簡體   English   中英

使用 OpenCV C++ 進行 Tensorflow 2 對象檢測

[英]Tensorflow 2 Object Detection with OpenCV C++

我已經使用 Tensorflow 2 對象檢測 API 訓練了 SSD ResNet V1 模型。 然后我想在 C++ 代碼中將這個模型與 OpenCV 一起使用。

首先,訓練后我有三個文件:

  • 檢查站
  • ckpt-101.data-00000-of-00001
  • ckpt-101.index

請注意,我沒有 .meta 文件,因為它不是生成的。

然后我使用對象檢測 API 中的exporter_main_v2.py腳本從這些文件創建了 SavedModel:

python3 exporter_main_v2.py input_type=image_tensor --pipeline_config_path /path/to/pipeline.config --trained_checkpoint_dir=/path/to/checkouts --output_directory=/path/to/output/directory

運行此腳本后,我得到了 saved_model.pb

我試圖以這種方式在 OpenCV 中使用這個文件:

cv::dnn::Net net = cv::dnn::readNetFromTensorflow("/path/to/saved_model.pb");

但我收到以下錯誤:

OpenCV(4.2.0) /home/andrew/opencv/modules/dnn/src/tensorflow/tf_io.cpp:42: error: (-2:Unspecified error) FAILED: ReadProtoFromBinaryFile(param_file, param). Failed to parse GraphDef file: /home/andrew/Documents/tensorflow_detection/workspace/pb_model/saved_model/saved_model.pb in function 'ReadTFNetParamsFromBinaryFileOrDie'

然后我嘗試凍結saved_model.pb。 但是,據我所知,在 TF2.x 中這是不可能的,因為 TF2.x 不支持會話和圖形。 我也沒有 .pbtxt 文件。

我的問題:是否可以在 OpenCV C++ 中使用通過 TF2 Object Detection API 訓練的模型?

如果您幫助我解決此問題或提供任何有用的建議,我將不勝感激。

如專用維基中所述,可以將 Tensorflow 2 模型與對象檢測 API 和 Opencv 一起使用: https : //github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

到目前為止,它們與 Tensorflow 1 兼容的模型更多,但對於 SSD 來說應該沒問題。 要凍結您的圖表,您必須執行以下操作:

import tensorflow as tf

from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2

loaded = tf.saved_model.load('my_model')
infer = loaded.signatures['serving_default']

f = tf.function(infer).get_concrete_function(input_1=tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32))
f2 = convert_variables_to_constants_v2(f)
graph_def = f2.graph.as_graph_def()

# Export frozen graph
with tf.io.gfile.GFile('frozen_graph.pb', 'wb') as f:
   f.write(graph_def.SerializeToString())

正如 OpenCV Github 問題中的評論所說: https : //github.com/opencv/opencv/issues/16582#issuecomment-603819498

然后,您可能需要使用 OpenCV wiki 中提供的tf_text_graph_ssd.py來生成凍結模型的文本圖表示,就是這樣!

Tensorflow 2 不再支持會話,因此您無法輕松地將模型導出為凍結圖。 我發現解決了我在 opencv 中使用 Tensorflow 對象檢測模型時遇到的問題。 希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM