YOLOv4 物体/目标检测之实战篇(Windows系统、Python3、TensorFlow2版本)
前言
基于YOLO进行物体检测、对象识别,在搭建好开发环境后,先和大家进行实践应用中,体验YOLOv4物体/目标检测效果和魅力;同时逐步了解YOLOv4的不足和优化思路。
YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS!YOLOv4相对YOLOv3没有算法层面的创新,主要是训练技巧的更新。YOLOv4比 Efficient Det快两倍并且性能相当。将YOLOV3的AP和FPS分别提高了10%和12%。
目录
一、开发环境参数
系统: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
- 点赞
- 收藏
- 关注作者
评论(0)