海康VM6200实现深度推理功能:Python脚本调用YOLO模型
发布时间:2026/9/5 9:19:21来源:尧图网络
本文目录前言一、海康Python环境配置1.2 安装pip命令二、在海康中安装YOLO依赖2.1 安装依赖2.2 验证环境三、在Python脚本模块中导入YOLO模型3.1 准备onnx文件3.2 编写推理脚本前言声明此文章仅为技术探讨探究使用不可作为商业用途。本文将以YOLOv5官方权重为例手把手带你在海康VM6200上完成从环境配置、依赖安装、模型转换pt转onnx到Python脚本模块推理调用的完整部署流程并附上可直接运行的推理脚本帮助你快速跑通深度学习功能。一、海康Python环境配置在刚开始研究的时候不知道python版本是多少不敢贸然安装依赖库因为yolo环境中依赖库的版本与python版本有着严格的规定如果不一致又要重新配。我这里在python脚本中确认了一下python版本打印出的日志显示版本是3.7.0。### 1.1 海康内置python版本查询方法。查询代码vsys.version_info PrintMsg(fPython Version:{v.major}.{v.minor}.{v.micro}f({sys.version.split()[0]}))1.2 安装pip命令确认内置 Python 版本为 3.7 后接下来需要为其安装 pip 工具以便后续安装第三方库。在海康4.4版本中内置Python解释器位于以下路径以你实际安装位置为准。我这里是安装在了D盘。D:\Application\HIKVision\VisionMaster4.4.0\Applications\ModuleProxy\x64没有安装python环境前Scripts文件夹是空的。安装步骤左键点击get-pip.py拖到python.exe中相当于执行python.exe get-pip.py命令之后会弹出一个黑色窗口是在正在安装。安装完毕后会自动关闭。如果你命令窗口有设置不自动关闭那么不会关掉窗口不要担心你的窗口没关闭不是没安装成功。安装完成后如果看到Scripts文件夹下新增了wheel.exe、pip.exe、pip3.7.exe、pip3.exe这四个文件代表安装成功。可进行下一步。常见问题如果安装后Scripts文件夹仍为空可能是权限不足建议以管理员身份运行。二、在海康中安装YOLO依赖配置好Python环境后接下来需要安装YOLOv5运行所需的依赖库。2.1 安装依赖使用在刚才的文件夹的路径中输入cmd后敲回车进入命令行窗口 确保自己进入的窗口前的地址是你的python.exe所在的地址如果不一致会出现安装失败接下来安装yolov5依赖我这里是去了Ultralytics官网找到了yolov5的requirements文件这个文件是每个yolo模型都需要的里面包含了该模型的依赖库。也可以使用我下面的代码来安装。在命令行后面输入下面内容后敲回车。直接复制粘贴进去.\python.exe-mpipinstallnumpy1.21.6 opencv-pythononnxruntime1.14.1-ihttps://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com2.2 验证环境安装完毕后在命令行中输入。依旧复制粘贴.\python.exe-cimport numpy, cv2, onnxruntime;print(numpy:,numpy.__version__);print(opencv:,cv2.__version__);print(onnxruntime:,onnxruntime.__version__)如果打印出的日志显示numpy: 1.21.6opencv: 5.0.0onnxruntime: 1.14.1则证明环境安装成功或者在python脚本中验证。代码importsysimportnumpyimportcv2importonnxruntimefromioHelperimport*defProcess(data)-int:moduleVarIoHelper(data,INIT_MODULE_VAR)globalVarIoHelper(data,INIT_GLOBAL_VAR)localVarIoHelper(data,INIT_LOCAL_VAR)try:PrintMsg(numpy: %s%numpy.__version__)PrintMsg(cv2: %s%cv2.__version__)PrintMsg(onnxruntime: %s%onnxruntime.__version__)exceptBaseExceptionase:PrintMsg(FAIL str(e))return0如果看到能够打印出版本号说明已经成功安装三、在Python脚本模块中导入YOLO模型海康VM6200支持通过「Python脚本」模块调用外部Python代码。下面演示如何在VM中加载YOLOv5模型并进行推理。3.1 准备onnx文件我这里拿官方权重来做示例。去github官方权重下载链接yolov5s.pt下载完成后将pt模型文件转换成onnx格式。转换onnx格式需要依赖yolov5源码这里github链接yolov5源码我这里下载的是7.0版本。文件不大就80多M。下载完毕后配置虚拟环境和依赖不用多说了吧。网上有很多教程。上面环境等一切就绪后在程序中的export.py程序中进行onnx格式导出。python export.py--weights yolov5s.pt--include onnx--imgsz640--opset12这里我没有试过能否通过Ultralytics库进行转换网上搜索到的教程yolov5必须使用export.py程序转换大家可以自行测试。3.2 编写推理脚本在海康VM的「Python脚本」模块中编写如下代码# coding: utf-8importsys,timeimportnumpyasnpimportcv2importonnxruntimeasortfromioHelperimport*# 配置 MODEL_PATH放你onnx格式文件的绝对路径INPUT_SIZE640# 与onnx格式的图片尺寸一致CONF_THRESHOLD0.25NMS_THRESHOLD0.45PROVIDERcpu# cpu / openvino / dml / cudaTHREADS4# CPU线程数0自动USE_CLASS_COLORSTrueCLASS_NAMES[person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic light,fire hydrant,stop sign,parking meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports ball,kite,baseball bat,baseball glove,skateboard,surfboard,tennis racket,bottle,wine glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot dog,pizza,donut,cake,chair,couch,potted plant,bed,dining table,toilet,tv,laptop,mouse,remote,keyboard,cell phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy bear,hair drier,toothbrush]# _sessNone_input_nameNone_output_nameNonedef_load_model():global_sess,_input_name,_output_nameif_sessisNone:soort.SessionOptions()so.graph_optimization_levelort.GraphOptimizationLevel.ORT_ENABLE_ALLifTHREADS0:so.intra_op_num_threadsTHREADS prov_map{cpu:[CPUExecutionProvider],openvino:[OpenVINOExecutionProvider,CPUExecutionProvider],dml:[DmlExecutionProvider,CPUExecutionProvider],cuda:[CUDAExecutionProvider,CPUExecutionProvider],}_sessort.InferenceSession(MODEL_PATH,sess_optionsso,providersprov_map.get(PROVIDER,[CPUExecutionProvider]))_input_name_sess.get_inputs()[0].name _output_name_sess.get_outputs()[0].name PrintMsg([YOLO] providers: %s%str(_sess.get_providers()))def_image_to_numpy(img_data):hint(img_data.height)wint(img_data.width)bufimg_data.buffernint(img_data.dataLen)ifimg_data.dataLenelselen(buf)arrnp.frombuffer(buf,dtypenp.uint8)ifnw*h:returncv2.cvtColor(arr.reshape(h,w),cv2.COLOR_GRAY2BGR),Trueelifnw*h*3:returncv2.cvtColor(arr.reshape(h,w,3),cv2.COLOR_RGB2BGR),FalsereturnNone,Falsedef_preprocess(img_bgr):h,wimg_bgr.shape[:2]rmin(INPUT_SIZE/w,INPUT_SIZE/h)nw,nhint(round(w*r)),int(round(h*r))resizedcv2.resize(img_bgr,(nw,nh),interpolationcv2.INTER_LINEAR)canvasnp.full((INPUT_SIZE,INPUT_SIZE,3),114,dtypenp.uint8)dw,dh(INPUT_SIZE-nw)//2,(INPUT_SIZE-nh)//2canvas[dh:dhnh,dw:dwnw]resized rgbcv2.cvtColor(canvas,cv2.COLOR_BGR2RGB)blobrgb.astype(np.float32)/255.0blobblob.transpose(2,0,1)[None,...]returnnp.ascontiguousarray(blob),r,(dw,dh)def_postprocess(outputs,r,dw,dh):向量化后处理predsoutputs[0][0]maskpreds[:,4]CONF_THRESHOLD predspreds[mask]iflen(preds)0:return[]cls_idnp.argmax(preds[:,5:],axis1)cls_confpreds[np.arange(len(preds)),5cls_id]confpreds[:,4]*cls_conf keepconfCONF_THRESHOLD preds,cls_id,confpreds[keep],cls_id[keep],conf[keep]iflen(preds)0:return[]boxesnp.column_stack([preds[:,0]-preds[:,2]/2,preds[:,1]-preds[:,3]/2,preds[:,2],preds[:,3]])idxcv2.dnn.NMSBoxes(boxes.tolist(),conf.tolist(),CONF_THRESHOLD,NMS_THRESHOLD)results[]foriinidx:iint(i)x,y,bw,bhboxes[i]results.append((int(cls_id[i]),float(conf[i]),(x-dw)/r,(y-dh)/r,bw/r,bh/r))returnresultsdef_class_color(cid):hexs(FF3838,FF9D97,FF701F,FFB21D,CFD231,48F90A,92CC17,3DDB86,1A9334,00D4BB,2C99A8,00C2FF,344593,6473FF,0018EC,8438FF,520085,CB38FF,FF95C8,FF37C7)hhexs[cid%len(hexs)]return(int(h[4:6],16),int(h[2:4],16),int(h[0:2],16))def_draw_boxes(img_bgr,dets):lwmax(round(sum(img_bgr.shape)/2*0.003),2)sflw/3tfmax(lw-1,1)forcid,conf,x,y,bw,bhindets:p1(int(x),int(y))p2(int(xbw),int(ybh))color_class_color(cid)ifUSE_CLASS_COLORSelse(128,128,128)cv2.rectangle(img_bgr,p1,p2,color,thicknesslw,lineTypecv2.LINE_AA)nameCLASS_NAMES[cid]ifcidlen(CLASS_NAMES)elsestr(cid)label%s %.2f%(name,conf)w,hcv2.getTextSize(label,0,fontScalesf,thicknesstf)[0]outsidep1[1]-h3cv2.rectangle(img_bgr,p1,(p1[0]w,p1[1]-h-3ifoutsideelsep1[1]h3),color,-1,cv2.LINE_AA)cv2.putText(img_bgr,label,(p1[0],p1[1]-2ifoutsideelsep1[1]h2),0,sf,(255,255,255),thicknesstf,lineTypecv2.LINE_AA)returnimg_bgrdefProcess(data)-int:moduleVarIoHelper(data,INIT_MODULE_VAR)globalVarIoHelper(data,INIT_GLOBAL_VAR)localVarIoHelper(data,INIT_LOCAL_VAR)try:_load_model()t0time.time()img_datamoduleVar.in0 img_bgr,is_gray_image_to_numpy(img_data)t1time.time()blob,r,(dw,dh)_preprocess(img_bgr)t2time.time()outputs_sess.run([_output_name],{_input_name:blob})t3time.time()dets_postprocess(outputs,r,dw,dh)t4time.time()parts[]coords[]forcid,conf,x,y,bw,bhindets:nameCLASS_NAMES[cid]ifcidlen(CLASS_NAMES)elsestr(cid)parts.append(%s,%.2f,%.1f,%.1f,%.1f,%.1f%(name,conf,x,y,bw,bh))coords.extend([float(x),float(y),float(bw),float(bh),float(conf)])moduleVar.out0\n.join(parts)ifpartselseNONEtry:moduleVar.out1coordsexceptBaseException:passPrintMsg([YOLO] detect %d objects:\n%s%(len(dets),moduleVar.out0))img_drawn_draw_boxes(img_bgr.copy(),dets)out_imgImageData()out_img.widthimg_bgr.shape[1]out_img.heightimg_bgr.shape[0]out_img.pixel_formatimg_data.pixel_formatifis_gray:out_img.buffercv2.cvtColor(img_drawn,cv2.COLOR_BGR2GRAY).tobytes()else:out_img.buffercv2.cvtColor(img_drawn,cv2.COLOR_BGR2RGB).tobytes()out_img.dataLenlen(out_img.buffer)moduleVar.out2out_img PrintMsg([time] conv%.1fms pre%.1fms infer%.1fms post%.1fms total%.1fms%((t1-t0)*1000,(t2-t1)*1000,(t3-t2)*1000,(t4-t3)*1000,(t4-t0)*1000))exceptBaseExceptionase:PrintMsg([YOLO] error: str(e))return1return0成功后可以拿yolo官方自带的图片进行测试如果能够成功调用会打印出检测信息。左侧的输入输出与我保持一致成功展示这里的耗时80多ms是在没有使用openvino和CUDA加速的情况下。加速后推理速度会更快。希望本文能帮助你在海康VM6200上顺利跑通YOLOv5深度学习功能。如有问题欢迎在评论区交流讨论。
网站建设高端定制企业官网