首页 > 编程知识 正文

anchor free 目标检测(ScaledYOLOv4实践:手把手教物体检测——ScaleYOLOv4-large)

时间:2023-05-06 15:07:15 阅读:122291 作者:4952

目录

摘要

训练

创建数据集

下载代码和权重文件

增加Mish函数

准备培训

测试

概述YOLOv4-large是专门为云GPU设计的体系结构,主要目的是提高目标检测精度。 作者在前述分析的基础上设计并扩展了全尺寸YOLOv4-P5,得到YOLOv4-P6和YOLOv4-P7。 其对应的网络结构示意图如下图所示。

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

代码: https://github.com/wongkinyiu/py torch _ yolo v4

paper:https://arxiv.org/ABS/2011.08036

论文思路:

通过对当前最先进物体检测器的分析,发现YOLOv4[1]主干CSPDarknet53与网络架构搜索技术获得的最佳架构特征基本一致。

CSPDarknet53的深度、瓶颈比、年龄期幅度增长比分别为65、1和2。 因此,我们开发了基于YOLOv4的模型定标技术,提出了scale -YOLOv4。 提出的变焦yolov4具有优异的性能,如下图所示。

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与其他型号的比较试验

/p> 训练 制作数据集

通过对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 imagesval: ../voc/images/val/  # 5k imagestest: ../voc/images/test/  # 20k images for submission to https://competitions.codalab.org/competitions/20794# number of classesnc: 2# class namesnames: ['aircraft', 'oiltank']

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

import osos.environ['KMP_DUPLICATE_LIB_OK']='True'

记住一定要放在最上面。

然后修改参数

将weights设置为“”parser.add_argument('--weights', type=str, default='', help='initial weights path') 将cfg设置为yolo4-p5的配置文件 parser.add_argument('--cfg', type=str, default='models/yolov4-p5.yaml', help='model.yaml path')将数据集配置为我们刚才增加的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') 改完上面的参数就可以运行。

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

测试

 打开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'")

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

打开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

下面是部分测试结果:

调试代码和数据集下载地址:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/14004297

参考:

https://zhuanlan.zhihu.com/p/298584493

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。