![25d652b8b3ba032a4159a77aee8c2c04.png](https://i-blog.csdnimg.cn/blog_migrate/580ffae40132bd8598443ea5135923ba.png)
王老师是中原动力人工智能骨干研发人员之一,技术深厚,今后会由王老师陆续带来人工智能方向技术干货,以飨读者。欢迎交流。
![25d652b8b3ba032a4159a77aee8c2c04.png](https://i-blog.csdnimg.cn/blog_migrate/580ffae40132bd8598443ea5135923ba.png)
input_layer = tf.keras.layers.Input([input_size, input_size, 3])
由于此时input_size = 416, 因此:
input_layer = tf.keras.layers.Input([416, 416, 3])
tf.keras.layers.Input()
作用:用于构建网络的第一层——输入层,该层会告诉网络我们的输入的尺寸是什么
参数列表:
layers.Input(
shape=None,
batch_size=None,
name=None,
dtype=None,
sparse=False,
tensor=None,
ragged=False,
**kwargs,)
参数解析(4个常用的):
![c501a7ac595e884e0cd0de4277094953.png](https://i-blog.csdnimg.cn/blog_migrate/7a0c955c0d6cc9101142d9bd14668706.png)
l shape:输入的形状,tuple类型,list类型也没问题。不含batch_size;tuple的元素可以为None类型数据,表示未知的或者说任意的,一般这里不用None
l batch_size:声明输入的batch_size大小,一般会在预测时候用,训练时不需要声明,会在fit时声明,即dataset类型数据声明了batch_size
l name:给layers起个名字,在整个网络中不能出现重名。如果name=None,则系统会自动为该层创建名字。
l dtype:数据类型,在大多数时候,我们需要的数据类型为tf.float32,因为在精度满足的情况下,float32运算更快。
![5d1e57f4e0c9af96612efe9f6662291f.png](https://i-blog.csdnimg.cn/blog_migrate/a988824c106dbe66eff42d70a3e09fcb.png)
总结:因此通过tf.keras.layers.Input() 构建了网络的输入层,shape指定了输入图片的形状为 [416, 416, 3]
Input 方法的结果为tf.Tensor类型,shape为 (None,416,416,3)
common.py定义了YOLOv3的网络结构,如下:
(提示:卷积核(1,1,1024(chanels),512(filters) ),表示卷积核的深度(等同于前一层对本层的输入channel)为1024,本层有卷积核512个,将输出512个Feature map,因此对下次的输出channel为512)
只需要一句话就解释清楚了:不管输入图像的深度channel为多少,每经过一个卷积核(filter),最后都通过一堆公式输出一个深度为1的特征图(feature map)。也就是说不管卷积核的深度channel是多少(卷积核的深度,和要被卷积的原始神经元的深度要一样),而卷积终将会合并卷积深度为1,不同的filter可以卷积得到不同的特征,也就是得到不同的feature map。。。我想这才是很多人疑惑的地方。
这里还是想强调一下,卷积核(filter)的深度channel数,其实是与输入图像相同的,所以常常会省略不写,只写输出filters的数量。
![9debbb840d525af88323400f3ec712dc.png](https://i-blog.csdnimg.cn/blog_migrate/597098dbae40a8f8ebf68c9dc9f0a79d.png)
图1 YOLO v3结构
YOLOv3的darknet53中,conv2d共有52个:
# 1 + 1 + (1*2+1) + (2*2+1) + (8*2+1) + (8*2+1) + (4*2) = 52
darknet53之后,conv2d共有23个:
(5+2)+(1+5+2)+(1+5+2)=23
因此,YOLOv3的conv2d共有75个。
0 1多尺度检测YOLOv3 对输入图片进行了粗、中和细网格划分,以便分别实现对大、中和小物体的预测。假如输入图片的尺寸为 416X416, 那么得到粗、中和细网格尺寸分别为 13X13、26X26 和 52X52。这样一算,那就是在长宽尺寸上分别缩放了 32、16 和 8 倍。
YOLOv3预测三种不同大小的box, 并且借鉴了 feature pyramid networks(FPN)的思想,将网络中一些深层特征图上采样之后,与浅层相同大小特征图在深度方向拼接concatenate,得到语义信息更丰富(来自较后面的特征图)且分辨率更高(较前面的特征图)的组合特征图,建议详细阅读一下FPN。
0 2Darknet53的使用可以看到YOLOv3的最初部分,是一个darknet53。此时 input_data的结果为tf.Tensor类型,shape为 (None,416,416,3)
作者首先训练一个darknet-53,为了两个目的:
01这个网路结构能在ImageNet有好的分类结果,从而说明这个网络能学习到好的特征(设计新的网络结构,这个相当于调参,具体参数怎么调,就是炼丹了);
02为后续检测模型做初始化。darknet-53的确很强,相对于ResNet-152和ResNet-101,darknet-53不仅在分类精度上差不多,计算速度还比ResNet-152和ResNet-101强多了,网络层数也比他们少。
注意如图2所示:Yolo_v3网络就是使用了darknet-53的前面的52层(没有全连接层FC,ull Connection)。
darknet53中,有5次上采样。对应图1来看,即从左至右的res1、res2、res8、res8、res4。
![fada6e8ec0dc64a9661f4ae9fcf2aec6.png](https://i-blog.csdnimg.cn/blog_migrate/ecfecec609f8d67fa67ccac0c8a74748.png)
图2 darknet-53网络结构
03上采样的使用网络中作者进行了三次检测,分别是在32倍降采样,16倍降采样,8倍降采样时进行检测,这样在多尺度的feature map上检测跟SSD有点像。
在网络中使用up-sample(上采样)的原因:网络越深的特征表达效果越好,比如在进行16倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就只使用了浅层特征,这样效果一般并不好。如果想使用32倍降采样后的特征,但深层特征的大小(shape)太小,因此yolo_v3使用了步长为2的up-sample(上采样),把32倍降采样得到的feature map的大小提升一倍,也就成了16倍降采样。同理8倍采样也是对16倍降采样的特征进行步长为2的上采样,这样就可以使用深层特征进行detection。
Yolo v3通过上采样的方式很好的使16倍降采样和8倍降采样使用深层特征,但进行4次下采样和3次下采样得到的浅层feature map大小是一样的。Yolo_v3想把这些浅层特征也利用起来,就有了route层。把16倍降采样得到的feature map和四次下采样得到的层拼接在一起,在channel那个维度进行拼接。这样拼接的好处:让网络同时学习深层和浅层特征,表达效果更好。8倍降采样同样也是这样的操作,把三次下采样的feature map拼接在一起。
![9583ee1977ebfed8160c424c86083373.png](https://i-blog.csdnimg.cn/blog_migrate/9dc486d6baca80cb301066ad5b98abfc.png)
![596346a552c161df6cb165dd53886876.png](https://i-blog.csdnimg.cn/blog_migrate/c4a12940645b625ba95fd062cf0e4f77.png)
![6e09c6a4bdc8be5f1ef56ddf9ccce5d1.png](https://i-blog.csdnimg.cn/blog_migrate/6ccc3b730df1f20c30ad0d5ddb0e674c.png)
本期先讲到这里,第二期很快就会再见,敬请关注。
![12c26b2433e8915a0973f412863e99a2.gif](https://i-blog.csdnimg.cn/blog_migrate/b64f2a241fa01a2e839abc8ef7b3b10d.gif)