物体检测-Faster R-CNN(1)
1628
2022-05-25
前言
基于YOLO进行物体检测、对象识别,在搭建好开发环境后,先和大家进行实践应用中,体验YOLOv4物体/目标检测效果和魅力;同时逐步了解YOLOv4的不足和优化思路。
YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS!YOLOv4相对YOLOv3没有算法层面的创新,主要是训练技巧的更新。YOLOv4比 Efficient Det快两倍并且性能相当。将YOLOV3的AP和FPS分别提高了10%和12%。
目录
一、开发环境参数
二、YOLOv4 的物体/目标检测效果:
三、体验YOLOv4物体/目标检测
1)下载代码,打开工程
2)下载权重文件
3)权重文件应用到工程
4)图片目标检测
5)视频文件目标检测
6)摄像头实时目标检测
四、核心代码之调用YOLOv4模型
五、分析YOLOv4目标检测
1)相对YOLOv3改进方面
2)YOLOv4训练的技巧
3)YOLOv4框架
一、开发环境参数
系统:Windows 编程语言:Python 3.8
深度学习框架:TensorFlow 2.3 整合开发环境:Anaconda 开发代码IDE:PyCharm
主要使用TensorFlow2.3、opencv-python4.4.0、Pillow、matplotlib 等依赖库。
详情请参考我的另一篇博客:YOLO实践应用之搭建开发环境(Windows系统、Python 3.8、TensorFlow2.3版本)
二、YOLOv4 的物体/目标检测效果:
1)有一只小狗被检测出来:
使用绿色的框框,把小狗的所在位置框出来,并在框框上方注释标签(类别 置信度)。比如小狗检测出的标签是dog,置信度是0.99,即有99%的把握认为是dog 狗。
在左上角有Track Total、Track Count 这是用来统计跟踪目标的,由于是图片的目标检测,所以它们是为0的;如果是视频或实时目标检测,能显示跟踪目标的信息。
2)两位橄榄球运动员同时被检测出来:
左边运动员被检测出是person,0.95;有95%的把握认为是person 人;
右边运动员被检测出是person,0.98;有98%的把握认为是person 人;
3)在复杂的十字路口,有许多行人、车辆、自行车、交通灯被检测出来了:
大家可以看到大部分的行人、汽车是被检测出来了,存在小部分没有被检测出来;哈哈看到广告牌上的汽车,也被识别为car 汽车(83%的把握)。如果是做特定场景的目标检测,建议大家后续采购特定场景的数据,重新训练网络,生成稳定且高精度的模型,保存权重文件,便于后续使用。
看左上角的统计信息,能看到汽车检测到5辆,行人检测到14位,自行车检测到1辆,交通灯设备3台,太阳伞3把,手提包1个。
4)下面是玩滑板的场景,能看到人和滑板都被检测出来了:
看左上角的统计信息,能看到人检测到5位,滑板4个。
三、体验YOLOv4物体/目标检测
1)下载代码,打开工程
先到githug下载代码,然后解压工程,然后使用PyCharm工具打开工程;
github代码-:
https://github.com/guo-pu/Deep-Sort-YOLOv4-master_V1.0
送人玫瑰,手留余香;各位大佬点一下github项目的星星Star,那就太感谢了(●ˇ∀ˇ●)
使用PyCharm工具打开工程:
打开后的页面是这样的:
【选择开发环境】
文件(file)——>设置(setting)——>项目(Project)——>Project Interpreters 选择搭建的开发环境;
然后先点击Apply,等待加载完成,再点击OK;
2)下载权重文件
在我网盘取以下红色框的三个文件:
market1501.pb、mars-small128.pb 这两个是目标检测的特征文件(必须)
yolov4.weights 是网络的权重文件,由它生成yolov4.h5的。
链接:https://pan.baidu.com/s/1qsi_rSqkWw0-pS3CPe-Mfg 提取码:11d0
下载好的文件,放到工程的model_data 目录中
3)权重文件应用到工程
在Pycharm的命令终端,执行如下命令,把训练好的权重进行转换,并应用到工程中。
【yolov4.weights】
python convertToH5.py --input_size 608 --min_score 0.3 --iou 0.5 --model_path model_data/yolov4.h5 --weights_path model_data/yolov4.weights
执行命令成功后,能看到生成yolov4.h5
4)图片目标检测
1)检测图片中的目标:
python detect_image.py --picture test_picture/dog.png --min_score 0.6 --model_yolo model _data/yolov4.h5 --model_feature model_data/market1501.pb
注意:min_score 设置置信度过滤,低于0.6置信度不会显示在图片中,能过滤低置信度目标物体;这个参数根据项目需求来设定。例如想尽可能检测出多些物体,那可以设置为 min_score 0.3 ;如果只想看到90%或以上置信度的物体,那可以设置为 min_score 0.9.
model_feature 目标检测特征模型文件,如果是检测小物体的建议使用mars-small128.pb,如果是中、大型物体建议使用market1501.pb
运行结果:
看左上角的统计信息,能看到检测到一只小狗;
2)检测街道的目标:
python detect_image.py --picture test_picture/street.png --min_score 0.3 --model_yolo mo del_data/yolov4.h5 --model_feature model_data/market1501.pb
看左上角的统计信息,能看到汽车检测到5辆,行人检测到14位,自行车检测到1辆,交通灯设备3台,太阳伞3把,手提包1个。
5)视频文件目标检测
python detect_video_tracker.py --video test.mp4 --min_score 0.6 --model_yolo model_data/yolov4.h5 --model_feature model_data/market1501.pb
备注:test.mp4 是要检测的视频文件名称
6)摄像头实时目标检测
python detect_video_tracker.py --video 0 --min_score 0.6 --model_yolo model_data/yolov4.h5 --model_feature model_data/market1501.pb
备注:0 电脑默认的摄像头设备号,如果电脑有两个摄像头,那么系统自带的是0,外接摄像头是1
四、核心代码之调用YOLOv4模型
detect_image.py 代码: # yolov4 对图片进行目标检测
#! /usr/bin/env python # -*- coding: utf-8 -*- "目标检测主代码 使用YOLOv4 检测图片中的不同目标物体,默认权重支持识别80种目标" import time import cv2 import argparse import numpy as np from PIL import Image from yolo4.yolo import YOLO4 from deep_sort import preprocessing from deep_sort import nn_matching from deep_sort.detection import Detection from deep_sort.tracker import Tracker from deep_sort import generate_detections # 执行命令 python detect_image.py --picture test.jpg --min_score 0.6 --model_yolo model_data/yolov4.h5 --model_feature model_data/market1501.pb # 外部参数配置 ''' picture 输入图片的名称( .jpg 或 .png 等格式的图片) min_score 设置置信度过滤,低于0.6置信度不会显示在图片中,能过滤低置信度目标物体;这个参数根据项目需求来设定 model_yolo 权重文件转为模型H5文件 model_feature 目标跟踪模型文件,如果是检测小物体的建议使用mars-small128.pb,如果是中大物体建议使用market1501.pb ''' parser = argparse.ArgumentParser() parser.add_argument('--picture', type=str, default='test.jpg', help='picture file.') parser.add_argument('--min_score', type=float, default=0.6, help='Below this score (confidence level) is not displayed.') parser.add_argument('--model_yolo', type=str, default='model_data/yolo4.h5', help='Object detection model file.') parser.add_argument('--model_feature', type=str, default='model_data/market1501.pb', help='target tracking model file.') ARGS = parser.parse_args() box_size = 2 # 边框大小 font_scale = 0.45 # 字体比例大小 if __name__ == '__main__': # Deep SORT - encoder = generate_detections.create_box_encoder(ARGS.model_feature, batch_size=1) metric = nn_matching.NearestNeighborDistanceMetric("cosine", ARGS.min_score, None) tracker = Tracker(metric) # 载入模型 yolo = YOLO4(ARGS.model_yolo, ARGS.min_score) # 读取图片 frame = cv2.imread(ARGS.picture) # 图片转换识别 image = Image.fromarray(frame) # bgr to rgb boxes, scores, classes, colors = yolo.detect_image(image) # 特征提取和检测对象列表 features = encoder(frame, boxes) detections = [] for bbox, score, classe, color, feature in zip(boxes, scores, classes, colors, features): detections.append(Detection(bbox, score, classe, color, feature)) # 运行非最大值抑制 boxes = np.array([d.tlwh for d in detections]) scores = np.array([d.score for d in detections]) indices = preprocessing.non_max_suppression(boxes, 1.0, scores) detections = [detections[i] for i in indices] # 追踪器刷新 tracker.predict() tracker.update(detections) # 遍历绘制跟踪信息 track_count = 0 track_total = 0 for track in tracker.tracks: if not track.is_confirmed() or track.time_since_update > 1: continue y1, x1, y2, x2 = np.array(track.to_tlbr(), dtype=np.int32) # cv2.rectangle(frame, (y1, x1), (y2, x2), (255, 255, 255), box_size//4) cv2.putText( frame, "No. " + str(track.track_id), (y1, x1 - 5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 255, 255), box_size//2, lineType=cv2.LINE_AA ) if track.track_id > track_total: track_total = track.track_id track_count += 1 # 遍历绘制检测对象信息 totalCount = {} for det in detections: y1, x1, y2, x2 = np.array(det.to_tlbr(), dtype=np.int32) caption = '{} {:.2f}'.format(det.classe, det.score) if det.classe else det.score cv2.rectangle(frame, (y1, x1), (y2, x2), det.color, box_size) # 填充文字区 text_size = cv2.getTextSize(caption, 0, font_scale, thickness=box_size)[0] cv2.rectangle(frame, (y1, x1), (y1 + text_size[0], x1 + text_size[1] + 8), det.color, -1) cv2.putText( frame, caption, (y1, x1 + text_size[1] + 4), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (50, 50, 50), box_size//2, lineType=cv2.LINE_AA ) # 统计物体数 if det.classe not in totalCount: totalCount[det.classe] = 0 totalCount[det.classe] += 1 # 跟踪统计 trackTotalStr = 'Track Total: %s' % str(track_total) cv2.putText(frame, trackTotalStr, (10,20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (50, 0, 255), 1, cv2.LINE_AA) # 跟踪数量 trackCountStr = 'Track Count: %s' % str(track_count) cv2.putText(frame, trackCountStr, (10,40), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (50, 0, 255), 1, cv2.LINE_AA) # 识别类数统计 totalStr = "" for k in totalCount.keys(): totalStr += '%s: %d ' % (k, totalCount[k]) cv2.putText(frame, totalStr, (10,60), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (50, 0, 255), 1, cv2.LINE_AA) # 保存检测后图片 filename = "output" + ARGS.picture cv2.imwrite(filename, frame) # 显示目标检测效果 cv2.namedWindow("video_reult", cv2.WINDOW_AUTOSIZE) cv2.imshow("video_reult", frame) # waitkey代表读取键盘的输入,括号里的数字代表等待多长时间,单位ms。 0代表一直等待 k = cv2.waitKey(0) if k == 27 & 0xFF == ord('q'): # 键盘上Esc键的键值 或输入q键 # 任务完成后释放所有内容 cv2.destroyAllWindows()
五、分析YOLOv4目标检测
YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS!YOLOv4相对YOLOv3没有算法层面的创新,主要是训练技巧的更新。YOLOv4比 Efficient Det快两倍并且性能相当。将YOLOV3的AP和FPS分别提高了10%和12%。
YOLOv4: Optimal Speed and Accuracy of Object Detection
论文地址:https://arxiv.org/abs/2004.10934
代码地址:https://github.com/AlexeyAB/darknet
1)相对YOLOv3改进方面
马赛克数据增强。
自对抗训练:对图像做改变扰动,然后在这个图像上训练。
改进 attention方式。
改进通道的组合方式。
Cross mini-batch Normal。
等等
总结:使用 加权残差连接(WRC),跨阶段部分连接(CSP),交叉微型批处理规范化(CmBN),自对抗训练(SAT),Mish激活(Mish-activation),马赛克数据增强(Mosaic data augmentation),CmBN,DropBlock正则化(DropBlock regularization)和CIoU损失函数(CIoU loss),并结合其中的一些功能来实现最新的结果:43.5%AP,MS COCO数据集的实时速度约为65 FPS,如下图所示:
、
YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS。
2)YOLOv4训练的技巧
用于backbone的BoF:CutMix和Mosaic数据增强,DropBlock正则化,Class label smoothing
用于backbone的BoS:Mish激活函数,CSP,MiWRC
用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,对单个ground-truth使用多个anchor,Cosine annealing scheduler,最佳超参数,Random training shapes
用于检测器的Bos:Mish激活函数,SPP,SAM,PAN,DIoU-NMS
YOLOv4部分组件——交叉小批量标准化(Cross mini-Batch Normalization)
3)YOLOv4框架
YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3
Backbone:CSPDarknet53
Neck:SPP,PAN
Head:YOLOv3
希望对你有帮助。( •̀ ω •́ )✧
YOLO物体/目标检测系列 https://blog.csdn.net/qq_41204464/category_10425913.html
Python TensorFlow
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。