5.训练模型之利用训练的模型识别物体
接下来我们开始训练,这里要做三件事:
- 将训练数据上传到训练服务器,开始训练。
- 将训练过程可视化。
- 导出训练结果导出为可用作推导的模型文件。
配置 Pipeline.config
在训练之前,我们需要按照前面章节中的相关内容配置一个 pipeline.config 文件,可以使用上一章节中的配置文件作为起始模板,然后再额外调整一些参数:
ssd {
....
num_classes: 1
...
}
训练数据中的物体只有一种类别,所以把num_classes
设为1.
eval_config: {
...
num_examples: 60
...
}
这里将num_examples
设为测试集的数据个数,200 X 0.3 = 60,我们在后面可视化学习过程中会用到的。
num_steps: 20000
最后将训练迭代的次数调整到 20000 次。最终的训练目录是这样的:
然后将训练目录打包上传到训练服务器,按照第三课时的内容运行训练脚本。
可视化训练过程
将训练过程可视化是一个很重要的步骤,这样可以随时检查学习的效果,对后期的模型调优有很大的指导意义。
做法是每隔一段时间,加载当前的的训练结果,选取一些测试数据,进行推理,根据推理结果生成日志,然后用 TensorBoard 将这些日志进行可视化(称做一次评估)。下面我们来看怎么做,在训练服务器上运行:
#进入 models/research
python object_detection/eval.py
--logtostderr
--pipeline_config_path=${TRAIN_DIR}/model/pipeline.config
--checkpoint_dir=${TRAIN_DIR}/model/train
--eval_dir=${TRAIN_DIR}/model/val
需要将TRAIN_DIR
替换为训练目录的绝对路径,然后运行 TensorBoard:
tensorboard --logdir=${TRAIN_DIR}/model
之后打开 http:// <服务器 IP>:6006 就可以看到可视化的结果:
我们比较关心的是 Total Loss 和 Precision(准确率):
其中 x 轴为训练的步数,可以看到随着训练的进行,Loss 在下降,Precision 在提高。
单击 IMAGES tab,还可以看到可视化的推理结果:
可以看出其实在 15000 步左右的时候,这个识别模型已经有了不错的效果。拖动图片上方的小圆点,还可以查看每一次评估时的推理结果:
整个训练的时间大概在 6 个小时左右,如果我们从 SSH 登录训练主机的终端直接运行训练代码,那么假设网络出现问题导致 SSH 断开连接的话,训练也会终止,这可不是我们希望看到的。
可以用 Screen 命令来避开这个问题:
这样的话如果当前终端的 session 中止,也不会影响训练运行了。如果想重新登入某个 session 的话,可以运行:screen -ls
。
输出结果是这样:
假设我们需要重新登入之前训练脚本 session 的话,可以运行: screen -r 11728.train
,就可以看到训练脚本仍然在终端上不停的输出信息。
OK,现在是时候喝点咖啡,6 个小时以后来收获训练结果了。
导出模型文件
大约 6 个小时以后,模型就训练好了。这个时候可以把训练文件夹打包下载到我们的笔记本上面,然后关闭和终止训练主机,这样就不再计费了。
在训练目录的 model/train 目录下会有一些 checkpoint 文件,比如:
我们需要选择一个 checkpoint,将其导出为可用于推理的模型文件,这里选择第 20000 步的 checkpoint,运行导出脚本:
# 进入tensorflow/models/research/
python object_detection/export_inference_graph.py
--input_type image_tensor
--pipeline_config_path ${TRAIN_PATH}/model/pipeline.config
--trained_checkpoint_prefix ${TRAIN_PATH}/model/train/model.ckpt-20000
--output_directory ${TRAIN_PATH}/output
之后就可以在训练目录的 output 目录下找到一个frozen_inference_graph.pb
文件,这就是我们导出的模型文件。
把这个模型导入到《物体识别》系列课程中的 Android App中,检验一下识别效果:
效果还不错, 可以在后台回复“熊猫模型”发送给你模型文件。
你可能会发现有一些图片中的熊猫不能被识别,那是因为为了演示方便,选取的熊猫样本图片和训练时间都不足够,这是正常的。
我们终于训练出了一个属于我们自己的、独一无二的模型。现在可以根据业务需求自行的进行训练并应用训练结果了,鼓掌!
可能有人会问,我们用一个可以识别很多其他物体的模型做转移学习,训练出来了一个可以识别熊猫的模型,那么训练出来模型是不是也可以识别其他物体呢。答案是否定的,你不能通过转移学习向一个已经训练好的识别模型里面增加可识别的物体,只能通过转移学习来加速你自己模型的训练速度。
- Spark详解02Job 逻辑执行图Job 逻辑执行图
- Spark详解01概览|Spark部署|执行原理概览Job 例子
- Spark详解05架构Architecture架构
- SQL Server常用命令(平时不用别忘了)
- Spark详解06容错机制Cache 和 Checkpoint Cache 和 Checkpoint
- SQL Server 学习笔记
- Collaborative Filtering(协同过滤)算法详解
- 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?
- Spark系列课程-00xxSpark RDD持久化
- RDD持久化
- P02_Hadoop CDH 5.3.6集群搭建
- P01_Spark开发测试运行环境安装Spark开发测试运行环境安装
- spark2.x依赖包POM
- P03_Hive 安装
- 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 数组属性和方法
- Kaggle Tweet Sentiment Extraction 第七名复盘
- 【翻译】.NET 5中的性能改进
- 腾讯云实时语音识别-iOS SDK
- JointPoint用法及与ProceedingJoinPoint 的关系
- Spring中的异步请求、异步调用及demo测试
- 以太坊交易签名解析源码解读
- 比较NaN和数字
- GO 的方法集
- 轻松应对并发问题,简易的火车票售票系统,第一步 —业务分析
- 【Spark Operator】核数设置Cores/Cores Limit/Cores Request,你搞清楚没有?
- 【Ceph RGW】radosgw_usage_exporter监控用户使用量
- 【Goland】#{key}=#{value},字符串被格式化了?
- Variable变量
- 案例:OGG目标端进程ABENDED处理
- Elasticsearch深分页以及排序查询问题