目标识别yolov5针对小目标检测的改进模型/添加帧率检测(代码片段)

zstar-_ zstar-_     2022-11-29     814

关键词:

问题背景

众所周知,YOLOv5会对输入的图片进行放缩,并进行32倍下采样。对于一些分辨率很高的遥感/无人机图片,小目标难以被训练识别。
本篇博文就来尝试这篇博文YOLOV5 模型和代码修改——针对小目标识别所提到的一种改进方案。

我所使用的是YOLOv5-5.0版本,数据集采用VisDrone数据集。

检测头改进

模型方面的修改:作者再模型上增加了一个更小的Anchor并添加了一些检测层。
yolov5l_modify.yaml

# parameters
nc: 10  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

# anchors
anchors:
  - [5,6, 8,14, 15,11]  #4
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],   #160*160
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],  #80*80
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]], #40*40
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9   20*20
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],  #20*20
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #40*40
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4  40*40
   [-1, 3, BottleneckCSP, [512, False]],  # 13     40*40

   [-1, 1, Conv, [512, 1, 1]], #40*40
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3   80*80
   [-1, 3, BottleneckCSP, [512, False]],  # 17 (P3/8-small)  80*80

   [-1, 1, Conv, [256, 1, 1]], #18  80*80
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #19  160*160
   [[-1, 2], 1, Concat, [1]], #20 cat backbone p2  160*160
   [-1, 3, BottleneckCSP, [256, False]], #21 160*160

   [-1, 1, Conv, [256, 3, 2]],  #22   80*80
   [[-1, 18], 1, Concat, [1]], #23 80*80
   [-1, 3, BottleneckCSP, [256, False]], #24 80*80

   [-1, 1, Conv, [256, 3, 2]], #25  40*40
   [[-1, 14], 1, Concat, [1]],  # 26  cat head P4  40*40
   [-1, 3, BottleneckCSP, [512, False]],  # 27 (P4/16-medium) 40*40

   [-1, 1, Conv, [512, 3, 2]],  #28  20*20
   [[-1, 10], 1, Concat, [1]],  #29 cat head P5  #20*20
   [-1, 3, BottleneckCSP, [1024, False]],  # 30 (P5/32-large)  20*20

   [[21, 24, 27, 30], 1, Detect, [nc, anchors]],  # Detect(p2, P3, P4, P5)
  ]

模型方面的改进我感觉作用不大,因为默认情况下Anchor是通过K-means聚类计算得到的,其它检测层是否有效也很难判断。

图像切割

作者在检测的时候(detect.py)增加了一个图像切分的步骤,即将大图切分成各个小块,分别进行检测,然后再进行融合。
增加的代码如下:

 # Inference
 t1 = time_sync()
 # pred = model(img, augment=opt.augment)[0] 原始

 '''
 此处进行改进
 '''
 mulpicplus = "3"  # 1 for normal,2 for 4pic plus,3 for 9pic plus and so on
 assert (int(mulpicplus) >= 1)
 if mulpicplus == "1":
     pred = model(img,
                  augment=augment,
                  visualize=increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False)[0]
 else:
     xsz = img.shape[2]
     ysz = img.shape[3]
     mulpicplus = int(mulpicplus)
     x_smalloccur = int(xsz / mulpicplus * 1.2)
     y_smalloccur = int(ysz / mulpicplus * 1.2)
     for i in range(mulpicplus):
         x_startpoint = int(i * (xsz / mulpicplus))
         for j in range(mulpicplus):
             y_startpoint = int(j * (ysz / mulpicplus))
             x_real = min(x_startpoint + x_smalloccur, xsz)
             y_real = min(y_startpoint + y_smalloccur, ysz)
             if (x_real - x_startpoint) % 64 != 0:
                 x_real = x_real - (x_real - x_startpoint) % 64
             if (y_real - y_startpoint) % 64 != 0:
                 y_real = y_real - (y_real - y_startpoint) % 64
             dicsrc = img[:, :, x_startpoint:x_real,
                      y_startpoint:y_real]
             '''
             可选,查看切片图片内容
             img2 = dicsrc.squeeze(0).cpu().numpy()
             img2 = img2.transpose((1, 2, 0))
             cv2.imshow('123', img2)
             cv2.waitKey(1)  
             '''
             pred_temp = model(dicsrc,
                               augment=augment,
                               visualize=increment_path(save_dir / Path(path).stem,
                                                        mkdir=True) if visualize else False)[0]
             pred_temp[..., 0] = pred_temp[..., 0] + y_startpoint
             pred_temp[..., 1] = pred_temp[..., 1] + x_startpoint
             if i == 0 and j == 0:
                 pred = pred_temp
             else:
                 pred = torch.cat([pred, pred_temp], dim=1)

代码中注释的部分可将切割的图片可视化展示。

效果检测

为了检测这样做是否有效,我使用改进前的YOLOv5l模型和改进后的YOLOv5l模型对VisDrone数据集训练100个epoch,并挑选了VisDrone测试集中的两张角度较高的图片进行检测,结果如下:

左侧是改进前,右侧是改进后:


通过对比发现两者实际上并没有太大的差异,可能是由于VisDrone数据集拍摄高度还是比较低,无法显示出效果,有待尝试更高分辨率的图片。

帧率检测

在尝试视频检测时,我想到如果能在输出视频中显示帧率就好了。
要实现这个功能只需要在detect.py中插入

# 函数开头插入
tt = time.time()
....

# 添加帧率检测
cv2.putText(im0, "FPS::.1f".format(1. / (time.time() - tt)), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 235), 4)
tt = time.time()

# 插入在这个位置
if save_img:
	...

代码备份

改进后的代码:https://www.aliyundrive.com/s/SyPtH4N2jcD

yolov5改进助力涨点

...塔网络结构(最新论文改进方法)📃增加小目标检测层,提高模型对小目标物体的识别能力🏀对模型进行轻量化处理🚩更换YOLOv5主干网络🕐.........(后续待更)😜YOLOv5基础网络结构 查看详情

目标检测tph-yolov5:基于transformer的改进yolov5的无人机目标检测(代码片段)

简介最近在使用VisDrone作为目标检测任务的数据集,看到了这个TPH-YOLOv5这个模型在VisDrone2021testset-challenge数据集上的检测效果排到了第五,mAP达到39.18%。于是开始阅读它的论文,并跑一跑的它的代码。论文地址:ht... 查看详情

python基于融合spd-conv改进yolov5与原生yolov5模型实践路面裂痕裂缝检测

SPD-Conv源于2022年一篇专门针对于小目标和低分辨率图像研究提出来的新技术,可以用于目标检测任务,能够一定程度提升模型的检测效果,今天正好有时间就想基于SPD融合yolov5s模型来开发路面裂痕裂缝检测模型,... 查看详情

目标检测yolov5遇上知识蒸馏(代码片段)

前言模型压缩方法主要4种:网络剪枝(Networkpruning)稀疏表示(Sparserepresentation)模型量化(Modelquantification)知识蒸馏(Konwledgedistillation)本文主要来研究知识蒸馏的相关知识,并尝试用知识蒸馏的方法对YOLOv5进行改进。知识蒸馏理... 查看详情

yolov5+gsconv:基于yolov5gsconv得小目标检测算法训练

目标检测是计算机视觉中一项艰巨的下游任务。对于车载边缘计算平台,大模型很难达到实时检测的要求。而且,由大量深度可分离卷积层构建的轻量级模型无法达到足够的准确性。因此本文引入了一种新方法GSConv来减轻模型的... 查看详情

用安卓手机解锁目标检测模型yolov5,识别速度不过几十毫秒!(代码片段)

丰色发自凹非寺量子位报道|公众号QbitAI现在,目标检测界明星模型YOLO,最新v5版本也可以在手机上玩儿了!瞧~只需要区区几十毫秒,桌上的东西就全被检测出来了:这速度似乎不比电脑差?想要亲手... 查看详情

目标检测算法——yolov5/yolov7改进之结合spd-conv(低分辨率图像和小目标涨点明显)

>>>深度学习Tricks,第一时间送达<<<目录 查看详情

目标检测yolov5分离检测和识别(代码片段)

前言YOLO作为单阶段检测方法,可以直接端到端的输出目标对象位置和类别,而在一些大型无人机遥感等目标检测任务中,使用单阶段检测往往会产生类别预测错误的问题。正好,YOLOv5-6.2版本提供了一个图像分类... 查看详情

目标检测yolov5:模型构建解析(代码片段)

前言最近在看一些目标检测的最新论文和代码,大多数都是在YOLOv5的基础上进行魔改。改的最多的基本是原版本的网络结构,这篇博文就从源码角度来解析YOLOv5中,模型是如何构建出来的。本文使用的是YOLOv5-5.0版本... 查看详情

详细解读tph-yolov5让目标检测任务中的小目标无处遁形

参考技术A1简介针对无人机捕获场景的目标检测是最近比较流行的一项任务。由于无人机在不同高度飞行,目标尺度变化较大,这样给模型的优化也带来了很大的负担。此外,在无人机进行高速低空飞行时,也会带来密集目标的... 查看详情

快速入门yolov5目标检测算法(代码片段)

文章目录一、YOLOv5简介二、网络结构1、Input2、Backbone3、Neck4、Head三、改进方法1、自适应锚框计算2、自适应灰度填充四、性能表现五、YOLOv5入门实战一、YOLOv5简介YOLOv5是一个在COCO数据集上预训练的物体检测架构和模型系列,... 查看详情

目标检测论文解读复现之八:基于yolov5s的滑雪人员检测研究

前言   此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新... 查看详情

yolov5小目标检测(方法与评价)

问题:当我们在对小目标数据集进行检测时,发现无论如何都有一些漏检的,其中我们也添加一些模块,以及其他的一些改进方法,如注意力、激活函数等等,结果始终不会令人满意,map也没有丝毫的... 查看详情

目标检测yolov5改进系列:主干网络中添加se注意力机制网络

写在前面:首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。1.SEnet介绍CNN网络中,图像或者说特征图FeatureMap的特征主要... 查看详情

深度学习目标检测---使用yolov5训练自己的数据集模型(windows系统)(代码片段)

...看一些视频教程和一些前辈的博客,实现了深度学习目标检测--使用yolov5网络训练自己的数据集并实现了对目标的识别。这篇博客我也是参考别人的博客教程,复现了使用yolov5训练自己的数据集,我呢主要是想记录下... 查看详情

模式识别:动物目标检测——yolov5开发(代码片段)

智能畜牧电网(目标检测部分)----开发文档一、项目背景:在畜牧业和养殖业发达的农村地带,经常出现狐狸和黄鼠狼这类野兽偷吃家禽,给农民的养殖生产带来困难的同时,经济上也造成了很大的损失... 查看详情

基于yolov5的水下海洋目标检测

摘要:水下海洋目标检测技术具有广泛的应用前景,可以用于海洋环境监测、海洋资源开发、海洋生物学研究等领域。本文提出了一种基于YOLOv5的水下海洋目标检测方法,使用数据增强方法进行了大量实验,并与... 查看详情

目标检测论文解读复现no.25基于改进yolov5的地铁隧道附属设施与衬砌表观病害检测方法

前言此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标... 查看详情