目录
算法介绍
OneNet算法的优点:
1):全卷积,端到端,没有ROI 操作,也没有 attention 机制
2):标签分配是通过最小代价策略,不需要复杂的人工设计或者启发
3):没有任何后处理,比如:NMS, max-pooling等
要点1:
以前的大部分网络只根据 proposal 和 GT 之间的 location cost 来进行打标签,比如 box IOU 或这 point distance. 并没有引入 classification cost. 这会导致前向推理时会产生大量的高分冗余框,所以需要NMS进行后处理。
要点2:
基于 box IOU 或者 Point distance 方式进行标签分配的算法都会面临:多对一的情况,即一个GT对应多个 positive sample。
要点3:
作者提出 Minimum Cost Assignment [最小代价分配策略], 即 classification cost + location cost 最小的 sample 标记为 positive sample, 剩余的为 negtive sample。
Location cost:
Minimum cost: 增加了一项:分类损失
伪代码:
要点4:
网络结构简单直观:backbone下采样,FPN上采样,只在下采样4次的feaure map上进行结果的预测。
同时文中也提供了多头训练结构:
比较有意思的结论是:单单使用多头训练,并不会提升精度。。。感觉有点意外,作者说如果多头训练,必须增大学习率才可能提升精度。。。单头训练增大学习率反而可能会造成精度下降。。。
最后看一下实验对比:
1:与centerNet 对比,感觉没有优势。。。为了追平AP,输入的尺度放大了。。。
2:好在结构简单,没有什么太多奇怪的东西
算法训练
我是训练自己的VOC格式的数据,简单记录一下
1:安装,参考https://github.com/PeizeSun/OneNet 官方的readme即可
2:模型下载:直接下载百度云链接即可,里面包含了R18_dcn, R18_nodcn, ResNet-18.pk预训练模型
3:准备数据。创建VOC2007文件夹,并将自己的VOC数据路径软链接过来
cd datasets
mkdir VOC2007
ln -s /path_to_your_voc/Annotations Annotations
ln -s /path_to_yout_voc/MainSets MainSets
ln -s /path_to_your_voc/JPEGImages JPEGImages
4:修改训练配置文件: OneNet/projects/OneNet/configs/onenet.res18.nodcn.yaml
5: 调整训练数据类别:OneNet/detectron2/data/datasets/pascal_voc.py,更改为自己的数据类别
6:调整解析代码,防止自己的train.txt中有特殊字符,比如# $ 等。OneNet/detectron2/data/datasets/pascal_voc.py
7: 跳过没有包含的类别:OneNet/detectron2/data/datasets/pascal_voc.py
8:训练
python projects/OneNet/train_net.py --num-gpus 1 --config-file projects/OneNet/configs/onenet.res18.nodcn.yaml
9:目前还在训练,还不能测试其具体效果,所以先简单的总结一下训练感受:
YOLOv5-s OneNet
Batch_size 16 16
Input_size 1024*1024 多尺度
epochs 80 300
(1):显存占用大,同样batch_size = 16, YOLOv5-s的训练图像大小是1024*1024,显存占用7.7G,而OneNet训练的图像小,但显存几近12G了。。。
(2):显存利用率低,YOLOv5-s能几近100%, 而OneNet 间断性的0-75%
(3):训练时间稍长,YOLOv5-s,80epoch耗时16.7h。 OneNet,300epoch耗时3 days。
终于训练完了。。。
YOLOv5-s: 看起来,还没有完全收敛,还有继续提升的空间。
OneNet:看起来也还有指标提升的空间,可就是慢。。。