YOLOv4 物体/目标检测之实战篇(Windows系统、Python3、TensorFlow2版本)

举报
一颗小树x 发表于 2020/12/02 23:04:04 2020/12/02
【摘要】 前言     基于YOLO进行物体检测、对象识别,在搭建好开发环境后,先和大家进行实践应用中,体验YOLOv4物体/目标检测效果和魅力;同时逐步了解YOLOv4的不足和优化思路。 YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS!YOLOv4相对YOLOv3没有算法层面的创新,主要是训练技巧的更新。YOLOv4比 Efficient Det快...

前言

    基于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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。