前面介绍的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左右,所以识别有一些错误。。
这个是攻城狮自己训练的认猫狗模型。
如果有朋友下载不方便的话,请留言,攻城狮想想办法把本地的文件传上去供大家下载。
这篇教程是攻城狮看过的最良心的一篇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里。
完成后,文件夹结构如下:
如果你想要训练自己的识别模型,请删掉以下文件(不要删文件夹):
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
如果正常运行,会出现:
识别了两只狗狗,以及一张海滨的图片。
这里是用了已有的模型对两张示例图片做识别。
3、收集和标记图片
作者在家里自己拍了140张图片,然后从网上下载了一些,总计311张图来训练模型。
这里作者提醒,每张图片最好小于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
如果一切正常,会出现训练过程如下:
作者建议训练到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识别网络摄像机。
卖家秀:
买家秀(loss=0.15左右)