欢迎光临散文网 会员登陆 & 注册

2023.4.20Pytorch用SSD训练自己的数据集

2023-04-22 15:21 作者:一定要催我去学习  | 我要投稿

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作为负样本。

获取分类损失最大的两个default box的算法过程

5、后处理算法

(1)Batch NMS筛除低质量的框

原本筛框是对每一类的框分别进行NMS算法筛除,但是这样算法效率会比较低,根据pytorch官方给的可以进行如下操作:

如下第一行数值为四个框的左上角和右下角坐标,第二行为四个框的类别label。

第一步:找到所有坐标的最大值(0.6)

第二步:获得一个新的列表,列表数值为label%5Ctimes%20(1%2Bmax)(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)

对于每一个DBox找IOU最大的GT,并记录对应GT的索引

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

对于每一个GT找IOU最大的DBox,并记录对应DBox的索引

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

将对应best_bbox_idx中索引位置的best_dbox_ious处的值变为2

第四步: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,据此可进行修改。

根据best_bbox_idx修正DBox匹配的GT

感觉很神奇的样子,我还没搞懂内部逻辑,有没有人能解答一下?

Pytorch 搭建自己的SSD目标检测平台(Bubbliiiing 深度学习 教程)

P9:Dataset2(训练必看)数据集制作

自己制作标签,用到labelimg

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

2023.4.20Pytorch用SSD训练自己的数据集的评论 (共 条)

分享到微博请遵守国家法律