本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github,删减了源码中部分内容,满足个人科研需求。
本篇文章在YOLOv5
算法实现的基础上,进一步完成YOLOv7
算法的实现。YOLOv7
相比于YOLOv5
,最主要的不同之处如下:
模型结构
:引进了更为高效的特征提取模块(ELAN
)、下采样模块(MP
),不同的空间池化层(SPPCSPC
),重参数卷积(RepConv
)正样本匹配
:结合YOLOv5
中和正样本匹配方法和YOLOX
中的正样本筛选方法(SimOTA
)
文章地址:
YOLOv7算法实现(一):模型搭建
YOLOv7算法实现(二):正样本匹配(SimOTA)与损失计算
0 引言
YOLOv7
中的正样本匹配在YOLOv5
的正样本匹配基础上进一步通过SimOTA
对正样本进行筛选,损失计算流程如图1所示。
1 正样本匹配
YOLOv5
的正样本匹配方法可见文章YOLOv5算法实现(四):损失计算。在YOLOv5
正样本匹配方法中,在每一个feature_map
上,根据目标中心点所在位置至多使用三个预测单元
对目标进行匹配,在每一个预测单元
中,根据宽高比至多使用三个Anchor
对目标进行匹配,因此经过YOLOv5
正样本匹配后,一个目标至多得到27个匹配样本。
SimOTA
正样本筛选流程如下:
- 计算实际目标
nt
与匹配样本nt_n
的IoU损失:
p a i r _ w i s e _ i o u _ l o s s = − log ( i o u ) pair\_wise\_iou\_loss = - \log (iou) pair_wise_iou_loss=−log(iou) - 计算实际目标
nt
与匹配样本nt_n
的类别交叉熵损失:
p a i r _ w i s e _ c l s _ l o s s = − y log ( σ ( y p r e d ) ) − ( 1 − y ) log ( σ ( 1 − y p r e d ) ) pair\_wise\_cls\_loss = - y\log (\sigma ({y_{pred}})) - (1 - y)\log (\sigma (1 - {y_{pred}})) pair_wise_cls_loss=−ylog(σ(ypred))−(1−y)log(σ(1−ypred)) - 根据IoU损失总和确定每一个实际目标
nt
的dynamic_k
(每一个nt
匹配的样本数量) - 计算匹配样本总损失:
p a i r _ w i s e _ l o s s = p a i r _ w i s e _ c l s _ l o s s + 3 p a i r _ w i s e _ i o u _ l o s s pair\_wise\_loss = pair\_wise\_cls\_loss + 3pair\_wise\_iou\_loss pair_wise_loss=pair_wise_cls_loss+3pair_wise_iou_loss - 根据总损失和
dynamic_k
对匹配的正样本进行筛选
假设某目标(类别为3)在某训练批次中得到了7个匹配结果,其SimOTA
正样本筛选示例如图2所示。
2 损失计算
YOLOv7
中损失计算方式与YOLOv5
一致,包含以下三个部分:
位置损失(仅计算正样本)
:
I o u L o s s = 1 − C I o U IouLoss = 1 - CIoU IouLoss=1−CIoU
类别损失(仅计算正样本)
:
C l s L o s s = ∑ i = 0 n f { 1 n ∑ j = 0 n [ 1 n c ∑ k = 0 k = n c ( y log ( σ ( p ) ) + ( 1 − y ) log ( 1 − σ ( p ) ) ) ] } ClsLoss = \sum\limits_{i = 0}^{nf} {\{ {1 \over n}\sum\limits_{j = 0}^n {[{1 \over {nc}}\sum\limits_{k = 0}^{k = nc} {({y}} } } \log (\sigma ({p})) + (1 - {y})\log (1 - \sigma ({p})))]\} ClsLoss=i=0∑nf{ n1j=0∑n[nc1k=0∑k=nc