欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~

作者:付越

导语

Tensorflow在更新1.0版本之后多了很多新功能,其中放出了很多用tf框架写的深度网络结构(https://github.com/tensorflow/models ),大大降低了开发难度,利用现成的网络结构,无论fine-tuning还是重新训练方便了不少。最近笔者终于跑通TensorFlow Object Detection API的ssd_mobilenet_v1模型,这里记录下如何完整跑通数据准备到模型使用的整个过程,相信对自己和一些同学能有所帮助。

Object Detection API提供了5种网络结构的预训练的权重,全部是用COCO数据集进行训练,这五种模型分别是SSD+mobilenet、SSD+inception_v2、R-FCN+resnet101、faster RCNN+resnet101、faster RCNN+inception+resnet101。各个模型的精度和计算所需时间如下。下面及介绍下如何使用Object Detection去训练自己的模型。

这里TensorFlow的安装就不再说明了,网上的教程一大把,大家可以找到很详尽的安装TensorFlow的文档。

训练前准备:

使用protobuf来配置模型和训练参数,所以API正常使用必须先编译protobuf库,这里可以下载直接编译好的pb库(https://github.com/google/protobuf/releases ),解压压缩包后,把protoc加入到环境变量中:

$ cd tensorflow/models$ protoc object_detection/protos/*.proto --python_out=.

(我是把protoc加到环境变量中,遇到找不到*.proto文件的报错,后来把protoc.exe放到models/object_detection目录下,重新执行才可以)

然后将models和slim(tf高级框架)加入python环境变量:

PYTHONPATH=$PYTHONPATH:/your/path/to/tensorflow/models:/your/path/to/tensorflow/models/slim

数据准备:

数据集需要转化成PASCAL VOC结构,API提供了create_pascal_tf_record.py,把VOC结构数据集转换成.record格式。不过我们发现更简单的方式,Datitran提供一种更简单生产.record格式的方法。

首先需要先要标注图像相应标签,这里可以使用labelImg工具。每标注一张样本,即生成一个xml的标注文件。然后,把这些标注的xml文件,按训练集与验证集分别放置到两个目录下,在Datitran提供了xml_to_csv.py脚本。这里只要指定标注的目录名即可。接下来,然后需要我们把对应的csv格式转换成.record格式。

def main():# image_path = os.path.join(os.getcwd(), 'annotations')image_path = r'D:\training-sets\object-detection\sunglasses\label\test'xml_df = xml_to_csv(image_path)xml_df.to_csv('sunglasses_test_labels.csv', index=None)print('Successfully converted xml to csv.')

调用generate_tfrecord.py,注意要指定--csv_input与--output_path这两个参数。执行下面命令:

python generate_tfrecord.py --csv_input=sunglasses_test_labels.csv --output_path=sunglass_test.record

这样就生成了训练及验证用的train.record与test.record。接下来指定标签名称,仿照models/ object_detection/data/ pet_label_map.pbtxt,重新创建一个文件,指定标签名。

item {id: 1name: 'sunglasses'
}

训练:

根据自己的需要,选择一款用coco数据集预训练的模型,把前缀model.ckpt放置在待训练的目录,这里meta文件保存了graph和metadata,ckpt保存了网络的weights,这几个文件表示预训练模型的初始状态。

打开ssd_mobilenet_v1_pets.config文件,并做如下修改:

  1. num_classes:修改为自己的classes num

  1. 将所有PATH_TO_BE_CONFIGURED的地方修改为自己之前设置的路径(共5处)

其他参数均保持默认参数。

准备好上述文件后就可以直接调用train文件进行训练。

python object_detection/train.py \
--logtostderr \
--pipeline_config_path= D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config \
--train_dir=D:/training-sets/data-translate/training

TensorBoard监控:

通过tensorboard工具,可以监控训练过程,输入西面指令后,在浏览器输入localhost:6006(默认)即可。

tensorboard --logdir= D:/training-sets/data-translate/training

这里面有很多指标曲线,甚至有模型网络架构,笔者对于这里面很多指标含义还没有弄明白,不过感觉出TensorBoard这个工具应该是极其强大。不过我们可以通过Total_Loss来看整体训练的情况。

从整体上看,loss曲线确实是收敛的,整体的训练效果还是满意的。另外,TensorFlow还提供了训练过程中利用验证集验证准确性的能力,但是笔者在调用时,仍有些问题,这里暂时就不详细说明了。

Freeze Model模型导出:

查看模型实际的效果前,我们需要把训练的过程文件导出,生产.pb的模型文件。本来,tensorflow/python/tools/freeze_graph.py提供了freeze model的api,但是需要提供输出的final node names(一般是softmax之类的最后一层的激活函数命名),而object detection api提供提供了预训练好的网络,final node name并不好找,所以object_detection目录下还提供了export_inference_graph.py。

python export_inference_graph.py \
--input_type image_tensor
--pipeline_config_path D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config \
--trained_checkpoint_prefix D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config /model.ckpt-* \
--output_directory D:/training-sets /data-translate/training/result

导出完成后,在output_directory下,会生成frozen_inference_graph.pb、model.ckpt.data-00000-of-00001、model.ckpt.meta、model.ckpt.data文件。

调用生成模型:

目录下本身有一个调用的例子,稍微改造如下:

import cv2
import numpy as np
import tensorflow as tf
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_utilclass TOD(object):def __init__(self):self.PATH_TO_CKPT = r'D:\lib\tf-model\models-master\object_detection\training\frozen_inference_graph.pb'self.PATH_TO_LABELS = r'D:\lib\tf-model\models-master\object_detection\training\sunglasses_label_map.pbtxt'self.NUM_CLASSES = 1self.detection_graph = self._load_model()self.category_index = self._load_label_map()def _load_model(self):detection_graph = tf.Graph()with detection_graph.as_default():od_graph_def = tf.GraphDef()with tf.gfile.GFile(self.PATH_TO_CKPT, 'rb') as fid:serialized_graph = fid.read()od_graph_def.ParseFromString(serialized_graph)tf.import_graph_def(od_graph_def, name='')return detection_graphdef _load_label_map(self):label_map = label_map_util.load_labelmap(self.PATH_TO_LABELS)categories = label_map_util.convert_label_map_to_categories(label_map,max_num_classes=self.NUM_CLASSES,use_display_name=True)category_index = label_map_util.create_category_index(categories)return category_indexdef detect(self, image):with self.detection_graph.as_default():with tf.Session(graph=self.detection_graph) as sess:# Expand dimensions since the model expects images to have shape: [1, None, None, 3]image_np_expanded = np.expand_dims(image, axis=0)image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')scores = self.detection_graph.get_tensor_by_name('detection_scores:0')classes = self.detection_graph.get_tensor_by_name('detection_classes:0')num_detections = self.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.squeeze(boxes),np.squeeze(classes).astype(np.int32),np.squeeze(scores),self.category_index,use_normalized_coordinates=True,line_thickness=8)cv2.namedWindow("detection", cv2.WINDOW_NORMAL)cv2.imshow("detection", image)cv2.waitKey(0)if __name__ == '__main__':image = cv2.imread('image.jpg')detecotr = TOD()detecotr.detect(image)

下面是一些图片的识别效果:

相关阅读

当强化学习遇见泛函分析

google cloud :穷人也能玩深度学习

[ I am Jarvis ] :聊聊 FaceID 背后的深度学习视觉算法

此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:https://cloud.tencent.com/community/article/351424

深度学习入门篇--手把手教你用 TensorFlow 训练模型相关推荐

  1. 深度学习入门:手把手教你用TensorFlow搭建图像识别模块

    之前和大家简单介绍了什么是神经网络(见我的文章:一句话告诉你什么是神经网络 ).那么今天再跟大家分享一些深度学习算法在图像识别上的应用.主要内容大概可以分为如下三个部分: ● 深度学习介绍: ● 神经 ...

  2. [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式)

    [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式) 个人网站–> http://www.yansongsong.cn TensorFl ...

  3. 深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用

    一.部署流程 先参考上一篇博客,学会Lenet在caffe上训练 caffe+qt+lenet实现手写体识别源码下载地址. 把训练好的权重文件和深度神经网络部署到Qt上,实现手写体的识别. 环境要求( ...

  4. 机器学习笔记——深度学习入门篇

    前向传播与反向传播 转载于:https://www.cnblogs.com/hdu-cpd/p/5988606.html

  5. 深度学习入门篇——一、Pytorch环境配置(GPU:GeForce 940MX)

    安装pytorch的几点注意事项: ①确定你的电脑显卡是否支持cuda.可取网站查询:CUDA Zone - Library of Resources | NVIDIA Developerhttps: ...

  6. 独家 | 17篇手把手教技术指南、技术进阶干货大合集

    数据派一直致力于打造数据科学人才聚集地,传播数据科学知识,分享前沿科技动态,分析应用案例,组织线下活动.本文通过梳理往期内容,挑选出数据派研究部出品的"一文读懂"."手把 ...

  7. 使用TensorFlow.js在浏览器中进行深度学习入门

    目录 设置TensorFlow.js 创建训练数据 检查点 定义神经网络模型 训练AI 测试结果 终点线 内存使用注意事项 下一步是什么?狗和披萨? 下载TensorFlowJS示例-6.1 MB T ...

  8. 报名 | NVIDIA线下交流会:手把手教你搭建TensorFlow Caffe深度学习服务器

    7月21日(周六)下午14:30,量子位与NVIDIA英伟达开发者社区联合举办线下交流会,拥有丰富一线开发经验的NVIDIA开发者社区经理Ken He,将手把手教你搭建TensorFlow & ...

  9. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

最新文章

  1. 在单元测试中访问私有字段
  2. linux中使用Vsftpd+nginx 搭建文件服务器
  3. shell 第三次练习
  4. spring集成mybatis后怎么在控制台打印sql语句
  5. MyBatis源码阅读(十) --- 一级缓存、二级缓存工作原理
  6. Excel用控件动态控制图表
  7. 人工智能 一种现代方法 第2章 智能化智能体
  8. matlab 有限元分析与应用,matlab有限元分析与应用(书及源程序)
  9. 基模高斯光束matlab_MATLAB 高斯光束传播轨迹的模拟
  10. 【人月神话】浅谈人月神话0.2什么是“人月”,为什么是“神话”?
  11. python绘制三维动态柱状图-使用pyecharts模块
  12. 13步设计出一个ITSM系统
  13. [JZOJ4274] [NOIP2015模拟10.28B组] 终章-剑之魂 解题报告(二进制)
  14. 阿里副总裁、达摩院副院长金榕被曝离职!AI科学家集体“逃离“大厂…
  15. 流媒体转发服务器系统,流媒体转发服务器配置
  16. 张无忌放弃了江湖与江山
  17. 年度Java技术盘点,懂这些技术的程序员2019年薪资翻倍!
  18. spring cloud--微服务
  19. Python机器学习与量化交易
  20. 大智慧专业财务PFFIN(N,M)函数N的取值一览表

热门文章

  1. linux jdk免安装配置,生产环境免安装jdk的使用方法
  2. matlab批量储存变量_[转载]整理:matlab批量读入数据文件的方法
  3. 临床预测模型开发checklist详解
  4. 中专计算机技术难吗,中专学计算机专业难不难?
  5. Spring Data Jpa 实体类自动创建数据库表失败解决
  6. 数据结构一:链表(循环链表)
  7. shutdown()函数:优雅地断开TCP连接
  8. 语音信号处理之(一)动态时间规整(DTW)
  9. MAKEWPARAM 宏 及MAKELONG ,MAKELPARAM,MAKELRESULT
  10. mysql的查询语句怎么优化_MySQL查询语句如何优化