第8组 Alpha (2/3)
1.过去完成了哪些任务
完成了模型的准备工作、初步分工和和初步训练;训练结果达到了论文中的精度,准确率初步达标
数据集
我们将使用 Pascal Visual Object Classes (VOC)
2007年和2012年的数据集,这一份数据集中包含有20种不同物体,每一个物体都被以下三个属性描述
- 盒子坐标
- 标签
{'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'}
- 识别难度(0表示不困难,1表示困难)
输出
采用 Multibox
技术,包含两个任务
- 回归,检测到目标的盒子坐标
- 分类,将检测到的目标归类
模型
本项目实施 Single Shot Detector (SSD)
方法,卷积操作如下
- 迁移学习,使用
VGG-16
作为基础网络 - 在
ILSVRC
分类任务上预训练,Pytorch
中可获取 - 修改
- 输入
size
为(300, 300)
- 第三
pooling
层使用ceiling
函数而不是floor
函数 - 第五
pooling
层使用(3, 3)
卷积核和1
步幅 - 去掉
fc8
,将fc6
和fc7
改为conv6
和conv7
- 输入
训练结果
参数
{'epoch': 231, 'model': SSD300(
(base): VGGBase(
(conv1_1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv1_2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv2_1): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2_2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv3_1): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3_2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3_3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True)
(conv4_1): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv5_1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool5): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
(conv6): Conv2d(512, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(6, 6), dilation=(6, 6))
(conv7): Conv2d(1024, 1024, kernel_size=(1, 1), stride=(1, 1))
)
(aux_convs): AuxiliaryConvolutions(
(conv8_1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))
(conv8_2): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
(conv9_1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))
(conv9_2): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
(conv10_1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
(conv10_2): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1))
(conv11_1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
(conv11_2): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1))
)
(pred_convs): PredictionConvolutions(
(loc_conv4_3): Conv2d(512, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(loc_conv7): Conv2d(1024, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(loc_conv8_2): Conv2d(512, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(loc_conv9_2): Conv2d(256, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(loc_conv10_2): Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(loc_conv11_2): Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv4_3): Conv2d(512, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv7): Conv2d(1024, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv8_2): Conv2d(512, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv9_2): Conv2d(256, 126, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv10_2): Conv2d(256, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(cl_conv11_2): Conv2d(256, 84, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
), 'optimizer': SGD (
Parameter Group 0
dampening: 0
lr: 2e-05
momentum: 0.9
nesterov: False
weight_decay: 0.0005
Parameter Group 1
dampening: 0
lr: 1e-05
momentum: 0.9
nesterov: False
weight_decay: 0.0005
)}
精度
{'aeroplane': 0.784830629825592,
'bicycle': 0.8301308751106262,
'bird': 0.7785976529121399,
'boat': 0.7153279781341553,
'bottle': 0.4816097021102905,
'bus': 0.86469566822052,
'car': 0.8681696653366089,
'cat': 0.8875483870506287,
'chair': 0.5919950008392334,
'cow': 0.8332351446151733,
'diningtable': 0.7646348476409912,
'dog': 0.8511528968811035,
'horse': 0.8756575584411621,
'motorbike': 0.8565510511398315,
'person': 0.7953250408172607,
'pottedplant': 0.5440034866333008,
'sheep': 0.7881692051887512,
'sofa': 0.7863275408744812,
'train': 0.8692547678947449,
'tvmonitor': 0.7590073943138123}
Mean Average Precision (mAP): 0.776
训练231轮后,达到和原论文相同的精度
测试随机图片
2. 小组分工
成员 | 工作 |
---|---|
蹇浩航 | 应用设计,后端 |
赵泽昊 | 模型调试与优化,应用的封装 |
郭升 | 小程序前端 |
丁浩喆 | 小程序前端 |
郭英来 | 小程序后端 |
3. 燃尽图
4. 例会照片
5. 剩余任务&困难
- 对应用进行封装
- 前端和后端的设计
- 考虑用户体验并进行优化
- 对新知识的学习目前进度较慢
6. 收获和疑问
- 对各自分工的知识方面加深了理解,提高动手能力
- 集体学习有助于合作