Opencv 在Raspberry Pi上的NCS2上处理openvino dnn识别器失败

Opencv 在Raspberry Pi上的NCS2上处理openvino dnn识别器失败,opencv,raspberry-pi,face-recognition,openvino,Opencv,Raspberry Pi,Face Recognition,Openvino,我正在尝试使用“英特尔NCS2”设备在我的Raspberry Pi 4上运行人脸检测器/人脸识别器python脚本。 我在Pi4上运行,根据pyimagesearch.com上的优秀博客安装了OpenCV和Openvino 人脸检测使用此代码运行,设置为针对NCS2(myriad)设备: 探测器运行时带有 imageBlob = cv2.dnn.blobFromImage( cv2.resize(image, (300, 300)), 1.0, (300, 300),

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

人脸检测使用此代码运行,设置为针对NCS2(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_expression_引擎的后端。但没有一种组合是有效的


有什么建议吗?

Artemy的评论让我想到了版本,所以我研究了一个版本警告,我认为它与版本无关。原来是sklearn中的版本冲突以某种方式阻碍了NCS2上识别器的运行。安装旧的0.20.2版本的scikit learn修复了此问题

这真的让我很困惑,因为我不希望无数的调用依赖于python库。也许我不小心换了另一个环境


有趣的是,对于我的视频应用程序来说,识别器的第一次扫描大约需要30秒,但在那之后,每个人脸只需要50毫秒

如果您首先初始化识别器模型,那么您会在检测器上得到错误信息吗?你能试着给无数个探测器分配多个探测器吗?有趣的建议。更改代码以首先初始化识别器并不能修复它。我仍然收到相同的错误消息。我可以分配第二个探测器,它似乎可以在无数个探测器上运行。有趣的是,对于相同的图像,探测器参数是不同的。我不确定这里发生了什么。你使用的是哪个OpenCV和OpenVINO版本?我猜网络
face\u embedding\u model/openface.nn4.small2.v1.t7
无法在NCS2上执行,并在这种情况下尝试退回到CPU。为了确认我可以建议尝试使用OpenVINO的标准应用程序运行网络。有关更多信息,请参阅。在version.txt中,我发布了OpenVINO version版本2019、R3、推断引擎30677和OpenCV版本4.1.2-OpenVINO。就我所知,我不太清楚你所说的“OpenVINO的标准应用程序”是什么意思,我认为如果没有NCS2设备,我无法在Raspberry Pi上运行任何OpenVINO。很高兴知道你设法解决了这个问题!是的,同意,这种行为的根本原因还不清楚。关于长时间的第一次迭代。OpenCV推理引擎后端是这样实现的:在第一次迭代中,它调用LoadNetwork方法。对于NCS2设备,它意味着将网络转换为可由设备执行的格式,然后将转换后的网络加载到设备。这是一个相当繁重的行动。然后,它只是处理图像,不需要太多时间。若第一次迭代的时间对您很关键,那个么有一种方法可以避免它。但是您必须使用推理机API。如果您对详细信息感兴趣,请告诉我。感谢您提供的有关LoadNetwork的信息非常有用。只要我知道这是正常的,我就可以接受长期的创业。你的问题确实激发了我去看版本,所以你帮了我的忙。
Failed to Initialize Inference Engine backend : Device with “CPU” name is not registered in the InferenceEngine in function ‘initPlugin’