1说明 1。1目标检测在pythonopencv(cv2)里占很大的比重,而目标检测当红网络肯定少不了RCNN家族。 1。22014年,RBG(RossB。Girshick)使用RegionProposalCNN代替传统目标检测使用的滑动窗口手工设计特征,设计了RCNN框架,使得目标检测取得巨大突破,并开启了基于深度学习目标检测的热潮。 1。3FastRCNN就是在RCNN的基础上采纳了SPPNet方法,对RCNN作了改进,使得性能进一步提高,让人们看到了RegionProposalCNN这一框架实时检测的希望。 1。4FasterRCNN最新进展。 RCNN(SelectiveSearchCNNSVM) SPPnet(ROIPooling) FastRCNN(SelectiveSearchCNNROI) FasterRCNN(RPNCNNROI) 总的来说,从RCNN,SPPNET,FastRCNN,FasterRCNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于regionproposal的RCNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。 2准备 2。1环境:python3。8deepinlinux操作系统微软编辑器vscode。 2。2切记:opencv4。2。0torch1。5。1(注意版本,否则报错)。 2。3图片来源:今日头条正版免费图库,效果图。 2。4进行多目标检测,适当修改,提高可调试性,注意事项已经交代。 代码:1。py执行1。jpeg图片(threshold0。8) 代码:1。py执行2。jpeg图片(threshold0。5) 3代码1。py 3。1来源https:github。comspmallicklearnopencv,对其代码进行删除,修改,注释,修复bug,调试和注意事项。 3。2代码头注释部分Pytorch使用FasterRCNN进行目标检测复杂性多种物体的目标检测注意版本查询opencv版本importcv2cv2。versionopencv4。2。0本机终端输入python3。81。py 3。3完整代码1。py第1步:导入模块importcv2importnumpyasnpimporttorchimporttorchvisionimporttorchvision。transformsasT第2步:模型加载使用的是FasterRCNNResNet50预训练模型。下载预训练模型,Resnet50FasterRCNN,带有训练好的权重参数。modeltorchvision。models。detection。fasterrcnnresnet50fpn(pretrainedTrue)不启用BatchNormalization和Dropout,保证BN和dropout不发生变化,pytorch框架会自动把BN和Dropout固定住,不会取平均,而是用训练好的值model。eval()第3步:识别内容可识别内容,注意顺序不能调动和NA不能删除COCOINSTANCECATEGORYNAMES〔background,person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,trafficlight,firehydrant,NA,stopsign,parkingmeter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,NA,backpack,umbrella,NA,NA,handbag,tie,suitcase,frisbee,skis,snowboard,sportsball,kite,baseballbat,baseballglove,skateboard,surfboard,tennisracket,bottle,NA,wineglass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hotdog,pizza,donut,cake,chair,couch,pottedplant,bed,NA,diningtable,NA,NA,toilet,NA,tv,laptop,mouse,remote,keyboard,cellphone,microwave,oven,toaster,sink,refrigerator,NA,book,clock,vase,scissors,teddybear,hairdrier,toothbrush〕第4步:定义预测函数defgetprediction(imgpath,threshold):imgcv2。imread(imgpath)transformT。Compose(〔T。ToTensor()〕)imgtransform(img)predmodel(〔img〕)predclass〔COCOINSTANCECATEGORYNAMES〔i〕foriinlist(pred〔0〕〔labels〕。numpy())〕修改np。int32,原来打印出np。floatpredboxes〔〔(np。int32(i〔0〕),np。int32(i〔1〕)),(np。int32(i〔2〕),np。int32(i〔3〕))〕foriinlist(pred〔0〕〔boxes〕。detach()。numpy())〕predscorelist(pred〔0〕〔scores〕。detach()。numpy())predt〔predscore。index(x)forxinpredscoreifxthreshold〕〔1〕predboxespredboxes〔:predt1〕predclasspredclass〔:predt1〕returnpredboxes,predclass第5步:定义目标检测函数defobjectdetectionapi(imgpath,threshold0。5,rectth2,textsize1,textth2):调用预测函数,获取框和识别名boxes,predclsgetprediction(imgpath,threshold)读取图片imgcv2。imread(imgpath)foriinrange(len(boxes)):绿色框cv2。rectangle(img,boxes〔i〕〔0〕,boxes〔i〕〔1〕,color(0,255,0))红色识别物体名称cv2。putText(img,predcls〔i〕,boxes〔i〕〔0〕,cv2。FONTHERSHEYSIMPLEX,textsize,(0,0,255))显示结果cv2。imshow(out,img)cv2。waitKey(0)cv2。destroyAllWindows()第6步:指定图片启动目标检测默认threshold0。5,也可以修改objectdetectionapi(。1。jpeg,threshold0。8)objectdetectionapi(。2。jpeg,threshold0。5) 以上仅仅只能对图片进行多目标检测,档次有点低 高级一点,全套功能:图片、摄像头实时和视频文件mp4 4全套功能代码2。py 4。1头文件注释和代码来源:coding:utf8CreatedonThuJul3008:47:122020author:Johnsonhttps:blog。csdn。netzhonglongshenarticledetails107682640?utmmediumdistribute。pcrelevant。nonetaskblogBlogCommendFromBaidu7。controldepth1utmsourcedistribute。pcrelevant。nonetaskblogBlogCommendFromBaidu7。control对其代码进行删除,修改,注释,修复bug,调试和注意事项。本机终端输入python3。82。py 4。2coco。names文件内容,注意去除引号和逗号 4。3完整代码2。py第1步:模块导入importnumpyasnpimportcv2importtorchimporttorchvisionfromtorchvisionimporttransforms第2步:打开文件coco。names将代码1的目标识别名放入coco。names中withopen(。coco。names)asf:获取类别名称coconames〔line。strip()forlineinf。readlines()〕第3步:加载模型在torchvision框架可以直接加载预训练模型modeltorchvision。models。detection。fasterrcnnresnet50fpn(pretrainedTrue)model。eval()将图片变成Tensor,并且把数值normalize到〔0,1〕transformtransforms。Compose(〔transforms。ToTensor()〕)第4步:图片检测函数定义,功能1deffasterrcnndetection(path):imagecv2。imread(path)blobtransform(image)c,h,wblob。shapeinputxblob。view(1,c,h,w)outputmodel(inputx)〔0〕这里如果是GPU。cuda()boxesoutput〔boxes〕。cpu()。detach()。numpy()scoresoutput〔scores〕。cpu()。detach()。numpy()labelsoutput〔labels〕。cpu()。detach()。numpy()index0forx1,y1,x2,y2inboxes:大于0。9比较好,太小要识别过多不精准,误识别类似与代码1的threshold0。6ifscores〔index〕0。6:框的颜色等设置cv2。rectangle(image,(np。int32(x1),np。int32(y1)),(np。int32(x2),np。int32(y2)),(0,255,0),1,8,0)labelidlabels〔index〕labeltxtcoconames〔labelid〕文字的颜色等设置将字体1。0改为2。0将1改为2,未报错cv2。putText(image,labeltxt,(np。int32(x1),np。int32(y1)),cv2。FONTHERSHEYPLAIN,2。0,(0,0,255),2)index1cv2。imshow(FasterRCNNDetectionDemo,image)cv2。waitKey(0)cv2。destroyAllWindows()第5步:视频检测函数定义,功能2defvideodetection(path):capturecv2。VideoCapture(path)循环whileTrue:while(capture。isOpened()):whilecv2。waitKey(1)0:ret,framecapture。read()ifretTrue:视频翻转framecv2。flip(frame,1)0颠倒,1翻转一下blobtransform(frame)c,h,wblob。shapeinputxblob。view(1,c,h,w)outputmodel(inputx)〔0〕这里如果是GPU。cuda()boxesoutput〔boxes〕。cpu()。detach()。numpy()scoresoutput〔scores〕。cpu()。detach()。numpy()labelsoutput〔labels〕。cpu()。detach()。numpy()index0forx1,y1,x2,y2inboxes:大一些,否则漏识别ifscores〔index〕0。5:框的颜色等设置cv2。rectangle(frame,(np。int32(x1),np。int32(y1)),(np。int32(x2),np。int32(y2)),(0,255,0),1,8,0)labelidlabels〔index〕labeltxtcoconames〔labelid〕文字的颜色等设置cv2。putText(frame,labeltxt,(np。int32(x1),np。int32(y1)),cv2。FONTHERSHEYPLAIN,1。0,(0,0,255),1)index1wkcv2。waitKey(1)ifwk27:breakcv2。imshow(videodetection,frame)摄像头检测函数videodetection(0)视频文件检测videodetection(。video。mp4)图片检测函数fasterrcnndetection(。1。jpeg) 5小bug 视频保存未成功!大家可以加油。总之比较完美。