2021.8.24
效果还是可以的,公司楼下:

一、简述

针对YOLOV5小目标识别部分做了算法改进:
1.修改了MODEL,增加了小目标检测层
2.修改了detect.py,增加了分割检测模块,以时间换准确度。

代码已上传到GITHUB:
https://github.com/Hongyu-Yue/yoloV5_modify_smalltarget

思路主要参考引用了两个文章,如下:
修改检测层
http://www.qishunwang.net/news_show_12005.aspx
修改detect.py
https://zhuanlan.zhihu.com/p/172121380

二、MODEL修改

主要修改了检测层和检测框

# parameters
nc: 1  # 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)]

增加了一个检测框,这个感觉意义不大,YOLO本身也有自适应框。

主要是参考上面网页中的方式,为小目标检测专门的增加了几个特征提取层:
在第17层后,继续对特征图进行上采样等处理,使得特征图继续扩大,同时在第20层时,将获取到的大小为160X160的特征图与骨干网络中第2层特征图进行concat融合,以此获取更大的特征图进行小目标检测。

原文提到在增加检测层后,带来的问题就是计算量增加,导致推理检测速度降低。不过对于小目标,确实有很好的改善。
不过实测来看对计算量增加的比较有限,效果有些许改善,还算值得。

三、代码修改

主要针对了detect.py做了修改,增加了图像切割层。
主要思路就是在目标分辨率太大的情况下,将目标图像分解为数个图像送入YOLOV5网络中做检测,再回收所有图像,计算坐标的相对值,集体来一次NMS。
引用作者原文如下:

小目标检测效果不好主要原因为小目标尺寸问题。
以网络的输入608608为例,yolov5中下采样使用了5次,因此最后的特征图大小是1919,3838,7676。
三个特征图中,最大的7676负责检测小目标,而对应到608608上,每格特征图的感受野是608/76=8*8大小。
即如果原始图像中目标的宽或高小于8像素,网络很难学习到目标的特征信息。
另外很多图像分辨率很大,如果简单的进行下采样,下采样的倍数太大,容易丢失数据信息。但是倍数太小,网络前向传播需要在内存中保存大量的特征图,极大耗尽GPU资源,很容易发生显存爆炸,无法正常的训练及推理。
这种情况可以使用分割的方式,将大图先分割成小图,再对每个小图检测,可以看出中间区域很多的汽车都被检测出来:

不过这样方式有优点也有缺点: 优点:准确性 分割后的小图,再输入目标检测网络中,对于最小目标像素的下限会大大降低。
比如分割成608608大小,送入输入图像大小608608的网络中,按照上面的计算方式,原始图片上,长宽大于8个像素的小目标都可以学习到特征。
缺点:增加计算量 比如原本19201080的图像,如果使用直接大图检测的方式,一次即可检测完。
但采用分割的方式,切分成4张912
608大小的图像,再进行N次检测,会大大增加检测时间。

分割并分别检测的代码功能块如下所示,
全部代码见github:

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]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)# Apply NMSpred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)

四、运行结果

修改前:

修改后:


效果还是非常明显的,我这个DEMO图是将原图分成了3*3个子图,送到修改后的MODEL中去做的检测,在算力足够的情况下,确实可以有效改善小目标检测的效果。

算力不够怎么办?
建议可以使用更小的YOLO网络,并且将分成33改为分成22,可以测试一下,看看效果和直接使用大网络比哪个好。

YOLOV5 模型和代码修改——针对小目标识别相关推荐

  1. YOLOV5 模型和代码修改——针对小目标识别(红外小目标)

    一.简述 最近忙于各种奇奇怪怪的杂事,仔细一看居然有四个月没有写微博了,罪恶-- 这次主要是针对航拍的红外图像做定向识别,项目实际识别目标由于保密的原因不能展示,博客里面仅用车辆和行人进行说明. 红外 ...

  2. 【目标检测】YOLOv5针对小目标检测的改进模型/添加帧率检测

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

  3. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  4. [深度学习] 基于切片辅助超推理库SAHI优化小目标识别

    对象检测是迄今为止计算机视觉中最重要的应用领域.然而,小物体的检测和大图像的推理仍然是实际使用中的主要问题,这是因为小目标物体有效特征少,覆盖范围少.小目标物体的定义通常有两种方式.一种是绝对尺度定义 ...

  5. 基于Caffe格式部署YOLOV5模型

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 [导语]本文为大家介绍了一个caffe部署yolov5 模型的教程,并开源了全部代码.主要是教你如何搭 ...

  6. 华为Atlas500 yolov5模型部署全流程

    python3.7.5安装(装在usr/local 以后复制到home目录) 检查系统是否安装python依赖以及gcc等软件. 分别使用如下命令检查是否安装gcc,make以及python依赖软件等 ...

  7. 【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)

    目录 0.前言 1.我的环境 2.整个流程 3.具体过程 3.1 训练自己的yolov5模型 3.2 将.pt模型转换为.onnx模型 3.3 在本地将.onnx转换成IR模型 3.4 在树莓派4B上 ...

  8. deepstream学习笔记(三):deepstream-imagedata-multistream解析与接入适配yolov5模型测试

    引言 上一节重点介绍了gstreamer架构图与各部分组成原理说明,并且针对deepstream-test1介绍了它的整体功能和画出了管道图,本篇博文将详细介绍deepstream-imagedata ...

  9. 使用YOLOv5模型进行目标检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈信达,华北电力大学,Datawhale成员 目标检测是计算机视觉 ...

最新文章

  1. IBMDB2数据库软件安装教程
  2. STM32F0xx_EXIT中断配置详细过程
  3. 数据监测驱动下的信息流广告优化
  4. 4 命名规则_赛普拉斯(Cypress)存储器芯片命名规则
  5. C 语言程序设计基础不好,想10天考国二C语言程序设计证书,可能吗?
  6. 推荐一款生信分析工具的集大成者
  7. mysql 5.6.26 驱动_mysql版本引起的驱动问题
  8. 丁腈橡胶自然老化时间_氙灯老化试验箱和紫外光老化试验箱的区别
  9. 学会这些知识普通人也能财务自由
  10. Q1财报蛋壳公寓再亏损:盈利死穴如何破?
  11. php 和风天气,为博客添加实时天气功能(和风天气、中国气象、心知天气)
  12. UEBA架构设计之路4:异常、威胁指标和威胁
  13. 我数星星...宝宝,你智商差点,就数月亮吧
  14. HTML网页设计作业个性潮流服装商城模板
  15. mysql 删除时间一个星期_2020春招必备:MySQL(20)与Redis(20),不看答案能答对几道?
  16. Python 随机提取Excel中部分数据并输出为新表格
  17. 使用Tableau对综测成绩进行可视化数据分析
  18. 使用UltraISO制作ubuntu安装u盘启动盘图文教程(转)
  19. 在类树莓派的ARM开发板上组建大数据集群
  20. 设置计算机关机时间快捷键,怎么让电脑定时关机设置大全

热门文章

  1. FFmpeg源码分析:avformat_open_input()打开媒体流
  2. 曲鸟全栈UI自动化教学(五):Selenium的键盘鼠标事件详解
  3. 【Parsec】笔记本远程连接主机,Parsec+ZeroTier,解决公网ip问题,校园网可用
  4. Flink知识点总结 Flink简介
  5. TensorFlow中张量,变量、常量、占位符概念
  6. 数学建模(九)决策论建模
  7. 一步步地分析排序——归并排序
  8. direct9.0b 下载地址
  9. 2021年中国牛奶产业发展环境(PEST)分析:牛奶需求量在上升[图]
  10. 易灵思FPGA---LVDS资源使用