我正在使用来自YoloV3的通用实现来进行一些推断。使用常规的输入和输出可以很好地工作
modelWeightPath = r"./yolov3.weights"
modelPath = r"./yolov3.cfg"
network = cv2.dnn.readNetFromDarknet(modelPath,modelWeightPath)
由于我们正在使用一些边缘设备,这些设备通常无法“转换”最后几层,因此我将使用原始实现仅对最后几层进行推断
我知道这些层是如何命名的(network.getLayerNames()
),并且我知道上一层的de数据是什么样子的,因为我保存了它们来进行测试。(请参见conv_81层的输入数据->;inputScale1)
inputLayers = ['permute_82','permute_94','permute_106']
inputData = [cv2.UMat(inputScale1),cv2.UMat(inputScale2),cv2.UMat(inputScale3)]
现在我不确定我应该如何使用这些知识来进行推理,因为我所有的尝试都只得到例外
network.setInput(blob=inputData[0],name=inputLayers[0]) - throws
outs = network.forward(outputlayers[0])
引发以下异常:OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\dnn\src\dnn.cpp:2929: error: (-204:Requested object was not found) Requested blob "permute_82" not found in function 'cv::dnn::dnn4_v20181221::Net::setInput'
network.setInputsNames(inputLayers)
network.setInput(inputData[0],name=inputLayers[0])
network.setInput(inputData[1],name=inputLayers[1])
network.setInput(inputData[2],name=inputLayers[2])
outs = network.forward() -> throws
将抛出:cv2.error: OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\dnn\src\dnn.cpp:686: error: (-215:Assertion failed) inputs.size() == requiredOutputs in function 'cv::dnn::dnn4_v20181221::DataLayer::getMemoryShapes'
编辑: 但问题是,这个例子是有效的:
imgPath = r'./frame_93.png'
image = cv2.imread(imgPath);
blobInputimage = cv2.dnn.blobFromImage(image,1.0 / 255.0,(416,416),(0, 0, 0))
network.setInputsNames(['conv_0'])
network.setInput(blobInputimage,name='conv_0')
output = network.forward('conv_81')
但仍然不能仅从排列层转发到yolo层
有人知道解决办法吗
到目前为止,我能够得到相同的结果,就像我通过推断常规网络得到的结果一样。因此,我通过删除除yolo entrie之外的所有条目,从.cfg文件中按比例创建了一个“新”网络,例如yolov3_scale_1.cfg如下所示:
验证输出的代码如下所示:
控制台输出:
相关问题 更多 >
编程相关推荐