Irf*_* S. 5 python opencv tensorflow google-colaboratory roboflow
我使用 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}
Run Code Online (Sandbox Code Playgroud)
这给了我一个frozen_inference_graph.pb文件,我可以用它来在 OpenCV DNN 中制作我的对象检测程序。另外,按照此示例/sf/answers/3993868651/,我准备了模型和管道配置的 .pbtxt 文件作为该cv2.dnn.readNetFromTensorflow函数的第二个参数。这是足以重现我遇到的错误的代码:
model = cv2.dnn.readNetFromTensorflow('models/trained/frozen_inference_graph.pb',
'models/trained/output.pbtxt')
Run Code Online (Sandbox Code Playgroud)
当我使用预训练的 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'
Run Code Online (Sandbox Code Playgroud)
它说找不到输入层。为什么会出现这种情况?另请注意,错误消息指出了一个目录:
C:\projects\opencv-python\opencv\modules\dnn\src\tensorflow\tf_importer.cpp
Run Code Online (Sandbox Code Playgroud)
这非常奇怪,因为我的计算机中根本没有该目录。我尝试对我的示例 SSD mobilenet 模型的 pbtxt 和配置文件进行差异检查,但我找不到在任何地方使用的特定目录的任何实例,甚至它们内部也没有目录路径。
这是使用 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"
Run Code Online (Sandbox Code Playgroud)
Preprocessor它有一个额外的输入节点,不仅使用FeatureExtractor/MobilenetV2/Conv/Conv2D
同时在生成的 pbtxt 上它只有这个
node {
name: "FeatureExtractor/MobilenetV2/Conv/Conv2D"
op: "Conv2D"
input: "FeatureExtractor/MobilenetV2/Conv/weights"
Run Code Online (Sandbox Code Playgroud)
我将示例 .pbtxt 的输入节点复制到我自己生成的 .pbtxt 中,它起作用了!