TensorFlow之目标检测API接口调试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zong596568821xp/article/details/82015126

参考:https://www.ctolib.com/topics-130007.html

1 环境配置

环境:tensorflow-gpu:1.9(注意要选择1.9的版本,测试过1.7版本的在最后一步模型转化时会有问题),python3.6

下载github上的code

git clone https://github.com/tensorflow/models.git

因为models里边的项目很多都用protobuf来配置,所以需要在research目录下进行protobuf编译。先更新一下电脑上的protoc版本,一定要下载3.4.0的版本,其它版本试过都报错。首先运行 protoc --version检测自己的版本,如果不是3.4.0,就到官网下载3.4.0 python版本

下载完后解压,进入目录,然后执行:

sudo ./configure
sudo make check
sudo make install

安装完后,运行 protoc --version检查版本是否正确,如果运行时报错报错:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory 

则先把/usr/local/lib追加到LD_LIBRARY_PATH环境变量中

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

然后进入tf的reserch目录,依次执行如下指令

protoc object_detection/protos/*.proto --python_out=.     
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

上述指令的意思分别是在protos文件夹中根据proto文件生成python源码文件,以及把research及research目录下的slim位置追加到python路径的环境变量中(pwd表示当前目录)

接下来,从models/object_detection目录中运行jupyter notebook打开Jupyter 笔记本(安装方法)。从这里选择object_detection_tutorial.ipynb。 从这里,你应该能在主菜单中运行单元格,并选择全部运行。你应该得到以下结果:

2 使用自己的图片做检测

如果要检测自己的图片,一种方法是在test_image文件夹下放自己的图片,并重新命名为image*.jpg的格式;另一种方法是修改TEST_IMAGE_PATH为自己的图片路径就可以了

3 使用其它模型做检测

一共公布了5个模型,上面我们只是用最简单的ssd + mobilenet模型做了检测,如何使用其他模型呢?找到Tensorflow detection model zoo,根据里面模型的下载地址,我们只要分别把MODEL_NAME修改为以下的值,就可以下载并执行对应的模型了:

预训练的模型包括四个数据集的模型:COCO 数据集(微软开源的数据集)、 Kitti数据集(自动驾驶场景)、Open Images数据集(谷歌开源的数据集)、AVA v2.1数据集(人类动作识别数据集)

(IncResnet V2 对小目标的检测效果非常不错)

4 准备自己的训练数据

4.1 程序结构

先宏观的浏览一下整个程序最终的目录结构,如果发现有的文件或文件夹没有,不要着急,后边会依次介绍到构建方法,在后边构建的过程中如果不清楚结构关系,可再回头看看该目录:

-object_detection

--data
----object-detection.pbtxt
----test_labels.csv
----test.record
----train_labels.csv
----train.record
--export_inference_graph.py
--generate_tfrecord.py
--images
----test
------*.jpg *.xml
----train
------*.jpg *.xml
----*.jpg *.xml
--mac_n_cheese_inference_graph
----checkpoint
----frozen_inference_graph.pb
----model.ckpt.*
----pipeline.config
----saved_model
------saved_model.pb
--object_detection_tutorial.ipynb
--protos
--ssd_mobilenet_v1_coco_11_06_2017
--test_images
----image1.jpg
----image2.jpg
----image*.jpg
--train.py
--training
----checkpoint
----events.out.*
----graph.pbtxt
----model.ckpt-*
----object-detection.pbtxt
----pipeline.config
--xml_to_csv.py

首先介绍一下步骤顺序:

  • 收集几百个包含你的对象的图像 - 最低限度是大约 100,理想情况下是 500+,但是,你有的图像越多,第二步就越乏味...
  • 注释/标注你的图像,理想情况下使用程序。 我个人使用 LabelImg。 这个过程基本上是,在你图像的对象周围画框。 标注程序会自动创建一个描述图片中的对象的 XML 文件。
  • 将这些数据分解成训练/测试样本
  • 从这些分割生成 TF 记录
  • 为所选模型设置.config文件(你可以从头自己开始训练,但是我们将使用迁移学习)
  • 训练
  • 从新的训练模型导出图形
  • 实时检测自定义对象!
  • ...
  • 完成!

4.2 标注数据

对于本教程,你可以跟踪任何你想要的东西,只需要 100 多张图片。 一旦你有图像,你需要标注它们。 可以使用 LabelImg,具体安装及使用方法参考之前的文章,标注完之后每张图片都对应一个XML的标注文件。一旦你标记了超过 100 张图片被,就需要将把他们分成训练和测试组。 为此,只需将你的图像和注解 XML 文件的约 10% 复制到一个称为test的新目录,然后将其余的复制到一个叫做train的新目录。

在object_detection文件夹下,新建一个文件夹叫images,然后把之前创建的test文件夹和train文件夹放进去。同时,需要把test文件夹和train文件夹里的图片及标注文件全部复制到images文件夹下。如果有不清楚的,请参考这个数据集

下一步就要将这些XML文件转换为所需的 TFRecord 文件。

4.3 转换格式

首先下载转换所需的代码,我们只用到了其中的两个文件,一个是xml_to_csv.py,另一个是generate_tfrecord.py,将这两个文件都放入object_detection文件夹下。

在object_detection文件夹下,新建一个data文件夹,用来存放生成的csv文件和record文件

首先运行 python xml_to_csv.py,结果输出两个Successfully converted xml to csv.则正常,可进入data文件夹查看是否生成train_labels.csv和test_labels.csv

然后打开generate_tfrecord.py文件,找到class_text_to_int函数,将类别写进row_label中,如果有很多个类别,就继续构建这个if语句。

依次运行以下两条指令

python3 generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record

python3 generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=data/test.record

结果输出Successfully created the TFRecords: ……则正常,至此,数据构建完成

5 修改配置文件

在训练的时候,我们有两个选择。我们可以使用预训练的模型,然后使用迁移学习来习得一个新的对象,或者我们可以从头开始习得新的对象。迁移学习的好处是训练可能更快,你需要的数据可能少得多。出于这个原因,我们将在这里执行迁移学习。

TensorFlow 有相当多的预训练模型,带有检查点文件和配置文件。如果你喜欢,可以自己完成所有这些工作,查看他们的配置作业文档。对象 API 还提供了一些示例配置供你选择。

我打算使用 mobilenet,在object_detection文件夹下,下载以下两个文件并解压:

wget https://raw.githubusercontent.com/tensorflow/models/master/object_detection/samples/configs/ssd_mobilenet_v1_pets.config
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz
tar -xzvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz

首先新建一个training文件夹,然后cd进去,输入 vim object-detection.pbtxt 打开一个空文件,在文件夹里写入识别的种类,格式如下

item {
  id: 1
  name: 'macncheese'
}

如果有多个种类,就在后边继续添加,

item {
  id: 1
  name: 'macncheese'
}
item {
  id: 2
  name: 'milk'
}

然后保存退出。

接着打开ssd_mobilenet_v1_pets.config文件,更改之处总共有7项:1.训练类别数更改;2.验证阶段图片数量(视具体情况);3.训练,验证,标签路径更改;

  • num_classes:1
  • fine_tune_checkpoint:"ssd_mobilenet_v1_coco_11_06_2017/model.ckpt"
  • train_input_reader/input_path:"data/train.record"
  • train_input_reader/label_map_path:"training/object-detection.pbtxt"
  • num_examples:
  • eval_input_reader/inputpath:"data/test.record"
  • eval_input_reader/label_map_path: "training/object-detection.pbtxt"

修改完后保存退出

6 开始训练

首先在legacy文件夹中复制一份train.py到object_detection文件夹下,然后运行以下指令

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=ssd_mobilenet_v1_pets.config

如果都正确的话,就会开始训练,会有如下的输出:

……
INFO:tensorflow:global step 16360: loss = 1.6747 (0.165 sec/step)
INFO:tensorflow:global step 16361: loss = 2.3805 (0.193 sec/step)
INFO:tensorflow:global step 16362: loss = 0.8742 (0.152 sec/step)
INFO:tensorflow:global step 16363: loss = 0.7009 (0.151 sec/step)
INFO:tensorflow:global step 16364: loss = 0.5231 (0.197 sec/step)
……

训练的过程中,会在training文件夹中输出新文件,

其中model.ckpt是每隔一定时间,会保存模型,且只保存最近的5个模型权重。checkpoint文件中记录了最新的5个权重信息,events开头文件可在tensorboard中查看训练记录,pipeline.config和第5步中的配置文件一样。graph.pbtxt图表信息

可以通过tensorboard来查看,在object_detection文件夹中输入:tensorboard --logdir='training',默认占用6006端口,然后在浏览器中输入ip和端口号即可打开tensorboard,如果是本机的话,在浏览器中输入 127.0.0.1:6006即可。

可以看到loss逐渐下降,达到一个较好的训练状态

7 测试模型

7.1 模型转化

训练过程中,会在training文件夹中生成一些检查点文件,我们需要把这些文件转化为pb文件,这样才可以拿该模型进行实时测试识别

在object_detection文件夹下,有一个export_inference_graph.py文件可以帮助我们实现该功能。运行它时,只需要传入检查点文件和配置文件,以及输出文件的位置,例如:

python export_inference_graph.py --input_type image_tensor --pipeline_config_path ssd_mobilenet_v1_pets.config --trained_checkpoint_prefix training/model.ckpt-279099 --output_directory mac_n_cheese_interence_graph/

其中,在--trained_checkpoint_prefix参数中输入的是检查点文件,可以选择要转化哪一个,输出目录是mac_n_cheese_inference_graph,当然也可以定义为其它目录,只需要和后边路径保持一致即可。

运行完后,会在mac_n_cheese_inference_graph文件夹下生成目标文件,有一个saved_model目录,最重要的是生成了forzen_inference_graph.pb文件,我们之后用该模型进行识别

7.2 测试验证

首先在测试集(object_detection/images/test)中选几张图片复制到object_detection/test_images文件夹中,并重命名为image3.jpg、image4.jpg……然后在object_detection文件夹中运行jupyter_notebook,打开object_dection_tutorial.ipynb,接下来做几处修改

首先修改模型名称以及对应的路径

# What model to download.
MODEL_NAME = 'mac_n_cheese_inference_graph'

# Path to frozen detection graph. This is the actual model that is used for the object detection.
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('training', 'object-detection.pbtxt')

NUM_CLASSES = 1

然后,可以把整个下载模型的cell删除掉,因为不需要再下载模型了

最后,在检测部分,将TEST_IMAGE_PATHS变量更改为:

TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(3, 8) ]

后边的range(3,8)看自己实际有几张测试图片,比如有两张,改为(3,5)即可

改完之后,点击cell、run all,即可得到结果,如图所示

由图可知,经过一些训练,模型可正确识别到待检测的目标,表明模型的有效性。至此,完成了tensorflow目标检测API的全部调用,如有问题,欢迎大家留言讨论!

猜你喜欢

转载自blog.csdn.net/zong596568821xp/article/details/82015126