| 原作者 | Anastasia Murzova |
|---|---|
| 兼容性 | OpenCV >= 4.5 |
目标
在本教程中,您将学习如何
- 获取 TensorFlow (TF) 检测模型的冻结图
- 使用 OpenCV Python API 运行转换后的 TensorFlow 模型
我们将以 SSD MobileNetV1 为例探讨上述要点。
简介
让我们简单了解一下用 OpenCV API 转换 TensorFlow 模型的流程中涉及的关键概念。将 TensorFlow 模型转换为 cv.dnn.Net 的第一步是获取冻结的 TF 模型图。冻结图定义了模型图结构与所需变量(如权重)保留值的组合。冻结图保存在 protobuf (.pb) 文件中。OpenCV 中有读取 .pb 图的特殊函数:cv.dnn.readNetFromTensorflow 和 cv.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
实践
在这一部分,我们将介绍以下几点:
- 创建 TF 分类模型转换管道并提供推论
- 提供推理,处理预测结果
模型准备
本分章中的代码位于 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 was retrieved.
Frozen graph path for ssd_mobilenet_v1_coco_2017_11_17: ./ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
为了提供模型推论,我们将使用下面的双层巴士照片(采用 Pexels 许可):

要启动测试过程,我们需要提供适当的模型配置。我们将使用 TensorFlow 对象检测 API 中的 ssd_mobilenet_v1_coco.config。TensorFlow 对象检测 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.pptxt。
在运行 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
结果如下

有几个有用的参数,也可以自定义用于结果修正:阈值 (--thr) 和非最大抑制 (--nms) 值。
本文介绍了如何使用OpenCVPythonAPI将TensorFlow检测模型,如SSDMobileNetV1,转换为可运行的模型,并提供了实际操作步骤,包括获取冻结图、模型配置和推断过程。
3678

被折叠的 条评论
为什么被折叠?



