5.训练模型之利用训练的模型识别物体

时间:2022-05-07
本文章向大家介绍5.训练模型之利用训练的模型识别物体,主要内容包括配置 Pipeline.config、可视化训练过程、导出模型文件、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

接下来我们开始训练,这里要做三件事:

  • 将训练数据上传到训练服务器,开始训练。
  • 将训练过程可视化。
  • 导出训练结果导出为可用作推导的模型文件。

配置 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中,检验一下识别效果:

效果还不错, 可以在后台回复“熊猫模型”发送给你模型文件。

你可能会发现有一些图片中的熊猫不能被识别,那是因为为了演示方便,选取的熊猫样本图片和训练时间都不足够,这是正常的。

我们终于训练出了一个属于我们自己的、独一无二的模型。现在可以根据业务需求自行的进行训练并应用训练结果了,鼓掌!

可能有人会问,我们用一个可以识别很多其他物体的模型做转移学习,训练出来了一个可以识别熊猫的模型,那么训练出来模型是不是也可以识别其他物体呢。答案是否定的,你不能通过转移学习向一个已经训练好的识别模型里面增加可识别的物体,只能通过转移学习来加速你自己模型的训练速度。