【问题标题】:Failure to process openvino dnn recognizer on NCS2 on Raspberry Pi无法在 Raspberry Pi 上的 NCS2 上处理 openvino dnn 识别器
【发布时间】:2020-02-28 23:57:29
【问题描述】:

我正在尝试使用英特尔 NCS2 设备在我的 Raspberry Pi 4 上运行人脸检测器/人脸识别器 Python 脚本。
根据 pyimagesearch.com 上的优秀博客,我在安装了 OpenCV 和 Openvino 的 Pi 4 上运行。

使用此代码运行人脸检测,设置为针对 NCS2(无数)设备:

detector = cv2.dnn.readNetFromCaffe("face_detection_model/deploy.prototxt",              
                "face_detection_model/res10_300x300_ssd_iter_140000.caffemodel")
detector.setPreferableTarget(cv2.dnn.DNN_TARGET_MYRIAD)

检测器运行与

     imageBlob = cv2.dnn.blobFromImage(
        cv2.resize(image, (300, 300)), 1.0, (300, 300),
        (104.0, 177.0, 123.0), swapRB=False, crop=False)
     detector.setInput(imageBlob)
     detections = detector.forward()

人脸检测器运行良好且运行流畅。

但是,然后,我在检测器找到的面部上设置了一个图像识别器。

embedder = cv2.dnn.readNetFromTorch("face_embedding_model/openface.nn4.small2.v1.t7"])
embedder.setPreferableTarget(cv2.dnn.DNN_TARGET_MYRIAD)

然后我根据检测框使用人脸图像调用它

        face = image[startY:endY, startX:endX]
        (fH, fW) = face.shape[:2]
        faceBlob = cv2.dnn.blobFromImage(face, 1.0 / 255, (96, 96),
            (0, 0, 0), swapRB=True, crop=False)
        embedder.setInput(faceBlob)
        vec = embedder.forward()

但是,当它到达 vec=embedder.forward() 时,会抛出以下错误

Failed to Initialize Inference Engine backend : Device with “CPU” name is not registered in the InferenceEngine in function ‘initPlugin’ 

我不知道为什么该函数正确地针对 NCS2 进行检测,但无法为识别器运行。

据我所知,它试图在 CPU 上运行识别器代码,而不是 NCS2。据称英特尔 openvino 库不支持 Raspberry Pi Arm 处理器,因此会引发错误。

我尝试使用 OpenCV 文档中的各种其他 setPreferableTarget 和 SetPreferrableBackend 设置。根据文档,与 myriad 的唯一允许组合是 DNN_TARGET_MYRIAD 的目标和 DNN_BACKEND_INFERENCE_ENGINE 的后端。但没有任何组合有效。

有什么建议吗?

【问题讨论】:

  • 如果您首先初始化识别器模型,那么您会在检测器上得到错误吗?您可以尝试将多个检测器分配给无数个吗?
  • 有趣的建议。更改代码以首先初始化识别器并不能修复它。我仍然收到相同的错误消息。我可以分配第二个检测器,它似乎可以在无数个检测器上运行。有趣的是,同一图像的检测器参数是不同的。我不确定这里发生了什么。
  • 您使用的是哪个 OpenCV 和 OpenVINO 版本?我猜测网络 face_embedding_model/openface.nn4.small2.v1.t7 无法在 NCS2 上执行,并在这种情况下尝试回退到 CPU。为了确认我可以建议尝试使用 OpenVINO 的标准应用程序运行网络。更多信息请参考docs.openvinotoolkit.org/latest/…
  • 从 version.txt 中,我有 OpenVINO 版本 release_2019_R3_InferenceEngine_30677,2019 年 9 月 16 日
  • 和 OpenCV 版本 4.1.2-openvino。我不太清楚使用“OpenVINO 的标准应用程序”是什么意思据我所知,如果没有 NCS2 设备,我认为我无法在 Raspberry Pi 上运行任何 OpenVINO。

标签: opencv raspberry-pi face-recognition openvino


【解决方案1】:

Artemy 的评论让我想到了版本,因此我查看了一个我认为无关的版本警告。事实证明,这是 sklearn 中的版本冲突,它以某种方式阻止了识别器在 NCS2 上的运行。安装旧的 0.20.2 版本的 scikit-learn 修复它。

这真的让我很困惑,因为我没想到 MYRIAD 调用依赖于 python 库。也许我不小心在某个地方更改了另一个设置。

有趣的是,对于我的视频应用程序,识别器的第一遍需要大约 30 秒,但之后每张脸只需要大约 50 毫秒。

【讨论】:

  • 很高兴知道您设法解决了这个问题!是的,同意,这种行为的根本原因尚不清楚。
  • 关于长的第一次迭代。 OpenCV 推理引擎后端以这种方式实现:在第一次迭代时,它调用 LoadNetwork 方法。对于 NCS2 设备,这意味着将网络转换为可以由设备执行的格式,然后将转换后的网络加载到设备中。这是一个相当繁重的操作。然后它只是处理不需要太多时间的图像。如果第一次迭代的时间对您来说很重要,那么有一种方法可以避免它。但是您必须改用推理引擎 API。如果您对细节感兴趣,请告诉我。
  • 感谢您提供有关 LoadNetwork 的信息非常有帮助。我可以忍受长时间的启动,只要我知道这是正常的。你的问题确实激发了我看版本,所以你是一个帮助。
猜你喜欢
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多