目录
前言
这是一个kaggle上的目标检测竞赛: Help Protect the Great Barrier Reef
赛题目标:建立一个根据珊瑚礁水下视频训练的目标检测模型,实时准确地识别海星
本文将介绍一下yolov5的网络结构和原理,并将其运用到这个赛题的解决上。
一、YOLOv5
YOLOv5项目的作者是Glenn Jocher,也不是原Darknet项目的作者Joseph Redmon。并且这个项目至今都没有发表过正式的论文。
网络的大体结构与YOLOv3相似1。
SPPF
1)空间金字塔池化(Spatial Pyramid Pooling, SPP)
之前介绍过ROI pooling,作用是将不同尺寸的输入统一为相同尺寸的输出,这里的SPP效果也差不多(ROI是受SPP启发提出的):将不同尺寸的输入化为相同维度的向量输出。
以下图为例,一张图片输入,我们将它分别划分为
16
×
16
,
4
×
4
,
1
×
1
16\times 16,4\times 4,1\times 1
16×16,4×4,1×1块,对每一块提取256维的特征,最后将特征拼在一起,这样就得到一个
21
×
256
21\times 256
21×256维的输出。
2)SPP
这一小节的SPP与上面的SPP略有不同,受上面的SPP的启发,YOLOv3有一个SPP版本,效果有所提升。
SPP就是将特征层分别通过一个池化核大小为5x5、9x9、13x13的最大池化层,然后在通道方向进行concat拼接在做进一步融合,这样能够在一定程度上解决目标多尺度问题,如下图所示。它和ROI Pooling效果类似,都能将不同的输入
3)SPPF
YOLOv5 中对SPP进行了改进,两者的作用和输出是一模一样的,但是SPPF效率更高。其原理是串行两个5x5大小的MaxPool层是和一个9x9大小的MaxPool层计算结果是一样的,串行三个5x5大小的MaxPool层是和一个13x13大小的MaxPool层计算结果是一样的。
用串行的几个5x5MaxPool层代替了原来的结构,避免了冗余计算,运算速度能提高两倍以上1。
数据增强
-
Mosaic
将四张图片拼成一张图片
1)增加数据多样性
2)增加目标个数
3)BN能一次统计到更多图片的参数 -
Copy paste
将部分目标随机的粘贴到图片中,前提是数据要有segments数据才行,即每个目标的实例分割信息。 -
Random affine(Rotation, Scale, Translation and Shear)
随机进行仿射变换,但根据配置文件里的超参数发现只使用了Scale和Translation即缩放和平移。 -
Random horizontal flip
随机水平翻转 -
Augment HSV(Hue, Saturation, Value)
随机调整色度,饱和度以及明度。 -
MixUp
就是将两张图片按照一定的透明度融合在一起,具体有没有用不太清楚,毕竟没有论文,也没有消融实验。代码中只有较大的模型才使用到了MixUp,而且每次只有10%的概率会使用到。
二、实战代码
YOLOv5的代码作者开源在GitHub上。预训练模型有不同的规模,规模越大一般来说精度越高,考虑到算力限制和数据集大小我们这里选择轻量级的YOLOv5s。
依旧是白嫖kaggle的算力,由于代码比较长,就不一点一点贴上来了,放在这里。下面主要讲讲代码的大致内容和在这个过程中遇到的问题以及学习到的东西。
1)代码结构
- 数据预处理
训练集由三段视频构成,一共有23501张图片,其中只有4917张有标注信息(有CTOS)。 - 数据读入
- YOLO训练
- 推理
2)边界框格式及损失指标
3)代码问题及解决
参考:
csdn:https://blog.csdn.net/qq_56591814/article/details/127083901
runtime error
https://blog.csdn.net/weixin_62375097/article/details/128961368