Tensorflow Object Detection API 终于支持tensorflow1.x与tensorflow2.x了
Tensorflow Object Detection API框架
基于tensorflow框架构建的快速对象检测模型构建、训练、部署框架,是针对计算机视觉领域对象检测任务的深度学习框架。之前tensorflow2.x一直不支持该框架,最近Tensorflow Object Detection API框架最近更新了,同时支持tensorflow1.x与tensorflow2.x。其中model zoo方面,tensorflow1.x基于COCO数据集预训练支持对象检测模型包括:
SSD,支持MobileNetv1/MobileNetv2/MobileNetv3/ResNet50 基础网络
Faster-RCNN,支持MobileNet/ResNet101/Inception基础网络
Mask-RCNN,支持ResNet101/ResNet50/Inception基础网络
Tensorflow2.x版本的模型库不仅支持tensorflow1.x这几种对象检测网络,还支持:
EfficientDet D0~EfficientDet D7
CenterNet HourGlass支持Box+KeyPoint
CenterNet Resnet50 支持Box+KeyPoint
此外还支持修改与注册自定义的对象检测模型训练。在框架安装方面也做了脚本优化,必以前更加的简介方便。官方github地址:
https://github.com/tensorflow/models/tree/master/research/object_detection
安装与配置
基于tensorflow1.x的Tensorflow Object Detection API框架,Windows环境霞依赖的软件与版本信息如下
-tensorflow1.15
-python3.6.5
-VS2015 VC++
-CUDA10.0(可选)
-Git-2.19.0-64-bit
-protoc-3.4.0-win32
01
下载源码
安装好上述依赖的软件与对应版本之后,首先需要的获取Tensorflow Object Detection API框架源码,执行下面的git命令行即可:
回车获取代码,最终得到的源码目录为:D:tensorflowmodels
02
编译源文件
编译protos文件,使用protoc-3.4.2-win32作为编译工具,执行如下的命令行:
这样就完成了编译。
03
安装依赖与运行测试
安装依赖python库,运行测试完成测试,执行如下代码:
回车执行,完成依赖包安装!然后再执行:
运行结果如下:
说明tensorflow1.x版本的Tensorflow Object Detection API框架正确安装完成。可以进行模型训练与测试、部署导出等。把上面的命令行中的tf1改成tf2就会完成tensorflow2.x版本的对象检测框架安装与配置。
运行代码测试
使用SSD MobileNet模型基于tensorflow1.x版本的对象检测框架,完成实时对象检测,代码实现如下:
MODEL_NAME = 'ssd_mobilenet_v2_coco_2018_03_29'
MODEL_FILE = 'D:/tensorflow/' + MODEL_NAME + '.tar'
# Path to frozen detection graph
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('D:/tensorflow/models/research/object_detection/data', 'mscoco_label_map.pbtxt')
NUM_CLASSES = 90
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
file_name = os.path.basename(file.name)
if 'frozen_inference_graph.pb' in file_name:
tar_file.extract(file, os.getcwd())
detection_graph = tf.Graph()
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name='')
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape(
(im_height, im_width, 3)).astype(np.uint8)
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
while True:
ret, image_np = cap.read()
image_np = cv.flip(image_np, 1)
image_np_expanded = np.expand_dims(image_np, axis=0)
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
scores = detection_graph.get_tensor_by_name('detection_scores:0')
classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
# Actual detection.
(boxes, scores, classes, num_detections) = sess.run(
[boxes, scores, classes, num_detections],
feed_dict={image_tensor: image_np_expanded})
# Visualization of the results of a detection.
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
cv.imshow('object detection', image_np)
c = cv.waitKey(1)
if c == 27: # ESC
cv.imwrite("D:/tensorflow/run_result.png", image_np)
cv.destroyAllWindows()
break
运行结果如下:
善始者实繁
克终者盖寡
- 洛谷 P1177 【模板】快速排序【13种排序模版】
- 一步一步深入理解Dijkstra算法
- 51 Nod 1791 合法括号子段【分治+字符串】
- ifconfig: command not found CentOS专版,其他的可以参考
- Codeforces 833E Caramel Clouds
- Codeforces 833D Red-black Cobweb【树分治】
- Codeforces 834E The Bakery【枚举+数位dp】
- 【Java学习笔记之一】java关键字及作用
- 如何让所有实体类用相同名称的主键(很有力的问题,比如所有表实体主键都用ID)
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
- memcached安装及.NET中的Memcached.ClientLibrary使用详解
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
- 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
- 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法