YOLOv3网络架构以及代码细节解析(一)

看了yolo3的论文但是作者只是在文中说了一些他对于网络的改进,没有网络结构也没有损失函数,想着把代码看一下,看了一天,终于yolo有了一个很初步的了解,话不多说,一下是点击此处我用的yolov3代码,是基于tensorflow实现的,我用tensorboard可视化了整个网络,提取码bvvz,我将从网络和损失函数来分析。
作者在yolo3中搞了一个53层的darknet,代码如下:
YOLOv3网络架构以及代码细节解析(一)_第1张图片
可以看到作者在网络中用了类似于resnet的结构,并且输出了三个不同尺度的feature map,在这之后作者还将这三种不容尺度的feature map经行融合采用了一种多尺度的方法(一会介绍)。通过darknet之后我们会输出3中尺度的feature map大小分别为[52,52,256]、[26,26,512] 、[13,13,1024],我们称之为3,2,1,。然后1会在通过yolo_net和detection_layer最后输出大小为[ 13, 13, 255]的feature map1,这里的255 = 3*(4+1+80),因为feature map中的每个cell预测三个box,每个box有4个坐标还有一个置信度,coco数据集有80类。
YOLOv3网络架构以及代码细节解析(一)_第2张图片
接下来就是比较麻烦的剩下两张feature map产生的过程了,大家看一下网络结构图就一目了然了:
YOLOv3网络架构以及代码细节解析(一)_第3张图片
可能看的不是很清楚,不清楚的话可以下载上面链接的文件自己看一下,我们从图中可以看到,feature map1在输出的前一层还输出了一个[13,13,512]大小的map,我们将这个map再通过一个卷基层然后上采样(代码中用的是最近邻采样)将map变成[26,26,256],接着将map和之前darknet中产生的2相连接产生新的map[26,26,768],接着通过卷积网络产生feature map2[2626255],同理我们按照上面的方法再融合3又可以产生一个feature map3。整个网络的输出就是这样了,然后可以在三个不同尺度的feature map上进行预测,作者采用的是anchor box的方法,作者在小的feature map上采用大的anchor box这杨就可以预测比较大的物体,我一开始一位anchor box很神秘但是一看代码就是一个list里面存放了anchor的长宽。
在这里插入图片描述
具体的过程大家还是要去看代码,还是有很多细节在里面的。以上就是整个网络的结构。接下来我们来分析损失函数:
YOLOv3网络架构以及代码细节解析(一)_第4张图片
损失函数一共分为3组第一组为box的损失,作者加了一个box_loss_scale这个值在box越大的时候越小,box越小的时候越大,因为小的box和大的box在变化相同的情况下小box相对于自身的变化量肯定较大,因此作者加了这个因子去平衡大小框之间的差异,其实这就和yolo1中开根号是一个道理。
第二组损失为置信率的损失,其中conf_pos_mask表示有物体,conf_neg_mask表示没有物体以及iou小于0.5,对于这两种情况我们都希望pred_conf_logits接近object_mask,这里使用了sigmod交叉熵去衡量,第三类为类别的损失也是用了交叉熵来衡量。
以上为我粗浅的理解,如有错误,欢迎指正,谢谢!

你可能感兴趣的:(YOLOv3网络架构以及代码细节解析(一))