模型手稿

请添加图片描述

请添加图片描述
上面这个图不行,backbone得到的feature不能共用。

yolov5 6.0结构图

https://www.cxybb.com/article/flyfish1986/119332396
https://blog.csdn.net/lcb_coconut/article/details/113844456
https://www.i4k.xyz/article/flyfish1986/117594265
https://blog.csdn.net/weixin_44119362/article/details/114289607?utm_medium=distribute.wap_relevant.none-task-blog-2defaultbaidujs_title~default-0.wap_blog_relevant_pic&spm=1001.2101.3001.4242.0
SPP与SPPF其实差不多
与别的轻量化网络的对比
Focus的作用以及去掉也可以
https://newreleases.io/project/github/ultralytics/yolov5/release/v6.0
shortcut的作用以及在6.0中的改变
https://zhuanlan.zhihu.com/p/159371985

我画的结构图

有一个trick要不要实现?
在这里插入图片描述
这里裁剪的话从每张需要裁剪的地方保留一个图像的两边,这样图像的任意两边是原始的边缘,可以保证增加概率保证你的裁剪目标不被切割,导致样本难分

yolov5 6.0部署实现

定位attention

https://github.com/Caojunxu/AC-FPN

  1. 上下文提取模块(CEM),从多个感受野中探索大量上下文信息。
  2. 由于冗余的上下文关系会导致误导定位和识别,因此本文的第二个模块为注意力引导模块(AM),它利用注意力机制自适应地捕捉对物体的显著依赖。AM又由两个子模块构成,上下文注意模块(CxAM)和内容注意模块(CnAM),分别关注显著语义的捕获和精确位置的定位。最重要的是,AC-FPN可以轻易的插入到现有基于FPN的网络中。
  3. 创新点来源:

https://zhuanlan.zhihu.com/p/148444821
https://arxiv.org/abs/2005.11475

类别不平衡的训练(yolo原有的方法不太好)

https://www.cnblogs.com/xiaoheizi-12345/p/14458802.html

根据样本种类分布使用图像调用频率不同的方法解决。

Yolov5中使用如下方法解决:

model.class_weights = labels_to_class_weights(dataset.labels, nc).to(device) * nc  # attach class weights
​
cw = model.class_weights.cpu().numpy() * (1 - maps) ** 2 / nc  # class weights
iw = labels_to_image_weights(dataset.labels, nc=nc, class_weights=cw)  # image weights
dataset.indices = random.choices(range(dataset.n), weights=iw, k=dataset.n)  # rand weighted idx

别的思路:

https://www.codetd.com/article/13152569
一、数据按类别比例自动增强——保证数据分布的平衡
二、数据重采样
三、Focal loss

[借鉴一些思路]

1. SNIP与SNIPER

SNIP的做法是只对size在指定范围内的目标回传损失,即训练过程实际上只是针对某些特定目标进行,这样就能减少domain-shift带来的影响。
SNIP的网络结构如下图所示:
SNIP:尺度归一化等方法
在这里插入图片描述
但如上的做法是用图像金字塔作为模型的输入,这种做法虽然能够提高模型效果,但是计算量的增加也非常明显,因为模型需要处理每个scale图像的每个像素,SNIPER可以以适当的比例处理ground truth(称为chips)周围的上下文区域,在训练期间每个图像生成的chips的数量会根据场景复杂度而自适应地变化
模型最终只处理这些chips,而不是处理整张图像

SNIPER的思路:
把图片丢到网络中时,就会产生不同尺度的feature map。作者的想法就是在特征图上的ground truth box周围去crop一些图片,这些图片称为chips。而不是直接拿gt去做loss。

优点是确实可以减少计算量;(比如一张图片可以Crop出5个512x512的chips,而且进行3个尺度的训练,但是它的计算量只比一张800x1333的图片进行单尺度训练多出30%,要是800x1333也进行多尺度训练时,训练量可比这种方法大多了)

实验细节:
实验细节:用图像金字塔生成chips的时候,在不同scale的层上使用的ground truth box范围在[0,80²]、[32²,150²]、[120², inf]。训练RPN是为了获取negative chips。每一张图上产生的chips是不同的,如果这张图包含的目标多,产生的chips就会增多,相反则减少。

级联方式——QueryDet:用于高分辨率的快速小目标检测

QueryDet:用于高分辨率的快速小目标检测

融合

综合上述两种方式,结合YOLOV5 6.0里面的结构算法

  1. 在gt附近弄clips的思想不谋而合,不过可以补充一下RPN之后的negative。而且,SNIP的思路是在图像金字塔上做不同尺度的融合,SNIPER的进化版本跟我们的思路也一样,是在特征图上的ground truth box周围去crop一些图片。而我也是想feature上crop,至于SNIP如何针对不同分辨率挑选不同的proposal进行梯度传播,然后将其他的设置为0。即针对每一个图像金字塔的每一个尺度进行正则化表示,这一步,可以暂时不用考虑,因为这是端到端的训练方式,我们目前可以先训练出来两个网络,分别进行测试。

  2. 级联方式的考量。首先预测低分辨率特征上小物体的粗略位置,然后使用由那些粗略位置稀疏引导的高分辨率特征来计算准确的检测结果。这样,不仅可以收获高分辨率特征图的好处,而且还可以避免对背景区域进行无用的计算。
    QueryDet的pipeline。 图像被送到主干和特征金字塔网络(FPN)中,生成一系列具有不同分辨率的特征图。 从查询起始层(此图像中的P5)开始,每个层从上一层接收一组关键位置,并应用查询操作来生成稀疏值特征图。 然后,稀疏检测头和稀疏查询头会预测所检测到的下一层相应的比例和关键位置的框。
    但这样做的问题就是,我完全可以用1280x1280的yolo进行端到端的检测,根本就用不到SNIP的思想——即不同尺度单独训练、而且在特征图上得到的chips,其实就是这儿所谓的粗糙

在这里插入图片描述

  1. 由于我之前是640x640结合4K原图的方法,现在不能用4K原图的话,那就考虑用1280x1280的输入尺寸大小。

相比于QueryDet的方式,我的查询方式是更科学的,因为有gt的加持。相比于SNIPER,我的chip选择方式更容易,因为只考虑了连接部件,而不是螺栓的上下文区域,我的上下文区域更有针对性,还是因为有gt的加持。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐