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

Smaller images have almost no consequences on inference time in OpenCV for a Mask RCNN model

上下文

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

我的问题

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

我做了什么

我又训练了一次我的 MASK RCNN 模型,这次使用 120x120 图像作为输入。训练速度快了大约 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,具体取决于型号,我的图像是 cv::Mat 大小 (480,480)。 我想知道是否可以解释为什么这两个模型之间的改进如此之少。函数 blobFromImage return 是与输入图像或其他形状具有相同形状的张量吗? 如果能帮助我理解这一点或提供加快流程的提示,我将不胜感激!

其他信息:

张量流 1.14,OpenCV 4.4.0

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

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

现在在 CPU 上使用 OpenVINO 使用 FP32 的推理速度比在 OpenCV 中快 4 倍,使用起来比 OpenCV 有点棘手,但绝对值得。