论文:https://arxiv.org/pdf/1512.02325.pdf
代码:https://github.com/amdegroot/ssd.pytorch
代码需要修改的地方:SSD-Pytorch训练和测试自己的数据集(新手必看)
0.数据
1.网络结构
SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
[译]理解SSD MultiBox -- 基于深度学习的实时目标检测
SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)
2.先验框
ssd.pytorch源码分析(二)— 默认框PriorBox的生成
3.Hard negative example mining
ssd.pytorch源码分析(五)—损失函数及Hard negative mining
pytorch-ssd源码解读(三)------------multibox_loss(损失函数)
4.eval
pytorch-ssd源码解读(二)------------detection(预测层)
用SSD框架训练自己的数据集 https://blog.csdn.net/chris_pei/article/details/79087284
用SSD-Pytorch训练自己的数据集https://blog.csdn.net/Blackrosetian/article/details/88816122
将数据集制作成VOC数据集格式 https://blog.csdn.net/attitude_yu/article/details/81905927
将自己的数据集改成voc的格式https://blog.csdn.net/a417197457/article/details/80701944
1.数据加载
data.DataLoader(Dataset)-->VOCDetection(SSDAugmentation)
● VOCDetection.pull_item()将数据整理为[image,xmin, ymin, xmax, ymax, label]的格式
onvertFromInts(), #数据类型转换
ToAbsoluteCoords(), # 位置信息转换
PhotometricDistort(), # 光度变形
Expand(self.mean), # 随机扩展
RandomSampleCrop(), # 随机裁剪
RandomMirror(), #随机镜像
ToPercentCoords(), #位置归一化
Resize(self.size), #图像尺寸缩放
SubtractMeans(self.mean) #图像去均值
-
模型搭建
https://blog.csdn.net/qq_17232031/article/details/90438676
https://blog.csdn.net/baidu_37283281/article/details/88371676
https://blog.csdn.net/xunan003/article/details/79186162
build_ssd-->SSD-->multibox(vgg,extras,mbox)
● Multibox
vgg:搭建vgg网络
extras:添加了额外的卷积层,通过这些卷积层得到的特征层
特征层为vgg中的第21层、倒数第二层和Extras中偶数卷积层为特征层,共6层,
每层特征图的大小为[38*38,19*19,10*10,5*5,3*3,1*1]
Mbox:为每个特征层的每个中心点的默认框的数目
Multibox:根据mbox添加定位与置信度分类层loc_layers和conf_layers
● SSD(SSD.forword-->loc,conf,priors)
Loc:通过vgg、Extras层和loc_layers层得到位置信息
conf:通过vgg、Extras层和conf_layers层得到置信度分类信息
Priors:得到默认框的坐标信息(PriorBox)
PriorBox:计算每个默认框相对于网络输入层输入图像的归一化左上角和右下角坐标
PriorBox.forward:特征图的每个中心点的默认框根据Mbox和aspect_ratios(默
认框的长宽比得到)
总共有38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732个默认框
-
构建优化器
optimizer = optim.SGD()
-
定义损失函数
https://blog.csdn.net/sinat_37145472/article/details/90259649
正负样本选择:
正样本:与 groundtruth box 同分类且满足 IOU>0.5 的default box
负样本:根据分类loss值排序得到,数量为正样本的三倍
criterion = MultiBoxLoss()-->match
● match()计算每个默认框相对于每张图片真实框的loc_t(位置偏差)和conf_t(分类置信度)
位置loss:smooth_l1_loss(回归问题)
总loss:L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N
-
识别
out = net(images)
调用的就是ssd.forword
-
计算损失函数
optimizer.zero_grad()
loss_l, loss_c = criterion(out, targets)
调用的其实是MultiBoxLoss
-
后向传播
loss.backward()