首先先放下github地址:https://github.com/acm5656/ssd_pytorch
然后放上参考的代码的github地址:https://github.com/amdegroot/ssd.pytorch
为什么要使用pytorch复现呢,因为好多大佬的代码对于萌新真的不友好,看半天看不懂,所以笔者本着学习和练手的目的,尝试复现下,并分享出来帮助其他萌新学习,大佬有兴趣看了后可以提些建议~
然后对ssd原理感兴趣的同学可以参考我的这篇博客https://www.cnblogs.com/cmai/p/10076050.html,主要对SSD模型进行了讲解。在这就主要讲解代码实现上的内容了,就不再讲原理了。
首先看下项目目录:
VOCdevkit:存放训练数据
weights :存放权重文件
Config.py :默认的一些配置
Test.py :测试单张照片的识别
Train.py :训练的py文件
augmentation.py:data augmentation的py文件,主要功能是扩大训练数据
detection.py:对识别的结果的数据进行部分筛选,传送给Test.py文件,供其调用使用
l2norm.py:进行l2正则化
loss_function.py:计算损失函数
ssd_net_vgg.py:ssd模型的实现
utils.py:工具类
voc0712.py:重写dataset类,提取voc的数据并规则化
模型搭建
模型搭建在ssd_net_vgg.py中,这个类只需要将一点,即vgg的网络需要注意,必须采用笔者的方式搭建,否则pre-train的model加载出错,具体的原因不在这里阐述。
模型的实现过程,将loc和conf的提取分开进行了,这个不影响正常的使用,只是在计算损失函数时,能够方便编程而已。
default box计算
代码在utils.py文件下,代码如下:
defdefault_prior_box():
mean_layer=[]for k,f inenumerate(Config.feature_map):
mean=[]for i,j in product(range(f),repeat=2):
f_k= Config.image_size/Config.steps[k]
cx= (j+0.5)/f_k
cy= (i+0.5)/f_k
s_k= C