将Tensorflow冻结推理图加载到OpenCV DNN时出现错误。

5
我使用Tensorflow API训练了一个目标检测模型,参考了Roboflow的这个Google Colaboratory笔记本的示例。链接如下:https://colab.research.google.com/drive/1wTMIrJhYsQdq_u7ROOkf0Lu_fsX5Mu8a
到目前为止,一切顺利,我已成功将我的训练模型提取为推理图,再次遵循相同的笔记本教程。
import re
import numpy as np

output_directory = './fine_tuned_model'

lst = os.listdir(model_dir)
lst = [l for l in lst if 'model.ckpt-' in l and '.meta' in l]
steps=np.array([int(re.findall('\d+', l)[0]) for l in lst])
last_model = lst[steps.argmax()].replace('.meta', '')

last_model_path = os.path.join(model_dir, last_model)
print(last_model_path)
!python /content/models/research/object_detection/export_inference_graph.py \
    --input_type=image_tensor \
    --pipeline_config_path={pipeline_fname} \
    --output_directory={output_directory} \
    --trained_checkpoint_prefix={last_model_path}

这给我提供了一个frozen_inference_graph.pb文件,我可以用它来在OpenCV DNN中制作我的目标检测程序。此外,遵循这个例子https://stackoverflow.com/a/57055266/9914815,我准备了模型和管道配置的.pbtxt文件作为第二个参数传递给cv2.dnn.readNetFromTensorflow函数。以下是刚好能够重现我遇到错误的代码:

model = cv2.dnn.readNetFromTensorflow('models/trained/frozen_inference_graph.pb', 
                                      'models/trained/output.pbtxt')

当我使用预训练的SSD MobileNet V2 COCO模型 ssd_mobilenet_v2_coco_2018_03_29.pbtxt 时,此代码成功运行。

然而,当我使用我自己训练的.pbtxt文件时,它会抛出以下错误:

C:\Users\Satria\Desktop\ExploreOpencvDnn-master>python trainedmodel_video.py -i test1.mp4 -o test1result.mp4
Traceback (most recent call last):                                                                                                                            
File "trainedmodel_video.py", line 48, in <module> 'models/trained/output.pbtxt') cv2.error:
OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp:544:error:
(-2:Unspecified error) Input layer not found: FeatureExtractor/MobilenetV2/Conv/weights in function
'cv::dnn::dnn4_v20190621::`anonymous-namespace'::TFImporter::connect' 

它说找不到输入层。为什么会发生这种情况?同时请注意错误信息指向一个目录:
C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp

这十分奇怪,因为我的电脑里根本没有那个目录。我尝试了与示例SSD mobilenet模型的pbtxt和config文件进行差异比对,但无论在哪里都找不到使用该特定目录的实例,甚至它们内部也没有目录路径。
这是由于使用Google Colab训练引起的吗?有没有正确的方法可以在OpenCV DNN中使用Colab训练的Tensorflow模型?
提前感谢!
1个回答

2
在我自己生成的pbtxt文件中添加了一个额外的输入节点后,问题得到解决。
有人建议我使用的OpenCV版本4.11已经过时。我升级到了4.30,但仍然无法工作,不过现在它让我可以使用FusedBatchNormV3,这在未来非常重要。
现在,在仔细查看示例和生成的pbtxt文件之后,
在示例的.pbtxt文件“ssd_mobilenet_v2_coco_2018_03_29.pbtxt”中,从第30行开始。
node {  
  name: "Preprocessor/mul"  
  op: "Mul" 
  input: "image_tensor" 
  input: "Preprocessor/mul/x"   
}   
node {  
  name: "Preprocessor/sub"  
  op: "Sub" 
  input: "Preprocessor/mul" 
  input: "Preprocessor/sub/y"   
}   
node {  
  name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"  
  op: "Conv2D"  
  input: "Preprocessor/sub" 
  input: "FeatureExtractor/MobilenetV2/Conv/weights"    

它有一个额外的输入节点,使用的是Preprocessor,不仅仅是FeatureExtractor/MobilenetV2/Conv/Conv2D

与此同时,在生成的pbtxt中只有这个

node {
  name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"
  op: "Conv2D"
  input: "FeatureExtractor/MobilenetV2/Conv/weights"

我将样例.pbtxt的输入节点复制到我自己生成的.pbtxt中,它成功了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接