| |
| 原始作者 | 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.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)。 以下行启动 requirements 安装到先前激活的虚拟环境中
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 Object Detection API 的 ssd_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) 值。