对于 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_height
和 blob_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 中的推理时间几乎没有影响的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow v1 对象检测 api mask_rcnn_inception_v2_coco 模型批量推理
如何使用 mask-RCNN 在 python 中计算(x,y)(质心)和掩码的宽度和高度?
如何将使用 Mask Rcnn 在自定义对象检测上创建蒙版图像的 Keras 模型转换为 CoreML 模型以在 iOS 应用程序中使用?