OpenCV  4.10.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)一些依赖项。以下代码行将需求安装初始化到先前激活的虚拟环境中

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("Frozen graph path for {}: {}".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 {} was not retrieved: {}".format(model_name, model_link))
return
print("TF {} was retrieved.".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 许可证)

双层巴士

要启动测试流程,我们需要提供适当的模型配置。我们将使用 ssd_mobilenet_v1_coco.config,该配置来自 TensorFlow Object Detection API。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"
示例:“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)值。