TensorFlow⽬标检测模型转换为OpenCVDNN可调⽤格式
原⽂:
在 OpenCV4.X 版本(OpenCV3.4.1之后版本) 可以采⽤ adNetFromTensorflow(pbmodel, pbtxt) 函数直接调⽤ TensorFlow 训练的⽬标检测模型.
1. TensorFlow Detection Model Zoo
TensorFlow ⽬标检测预训练模型:
1.1. 基于 COCO 数据训练的模型
Model name Speed (ms)COCO mAP[^1]Outputs
3021Boxes
2618Boxes
2918Boxes
2916Boxes
2620Boxes
5632Boxes
7635Boxes
3122Boxes
2922Boxes
2722Boxes
4224Boxes
5828Boxes
8930Boxes
64Boxes
9230Boxes
10632Boxes
82Boxes
62037Boxes
241Boxes
183343Boxes
540Boxes
77136Masks
7925Masks
47033Masks
34329Masks
注:
[1] - 带五⾓星符号(☆) 表⽰模型⽀持 TPU 训练.
[2] - 下载 quantized 模型的 . ⽂件并解压后,会得到不同的⽂件,包括:checkpoint ⽂件,config 配置⽂件和 tfile frozen
graphs(txt/binary)⽂件.
1.2. 基于 Kitti 数据集训练的模型
Model name Speed (ms)Pascal mAP@0.5Outputs
7987Boxes
1.3. 基于 Open Images 数据集训练的模型
Model name Speed (ms)Open Images mAP@0.5[^2]Outputs
72737Boxes
347Boxes [^3]2073 (faces)Boxes
Model name Speed (ms)Open Images mAP@0.5[^4]Outputs
42554Boxes
8936Boxes
23738Boxes
1.4. 基于 iNaturalist Species 数据集训练的模型
Model name Speed (ms)Pascal mAP@0.5Outputs
39558Boxes
36655Boxes
1.5. 基于 AVA v
2.1 训练的模型
Model name Speed (ms)Pascal mAP@0.5Outputs
9311Boxes
1.6. TensorFlow ⽬标检测 API - SSD 例⽰
TensorFlow 中,深度学习⽹络被表⽰为图(graphs),其中图中每个节点(node) 是其输⼊的⼀种变换. 节点可以是常⽤⽹络层,如 C++ 实现的 Convolution 和 MaxPooling 层. 也可以采⽤ python 利⽤ TensorFlow 操作⼦(operations) 来构建⾃定义⽹络层.
TensorFlow ⽬标检测API 是⽤于创建⽬标检测深度⽹络的框架.
TensorFlow 训练得到的模型是 .pb 后缀的⼆值⽂件,其同时保存了训练⽹络的拓扑(topology)结构和模型权重.
这⾥以 ssd_mobilenet_v2_coco_2018_03_29 预训练模型(基于 COCO 数据集训练的 MobileNet-SSD模型)为例:
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
import tensorflow as tf
model_path ="/path/to/ssd_mobilenet_v2_coco_2018_03_29"
frozen_pb_file = os.path.join(model_path,'frozen_inference_graph.pb') score_threshold =0.3
img_file ='test.jpg'
# Read the graph.
with tf.gfile.FastGFile(frozen_pb_file,'rb')as f:
graph_def = tf.GraphDef()
graph_def.ad())
with tf.Session()as sess:
# Restore session
tf.import_graph_def(graph_def, name='')
# Read and preprocess an image.
img_cv2 = cv2.imread(img_file)
img_height, img_width, _ = img_cv2.shape
img_in = size(img_cv2,(300,300))
img_in = img_in[:,:,[2,1,0]]# BGR2RGB
# Run the model
outputs = sess.run([_tensor_by_name('num_detections:0'),                    _tensor_by_name('detection_scores:0'),
<_tensor_by_name('detection_boxes:0'),
<_tensor_by_name('detection_classes:0')],
feed_dict={
'image_tensor:0': shape(1,
img_in.shape[0],
img_in.shape[1],
3)})
# Visualize detected bounding boxes.
num_detections =int(outputs[0][0])
for i in range(num_detections):
classId =int(outputs[3][0][i])
score =float(outputs[1][0][i])
bbox =[float(v)for v in outputs[2][0][i]]
if score > score_threshold:
x = bbox[1]* img_width
y = bbox[0]* img_height
right = bbox[3]* img_width
bottom = bbox[2]* img_height
(int(x),int(y)),
(int(right),int(bottom)),
(125,255,51),
thickness=2)
plt.figure(figsize=(10,8))
plt.imshow(img_cv2[:,:,::-1])
plt.title("TensorFlow MobileNetV2-SSD")
plt.axis("off")
plt.show()
⽬标检测结果如:
2. TensorFlow ⽬标检测模型转换为 DNN 可调⽤格式
OpenCV DNN 模块调⽤ TensorFlow 训练的⽬标检测模型时,需要⼀个额外的配置⽂件,其主要是基于与 protocol buffers(protobuf)格式序列化图(graph) 相同的⽂本格式版本.
2.1. DNN 已可直接调⽤检测模型
OpenCV 中已经提供的 TensorFlow ⽬标检测模型和配置⽂件有:
Model Version
MobileNet-SSD v12017_11_17
MobileNet-SSD v1 PPN2018_07_03
MobileNet-SSD v22018_03_29
Inception-SSD v22017_11_17
Faster-RCNN Inception v22018_01_28
Faster-RCNN ResNet-502018_01_28
Mask-RCNN Inception v22018_01_28
2.2. 常⽤⽬标检测模型转换
三种不同的 TensorFlow ⽬标检测模型转换脚本为:
转换脚本的输⼊参数:
[1] - --input: TensorFlow frozen graph ⽂件路径.
[2] - --config: TensorFlow 模型训练时的 *.config ⽂件路径.
注: TensorFlow *.config配置⽂件:.
转换脚本的输出参数:
[1] - --output: 输出的 text graph ⽂件.
如:
faster rcnn 模型:
python3 tf_text_graph_faster_rcnn.py \
--input '/path/to/faster_rcnn_resnet50_coco_2018_01_28/frozen_inference_graph.pb' \
--config '/path/to/faster_rcnn_fig' \
--output '/path/to/faster_rcnn_resnet50_coco_2018_01_28/graph.pbtxt'
ssd 模型:
python3 tf_text_graph_ssd.py \
--input /path/to/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb \
--config /path/to/ssd_inception_fig \
--output /path/to/ssd_inception_v2_coco_2018_01_28/graph.pbtxt
mask rcnn 模型:
python3 tf_text_graph_mask_rcnn2.py \
-
rectangle函数opencv
-input '/path/to/mask_rcnn_resnet50_atrous_coco_2018_01_28/frozen_inference_graph.pb' \
--config '/path/to/mask_rcnn_resnet50_fig' \
--output '/path/to/mask_rcnn_resnet50_atrous_coco_2018_01_28/graph.pbtxt'
对于⽣成的 graph.pbtxt 可采⽤ Netron ⼯具进⾏可视化.
2.3. DNN ⽬标检测 - SSD 例⽰
与 TensorFLow ⽬标检测 API -SSD 例⽰ ⼀样,检测测试下基于 OpenCV DNN 的 SSD ⽬标检测.
[1] - ⾸先进⾏模型转换,如:
python3 tf_text_graph_ssd.py \
--input '/path/to/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb' \
--config '/path/to/ssd_mobilenet_fig' \
--output '/path/to/ssd_mobilenet_v2_coco_2018_03_29/graph.pbtxt'
终端打印的转换过程如:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。