2023.4.20Pytorch用SSD训练自己的数据集
1、【Pytorch 搭建自己的SSD目标检测平台(Bubbliiiing 深度学习 教程)】 https://www.bilibili.com/video/BV1A7411976Z/?share_source=copy_web&vd_source=1e6f2281c23ca69b18df2d7768310983
笔记
2.2 SSD源码解析(Pytorch)
2、SSD网络的搭建
(1)推荐看up主之前的6.1ResNet网络结构和6.2使用Pytorch搭建ResNet并基于迁移学习训练
(2)python语法中对于索引是左闭右开的
(3)非关键字参数
3、Default box生成
计算时用的相对坐标。
4、Loss计算
(1)负样本的获取
对除正样本之外的default box计算highest confidence loss ,下面就是获取分类损失最大的两个default box的算法过程。
[0.3,0.1,……]是对应的分类损失,对其进行降序排列,获得索引[3,0,4,……],在对该索引进行升序排列,得到索引的索引[1,3,4,……],因为是取最大的2个,所以进行判断,得到[True,False,……],对比第一个列表和第四个列表,可以看到True对应的位置正好是损失最大的两个。即可获得获取分类损失最大的两个default box作为负样本。

5、后处理算法
(1)Batch NMS筛除低质量的框
原本筛框是对每一类的框分别进行NMS算法筛除,但是这样算法效率会比较低,根据pytorch官方给的可以进行如下操作:
如下第一行数值为四个框的左上角和右下角坐标,第二行为四个框的类别label。
第一步:找到所有坐标的最大值(0.6)
第二步:获得一个新的列表,列表数值为(max=0.6)
即[0,0,1.6,1.6]
第三步:让对应框的坐标加上上述列表数值,如[0.1,0.1,0.3,0.3]变为[0.1,0.1,0.3,0.3];[0.4,0.1,0.5,0.2]变为[2,1.7,2.1,1.8],即可将不同类的框分开
第四步:进行NMS处理


6、正负样本匹配
SSD正样本选取:(1)对每一个GT box找IOU最大的default box作为正样本;(2)对每一个default box,如果其与任意一个GT box的IOU的值大于0.5则认为为正样本。
如下表格是每一个default box与每一个GT box的IOU值。
算法步骤:
第一步:对于每一个DBox找IOU最大的GT(best_dbox_ious),并记录对应GT的索引(best_dbox_idx)

第二步:对于每一个GT找IOU最大的DBox(best_bbox_ious),并记录对应DBox的索引(best_bbox_idx)

第三步:将对应best_bbox_idx中索引位置的best_dbox_ious处的值变为2(只要比0.5大即可)

第四步:idx生成一个列表[0,1,2],根据best_dbox_idx[best_bbox_idx[idx]]=idx,得到best_dbox_idx:[0,2,1,2,2]
这里是在根据best_bbox_idx修正DBox匹配的GT,比如在第一步DBox0匹配的是GT1,但在第二步GT0匹配到了DBox0,所以根据(1)对每一个GT box找IOU最大的default box作为正样本;应该将DBox0匹配给GT0,据此可进行修改。

感觉很神奇的样子,我还没搞懂内部逻辑,有没有人能解答一下?
Pytorch 搭建自己的SSD目标检测平台(Bubbliiiing 深度学习 教程)
P9:Dataset2(训练必看)数据集制作
自己制作标签,用到labelimg

学到了,不要乱改和要细心……用SSD训练自己的数据集的时候因为JPEGImages和JPEGlmages,硬是找了三个小时才发现这个错误……