运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

运维开发网 https://www.qedev.com 2021-05-09 19:46 出处:51CTO 作者:wx60962e30e0986
ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large,wx60962e30e0986的博客原创的深度学习文章。

摘要

YOLOv4-large是专为云端GPU而设计的一种架构,主要目的在于获得更好的目标检测精度。作者基于前述分析设计了一个全尺寸的YOLOv4-P5并扩展得到了YOLOv4-P6和YOLOv4-P7。其对应的网络结构示意图见下图。

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

作者通过实验发现:YOLOv4-P6(宽度缩放因子1)可以达到30fps的实时处理性能;YOLOv4-P7(宽度缩放因子1.25)可以达到15fps的处理速度。

代码:https://github.com/WongKinYiu/PyTorch_YOLOv4

Paper:https://arxiv.org/abs/2011.08036

论文思路:

通过对目前最先进的物体检测器的分析,我们发现YOLOv4[1]的主干CSPDarknet53几乎匹配所有通过网络架构搜索技术得到的最优架构特征。

 

CSPDarknet53的深度、瓶颈比、龄期间宽度生长比分别为65、1和2。因此,我们开发了基于YOLOv4的模型缩放技术,提出了scale -YOLOv4。提出的缩放yolov4具有出色的性能,如下图所示:

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

scale - yolov4的设计过程如下

首先对yolov4进行了重新设计,提出了YOLOv4-CSP,然后基于onYOLOv4-CSP开发了scale - yolov4。

在提出的scale - yolov4中,本文讨论了线性缩放模型的上界和下界,并分别分析了小模型和大模型缩放时需要注意的问题。因此,我们能够系统地开发YOLOv4-large和yolov4 -tiny模型。Scaled-YOLOv4能够在速度和精度之间实现最好的平衡,能够在15 fps、30 fps和60fps的影片以及嵌入式系统上进行实时对象检测。

我们总结了本文的工作:

 

1、设计了一种针对小模型的强大的模型缩放方法,系统地平衡了浅层CNN的计算代价和存储带宽;

2、设计一种简单有效的大型目标检测器缩放策略;

3、分析各模型缩放因子之间的关系,基于最优组划分进行模型缩放;

4、实验证实了FPN结构本质上是一种一次性结构;

5、利用上述方法开发yolov4 - tiny 和 yolo4v4 -large。

YOLOv4-large与其他模型对比试验

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

训练

制作数据集

通过对ScaledYoloV4代码的分析,发现ScaledYoloV4的数据集合YoloV5的数据集是相同的。如果使用过YoloV5,就可以直接按照YoloV5的方法即可。

具体的代码可以参考我以前写的博文:

COCO转YoloV5数据集,适用于YoloV5、ScaledYoloV4

https://wanghao.blog.csdn.net/article/details/111472706

Win10 Labelme标注数据转为YOLOV5 训练的数据集

https://wanghao.blog.csdn.net/article/details/108865894

Win10环境下,将VOC数据集转为YOLOV5使用的数据集。

https://wanghao.blog.csdn.net/article/details/108782268

本例选用的Labelme标注的数据集。数据集地址:

https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/14003627

将制作好的数据集放在和ScaledYOLOv4-yolov4-large同级目录。

下载代码和权重文件

https://github.com/WongKinYiu/ScaledYOLOv4/tree/yolov4-large

https://github.com/WongKinYiu/ScaledYOLOv4/tree/yolov4-csp

https://github.com/WongKinYiu/ScaledYOLOv4/tree/yolov4-tiny

这个Scaled总共有三个模型,本文使用Yolov4-large,权重文件在Readme里面有链接,如果你是训练自己的数据集,就没有必要下载。

增加Mish函数

增加Mish函数有两种方法,如果需要使用预训练模型就只能用Readme中提供的方法,这个方法我在Win10环境中用的时候出现了问题,而且我使用自己的数据集,可以不使用预训练模型,所以我采用另一种方式,在程序中增加Mish函数。

打开models/common.py加入如下代码:

class Mish(torch.nn.Module):

    def __init__(self):

        super().__init__()

    def forward(self, x):

        x = x * (torch.tanh(torch.nn.functional.softplus(x)))

        return x

准备训练

在data文件夹下面增加voc.yaml,写入配置数据集的配置。

# train and val datasets (image directory or *.txt file with image paths)

train: ../VOC/images/train/  # 118k images

val: ../voc/images/val/  # 5k images

test: ../voc/images/test/  # 20k images for submission to https://competitions.codalab.org/competitions/20794



# number of classes

nc: 2



# class names

names: ['aircraft', 'oiltank']

然后打开train.py文件,在文件的上面加入

import os

os.environ['KMP_DUPLICATE_LIB_OK']='True'

记住一定要放在最上面。

然后修改参数

  1. 将weights设置为“”
parser.add_argument('--weights', type=str, default='', help='initial weights path')

  1. 将cfg设置为yolo4-p5的配置文件  parser.add_argument('--cfg', type=str, default='models/yolov4-p5.yaml', help='model.yaml path')
  2. 将数据集配置为我们刚才增加的voc.yaml parser.add_argument('--data', type=str, default='data/voc.yaml', help='data.yaml path')
4、根据电脑的情况调节batch-size

parser.add_argument('--batch-size', type=int, default=2, help='total batch size for all GPUs')

改完上面的参数就可以运行。

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

训练完成后可以在runs看到训练的结果。

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

测试

 打开test.py,修改参数的配置

parser.add_argument('--weights', nargs='+', type=str, default='runs/exp0/weights/best.pt', help='model.pt path(s)')

parser.add_argument('--data', type=str, default='data/voc.yaml', help='*.data path')

parser.add_argument('--batch-size', type=int, default=2, help='size of each image batch')

parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')

parser.add_argument('--conf-thres', type=float, default=0.8, help='object confidence threshold')

parser.add_argument('--iou-thres', type=float, default=0.65, help='IOU threshold for NMS')

parser.add_argument('--task', default='test', help="'val', 'test', 'study'")

按照上面的参数配置,就可以测试了,测试完成后,回看到测试结果

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

打开detect.py可以测试图片,也可以打开摄像头测试,通过修改配置参数就可以实现。

1、修改weights路径。

parser.add_argument('--weights', nargs='+', type=str, default='runs/exp9/weights/best.pt', help='model.pt path(s)')

2、修改source参数,这个参数支持单张图片,图片文件夹和摄像头三种,如果需要设置为为0就可以调用摄像头。设置为图片的路径就可测试单张的图片。

parser.add_argument('--source', type=str, default='inference/images', help='source')  # file/folder, 0 for webcam

3、输出结果的存放位置。

parser.add_argument('--output', type=str, default='inference/output', help='output folder')  # output folder

下面是部分测试结果:

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消