目标检测之SSD(single shot multibox detector)的pytorch代码阅读总结

代码地址:点击打开链接(https://github.com/amdegroot/ssd.pytorch)

这是别人的阅读笔记:在medium,点击打开链接(https://towardsdatascience.com/learning-note-single-shot-multibox-detector-with-pytorch-part-1-38185e84bd79)

数据准备部分
  • 准备三个文件: images, anonation(xml,与图片数据同名),txt(待训练数据的名称)
  • 先读取txt,根据txt内容读取image和label
  • 重写torch.datasets的__getitem__方法,在这个过程中,要将xml的内容提取出来,xml的内容主要以object的name和box为主,将name转换成index,再将index与box连起来,注意(2,)这样形式的shape
  • 再将数据经过transforms,包括加噪声,剪裁,最最关键的是box对应的变化
  • 数据预处理也是很重要的一块内容,包括加噪声和裁剪,但是要重写自己的transform。在重写的过程中还得带上标签,因为image的变化可能会引起box的变化,这点不同于分类。
网络结构
  • 第一遍粗略过了下网络结构和multi box的代码,网络很明确,vgg+额外的卷积层,然后从中间层的特征图上预测loss,分别是位置的偏移和类别的概率
  • box的产生很依赖trick,针对每个gt找出最匹配的default box
  • 第二遍过整个网络结构,先构成vgg+extra layers,然后从vgg的conv4_3和fc7、extra layers的每隔两层提取网络的输出结果,通过与其对应的task网络(与提取的层数一一对应)结构产生location/confidence(应该是一些map)。test过程中,这些结果送入detect过程,将conf通过softmax生成概率,将loc解码成对应的坐标位置,最后结果先是选出conf大于阈值的位置,根据这些位置挑选出对应的框,再对框使用nms,最后挑出top_k个最优结果。
训练过程
到现在为止,已经全部过了一遍,接下来的过程就是训练的细节,主要是损失函数的计算,每个image共有8732个box,第一步就是一个个image和其groundtruth进行匹配,将一个batchsize的匹配结果进行累计到一个变量里,通过向量化的操作尽量避免循环的使用,涉及到很多tensor的形状相关的属性的使用以及不少技巧。包括以下过程:
  • 在计算两个box的IOU时,采用unsqueeze和expand实现了两个for循环的操作,可以自己在程序里实验一下
  • 根据重合度,为8732中的每个box选择一个groundtruth,location:8732*4,confidence:8732*1(值为0~19,共20类),①对于confidence中对应重合度小于阈值的地方,值设为0,即负样本,类别成了21类,在loss的计算过程中增加background部分的损失。②要将box的位置(x1,y1,x21,y2)表达成偏移量delta(x,y,w,h),然后进行损失函数的计算,包括两部分:
  • location:挑选重合度大的一些box,根据自带函数F.smooth_l1_loss 计算。
  • confidence:文章中说 根据highest confidence loss,选择3倍于正样本数目的负样本,正样本根据重合度已经选择出来了,选择负样本先计算这个confidence loss,首先求取预测confidence的log_sum_exp值,再减去其中对应groundtruth的confidence,其值作为筛选样本的confidence loss,进行排序,选取最大的几个值为负样本,计算交叉熵,计算最终的loss,负样本针对的是background。


新添加框图结构


目标检测之SSD(single shot multibox detector)的pytorch代码阅读总结_第1张图片


你可能感兴趣的:(目标检测)