范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

PytorchRCNN进行多目标检测

  1 说明
  ====
  1.1 目标检测在python-opencv(cv2)里占很大的比重,而目标检测当红网络肯定少不了RCNN家族。
  1.2 2014年,RBG(Ross B. Girshick)使用Region Proposal + CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了R-CNN框架,使得目标检测取得巨大突破,并开启了基于深度学习目标检测的热潮。
  1.3 Fast R-CNN就是在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进,使得性能进一步提高,让人们看到了Region Proposal + CNN这一框架实时检测的希望。
  1.4 Faster R-CNN最新进展。
  ==================================
  R-CNN(Selective Search + CNN + SVM)
  SPP-net(ROI Pooling)
  Fast R-CNN(Selective Search + CNN + ROI)
  Faster R-CNN(RPN + CNN + ROI)
  ==================================
  总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。
  2 准备
  =====
  2.1 环境:python3.8+deepin-linux操作系统+微软编辑器vscode。
  2.2 切记:opencv4.2.0+torch1.5.1(注意版本,否则报错)。
  2.3 图片来源:今日头条正版免费图库,效果图。
  2.4 进行多目标检测,适当修改,提高可调试性,注意事项已经交代。
  代码:1.py 执行1.jpeg图片 (threshold=0.8)
  代码:1.py 执行2.jpeg图片(threshold=0.5)
  3 代码1.py
  ========
  3.1 来源https://github.com/spmallick/learnopencv,对其代码进行删除,修改,注释,修复bug,调试和注意事项。
  3.2 代码头注释部分#Pytorch使用Faster R-CNN进行目标检测 #复杂性多种物体的目标检测  #注意版本 #查询opencv版本 """ import cv2 cv2.__version__ """ #opencv 4.2.0  #本机终端输入 #python3.8 1.py
  3.3 完整代码1.py#第1步:导入模块 import cv2 import numpy as np  import torch import torchvision import torchvision.transforms as T  #第2步:模型加载 #使用的是Faster R-CNN + ResNet50预训练模型。 #下载预训练模型,Resnet50 Faster R-CNN,带有训练好的权重参数。 model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) #不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化, #pytorch框架会自动把BN和Dropout固定住,不会取平均,而是用训练好的值 model.eval()  #第3步:识别内容 #可识别内容,注意顺序不能调动和N/A不能删除 COCO_INSTANCE_CATEGORY_NAMES = [     "__background__", "person", "bicycle", "car", "motorcycle", "airplane", "bus",     "train", "truck", "boat", "traffic light", "fire hydrant", "N/A", "stop sign",     "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",     "elephant", "bear", "zebra", "giraffe", "N/A", "backpack", "umbrella", "N/A", "N/A",     "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball",     "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket",     "bottle", "N/A", "wine glass", "cup", "fork", "knife", "spoon", "bowl",     "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza",     "donut", "cake", "chair", "couch", "potted plant", "bed", "N/A", "dining table",     "N/A", "N/A", "toilet", "N/A", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",     "microwave", "oven", "toaster", "sink", "refrigerator", "N/A", "book",     "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush" ]   #第4步:定义预测函数 def get_prediction(img_path, threshold):     img=cv2.imread(img_path)      transform = T.Compose([T.ToTensor()])     img = transform(img)     pred = model([img])     pred_class = [COCO_INSTANCE_CATEGORY_NAMES[i] for i in list(pred[0]["labels"].numpy())]     #修改np.int32,原来打印出np.float     pred_boxes = [[(np.int32(i[0]), np.int32(i[1])), (np.int32(i[2]), np.int32(i[3]))] for i in list(pred[0]["boxes"].detach().numpy())]     pred_score = list(pred[0]["scores"].detach().numpy())     pred_t = [pred_score.index(x) for x in pred_score if x>threshold][-1]     pred_boxes = pred_boxes[:pred_t+1]     pred_class = pred_class[:pred_t+1]     return pred_boxes, pred_class     #第5步:定义目标检测函数 def object_detection_api(img_path, threshold=0.5, rect_th=2, text_size=1, text_th=2):     #调用预测函数,获取框和识别名     boxes, pred_cls = get_prediction(img_path, threshold)     #读取图片     img = cv2.imread(img_path)          for i in range(len(boxes)):         #绿色框         cv2.rectangle(img, boxes[i][0], boxes[i][1],color=(0, 255, 0))         #红色识别物体名称         cv2.putText(img,pred_cls[i], boxes[i][0], cv2.FONT_HERSHEY_SIMPLEX, text_size, (0,0,255))      #显示结果     cv2.imshow("out" , img)     cv2.waitKey(0)     cv2.destroyAllWindows()  #第6步:指定图片启动目标检测 #默认threshold=0.5,也可以修改 object_detection_api("./1.jpeg", threshold=0.8) #object_detection_api("./2.jpeg", threshold=0.5)
  ===以上仅仅只能对图片进行多目标检测,档次有点低===
  ===高级一点,全套功能:图片、摄像头实时和视频文件mp4===
  4 全套功能代码2.py
  ==============
  4.1 头文件注释和代码来源:# -*- coding: utf-8 -*- """ Created on Thu Jul 30 08:47:12 2020 @author: Johnson """ #https://blog.csdn.net/zhonglongshen/article/details/107682640?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control #对其代码进行删除,修改,注释,修复bug,调试和注意事项。  #本机终端输入 #python3.8 2.py
  4.2 coco.names文件内容,注意去除引号和逗号
  4.3 完整代码2.py#第1步:模块导入 import numpy as np import cv2  import torch import  torchvision from torchvision import transforms   #第2步:打开文件coco.names #将代码1的目标识别名放入coco.names中 with open("./coco.names") as f: #获取类别名称     coco_names = [line.strip() for line in f.readlines()]  #第3步:加载模型 #在torchvision框架可以直接加载预训练模型 model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) model.eval() ##将图片变成 Tensor,并且把数值normalize到[0,1] transform = transforms.Compose([transforms.ToTensor()])  #第4步:图片检测函数定义,功能1 def faster_rcnn_detection(path):     image = cv2.imread(path)     blob = transform(image)     c,h,w = blob.shape     input_x = blob.view(1,c,h,w)     output = model(input_x)[0]  #这里如果是GPU.cuda()     boxes = output["boxes"].cpu().detach().numpy()     scores = output["scores"].cpu().detach().numpy()     labels = output["labels"].cpu().detach().numpy()     index = 0     for x1,y1,x2,y2 in boxes:         #大于0.9比较好,太小要识别过多不精准,误识别         #类似与代码1的threshold=0.6         if scores[index]>0.6:             #框的颜色等设置             cv2.rectangle(image, (np.int32(x1), np.int32(y1)),                          (np.int32(x2), np.int32(y2)), (0, 255, 0), 1, 8, 0)             label_id = labels[index]             label_txt = coco_names[label_id]             #文字的颜色等设置             #将字体1.0改为2.0             #将1改为2,未报错             cv2.putText(image, label_txt, (np.int32(x1), np.int32(y1)),              cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 255), 2)         index+=1          cv2.imshow("Faster-RCNN Detection Demo", image)     cv2.waitKey(0)     cv2.destroyAllWindows()       #第5步:视频检测函数定义,功能2 def video_detection(path):     capture = cv2.VideoCapture(path)      #循环     #while True:     #while(capture.isOpened()):     while cv2.waitKey(1) < 0:         ret,frame = capture.read()                  if ret == True:             #视频翻转             frame = cv2.flip(frame,1)  #0颠倒,1翻转一下             blob = transform(frame)             c,h,w = blob.shape             input_x = blob.view(1,c,h,w)             output = model(input_x)[0]  #这里如果是GPU.cuda()             boxes = output["boxes"].cpu().detach().numpy()             scores = output["scores"].cpu().detach().numpy()             labels = output["labels"].cpu().detach().numpy()             index = 0                      for x1,y1,x2,y2 in boxes:                 #大一些,否则漏识别                 if scores[index]>0.5:                     #框的颜色等设置                     cv2.rectangle(frame, (np.int32(x1), np.int32(y1)),                                 (np.int32(x2), np.int32(y2)), (0, 255, 0), 1, 8, 0)                     label_id = labels[index]                     label_txt = coco_names[label_id]                     #文字的颜色等设置                     cv2.putText(frame, label_txt, (np.int32(x1), np.int32(y1)),                      cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 255), 1)                 index+=1                  wk = cv2.waitKey(1)             if wk==27:                 break              cv2.imshow("video detection",frame)     #摄像头检测函数 #video_detection(0) #视频文件检测 video_detection("./video.mp4")  #图片检测函数 #faster_rcnn_detection("./1.jpeg")
  5 小bug
  视频保存未成功!大家可以加油。总之比较完美。

房地产最终的结局是私人房地产商10年内倒闭关门?房地产最终的结局是私人房地产商全部破产倒闭关门。国企接管房地产市场。房子将成为民生工程,以后不允许私人资本进入房地产工程。这个过程应该在这10年内完成,如果像教培机构那样的雷霆手段这两个残忍的真相,早一点知道,早一点让自己更幸福分享创造快乐!在您阅读本文前,可以点击右上角关注,以后您每天都可以免费收到老廖爱生活分享的内容!这两个残忍的真相,早一点知道,早一点让自己更幸福!1如果你实力够强,颜值够高,就算脾牛逼人生八零后的历程之六婆媳博弈八零后的婆婆绝大部份都是上世纪大浪淘沙留下来的佼佼者,我们八零后在她面前简直就是小白弱鸡!结婚前第一次见面,婆婆那个和蔼可亲唷!先历数自己做媳妇的时候受了多少苦难,决对不会让自己的牛逼人生八零后的历程之七买房08年金融危机,我一个同学及时出手买了一套89平米的房子,才十八万,首付了五万,现在涨到四十多万了!我看中了一套差不多的,给老公做了无数思想工作,男人的思想就是只要老婆和妈妈没有吵以患者为中心建设的互联网医院,真的能够实现好医疗服务吗?在疫情的影响下,互联网医院正在如火如荼地开办。而为了更好地推动医疗卫生医疗卫生体系向互联网医疗的模式改革,各省的省卫健委市委市政府都发布了相关利好通告,让互联网医院这一新型普惠技术孩子扁桃体发炎应当如何处理?大多数孩子的家长都是这样做的作为孩子,孩子的照料是一件令人头疼的事情。由于孩子免疫力低,所以经常容易被各种细菌病毒感染而诱发上呼吸道感染,其中扁桃体炎便是每个孩子至少都会发病一次的疾病。扁桃体炎的特征也很明显28岁杨某查出甲状腺结节,纵横比1,情况不好,不想手术怎么办体检查出甲状腺结节,大家最怕的事情是什么?我相信几乎所有人都害怕结节发生恶变。我们在超声报告中要特别当心出现这些字眼边界不清晰形态不规则有微小钙化纵横比大于1等等,出现这些就意味着推行52课后服务,只玩不辅导作业,老师怒怼这不是补课文跳跳妈妈谈教育中小学推行52课后延时服务,本是为减轻家长负担,却引得家长连连抱怨。此前全国各地小学430放学,家长无法兼顾工作和照顾孩子,为了解决这一问题,教育部设立新政策,中小一二年级不留作业,恶果终降临?一线老师吐槽题都看不懂文跳跳妈妈谈教育减负是从高学习压力的基础的减轻负担,而非从0减到负数。双减工作正在推进,教育部也接连下发了相关文件,来响应双减,比如52课后延时服务寒暑假托管班小学一二年级不进行纸孩子不愿意做作业?家长如何帮助克服孩子畏难情绪面对难题困难的情况,人们要花费大量力气去解决问题,导致短时间内无法达到想要的结果。人类通性似乎都是不愿意遇到困难的,对困难表现出沮丧失望,甚至焦虑不安到孩子不愿意做作业?家长如何帮助克服孩子畏难情绪面对难题困难的情况,人们要花费力气去解决问题,导致无法短时间达到想要的结果。人类通性似乎都是不愿意遇到困难的,对困难表现出沮丧失望,甚至不安焦虑,到失去
哥嫂车祸去世了,留下个12岁儿子,我不想养可以吗?(原创)哥哥的亲儿子,你的亲侄子,除了他爸妈之外,你就是这个十二岁孩子的年轻亲人了。孩子的爷爷奶奶可养,但他们不合适,因为年纪大了,精力不支。你养最合适,一是对得住哥哥,二是对得住怀孕了有必要那么小心吗?我当时怀孕的时候怀一个多月的时候吧出血了,然后去医院医生说什么孕酮太低,又流产的迹象,然后给我开了那些保胎药,我吃了一次那个味道简直了。我吞下去就想吐。然后就没吃了,心里想着有缘分以后要怎么跟女儿说她的爸爸为什么跟别人的爸爸不一样我不知道怎么跟胖胖说她爸爸的过去,在这一生中算的上是一个巨大的遗憾,她只能看到她爸爸的现在,却不知如果不是背叛,她的家也是完整的,她的爸爸也是爱她的他终究还是因为在这样的一个原生家熊孩子将鞭炮伸入下水道,画面触目惊心,大喊妈妈我好怕春节是我们特别注重的一个节日,所以经常会通过一些特定的方式来庆祝春节。比如放鞭炮,走亲戚,拜年,打牌等等。而对于孩子们而言,鞭炮则是他们最喜欢的一种充满节日氛围的玩具。然而不得不注对孩子要爱,但是需要有明确的要求对孩子要爱,但是需要有明确的要求很多母亲对孩子任劳任怨,愿意为他们付出一切,母亲是伟大的,也是无私的。莫言的丰乳肥臀中的母亲就是任劳任怨无私为孩子们付出,她养育了自己的9个孩子,也当好一个爸爸在孩子丰富而单纯的感情世界里,爸爸就像广阔的天高大的树不倒的山,他们希望爸爸精神抖擞地到学校去接他们,带着他们从其他小朋友的身边走过他们渴望得到爸爸一个微笑一句鼓励一个亲吻他们盼望语文教学不该追求即时效应唐晓敏中国传统语文教育的一个特点是,起步就让儿童读最好的书,这就是经典著作,而不在意儿童是否能理解。这是富有智慧的做法。中国有数千年的教育经验的积累,深刻认识到,语文学习的理解是一冬天做好这三点,宝宝少生病1通风在空气质量良好的情况下,保持每天开窗通风30分钟左右,增加空气流通保持屋内空气清新。2保持屋内适宜的温湿度冬天家里适合的温度是2426,湿度是4060。温度过低,宝宝容易感冒觉得没钱不如不生家是避风的港湾,我们是条船。船存在的意义不是只待在港湾里。同样的道理,子女是要培养的,任何人的保护都不如自我保护。培养他生活的能力才是一切意义的核心。如果她生活的能力比我们都强,还楼姣英高龄女性要三胎,如何孕得顺利,生的健康实施三孩生育政策后,高龄孕产妇有可能增多,发生出生缺陷的风险将会增大。如何保障孕产妇和新生儿健康安全是所有妇产科和儿科医生所面临的新挑战。在医学概念中,高龄通常是指预产期大于等于3哪些适合给孩子吃的家常菜,既营养又健康?作为家长给孩子做饭,着实不易,孩子学习时间紧张,大人上班时间更紧张,既要荤素搭配营养均衡,还得是方便快捷的。下面分享几个简单有营养,孩子还爱吃的家常菜。1。西红柿炒鸡蛋(酸甜可口宝