MaskRCNN和RoIAlign

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MaskRCNN和RoIAlign相关的知识,希望对你有一定的参考价值。

参考技术A Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。

在Faster-RCNN中ROIPooling的过程如下图所示:

输入图片的大小为800x800,其中狗这个目标框的大小为665x665,经过VGG16网络之后获得的特征图尺寸为800/32 x 800/32 = 25 x 25,其中32代表VGG16中的5次下采样(步长为2)操作。同样,对于狗这个目标,我们将其对应到特征图上得到的结果是665/32 x 665/32 = 20.78 x 20.78 = 20 x 20,因为坐标要保留整数所以这里引入了第一个量化误差即舍弃了目标框在特征图上对应长宽的浮点数部分。

然后我们需要将这个20x20的ROI区域映射为7x7的ROI特征图,根据ROI Pooling的计算方式,其结果就是20/7 x 20/7 = 2.86 x 2.86,同样执行取整操作操作后ROI特征区域的尺寸为2 x 2,这里引入了第二次量化误差。

从上面的分析可以看出,这两次量化误差会导致原始图像中的像素和特征图中的像素进行对应时出现偏差,例如上面2.86将量化为2的时候就引入了0.86的偏差,这个偏差映射回原图就是0.86 x 32 = 27.52,可以看到这个像素偏差是很大的。

为了缓解ROI Pooling量化误差过大的缺点,ROIAligin没有使用量化操作,而是使用了双线性插值。它充分的利用原图中的虚拟像素值如四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将和类似的非整数坐标值像素对应的输出像素值估计出来。这一过程如下图所示:

其中featmap就是VGG16或者其他Backbone网络获得的特征图,黑色实线表示的是ROI划分方式,最后输出的特征图大小为,然后就使用双线性插值的方式来估计这些蓝色点的像素值,最后得到输出,然后再在橘红色的区域中执行Pooling操作最后得到的输出特征图。可以看到,这个过程相比于ROI Pooling没有引入任何量化操作,即原图中的像素和特征图中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

我正在尝试使用 Mask RCNN 构建对象检测,并在调用 MaskRCNN 方法时出错

【中文标题】我正在尝试使用 Mask RCNN 构建对象检测,并在调用 MaskRCNN 方法时出错【英文标题】:I am trying to build a object detection using Mask RCNN and get an error when i call MaskRCNN method 【发布时间】:2021-05-16 17:43:33 【问题描述】:

我正在尝试使用 Matterport 的 Mask RCNN 的 keras 实现。当我调用函数 modellib.MaskRCNN 时,出现以下错误。

'''maskrcnnModel = modellib.MaskRCNN(mode='training', config=config, model_dir='/rootdir' )'''

/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/type_spec.py in type_spec_from_value(value) 3, "Failed to convert %r to tensor: %s" % (type(value).name, e))

raise TypeError("Could not build a TypeSpec for %r with type %s" % (值,类型(值)。名称)) TypeError: 无法为 与 KerasTensor 类型构建 TypeSpec

我使用的是 Tensorflow 2.4.1 和 keras 2.4.0 版本

我在很多地方冲浪,但我没有为我工作。我尝试按照其他 *** 问题中的建议修改 model.py,但没有发现任何区别。

感谢您的帮助

【问题讨论】:

【参考方案1】:

经过大量的浏览后,我终于在 github 中找到了另一个帮助我前进的存储库。我能够继续训练模型。感谢 akTwelve 为更新 matterport 的基本代码以适用于 TF 2.4.1 和 Kears 2.4.0 所做的出色工作。可以获取github链接@https://github.com/akTwelve/Mask_RCNN

【讨论】:

【参考方案2】:

改变你的模型:

gt_boxes = KL.Lambda(lambda x: norm_boxes_graph(x, K.shape(input_image)[1:3]))(input_gt_boxes)

h, w = K.shape(input_image)[1], K.shape(input_image)[2]
image_scale = K.cast(K.stack([h, w, h, w], axis=0), tf.float32) 
gt_boxes = KL.Lambda(lambda x: K.cast(x, tf.float32))(input_gt_boxes)

适用于 tensorflow 2.3.1 和 Python 3.8

【讨论】:

以上是关于MaskRCNN和RoIAlign的主要内容,如果未能解决你的问题,请参考以下文章

maskrcnn识别框非常小

MaskRCNN和RoIAlign

TensorRT maskrcnn windows下使用自己的数据集(二)

MaskRcnn中的NMS参数设置

踩坑MaskRCNN训练

我正在尝试使用 Mask RCNN 构建对象检测,并在调用 MaskRCNN 方法时出错