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