OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
轉換 TensorFlow 檢測模型並使用 OpenCV Python 啟動

原始作者Anastasia Murzova
相容性OpenCV >= 4.5

目標

在本教程中,您將學習如何

  • 獲取 TensorFlow (TF) 檢測模型的凍結圖
  • 使用 OpenCV Python API 執行轉換後的 TensorFlow 模型

我們將以 SSD MobileNetV1 為例,探討以上列出的要點。

簡介

讓我們簡要了解一下 TensorFlow 模型與 OpenCV API 過渡流程中涉及的關鍵概念。 將 TensorFlow 模型轉換為 cv.dnn.Net 的初始步驟是獲取凍結的 TF 模型圖。 凍結圖定義了模型圖結構與所需變數的保留值的組合,例如權重。 凍結圖儲存在 protobuf (.pb) 檔案中。 OpenCV 中有特殊的函式用於讀取 .pb 圖:cv.dnn.readNetFromTensorflowcv.dnn.readNet

要求

為了能夠使用以下程式碼進行實驗,您需要安裝一組庫。 我們將為此使用 python3.7+ 的虛擬環境

virtualenv -p /usr/bin/python3.7 <env_dir_path>
source <env_dir_path>/bin/activate

對於從原始碼構建的 OpenCV-Python,請按照 OpenCV 簡介 中的相應說明進行操作。

在開始安裝庫之前,您可以自定義 requirements.txt,排除或包含一些依賴項(例如,opencv-python)。 以下行啟動 requirements 安裝到先前啟用的虛擬環境中

pip install -r requirements.txt

實踐

在本部分中,我們將介紹以下幾點

  1. 建立 TF 分類模型轉換管道並提供推理
  2. 提供推理,處理預測結果

模型準備

本子章節中的程式碼位於 samples/dnn/dnn_model_runner 模組中,可以使用以下行執行

python -m dnn_model_runner.dnn_conversion.tf.detection.py_to_py_ssd_mobilenet

以下程式碼包含 TF SSD MobileNetV1 模型檢索的步驟

tf_model_name = 'ssd_mobilenet_v1_coco_2017_11_17'
graph_extraction_dir = "./"
frozen_graph_path = extract_tf_frozen_graph(tf_model_name, graph_extraction_dir)
print("凍結圖路徑為 {}:{}".format(tf_model_name, frozen_graph_path))

extract_tf_frozen_graph 函式中,我們提取模型檔案中提供的 frozen_inference_graph.pb 以進行進一步處理

# 定義模型檔案名稱
tf_model_tar = model_name + '.tar.gz'
# 定義連結以檢索模型檔案
model_link = DETECTION_MODELS_URL + tf_model_tar
tf_frozen_graph_name = 'frozen_inference_graph'
try:
urllib.request.urlretrieve(model_link, tf_model_tar)
except Exception
print("TF {} 未檢索到:{}".format(model_name, model_link))
return
print("TF {} 已檢索。".format(model_name))
tf_model_tar = tarfile.open(tf_model_tar)
frozen_graph_path = ""
for model_tar_elem in tf_model_tar.getmembers()
if tf_frozen_graph_name in os.path.basename(model_tar_elem.name)
tf_model_tar.extract(model_tar_elem, extracted_model_path)
frozen_graph_path = os.path.join(extracted_model_path, model_tar_elem.name)
break
tf_model_tar.close()

成功執行以上程式碼後,我們將獲得以下輸出

TF ssd_mobilenet_v1_coco_2017_11_17 已檢索。
ssd_mobilenet_v1_coco_2017_11_17 的凍結圖路徑:./ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb

為了提供模型推理,我們將使用以下 雙層巴士照片(在 Pexels 許可下)

雙層巴士

要啟動測試過程,我們需要提供適當的模型配置。 我們將使用來自 TensorFlow Object Detection APIssd_mobilenet_v1_coco.config。 TensorFlow Object Detection API 框架包含用於物件檢測模型操作的有用機制。

我們將使用此配置來提供文字圖表示。 為了生成 .pbtxt,我們將使用相應的 samples/dnn/tf_text_graph_ssd.py 指令碼

python tf_text_graph_ssd.py --input ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb --config ssd_mobilenet_v1_coco_2017_11_17/ssd_mobilenet_v1_coco.config --output ssd_mobilenet_v1_coco_2017_11_17.pbtxt

成功執行後,將建立 ssd_mobilenet_v1_coco_2017_11_17.pbtxt

在我們執行 object_detection.py 之前,讓我們看一下 SSD MobileNetV1 測試過程配置的預設值。 它們位於 models.yml

ssd_tf
model: "ssd_mobilenet_v1_coco_2017_11_17.pb"
config: "ssd_mobilenet_v1_coco_2017_11_17.pbtxt"
mean: [0, 0, 0]
scale: 1.0
width: 300
height: 300
rgb: true
classes: "object_detection_classes_coco.txt"
sample: "object_detection"

為了獲取這些值,我們需要提供凍結圖 ssd_mobilenet_v1_coco_2017_11_17.pb 模型和文字圖 ssd_mobilenet_v1_coco_2017_11_17.pbtxt

python object_detection.py ssd_tf --input ../data/pexels_double_decker_bus.jpg

此行等效於

python object_detection.py --model ssd_mobilenet_v1_coco_2017_11_17.pb --config ssd_mobilenet_v1_coco_2017_11_17.pbtxt --input ../data/pexels_double_decker_bus.jpg --width 300 --height 300 --classes ../data/dnn/object_detection_classes_coco.txt

結果是

OpenCV SSD 巴士結果

有幾個有用的引數,也可以自定義這些引數以進行結果校正:閾值 (--thr) 和非極大值抑制 (--nms) 值。