利用TensorFlow 本地训练物体检测object detection(mac os)

安装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即为我们需要的模型文件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容