对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响

Posted

技术标签:

【中文标题】对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响【英文标题】:Smaller images have almost no consequences on inference time in OpenCV for a Mask RCNN model 【发布时间】:2020-11-04 12:32:32 【问题描述】:

上下文

我使用 Tensorflow 对象检测 API 训练了一个自定义 MASK RCNN,以检测面部区域。我的输入图像是 480x480,但我选择将它们调整为 240x240,以便训练更快。

我的问题

我在另一个项目中使用 OpenCV DNN 在几台计算机上进行了 C++ 推理,我得到了非常不同的速度结果(每台计算机都非常不同,所以到目前为止没什么好担心的,再次预测是好的)但我有一个在最差的(无 GPU)上推理时间约为 2.5 秒,这对于我的目的来说太长了。

我做了什么

我使用这次 120x120 图像作为输入再次训练了我的 MASK RCNN 模型。训练速度快了大约 3 倍,结果也足够好(比第一个训练差 7% 左右,这对我来说还可以)。

问题

使用 OpenCV 运行推理时,推理速度仅快不到 10 毫秒(总时间约为 2.5 秒),而在我看来,看到训练速度应该快得多。

问题

我正在为我的网络提供一个创建的 blob,例如:

  blob = cv::dnn::blobFromImage(image, 1.0, cv::Size(blob_height, blob_width), cv::Scalar(), true, false);

blob_heightblob_width 为 120 或 240,具体取决于型号,我的图像是尺寸为 (480,480) 的 cv::Mat。 我想知道是否有解释为什么两个模型之间的改进如此之少。函数 blobFromImage 是否返回与输入图像具有相同形状的张量? 如果能帮助我理解这一点或提供加快流程的提示,我将不胜感激!

其他信息:

张量流 1.14,OpenCV 4.4.0

【问题讨论】:

【参考方案1】:

对于可能有同样问题的人来说,MASK RCNN 和其他类似的模型(如 Faster RCNN)总是具有相同数量的参数,而不管图像的输入大小如何,这使得推理时间几乎总是相同的。然后很难使用 OpenCV 改进推理。

然后最好的解决方案是使用 OpenVINO 工具包 (https://docs.openvinotoolkit.org/latest/index.html),它具有优化模型的模块(例如,使用 FP16 或 INT8 而不是 FP32)和优化指定硬件上的推理的推理引擎(但是它有是 Intel 硬件,但对于 CPU,到目前为止它很方便)。

现在,在带有 OpenVINO 的 CPU 上,使用 FP32 的推理速度比在 OpenCV 中快 4 倍,使用起来比 OpenCV 稍微复杂一些,但绝对值得。

【讨论】:

这似乎很明显。 MASK RCNN 是一个深度模型(多层)。仅更改输入分辨率会更改第一层,在本例中更改为 75%。切换到 INT8 可将 所有 层缩小 75%。您可能应该检查 FP/FN 费率。 我的观点主要是说具有相同精度的 OpenVINO 速度要快得多,我没有尝试使用 INT8 或 FP16 抱歉,如果不清楚。

以上是关于对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响的主要内容,如果未能解决你的问题,请参考以下文章

Mask RCNN 的预测无法正常工作

检测论文综述(一) : 从RCNN到Mask-RCNN

Mask-RCNN 的智能多边形标注

Tensorflow v1 对象检测 api mask_rcnn_inception_v2_coco 模型批量推理

如何使用 mask-RCNN 在 python 中计算(x,y)(质心)和掩码的宽度和高度?

如何将使用 Mask Rcnn 在自定义对象检测上创建蒙版图像的 Keras 模型转换为 CoreML 模型以在 iOS 应用程序中使用?