keras — YOLOv3 笔记

文件结构

参考

数据增强

翻转变换 flip
随机修剪 random crop
色彩抖动 color jittering
平移变换 shift
尺度变换 scale
对比度变换 contrast
噪声扰动 noise
旋转变换/反射变换 Rotation/reflection
  • 这里需要注意的是,虽然输入尺寸是416x416,但原图是按照纵横比例缩放至416x416的, 取 m i n ( w / i m g w , h / i m g h ) min(w/img_w, h/img_h) min(w/imgw,h/imgh)这个比例来缩放,保证长的边缩放为需要的输入尺寸416,而短边按比例缩放不会扭曲, i m g w , i m g h img_w,img_h imgw,imgh是原图尺寸768,576, 缩放后的尺寸为 n e w w , n e w h = 416 , 312 new_w, new_h=416,312 neww,newh=416,312,需要的输入尺寸是w,h=416*416(128值填充):
    keras — YOLOv3 笔记_第1张图片
  • yolov3需要的训练数据的label是根据原图尺寸归一化了的,这样做是因为怕大的边框的影响比小的边框影响大,因此做了归一化的操作,这样大的和小的边框都会被同等看待了,而且训练也容易收敛。

网络结构

参考

  • YOLOv3
    keras — YOLOv3 笔记_第2张图片
  • resn:n代表数字,表示这个res_block里含有多少个res_unit
  • 整个yolo_v3_body包含252层:
    keras — YOLOv3 笔记_第3张图片
  • 整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)
  • 在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1/32。输入为416x416,则输出为13x13(416/32=13)
  • yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32
  • 通常都要求输入图片是32的倍数
  • 步长2的卷积 + 零填充
    keras — YOLOv3 笔记_第4张图片
  • tiny-yolo3
    keras — YOLOv3 笔记_第5张图片
  • YOLOv3和tiny-YOLOv3的战绩
    在这里插入图片描述
    keras — YOLOv3 笔记_第6张图片

网络输出

keras — YOLOv3 笔记_第7张图片

  • 借鉴了FPN的思想
  • yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率,即3*(5 + 80) = 255(YOLOv1:7x7x30,2*(5+20) = 50)
  • 作者并没有像SSD那样直接采用backbone中间层的处理结果作为feature map的输出,而是和后面网络层的上采样结果进行一个拼接之后的处理结果作为feature map

边框回归

  • YOLOv3使用逻辑回归预测每个边界框的客观得分
  • logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor
  • 忽视IoU小的Anchor:If the bounding box prior is not the best but does overlap a ground truth object by more than some threshold we ignore the prediction, following[17]. We use the threshold of 0.5. Unlike [17] our system only assigns one bounding box prior for each ground truth object.
  • 不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模
  • 第一点, 9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。
  • 第二点,每个输出y在每个自己的网格都会输出3个预测框,这3个框是9除以3得到的,这是作者设置的,我们可以从输出张量的维度来看,13x13x255。255是怎么来的呢,3*(5+80)。80表示80个种类,5表示位置信息和置信度,3表示要输出3个prediction。在代码上来看,3*(5+80)中的3是直接由num_anchors//3得到的
  • 第三点,作者使用了logistic回归来对每个anchor包围的内容进行了一个目标性评分(objectness score)。根据目标性评分来选择anchor prior进行predict,而不是所有anchor prior都会有输出!

网络训练

train_bottleneck.py

  • model, bottleneck_model, last_layer_model
  • model:将网络的输出(3个y)和真值,以及输出数据连起来!一边得到最后的loss层
  • last_layer_model:
    keras — YOLOv3 笔记_第8张图片
  • model和last_layer_model是接了loss层的模型!
  • bottleneck_model没有包括yolo_body中的输出前面的卷积层!

bottleneck_model = Model([model_body.input, *y_true], [out1, out2, out3])

  • last_layer_model是相对于yolo_body的bottleneck_model的差集!
model_loss_last =Lambda(yolo_loss, 
output_shape=(1,), name='yolo_loss', arguments={
'anchors': anchors, 
'num_classes': num_classes, 
'ignore_thresh': 0.5})([*model_last.output, *y_true])
last_layer_model = Model([in0,in1,in2, *y_true], model_loss_last)
  • model是包括了损失函数的yolo_body
model_loss = Lambda(yolo_loss, output_shape=(1,), name='yolo_loss',
        arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5})(
        [*model_body.output, *y_true])
model = Model([model_body.input, *y_true], model_loss)
  • 而train.py里面,create_model()只有model,没有将model拆成bottleneck_mdel和last_layer_model!

yolo_loss.py

训练流程

keras — YOLOv3 笔记_第9张图片

你可能感兴趣的:(DL,Learning)