问题背景

众所周知,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)]

模型方面的改进有点类似于TPH-YOLOv5。

图像切割

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

 # Inferencet1 = time_sync()# pred = model(img, augment=opt.augment)[0] 原始'''此处进行改进'''mulpicplus = "3"  # 1 for normal,2 for 4pic plus,3 for 9pic plus and so onassert (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) % 64if (y_real - y_startpoint) % 64 != 0:y_real = y_real - (y_real - y_startpoint) % 64dicsrc = 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_startpointpred_temp[..., 1] = pred_temp[..., 1] + x_startpointif i == 0 and j == 0:pred = pred_tempelse: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针对小目标检测的改进模型/添加帧率检测相关推荐

  1. YOLOV5 的小目标检测网络结构优化方法汇总(附代码)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨南山 来源丨 AI约读社 YOLOv5是一种非常受欢迎的单阶段目标检测,以其性能和速度著称,其结 ...

  2. 目标检测论文解读复现之十六:基于改进YOLOv5的小目标检测算法

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

  3. YOLOv5增加小目标检测层

    采用增加小目标检测层的方式来使YOLOv5能够检测小目标,只需要修改models下的yaml文件中的内容即可. 主要改变如下: 原yaml: # parameters nc: 80 # number ...

  4. 【CV】小目标检测问题中“小目标”如何定义?其主要技术难点在哪?

    前言: 目标检测是计算机视觉领域中的一个重要研究方向,同时也是解决分割.场景理解.目标跟踪.图像描述和事件检测等更高层次视觉任务的基础.在现实场景中,由于小目标是的大量存在,因此小目标检测具有广泛的应 ...

  5. 初学者必看,提供海星检测项目从零开始小目标检测sota算法(ppyoloe-sod)

    我以我的一个项目进行介绍,各位如果想运行这些程序的话,可以跳转到相应的百度的页面,我放到底下啦.基于ppyoloe-sod海星目标检测(小目标检测) - 飞桨AI Studio 0 赛事背景说明 澳大 ...

  6. 目标检测(降低误检测率及小目标检测系列笔记)

    深度学习中,为了提高模型的精度和泛化能力,往往着眼于两个方面:(1)使用更多的数据(2)使用更深更复杂的网络. ** 一.什么是负样本 ** 负样本是指不包含任务所要识别的目标的图像,也叫负图像(Ne ...

  7. 摄像头图像分析目标物体大小位置_小目标检测的增强算法

    版权声明:本文来源 程序媛的小世界https://zhuanlan.zhihu.com/p/135397874 Augmentation for small object detection 摘要 近 ...

  8. 解决目标检测中的小目标问题

    <解决目标检测中的小目标问题>   目标检测的前身是滑窗 + 图像分类,如果想要对图像进行鲁棒的分类,首先特征要能够覆盖整幅图像,而且编码的前景信息要比噪声背景信息更加显著.这对于小目标来 ...

  9. 【深度学习】解决物体检测中的小目标问题

    为了提高模型在小物体上的性能,我们建议使用以下技术: 提高图像捕获分辨率 提高模型的输入分辨率 平铺图像 通过扩充生成更多数据 自动学习模型锚 过滤掉多余的类 为什么小目标问题很难? 小物体问题困扰着 ...

最新文章

  1. Docker安装Apache与运行简单的web服务——httpd helloworld
  2. Struts2防止表单重复提交
  3. python版权问题_关于版权问题 · Issue #62 · hankcs/HanLP · GitHub
  4. MySQL中B-tree索引和Hash索引区别
  5. 《悦趣式连锁反应》玩转STEM教育!529块积木元件,N+1款炫酷模型
  6. 弹性式分布数据集RDD——Pyspark基础 (二)
  7. 【面试题22】栈的压入、弹出序列
  8. centos mysql phpmyadmin_CentOS下phpMyAdmin安装
  9. 数字经济时代,企业的核心竞争力究竟是什么?
  10. mysql 时间毫秒值_MySQL存储毫秒数据的方法
  11. Git报错:another git process seems to be running in this repository
  12. 客户细分_客户细分初学者指南
  13. win10的键盘肆无忌惮的乱输入某个字母
  14. 为什么人脸识别系统总是认错黑人?
  15. 数据禾|2020年江苏省土地利用数据(矢量)
  16. SQL 笔记总结-转载
  17. JAVA 爬虫 抖音视频
  18. JsonMappingException Infinite recursion StackOverflowError
  19. Mask RCNN 魔方颜色块识别
  20. 最近在某外卖平台上点了一份米粉加了份青菜

热门文章

  1. Python 下载文件获取文件名request.get(...,stream=True)
  2. Python OCR识别图片验证码(二)
  3. python调用打印机打印pdf_python连接打印机实现打印文档、图片、pdf文件等功能
  4. 用python批量插入数据到数据库中
  5. 安卓内存优化-bitmap优化
  6. 【平台介绍】元古数字藏品平台即将正式上线
  7. 电力系统利用远程智能电能表实现远程集抄
  8. 全球与中国植物培养箱市场现状及未来发展趋势(2022)
  9. oracle系统表空间和自定义表空间
  10. 数据模型:概念数据模型,逻辑数据模型,物理数据模型