据上次的xception已经过去半个月了(划水了半个月),上次的xcepion训练慢问题已经解决了,其实就是中间的imagesize没有控制好,这样都能训练也是十分的神奇,这次记录一下整了小半个月的yolov3模型,虽然还没整完但是主体框架已经好了
先看代码
最上面的是配置参数,元组内的是(kernel,kernel_size,stride)例如(32,3,1)代表有32个kernel,size为3,stride为1,日后导入下面的CnnBlock函数
CnnBlock:
可以看到就是普通卷积多了一个Bn和LeakyRelu函数,其他的并没有什么变化
ResidualBlock:
num_repeat即重复的次数,最后通道数先减少一半再还原回来,最终的结果和开始的输入的size一致,可以直接加
有关残差块可以自行看Resnet的论文或者不想看英文的兄弟可以看同济自豪兄的视频
https://www.bilibili.com/video/BV1vb4y1k7BV?spm_id_from=333.999.0.0
ScalePrediction:
就是个卷积,第二个CnnBlock最终输出通道数3*(num_class+5)中的3为一个boundingbox的三个anchor,num_class为预测物体的种类数量(即训练的时候物体一共的种类),5为anchor的x,y,长,宽,置信度
最终调整一下位置改为(batch_size,3,imagesize,imagesize,numclass+5)即可
接着就是yolov3的主体:
先看这个_create_conv_layer层:
通过开始的config文件创建layer
元组的就是添加卷积层
列表中的["B",次数]就代表添加的残差块的次数
str中的“S”代表预测,并且将预测结果存入outputs[]的列表中
“U”代表上采样,这里涉及特征金字塔,也可以自行百度FPN
简而言之就是将上层的特征上采样并与下层的特征层cat,然后下层的特征再进行预测
最后看forward层:
遇到ScalePrediction就将预测的结果放入output中
但不想破坏x的size,所以直接continue回去
遇到残差块并且repeat的次数为8时就存在route_connection中等着与高层的上采样进行cat
遇到上采样就拿出route_connection中的最后一个进行cat //看图
差不多就是这样了
输入在网络中的变化应该是这样子的
config = [
(32, 3, 1), //416*416*3->416*416*32
(64, 3, 2), //416*416*32->208*208*64
["B", 1], //单纯残差 208*208*64
(128, 3, 2), //208*208*64->104*104*128
["B", 2], //不变
(256, 3, 2), //104*104*128->52*52*256
["B", 8], //route_connection[a] a=52*52*256
(512, 3, 2), //52*52*256->26*26*512
["B", 8], //route_con[a,b] b=26*26*512
(1024, 3, 2), //26*26*512->13*13*1024
["B", 4], # To this point is Darknet-53 //不变
(512, 1, 1), //13*13*1024->13*13*512
(1024, 3, 1), //13*13*512->13*13*1024
"S", output[a] a=13*13*512->13*13*1024->13*13*(num+5)*3->(3,13,13,num+5) //3为anchor数,13是image的长和宽,num+5代表识别的种类的概率+boundingbox的x,y,长,宽,置信度 ,后面的"S"同理
(256, 1, 1), 13*13*1024->13*13*256
"U", 13*13*256->26*26*256+26*26*512=26*26*768
(256, 1, 1), 26*26*768->26*26*256
(512, 3, 1), 26*26*256->26*26*512
"S", 26*26*512->26*26*(num+5)*3
(128, 1, 1), 26*26*512->26*26*128
"U", 26*26*128->52*52*128+52*52*256=52*52*384
(128, 1, 1), 52*52*384->52*52*128
(256, 3, 1), 52*52*128->52*52*256
"S", 52*52*256->52*52*(num+5)*3
]
最后此代码的来源如下:
https://www.youtube.com/watch?v=Grir6TZbc1M&t=32s
机翻的太难受了,不如当英语听力