安装homebrew
为了后面安装依赖库更方便,所以我们首先安装homebrew。Homebrew是一个包管理器,用于在Mac上安装一些OS X没有的UNIX工具(比如著名的wget)
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装python
一般mac机器自带python,笔者机器上时python2.7,所以后面所有的插件和依赖库都需要是和2.7匹配的。当然有得用的是python3,后面依赖库和插件就需要做匹配的,比如pip,就需要安装pip3对应python3
安装pip
pip是常用的python包管理工具,类似于java的maven。用python的同学,都离不开pip。我们可以通过以下两种方式安装pip。
sudo easy_install pip
方法2
brew install pip
安装tensorflow
# For CPU
pip install tensorflow
# For GPU
pip install tensorflow-gpu
正常情况下会遇到权限问题如下,
OSError: [Errno 1] Operation not permitted
以为是sudo的原因,发现加了还是不行,后来才知道是SIP的原因。
需要我们重启电脑,按住command+R直到进入恢复模式,通过csrutil disable 关闭sip,然后再进行安装tensor flow。
安装依赖库
sudo pip install protobuf
sudo pip install pillow
sudo pip install lxml
sudo pip install jupyter
sudo pip install matplotlib
COCO API 安装
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
这个时候可能会遇到缺少module的错误,
python setup.py build_ext --inplace
Traceback (most recent call last):
File "setup.py", line 2, in <module>
from Cython.Build import cythonize
ImportError: No module named Cython.Build
make: *** [all] Error 1
需要安装cython依赖库
sudo pip install Cython
sudo pip install fasttext
然后继续执行make,make成功之后,将protobuf拷贝到tensorflow的models的research目录。
cp -r pycocotools <path_to_tensorflow>/models/research/
Protobuf Compilation
TensorFlow Object Detection API使用Protobufs去配置模型和训练参数,所以必须编译好protobufs才能正常使用框架。可以在research通过如下方式进行编译
# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
如果没有安装protoc,需要通过去安装下。
brew install protobuf
Add Libraries to PYTHONPATH
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
当然为了以后也生效,不是临时配置,可以把上面这句话加入到~/.bashrc中去。
安装好后,可以通过下面这条命令测试下,看是否都安装成功了。
python object_detection/builders/model_builder_test.py
准备文件夹
我们需要准备一个文件夹,为了我们训练专用的,我们训练需要的所有文件都可以放到这里面来,推荐的文件夹列表如下:
+data
-label_map file
-train TFRecord file
-eval TFRecord file
+models
+ model
-pipeline config file
+train
+eval
根据这些文件,我们一起来准备数据。
配置标签文件label_map file
我们需要准备标签,来告诉模型,我们总共训练的分类有多少,他的大致格式如下:
item {
id: 1
name: 'aeroplane'
}
item {
id: 2
name: 'bicycle'
}
item {
id: 3
name: 'bird'
}
当然对应格式的标签文件我们都可以从/research/object_detection/这个文件夹找到。
我们这次准备的数据集是pascal voc格式的,所以我们拷贝出pascal_label_map.pbtxt文件。
配置训练的pipeline文件
为了能够帮助用户快速开始训练,而不用自己再去写配置文件,tensorflow提供了一些列模型对应的配置文件demo,用户仅仅需要做的就是更改数据集的路径和训练分类的个数。
在object_detection/samples/configs文件夹中,我们可以找到这些对应的配置文件,我们要做的就是拷贝出来然后更改少量内容就行了。
准备输入数据
TensorFlow的物体检测API支持的数据格式是TFRecord,所以我们需要把pascal voc格式的数据集转换成TFRecord格式的。为了方便,tensorflow已经提供了python脚本帮助转换。脚本位置在:object_detection/dataset_tools/create_pascal_tf_record.py,参数如果设置为--set=train,则代表是训练集,如果设置为--set=val,则代表为验证集。这里我们用2012的数据集来做训练,转换脚本如下:
# From tensorflow/models/research/
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_11-May-2012.tar
python object_detection/dataset_tools/create_pascal_tf_record.py \
--label_map_path=object_detection/data/pascal_label_map.pbtxt \
--data_dir=VOCdevkit --year=VOC2012 --set=train \
--output_path=pascal_train.record
python object_detection/dataset_tools/create_pascal_tf_record.py \
--label_map_path=object_detection/data/pascal_label_map.pbtxt \
--data_dir=VOCdevkit --year=VOC2012 --set=val \
--output_path=pascal_val.record
准备预训练模型
通常模型的训练都不是从0开始的,利用fine-tuning的思想在已有模型基础上训练可以有一个好的performance
tensorflow提供了一堆物体检测的预训练模型,可以在models/object_detection里面找到,根据这些模型,我们填充不同的训练数据就可以达到自己训练的效果了。这里我们用pascal voc2012提供的物体检测的训练数据。自己做训练的数据的话,回头专门写一篇文章。
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz
cd ssd_mobilenet_v1_coco_2017_11_17
cp model.ckpt.* /path/to/your/tranins//拷贝到你刚才准备训练数据的models的文件夹
然后修改pipeline配置文件,修改num_classes为我们需要训练的分类个数(因为这里voc2012的物体检测分类是20,所以设置为20),
然后把所有的PATH_TO_BE_CONFIGURED这里的文件路径修改为自己的路径:
1.验证数据集
eval_input_reader: {
tf_record_input_reader {
input_path: "PATH_TO_BE_CONFIGURED/mscoco_val.record"
}
label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt"
shuffle: false
num_readers: 1
}
train_input_reader: {
tf_record_input_reader {
input_path: "PATH_TO_BE_CONFIGURED/mscoco_train.record"
}
label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt"
}
fine_tune_checkpoint: "/path/to/your/tranins//拷贝到你刚才准备训练数据的models的文件夹"
开始训练
训练
python object_detection/train.py \
--logtostderr \
--pipeline_config_path=/Users/yuxueting/yxt/pascal_train/models/ssd_mobilenet_v1_coco.config \ //之前准备的pipeline文件
--train_dir=/Users/yuxueting/yxt/pascal_train/train_output //最终模型的输出文件夹
验证
python object_detection/eval.py \
--logtostderr \
--pipeline_config_path=/Users/yuxueting/yxt/pascal_train/models/ssd_mobilenet_v1_coco.config\
--checkpoint_dir=${PATH_TO_TRAIN_DIR} \
--eval_dir=/Users/yuxueting/yxt/pascal_train/train_output
查看训练过程和结果
tensorboard --logdir=${PATH_TO_MODEL_DIRECTORY}
生成android可用的pb文件
训练完成后,你会在/Users/yuxueting/yxt/pascal_train/train_output里面发现一堆的model.ckpt-###.data-000000-of-00001。
但是我们正常在android上使用的模型文件是*.pb,所以需要把训练好的数据文件转换成pb文件。tensorflow提供了一个脚本专门做转换:object_detection/export_inference_graph.py
# From tensorflow/models/research/
python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path /Users/yuxueting/yxt/pascal_train/models/ssd_mobilenet_v1_coco.config \
--trained_checkpoint_prefix /Users/yuxueting/yxt/pascal_train/train_output/model.ckpt-200 \ //check_point文件存在的路径
--output_directory /Users/yuxueting/yxt/pascal_train/train_output/output_inference_graph.pb
最终会生成一个output_inference_graph.pb文件夹,打开文件夹,里面的frozen_inference_graph.pb即为我们需要的模型文件。