1说明: 1。1技术要点:yolov3pythoncv2(OpenCV)实现目标检测,本文由浅入深,代码注释,小白秒懂,值得收藏。 1。23种方法:摄像头视频目标检测、小视频cv2目标检测,和视频目标检测生成avi视频。 1。3yolo的基本介绍。 pic1:单张静态图片目标检测 1。4单张静态图片目标检测,我已经讲过,可参考文章 《目标检测和识别:PythonOpenCVYolov3》,文章中三个文件:yolov3。cfg、coco。names和yolov3。weights。下载已经告知,本文省略。建议先看这篇文章后,再看本文。 2效果图: 2。1摄像头实时目标检测 bottle矿泉水瓶;cellphone手机;person人 2。2读取视频实时目标检测: person人; 2。3目标检测后生成avi视频: 来自网络,仅供学习,如有侵权,请联系,定删除 3摄像头实时目标检测代码:代码来源,进行注释和分析https:blog。csdn。netqq39567427articledetails105451962?utmmediumdistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。addparamisCfdepth1utmsourcedistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。addparamisCf摄像头实时目标检测第1步:导入模块importcv2importnumpyasnp第2步:加载yolov3的模型和三个文件注意路径netcv2。dnn。readNet(homexgjDesktopyolov3yolov3。weights,homexgjDesktopyolov3yolov3。cfg)名字分类的空的列表classes〔〕withopen(homexgjDesktopyolov3coco。names,r)asf:classes〔line。strip()forlineinf。readlines()〕layernamesnet。getLayerNames()outputlayers〔layernames〔i〔0〕1〕foriinnet。getUnconnectedOutLayers()〕第3步:初始化相关参数颜色随机产生colorsnp。random。uniform(0,255,size(len(classes),3))Initializeframeratecalculationframeratecalc1获取频率freqcv2。getTickFrequency()0提示读取摄像头如果格式是xxxxxxxxx。mp4就是读取本地视频文件capcv2。VideoCapture(0)第4步:循环whileTrue:Starttimer(forcalculatingframerate)t1cv2。getTickCount()获取读取摄像头资料ret,framecap。read()以下与单张静态图片类似获取高、宽和通道height,width,channelsframe。shapeDetectingobjects,侦测对象相关设置,与静态图片类似blobcv2。dnn。blobFromImage(frame,0。00392,(416,416),(0,0,0),True,cropFalse)net。setInput(blob)outsnet。forward(outputlayers)Showinginformationsonthescreen屏幕展示信息设置classids〔〕confidences〔〕boxes〔〕outs是上面获取的foroutinouts:fordetectioninout:scoresdetection〔5:〕classidnp。argmax(scores)confidencescores〔classid〕ifconfidence0。5:Objectdetectedcenterxint(detection〔0〕width)centeryint(detection〔1〕height)wint(detection〔2〕width)hint(detection〔3〕height)Rectanglecoordinatesxint(centerxw2)yint(centeryh2)boxes。append(〔x,y,w,h〕)confidences。append(float(confidence))classids。append(classid)indexescv2。dnn。NMSBoxes(boxes,confidences,0。5,0。4)fontcv2。FONTHERSHEYSIMPLEXforiinrange(len(boxes)):ifiinindexes:x,y,w,hboxes〔i〕labelstr(classes〔classids〔i〕〕)colorcolors〔i〕cv2。rectangle(frame,(x,y),(xw,yh),color,1)cv2。putText(frame,label,(x,y20),font,0。7,color,1)cv2。putText(frame,FPS:{0:。2f}。format(frameratecalc),(30,50),font,0。7,(255,255,0),1)cv2。namedWindow(Image,cv2。WINDOWNORMAL)cv2。resizeWindow(Image,960,540)cv2。imshow(Image,frame)以上与单张静态图片类似Calculateframeratet2cv2。getTickCount()time1(t2t1)freqframeratecalc1time1Pressqtoquit,默认为1ifcv2。waitKey(1)ord(q):break第5步:结束关闭cap。release()cv2。destroyAllWindows() 4读取本地视频进行目标检测: 代码基本与上面相同,仅需给一下这一行代码为capcv2。VideoCapture(homexgjDesktopyolov3333。mp4)上面注释里有介绍 5高级一点的视频标准目标检测,并合成新的视频: 5。1本机环境:python3。8OpenCV4。2。0华为笔记本电脑deepinlinux操作系统。 5。2代码说明:参考文章,对代码进行注释和适当修改https:my。oschina。netu1464083blog2906860本代码:sp3。py 5。3代码:第1步:导入模块importnumpyasnpimportargparseimportimutilsimporttimeimportcv2importos第2步:参数构建实例化apargparse。ArgumentParser()当前本代码同目录下的input文件夹:原视频位置ap。addargument(i,input,requiredTrue,helppathtoinputvideo)当前本代码同目录下的output文件夹:目标检测标定后的合成视频位置ap。addargument(o,output,requiredTrue,helppathtooutputvideo)当前本代码同目录下的yolov3文件夹ap。addargument(y,yolov3,requiredTrue,helpbasepathtoYOLOdirectory)参数定义,默认值ap。addargument(c,confidence,typefloat,default0。5,helpminimumprobabilitytofilterweakdetections)ap。addargument(t,threshold,typefloat,default0。3,helpthresholdwhenapplyongnonmaximasuppression)argsvars(ap。parseargs())第3步:加载yolov3的3个文件注意:三个文件在yolov3文件下weightsPathos。path。sep。join(〔args〔yolov3〕,yolov3。weights〕)configPathos。path。sep。join(〔args〔yolov3〕,yolov3。cfg〕)labelsPathos。path。sep。join(〔args〔yolov3〕,coco。names〕)读取标签名文件LABELSopen(labelsPath)。read()。strip()。split()initializealistofcolorstorepresenteachpossibleclasslabelnp。random。seed(42)颜色随机设置COLORSnp。random。randint(0,255,size(len(LABELS),3),dtypeuint8)print(〔INFO〕loadingYOLOfromdisk。。。)netcv2。dnn。readNetFromDarknet(configPath,weightsPath)lnnet。getLayerNames()ln〔ln〔i〔0〕1〕foriinnet。getUnconnectedOutLayers()〕第4步:获取输入的原视频文件vscv2。VideoCapture(args〔input〕)writerNone(W,H)(None,None)trytodeterminethetotalnumberofframesinthevideofiletry:propcv2。cv。CVCAPPROPFRAMECOUNTifimutils。iscv2()elsecv2。CAPPROPFRAMECOUNTtotalint(vs。get(prop))测算本视频内的目标检测识别后的总框架print(〔INFO〕{}totalframesinvideo。format(total))anerroroccurredwhiletryingtodeterminethetotalnumberofframesinthevideofileexcept:print(〔INFO〕couldnotdetermineofframesinvideo)print(〔INFO〕noapprox。completiontimecanbeprovided)total1第5步:循环loopoverframesfromthevideofilestreamwhileTrue:readthenextframefromthefile(grabbed,frame)vs。read()iftheframewasnotgrabbed,thenwehavereachedtheendofthestreamifnotgrabbed:breakiftheframedimensionsareempty,grabthemifWisNoneorHisNone:(H,W)frame。shape〔:2〕constructablobfromtheinputframeandthenperformaforwardpassoftheYOLOobjectdetector,givingusourboundingboxesandassociatedprobabilitiesblobcv2。dnn。blobFromImage(frame,1255。0,(416,416),swapRBTrue,cropFalse)net。setInput(blob)starttime。time()layerOutputsnet。forward(ln)endtime。time()initializeourlistsofdetectedboundingboxes,confidences,andclassIDs,respectivelyboxes〔〕confidences〔〕classIDs〔〕loopovereachofthelayeroutputsforoutputinlayerOutputs:loopovereachofthedetectionsfordetectioninoutput:scoresdetection〔5:〕classIDnp。argmax(scores)confidencescores〔classID〕ifconfidenceargs〔confidence〕:boxdetection〔0:4〕np。array(〔W,H,W,H〕)(centerX,centerY,width,height)box。astype(int)xint(centerX(width2))yint(centerY(height2))boxes。append(〔x,y,int(width),int(height)〕)confidences。append(float(confidence))classIDs。append(classID)绑定boxidxscv2。dnn。NMSBoxes(boxes,confidences,args〔confidence〕,args〔threshold〕)ensureatleastonedetectionexists确保一个侦测存在iflen(idxs)0:loopovertheindexeswearekeepingforiinidxs。flatten():extracttheboundingboxcoordinates(x,y)(boxes〔i〕〔0〕,boxes〔i〕〔1〕)(w,h)(boxes〔i〕〔2〕,boxes〔i〕〔3〕)drawaboundingboxrectangleandlabelontheframecolor〔int(c)forcinCOLORS〔classIDs〔i〕〕〕cv2。rectangle(frame,(x,y),(xw,yh),color,2)text{}:{:。4f}。format(LABELS〔classIDs〔i〕〕,confidences〔i〕)cv2。putText(frame,text,(x,y5),cv2。FONTHERSHEYSIMPLEX,0。5,color,2)checkifthevideowriterisNone写入新的视频文件ifwriterisNone:initializeourvideowriterfourcccv2。VideoWriterfourcc(MJPG)writercv2。VideoWriter(args〔output〕,fourcc,30,(frame。shape〔1〕,frame。shape〔0〕),True)someinformationonprocessingsingleframeiftotal0:elap(endstart)print(〔INFO〕singleframetook{:。4f}seconds。format(elap))print(〔INFO〕estimatedtotaltimetofinish:{:。4f}seconds。format(elaptotal))writetheoutputframetodiskwriter。write(frame)第6步:结束和收尾releasethefilepointersprint(〔INFO〕cleaningup。。。)writer。release()vs。release() 5。4运行:第7步:使用方法在本代码sp3。py的目录下打开终端本机输入python3。8sp3。pyinputvideos222。mp4outputoutput2222。aviyolov3yolov3 5。5图: 视频是一首完整的MV,有点大,时间有一点久 6小结: 6。1摄像头视频,有点卡,小bug。 6。2合成视频,有点慢,xiaobug。 7yolo介绍: 7。1yolo是目前比较流行的目标检测算法,速度快结构简单。 7。2YOLO是2016年提出来的目标检测算法,当前较为火热。 7。3yoloYouOnlyLookOnce: Unified,RealTimeObjectDetection, 即:YouOnlyLookOnce说的是只需要一次CNN运算, Unified指的是这是一个统一的框架,提供endtoend的预测, 而RealTime体现是Yolo算法速度快,达到实时。 7。4yolov3比较成熟,但目前已经出现yolov4和yolov5(被认为是v4。5版本)。