一、OTA介绍
OTA源于2021年cvpr的论文,我认为就是使训练和验证的标签有着更好的对应关系,
01提出了一种基于优化策略的标签分配方式,通过最小化loss,让网络自己学习最优的标签分配方式。将真实标签(GT)看做标签(label)供应商,锚框(anchor ) 看做标签(label)的需求方。对于不同样本有不同的loss。对于正样本,将分类和回归的 loss 加权和作为传输loss 。对于负样本,传输loss就为分类 loss。
02免去了手工选定参数的方式来实现标签分配,让网络自己选择每个真实标签(GT)对应的 锚框(anchor ) 数量,而非提前设定,也能够较好的解决模棱两可的 锚框(anchor ) 分配问题,提高网络对这部分 锚框(anchor ) 的处理效果
标签分配(Label Assignment)标签分配策略是对训练过程中各个Anchor划分正负属性,并分配各自学习目标的策略方法,在整体上通过标签是否是非负即正可以分为硬标签分配和软标签分配。其中,硬标签分配可以分成静态分配策略和动态分配策略两类。
二、在yolov5中加入OTA
01-网页复制OTA源码
https://github.com/z1069614715/objectdetection_script/blob/master/yolo-improve/yolov5-OTA/loss.py
02-将OTA源码加入到utils/loss.py最后面
03-在train.py下导入ComputeLossOTA替换ComputeLoss
from utils.loss import ComputeLossOTA
在下方模型计算损失更改使用的损失compute_loss = ComputeLossOTA(model)
04-在forward过程中加入imgs
loss, loss_items = compute_loss(pred, targets.to(device),imgs)
05-在val.py文件夹下loss下面加入参数im
loss += compute_loss(train_out, targets,im)[1]
06根据报错修改loss.py下的维度
将iou.detach()替换为torch.squeeze(iou.detach())