天天看点

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

前面介绍的ImageAI可以使用固定模型准确识别预设目标。但有的时候我们需要识别一些自定义的目标,因此需要能自定义识别的工具。

这篇教程是攻城狮看过的最良心的一篇win10环境的目标识别教程之一。在这里部分摘录翻译,供大家交流学习,共同进步。

算法结构为fast-rcnn,当然也可以读取其他结构。程序原作者已经封装好了,改config文件就可以用。

支持识别图片、视频和网络摄像头。

本文翻译自GITHUB的《How to train a TensorFlow Object Detection Classifier for multiple object detection on Windows》。

原文作者为:Evan EdjeElectronics 此处仅做翻译。

原文链接:https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

教学视频链接:https://www.youtube.com/watch?v=Rgpfk6eYxJA

先放一个买家秀,攻城狮没有安装gpu版本的tensorflow,因此只训练到loss=0.15左右,所以识别有一些错误。。

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)
基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

这个是攻城狮自己训练的认猫狗模型。

如果有朋友下载不方便的话,请留言,攻城狮想想办法把本地的文件传上去供大家下载。

这篇教程是攻城狮看过的最良心的一篇win10环境的目标识别教程之一。在这里部分摘录翻译,供大家交流学习,共同进步。

原文和原教学视频链接放在上面了,讲得比我的翻译更清楚,大家有条件可以去看看。

这篇教程的目标是识别部分扑克牌,同时标记扑克牌的位置。属于标记识别范畴。该程序支持自定义模型训练,因此,你可以用它来训练自己的模型,例如识别人脸、识别花鸟等等。

最后的结果支持识别图片、视频和网络摄像头摄像结果。

以下为正文内容:

1、安装Tensorflow(GPU版本)

这一步相关教程有很多了,这里放一个链接:

https://www.youtube.com/watch?v=RplXYjxgZbw

2、建立项目文件夹(Tensorflow1)并配置ananconda的项目环境

在C盘建立一个文件夹 /Tensorflow1。

下载 https://github.com/tensorflow/models 上的models—master文件,解压并且放在/Tensorflow1里。将models—master重命名为models。

下载Faster-RCNN-Inception-V2模型。链接在这里:

http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

用解压软件解压并放在C:\tensorflow1\models\research\object_detection folder这个路径下。

下载原文地址的压缩包,复制到C:\tensorflow1\models\research\object_detection里。

完成后,文件夹结构如下:

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

如果你想要训练自己的识别模型,请删掉以下文件(不要删文件夹):

All files in \object_detection\images\train and \object_detection\images\test

The “test_labels.csv” and “train_labels.csv” files in \object_detection\images

All files in \object_detection\training

All files in \object_detection\inference_graph

建立一个anaconda项目环境(tensorflow1)

建立一个叫做tensorflow1的项目环境

C:\> conda create -n tensorflow1 pip python=3.5
           

激活tensorflow1环境

C:\> activate tensorflow1
           

在该环境内安装tensorflow(gpu)版本

(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu
           

安装一些必要的库

(tensorflow1) C:\> conda install -c anaconda protobuf
(tensorflow1) C:\> pip install pillow
(tensorflow1) C:\> pip install lxml
(tensorflow1) C:\> pip install Cython
(tensorflow1) C:\> pip install jupyter
(tensorflow1) C:\> pip install matplotlib
(tensorflow1) C:\> pip install pandas
(tensorflow1) C:\> pip install opencv-python
           

把PYTHONPATH指到我们的文件夹

(tensorflow1) C:\> set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
           

每次重新启动命令行的时候,都要重新输一遍这个指令。

编译Protobufs 并且运行run setup.py

在anaconda的Prompt里运行

protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto
           

在命令行里运行

(tensorflow1) C:\tensorflow1\models\research> python setup.py build
(tensorflow1) C:\tensorflow1\models\research> python setup.py install
           

用以下代码测试一下环境能否正常工作

(tensorflow1) C:\tensorflow1\models\research\object_detection> jupyter notebook object_detection_tutorial.ipynb
           

如果正常运行,会出现:

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

识别了两只狗狗,以及一张海滨的图片。

这里是用了已有的模型对两张示例图片做识别。

3、收集和标记图片

作者在家里自己拍了140张图片,然后从网上下载了一些,总计311张图来训练模型。

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

这里作者提醒,每张图片最好小于200KB,分辨率不超过720x1280,否则会训练得非常慢。

准备好照片后,把20% 的照片放进 \object_detection\images\test文件夹。

把80% 的照片放进 \object_detection\images\train文件夹。

在labelmg软件中标记图片,下载链接:

https://www.dropbox.com/s/tq7zfrcwl44vxan/windows_v1.6.0.zip?dl=1

这一步是最耗时的,攻城狮标了一个上午。。

标记完成后,生成的使很多.xml文件,我们需要把它转化成 .csv文件。

在Anaconda command prompt里,执行以下命令:

(tensorflow1) C:\tensorflow1\models\research\object_detection> python xml_to_csv.py
           

这一步在\object_detection\images文件夹里把之前的.xml转化成.csv文件。

如果你想训练自己的模型,需要调整labelmap.pbtxt 的内容

例如

# TO-DO replace this with label map
def class_text_to_int(row_label):
    if row_label == 'nine':
        return 1
    elif row_label == 'ten':
        return 2
    elif row_label == 'jack':
        return 3
    elif row_label == 'queen':
        return 4
    elif row_label == 'king':
        return 5
    elif row_label == 'ace':
        return 6
    else:
        return None
           

调整为

# TO-DO replace this with label map
def class_text_to_int(row_label):
    if row_label == 'basketball':
        return 1
    elif row_label == 'shirt':
        return 2
    elif row_label == 'shoe':
        return 3
    else:
        return None
           

然后,把文件转化成TFRecord

python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
           

5、创建Labelmap并且设定训练的输入输出路径

在C:\tensorflow1\models\research\object_detection\training里创建记事本文件,保存为labelmap.pbtxt。注意是pbtxt,不是txt。

在文件里写以下代码

item {
  id: 1
  name: 'nine'
}

item {
  id: 2
  name: 'ten'
}

item {
  id: 3
  name: 'jack'
}

item {
  id: 4
  name: 'queen'
}

item {
  id: 5
  name: 'king'
}

item {
  id: 6
  name: 'ace'
}
           

如果要训练自己的模型,可以做一些修改,例如改成

item {
  id: 1
  name: 'basketball'
}

item {
  id: 2
  name: 'shirt'
}

item {
  id: 3
  name: 'shoe'
}
           

设定训练输入输出通道:

在 C:\tensorflow1\models\research\object_detection\samples\configs文件夹里,复制faster_rcnn_inception_v2_pets.config文件到\object_detection\training文件夹里。

对faster_rcnn_inception_v2_pets.config文件做一下修改(这块攻城狮直接拷贝的原文,因为怕翻译造成意思上的歧义:

第 9行. 把classes的num改成你想要探测的类的数量。

例如:For the above basketball, shirt, and shoe detector, it would be num_classes : 3 .

Line 110. Change fine_tune_checkpoint to:

fine_tune_checkpoint : “C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt”

Lines 126 and 128. In the train_input_reader section, change input_path and label_map_path to:

input_path : “C:/tensorflow1/models/research/object_detection/train.record”

label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

Line 132. Change num_examples to the number of images you have in the \images\test directory.

Lines 140 and 142. In the eval_input_reader section, change input_path and label_map_path to:

input_path : “C:/tensorflow1/models/research/object_detection/test.record”

label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

6、训练模型

在\object_detection目录内,执行以下命令:

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

如果一切正常,会出现训练过程如下:

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

作者建议训练到loss低于0.05为止。

在Anaconda Prompt里,激活tensorflow1环境,并且输入以下指令

(tensorflow1) C:\tensorflow1\models\research\object_detection>tensorboard --logdir=training
           

会得到一个网址:YourPCName:6006

在浏览器里输入这个网址,可以打开TensorBoard,让你可视化地看训练过程。

训练中,可以用Ctrl+C 中止,之后重复前面的训练操作可以继续训练,从最后一个记录点继续。

7、输出Inference Graph

在命令行里执行

其中,XXXX需要换成你的模型号

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph
           

在\object_detection\inference_graph文件夹里创建一个.pb文件。

8、使用目标识别探测器

在Anaconda Command Prompt里(tensorflow1环境)中输入:idle。

对应窗口中打开 \object_detection文件夹的Object_detection_image.py文件来识别单个图片。(Object_detection_image.py文件里的图片名可以改成\object_detection文件夹里的对应图片名,来识别你想识别的图片)

同样,可以用Object_detection_video.py来识别视频

用Object_detection_webcam.py识别网络摄像机。

卖家秀:

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

买家秀(loss=0.15左右)

基于tensorflow的自定义目标识别(win10环境) ——电气攻城狮的AI入门之旅(3)

继续阅读