Mask_RCNN体系面向对象语义分割进化史及代码实现

本文从R_CNN、Fast/Faster/Mask RCNN原理一点点理解面向对象的语义分割,R_FCN、SSD待补充

参考阅读:https://zhuanlan.zhihu.com/p/47579399

源码:https://github.com/matterport/Mask_RCNN

一、RCNN(区域神经网络)

原理:采用过分割将图像分割成小区域,再查找现有小区域,对其进行最高可能性合并,直到整张图像合并成一个区域位置时,输出所有曾经存在过的区域,作为ROI区域;再以成熟的训练好的对应类别的深度卷积网络(Alexnet、googlenet、vgg等)作为特征提取器,采用SVM对各个区域(上下采样到相同大小尺度)进行预测;最后通过线性回归模型运行边框输出更为准确的边框边界线。

1、合并可参考规则:光谱(颜色直方图)相似性、纹理(梯度直方图)相似性、合并后总面积最小的或合并后总面积在BBOX中所占比例最大的

2、边框回归:https://blog.csdn.net/zijin0802034/article/details/77685438

二、Fast/Faster/Mask RCNN

(一)Fast_RCNN网络简介

以上RCNN最大的问题在于效率,ROI区域进行多次重复的的特征提取,这里提出先在整个图像上进行特征提取再选取ROI区域减少重复计算量,且特征提取网络参与训练更新权重。

Mask_RCNN体系面向对象语义分割进化史及代码实现_第1张图片
1、采用选择性搜索创建ROI(Fast的这个过程称之为区域提案):作用在卷积网络的输出上,而不是原始图像上,这样就仅需对整张图片进行一次卷积运算提取前向特征,减少了运算量;

不同于RCNN采用采样到相同的ROI尺度输入,这里采用不同尺度的ROI经过兴趣区域池化层后输出相同尺度的特征图,普通池化层通过设置池化窗口(核)、步幅等控制输出大小,而 RoI 池化层里直接设置每个区域的输出 大小。例如设置 n × m,那么对每一个区域我们得到 n × m 形状输出。

2、物体的分类使用Softmax分类取代SVM分类器

 

(二)Faster R-CNN

Mask_RCNN体系面向对象语义分割进化史及代码实现_第2张图片

选择性搜索只是在RCNN枚举的基础上将对原图进行改为对卷积结果进行区域提案,速度上依然较慢,提出重复使用区域提案的相同的 CNN 结果以取代单独运行选择性搜索算法(区域提议网络region proposal network,简称 RPN)。RPN 以锚框为起始点,通过一个小神经网络 来选择提议区域。

 

网络主要包括两个部分:

1、特征提取网络:它用来从大量的图片中提取出一些不同目标的重要特征,通常由conv+relu+pool层构成,常用一些预训练好的网络(VGG、Inception、Resnet等),这里采用连续的13个卷积层、relu激活函数组合,间杂着4个池化层,获得的结果叫做特征图。

2、目标检测网络(Region Proposal Network):

(1)生成ROI:在获得的特征图的每一个锚点上做多个候选ROI(这里是9),然后利用分类器将这些ROI区分为背景和前景,同时利用回归器对这些ROI的位置进行初步的调整;

(2)ROI分类:在RPN阶段,用来区分前景(于真实目标重叠并且其重叠区域大于0.5)和背景(不与任何目标重叠或者其重叠区域小于0.1);在Fast-rcnn阶段,用于区分不同种类的目标(猫、狗、人等);

(3)ROI回归:在RPN阶段,进行初步调整;在Fast-rcnn阶段进行精确调整;

 

核心函数:每个锚点的anchor生成   def generate_anchor_base (base_size=16,ratios=[0.5,1,2],anchor_scales=[8,16,32]):

分析一下函数的参数base_size=16就是基础的anchor的宽和高其实是16的大小,再根据不同的放缩比和宽高比进行进一步的调整,ratios就是指的宽高的放缩比分别是0.5:1,1:1,1:2这样,最后一个参数是anchor_scales也就是在base_size的基础上再增加的量,本代码中对应着三种面积的大小(16*8)2 ,(16*16)2  (16*32)2  也就是128,256,512的平方大小,三种面积乘以三种放缩比就刚刚好是9种anchor

 

(三)Mask RCNN

为了获得像素级别的识别结果,Mask R-CNN 向 Faster R-CNN 添加一个分支来输出二进制 mask,以说明给定像素是否是目标的一部分。如上所述,分支(在上图中为白色)仅仅是 CNN 特征图上的简单的全卷积网络。

Mask_RCNN体系面向对象语义分割进化史及代码实现_第3张图片

(1)提出ROI对齐层,去掉Faster_RCNN在ROI池化层中的定点化过程使输入的输入的提议区域和分割区域的坐标均使用实数,若非实数,其元素值通过相邻像素插值而来;

(2)输入特征图输出在像素上属于目标的所有位置,将原有的仅输出对象所在外接矩形转为输出具体的像素。

 

三、网络跑通过程中(demo.py)遇到的问题及解决方法

1、安装必要的包环境,在命令行中输入 python F:\cx\SSegcode\Mask_RCNN-master\Mask_RCNN-master\setup.py

(1)安装VC++14.0环境,安装的VS2017,在菜单栏工具

Mask_RCNN体系面向对象语义分割进化史及代码实现_第4张图片

(2)安装基础的库

requirements.txt中包含了所有需要使用的库,全部安装即可,注意Keras的版本,打开命令行输入:

 pip install -r requirements.txt

(3)从下载代码的目录打开命令行输入:

python setup.py install

 

2、运行demo.ipynb

(1)先将其转为demo.py,运行Jupyter notebook,打开对应的ipynb运行界面后,在File中选择Download as中点击Python(.py)。

(2)UserWarning: Matplotlib is currently using agg,which is a non-GUI backend, so cannot show the figure

解决方法:在你的环境里,例如anacon/envs/pytorch/lib/sit-pakege/pycocotools/coco.py 

查找“Agg” ,改为 “TkAgg”

import matplotlib; matplotlib.use('TkAgg')

 

(3)结果及输出

可能由于kreas版本问题,在显示输出结果图片时存在一定问题,在这里修改visualize函数为opencv输出结果图片。

# In[5]:

# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

# Run detection
results = model.detect([image], verbose=1)

# Visualize results
r = results[0]
masks=np.array(r['masks']).astype(int)
mask=np.zeros((masks.shape[0],masks.shape[1]),int)


# =============================================================================
image=cv2.cvtColor(np.uint8(image), cv2.COLOR_RGB2BGR)
# cv2.imwrite("E:\\LY_workspace\\SSegcode\\Mask_RCNN-master\\samples\\image.tif",image)
# =============================================================================

for i in range(masks.shape[2]) :
    mask=masks[:,:,i]+mask

cv2.imwrite("E:\\LY_workspace\\SSegcode\\Mask_RCNN-master\\samples\\masks.tif",mask*56)

i=0
for rec in r['rois']:
    image = cv2.rectangle(image, (rec[1], rec[0]), (rec[3], rec[2]), (255, 0, 0), 2)
    """
    cv2.putText(图像, 文字, (x, y), 字体, 大小, (b, g, r), 宽度)
    """
    image = cv2.putText(image, class_names[r['class_ids'][i]],(rec[1]+10, rec[0]+10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
    image = cv2.putText(image, str(r['scores'][i]),(rec[1], rec[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
    i+=1

cv2.imwrite("E:\\LY_workspace\\SSegcode\\Mask_RCNN-master\\samples\\draw_0.tif",image)

 

Mask_RCNN体系面向对象语义分割进化史及代码实现_第5张图片

Mask_RCNN体系面向对象语义分割进化史及代码实现_第6张图片

Mask_RCNN体系面向对象语义分割进化史及代码实现_第7张图片

你可能感兴趣的:(论文阅读,google速成机器学习,Mask_RCNN)