| |
原作者 | 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("{} 的冻结图路径:{}".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 对象检测 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.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
) 值。