数据的准备其实是最花功夫和时间的,度过了上一个阶段后,就进入激动的模型训练阶段了,首先简要聊聊我对Mask RCNN算法的理解:




CNN 图片分类实战_Mask


MaskRCNN是何凯明大神基于FastRCNN的改进,2018年初在tensorflow上实现了该模型算法。在原有FastRCNN的基础上,将ROIPooling部分调整为ROIAlign,同时增加mask值描述分类。我对整个Mask RCNN的理解如下:

MaskRCNN 是一种two stage图像检测方法,追求精度和识别效果,所谓two stage,就是说第一步先要对图像进行扫描,然后生成目标区域,认为里面有东西;第二部再进行图片分类以及生成界限框(矩形框rois)和mask。与yolo和视网膜等追求速度的one stage算法不一样。

下面一步一步说,first stage:

图像进来首先是卷积层:这是一个标准的残差网,代码使用的是ResNet101网络作为特征抽取器,前面的几层可以检测低层次的特征,比如边缘和边角,后面的层次可以检测一些高级特征,具体汽车、人、天空等等,通过这个backbone网络,图片会被提取出32*32的特征图 共计2048个。这些特征图会进入下一个stage

在残差网络生成特征的同时,FPN特征金字塔也能更好识别物体的多重尺度上的特征,它将不同层级的特征可以自由的传递。虽然最后一层的feature maps 语义强,但是位置和分辨率都比较低,容易检测不到比较小的物体。FPN的功能就是融合了底层到高层的feature maps ,从而充分的利用了提取到的各个阶段的特征

这里再说说高层上采样:为了在图像分辨率高的时候看见小东西,就要把后面分辨率低的特征拿到前面分辨率高的图样里融合成新的特征。绕嘴。。。

这段代码能看出先生成上层特征,再生成下层特征 ,upsampling即是上采样。原代码将FPN放在RPN网络中用于生成proposal,原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。(参阅)


CNN 图片分类实战_fastrcnn网络模型_02


CNN 图片分类实战_CNN 图片分类实战_03


ResNet残差网结构

好了,下面谈谈对second stage的理解。

RPN 区域推荐的网络,用于帮助网络推荐感兴趣的区域,首先是来自FPN输出的特征P2到P5,即conv feature map


CNN 图片分类实战_卷积_04


获得窗口坐标和前后景置信度

接下来就是RoIAlign了,这也是MaskRCNN的重点改进


CNN 图片分类实战_fastrcnn网络模型_05


ROIpooling与ROIalign的区别

可以看出来,两者最大的区别就是ROIPooling做了2次取整,从图片到特征图,又从特征图到ROI池化层,这对于图像分割会产生很大的误差。RoiAlign采用双线性插值来得到固定四个点坐标的像素值。得到固定的7*7的区域特征图

这些搞定了,就可以开始分类和mask了:包括了物体检测最终的classes和bounding boxes。该部分是利用了之前检测到了ROI进行分类和回归(是分别对每一个ROI进行);mask的预测也是在ROI之后的,通过全连接层来进行的。因为每个ROI只对应一个物体,只需对其进行语义分割就好,相当于了实例分割了( 在训练的时候,二者都是同时进行的;在预测的时候,先得到分类的结果,然后再把此结果传入到mask预测中得到mask)

---------------------------------------------------------------------------------------------------------------------------

以上是模型的预测原理,下面谈谈实际的训练,训练的时候要先注明是训练的哪一个部分:

我这里采用的是训练头部70 epoch,训练resnet stage 5+ 20epoch,总计训练90epoch,step设置为100.

STEPS_PER_EPOCH 要在config类里面事先说明。


CNN 图片分类实战_CNN 图片分类实战_06


CNN 图片分类实战_过拟合_07


一般情况下训练到stage5+就可以了


CNN 图片分类实战_卷积_08


90轮训练的tensorboard展示

整整跑了130小时。。。

mAP的计算可以调用util的方法,实际上,我们发现关于脏点类的识别,在系统的总体loss值下降到.5以内既可以满足要求。


CNN 图片分类实战_CNN 图片分类实战_09


另外通过visualize里的方法,可以实现丰富的图像识别效果


CNN 图片分类实战_fastrcnn网络模型_10


以下为脏点类瑕疵的识别效果:


CNN 图片分类实战_Mask_11


原图


CNN 图片分类实战_卷积_12


训练效果图


CNN 图片分类实战_Mask_13


训练不足时,会出现误识别现象

对于钢板擦痕和划痕的识别效果比较奇怪,超过一定训练轮数后,会出现过拟合现象。有点进一步研究:


CNN 图片分类实战_fastrcnn网络模型_14


正常识别效果


CNN 图片分类实战_CNN 图片分类实战_15


过拟合

具体识别规律必须要实际确认,loss和mAP只能算作辅助吧,训练不一定越多越好,这就是本次”炼丹“的体会吧。