[AI] 使用object detection训练自己的模型用于物体识别
软件环境
- tensorflow (1.8.0)
- libprotoc 3.0.0/3.3.0
- tensorflow models
models/research/object_detection
(2018/dec版本)- models
git clone https://github.com/tensorflow/models.git
- pretrained models:
ssd_mobilenet_v1_coco_2018_01_28.tar.gz
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
tar xfvz ./ssd_mobilenet_v1_coco_2018_01_28.tar.gz
- Python pip libraries
pip install absl-py --user
pip install Cython --user
pip install pycocotools --user
pip install pillow --user //PIL
参考网站
把 tensorflow路径加到环境变量
nano ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/home/guohj/AI/lib/tensorflow/models-master/research:/home/guohj/AI/lib/tensorflow/models-master/research/slim
编译 proto files
guohj@guopc:/home/guohj/AI/lib/tensorflow/models-master/research$ ../../protobuf/v3.3/bin/protoc object_detection/protos/*.proto --python_out=.
guohj@guopc:/home/guohj/AI/lib/tensorflow/models-master/research$
标记图像 label Images
使用工具LabelImg:
- Github: label Img
- 教程: 图片标注工具使用介绍
git clone https://github.com/tzutalin/labelImg.git
Python 2 + Qt4
sudo apt-get install pyqt4-dev-tools
sudo pip install lxml
make qt4py2
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Python 3 + Qt5
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
其他工具比较
- LabelMe: 最着名的工具之一。但是,用户界面有点太慢,特别是放大图像时。
- RectLabel 简单易用。仅适用于Mac
- LabelBox:非常适合大型标签项目,并可选择不同类型的标签任务。
- VGG图像注释器(VIA):快速,轻便,设计精良。这是我最终使用的那个。
- COCO UI:用于注释COCO数据集的工具。
创建label map 文件 (*.pbtxt)
id需要从1开始,class-N便是自己需要识别的物体类别名,文件后缀为.pbtxt
item{
id:1,
name: 'class-1',
},
item{
id:2,
name: 'class-2',
}
生成 Record File
使用工具:
- 标记XML转CSV脚本 xml_to_csv.py
- CSV+ JPG转 tensorflow record文件 generate_tfrecord.py
在函数class_text_to_int() 中增加所有标签以及映射值(*.pbtxt中的id)。
python utils/generate_tfrecord.py --csv_input=s7_train_labels.csv --output_path=train.record
python utils/generate_tfrecord.py --csv_input=s7_test_labels.csv --output_path=test.record
训练集、测试集 划分比例:
- 数据量很小时(几百张图片),可以让训练集和测试集相同。
- 数据量不大的时候(万级别及以下)一般将训练集和测试集划为7:3。若有验证集,则划为6:2:2.
- 到了大数据时代,数据量陡增为百万级别,此时我们不需要那么多的验证集和训练集。假设有100W条数据,只需要拿出1W条来当验证集,1W条来当测试集,就能很好地work了。因此,在深度学习中若是数据很大,我们可以将训练集、验证集、测试集比例调整为98:1:1
training
根据自己的需要,选择一款用coco数据集预训练的模型,把前缀model.ckpt放置在待训练的目录,这里meta文件保存了graph和metadata,ckpt保存了网络的weights,这几个文件表示预训练模型的初始状态。
比如选择:ssd_mobilenet_v1_coco
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
tar xfvz ./ssd_mobilenet_v1_coco_2018_01_28.tar.gz
- Edit
pipeline.config
file.
- num_classes:修改为自己的classes num
- 将所有PATH_TO_BE_CONFIGURED的地方修改为自己之前设置的路径(共5处)
- 开始训练
python object_detection/model_main.py --pipeline_config_path=/home/guohj/AI/training/S7_tf_ssd_mobilenet/pretrained/ssd_mobilenet_v1_coco_2018_01_28/pipeline.config --model_dir=/home/guohj/AI/training/S7_tf_ssd_mobilenet/trainres/ --num_train_steps=30000 --num_eval_steps=2000 --alsologtostderr
Tensorboard 进行监控
通过tensorboard工具,可以监控训练过程。
tensorboard --logdir=/home/guohj/AI/training/S7_tf_ssd_mobilenet/trainres/
GPU 运算
Tensorflow 只能使用 CUDA 9.0,即使CUDA9.1都不行