深度神经网络——转换 TensorFlow 检测模型并使用 OpenCV Python 发布 OpenCV v4.8.0

本文介绍了如何使用OpenCVPythonAPI将TensorFlow检测模型,如SSDMobileNetV1,转换为可运行的模型,并提供了实际操作步骤,包括获取冻结图、模型配置和推断过程。
原作者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.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 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

结果如下

在这里插入图片描述

OpenCV SSD 巴士结果

有几个有用的参数,也可以自定义用于结果修正:阈值 (--thr) 和非最大抑制 (--nms) 值。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值