我遵循了一个基于Roboflow的Google Colaboratory笔记本的示例,使用Tensorflow API训练了对象检测模型。
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文件进行diffcheck,但我找不到在任何地方使用的特定目录的任何实例,甚至它们内部都没有目录路径。
这是由使用Google Colab进行培训引起的吗?
我有什么正确的方法可以在OpenCV DNN中使用Colab训练的Tensorflow模型吗?
提前致谢!

最佳答案

在我自己生成的pbtxt文件中添加其他输入节点后解决
有人建议我使用的OpenCV版本4.11已过时。
我更新到4.30,仍然无法正常工作,但是现在它使我可以使用FusedBatchNormV3,这在将来非常重要。
现在,仔细查看示例中的diffcheck和生成的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"
它有一个额外的Input节点,它使用Preprocessor,而不仅仅是FeatureExtractor/MobilenetV2/Conv/Conv2D同时在生成的pbtxt上只有这个
node {
  name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"
  op: "Conv2D"
  input: "FeatureExtractor/MobilenetV2/Conv/weights"
我将示例.pbtxt的Input节点复制到我自己生成的.pbtxt中,并且可以正常工作!!!

关于python - 将Tensorflow卡住的推理图加载到OpenCV DNN时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62751221/

10-08 22:28