关键词:
问题背景
众所周知,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的地铁隧道附属设施与衬砌表观病害检测方法
前言此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标... 查看详情