快速搭建TensorFlow目标检测框架并训练自己的数据集

安装anaconda

前往anaconda清华镜像站下载最新版本
可参考我的博文anaconda简单入门

创建python3.6环境

非常不建议使用windows,因为学界、工业界tensorflow基本上都是linux环境,windows各种工具bug调试麻烦多多。笔者很早就完成了ubuntu 18.04的教程,windows又花了很多时间解决BUG
linux,macos系统使用terminal,windows用户使用cmd执行下列命令
目前tensorflow1.12版本最高支持到python3.6

conda create -n py3.6 python=3.6 #py3.6是自己为环境起的 名字,可以自己起容易记的

安装TensorFlow

  • 如果有nvidia显卡,可安装TensorFlowGPU版本。先行安装nvidia新版本驱动
    驱动安装完成后

-1. 进入py3.6环境

conda activate py3.6

-2. 安装TensorFlow-gpu

conda install tensorflow-gpu=1.12

这里我指定安装了最新版的(1.12)tensorflow,conda会自行在py3.6这个虚拟环境中安装cudatoolkit和cudnn等环境,所以不需要像很多教程那样自行安装cuda和cudnn。

  • 无nvidia显卡,可安装TensorFlow cpu版本
    -1. 进入py3.6环境
conda activate py3.6

-2. 安装Tensorflow

conda intstall tensorflow=1.12

测试TensorFlow是否安装成功

输入

python
在>>>后输入import tensorflow as tf

如果不报错,说明安装成功

下载TensorFlow目标检测api

tensorflow附带了一些样例和示范代码,我们在示范代码的基础上做修改,训练自己的目标检测模型
首先需要电脑安装过git工具,windows用户一般不会自带,前往git官网下载安装成功后即可使用

  • 进入自己打算存项目的目录,执行git clone git@github.com:tensorflow/models.git可将官方models目录下载下来,但是因为github在国内下载缓慢,官方目录有多处错误,并且需要自己编写很多代码,我在这里将我已经编写好很多脚本的代码上传到国内的coding,输入
git clone https://git.dev.tencent.com/MachinePlay/models.git

安装api

  • ubuntu 用户可以提前一键安装后续需要的软件
安装前可以先把源换了
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
sudo apt-get install protobuf-compiler python-pil python-lxml
 pip install jupyter,matplotlib,pillow,lxml

进入models/research/目录

linux用户可以直接输入下列命令,将protobuf编译完成

protoc object_detection/protos/*.proto --python_out=.
  • windows用户需按下列步骤手动安装(真累啊)
安装前可以先把源换了
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pillow
pip install lxml
pip install jupyter
pip install matplotlib

进入models/research/目录 ,手动编译.proto文件,共29个,一个一个输入

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

接下来把装好的object_detection加入系统环境变量

  • linux
    vim ~/.bashrc 进入环境配置
    在最后一行加入
export PYTHONPATH=$PYTHONPATH:pwd:pwd/slim

其中'pwd'替换为当前research路径
关闭终端,重新进入环境即可

  • windows
    进入models/research文件夹
    输入
python setup.py install

进入models/research/slim文件夹
输入

python setup.py install
  • 然后按下列步骤将research文件夹和slim文件夹加入系统变量
    进入资源管理器,右键点击属性



    点击高级系统设置


    image.png

    点击环境变量设置
    image.png

    找到path,点击编辑

    将research文件夹路径和slim路径加入后面,路径换成你自己的


    image.png

    点击确定,重新打开cmd,进入环境

测试是否安装成功

进入models/research/slim文件夹,输入

python object_detection/builders/model_builder_test.py

显示OK,即安装成功


image.png

到此为止,TensorFlow就安装成功了

数据集制作

使用labelimg制作好pascal voc格式数据集
一般包含这三个文件夹,其父文件夹叫做VOC2007


image.png

请将这三个文件夹拷出,放在models\research\object_detection\voc\VOCdevkit文件夹中


image.png

数据集转换

需要把voc格式数据处理为tensorflow支持的tfrecord格式
Tensorflow对象检测API必须使用TFRecord的档案格式,我用的是2007年的数据集, 目录如下,格式转换脚本我放在了object_detection文件夹内

image.png

首先需要更改pascal_label_map.pbtxt文件,该文件样例在目录models/research/object_detection/data/pascal_label_map.pbtxt下,存储着标签信息
将标签信息更改为自己制作数据集对应的字符,不要多也不要少,如图所示,这里我要识别分类的是图片内容的含水量百分比,共有四类,0%,20%。60%,100%所以修改了对应的name,id从1开始,有多少类要全部写上,可复制一份到voc/trainfcn中
image.png

在object_detection目录下,输入如下命令制作训练集

python create_pascal-tf_record.py --data_dir=VOCdevkit路径 --year=VOC2007 --set=train --outpath=转换后数据存放路径/文件名.record

其中 create_pascal-tf_record.py脚本用来将voc格式数据集转换为tfrecord文件,供tensorflow读取,year指定其格式与2007年的voc一致,即上文图所示的结构,set=train表示制作的是训练集,outpath=后面是转换后tfrecord文件存储的位置,出现waring不要紧没关系,不报错就行
例如我的路径如下,我后面会把所有文件存放到voc/trainfcn/文件夹中(注意系统不同路径表示方法不同:斜杠和反斜杠)

python create_pascal_tf_record.py --data_dir=C:/code/project/tfrock/models/research/object_detection/voc/VOCdevkit --year=VOC2007 --set=train --output_path=voc/trainfcn/pascal_val.record

在object_detection目录下,输入如下命令制作测试集

python create_pascal-tf_record.py --data_dir=VOCdevkit路径 --year=VOC2007 --set=val --outpath=转换后数据存放路径/文件名.record

例如我的路径如下

python create_pascal_tf_record.py --data_dir=C:/code/project/tfrock/models/research/object_detection/voc/VOCdevkit --year=VOC2007 --set=val --output_path=voc/trainfcn/pascal_val.record

我一般将训练集命名为train.record,测试集命名为val.record,并且存放在以模型命名的文件夹中。方便以后使用。

选择模型开始训练

接下来可以去网上下载网络模型或者自己编写模型开始训练,我在models/research/object_detection/voc文件夹里预置了Faster-RCNN RESNET101的预训练网络模型,可供使用
可以前往MODEL ZOO下载一些非官方预训练的网络模型,或者在网络自行查找下载

修改模型配置

首先可以看到我将Faster-RCNN RESNET101放在了voc文件夹下并完成解压


image.png

内部结构如下


image.png

其中checkhpoint记录了上一次训练断点位置,.pb文件是训练完成后保存下来供调用的模型,ckpt之类是训练中途保存的断点文件。pipeline.config是该网络的配置,理论上一开始网络模型里只有一个网络配置文件,我们要从头开始训练(参数从随机开始),其他文件都是训练过程中生成的。这里我们下载了别人已经预训练的模型(已经有比较靠谱的参数),并作为初始化。
  • 首先从object_detection/samples/configs/里找到对应模型的配置文件样例,修改它(给的是样例,如果是自己写的模型或别处下载的模型,配置文件就要全部自己写),例如我们找到faster_rcnn_resnet101_coco.config,把他复制到voc/trainfcn文件夹中,并修改。
  • 文件分成五个部分,
model模型的框架   meta-architecture, feature extractor…
train_config,定义 optimizer (Momentum, Adam, Adagrad…), fine-tune model
eval_config,定义valuation估值指标
train_input_config,定义作为训练数据集与标签映射路径
eval_input_config,定义作为估值数据集的路径与标签映射路径

主要修改这4部分

0.目标种类个数
num_classes: 4,改为自己的目标种类个数



例如我有四种,就改为4

1:自定义路径指定模型位置
fine_tune_checkpoint: “PATH_TO_BE_CONFIGURED/model.ckpt”
通常在进行训练时不会从头开始训练,大部份会利用别人已经训练好的参数来微调以减少训练的时间
fine_tune_checkpoint的数值为:你定义的faster_rcnn_resnet101_coco_2018_01_28位置(例如:"object_detection/voc/faster_rcnn_resnet101_coco_2018_01_28/model.ckpt")

image.png

2:指定训练数据的label和record数据文件
label文件即我们刚刚修改过的标签映射文件,pascal_label_map.pbtxt
record文件:即pascal_train.record转换成tfrecord的训练集
train_input_reader: {
tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pascal_train.record" }
label_map_path: "PATH_TO_BE_CONFIGURED/pascal_label_map.pbtxt"}


image.png

3:指定测试数据的label和record数据文件
label文件即我们刚刚修改过的标签映射文件pascal_label_map.pbtxt
record文件:即pascal_val.record转换成tfrecord的训练集
eval_input_reader: {
tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pascal_val.record" }
label_map_path: "PATH_TO_BE_CONFIGURED/pascal_label_map.pbtxt"
}


image.png

另外修改eval_config,即验证集图片张数,可查看数据集中val数量修改


image.png

到此为止模型配置完毕

开始训练

进入object_detection文件夹,输入

python train.py --logtostderr --pipeline_config_path=${定义的网络Config} --train_dir=${训练结果要存放的目录}

例如我的

python train.py --train_dir=voc\trainfcn\ --pipeline_config_path=voc\trainfcn\faster_rcnn_resnet101_voc07. config

开始训练,control+c可中断训练,中断后再次运行将会从最近的自动保存点继续训练,也就是如果训练了一天断电了,第二天在同一traiN_DIR训练时不会损失昨天的训练结果,除非你把train_dir内容全部删除
--logtostderr表示将log输出到stderr,我省略了会默认输出到train_dir中,方便查看


image.png

查看训练过程

打开tensorboard可查看训练结果、损失函数情况等等
进入object_detection文件夹,输入

tensorboard --logdir=voc/trainfcn# 之前存放log的地方

浏览器登录127.0.1.1:6006可打开Tensorboard查看信息如下:


image.png

你的步骤从1开始,损失会高一些。 根据你的 GPU 和你有多少训练数据,这个过程需要不同的时间。 像 1080ti 这样的东西,应该只需要一个小时左右。 如果你有很多训练数据,则可能需要更长的时间。
停止迭代次数或者条件在设置文件里,可自行指定迭代步数或loss降到一定后停止,或强行中断
默认保存最近五次自动保存的训练结果,可以看到随着训练自动保存了到达一定步数的结果。
自动保存步数可自行设置


image.png

还可以查看网络计算图、数据分布、测试结果等
image.png

image.png

image.png

模型验证和模型保存

训练完成或中断后,可使用eval.py模型检验脚本来检验训练结果
首先我们可以看到训练的日志和最终的模型(默认保存了5个不同步数时的模型)都会保存在train_dir中

image.png

这里会报错ModuleNotFoundError: No module named 'pycocotools',因为我们确实没有安装pycocotools
所以我们先安装pycocotools windows和linux安装方法不同

  • linux:
pip install pycocotools 
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

如图所示即为安装成功

image.png

windows安装完成后仍然会报错 NameError: name 'unicode' is not defined
是因为windows下载的是基于python2的代码,其中unicode在python3中已经升级为str函数,需要修改源码
打开报错位置,我的如下图
image.png

打开该文件,修改213行和352行的unicode修改为str
image.png

image.png

然后在object_detection目录下执行eval.py 检验训练结果

python eval.py 
    --logdir=${log目录}
    --pipeline_config_path=${定义的Config} \
    --checkpoint_dir=${训练模型存放的目录} \
    --eval_dir=${测试结果要存放的目录}

windows下使用依然会出现报错,但不影响结果,原因还未查明
例如我的命令是,我将检验结果也存放在trainfcn文件夹中(这样做其实容易混淆,建议将检验结果和log放在另一个目录,另外开启Tensorboard查看)

python eval.py --logdir=voc\trainfcn\ --pipeline_config_path=voc\trainfcn\faster_rcnn_resnet101_voc07.conf ig  --checkpoint_dir=voc\trainfcn\ --eval_dir=voc\trainfcn\

tensorboard出现image选项,可以查看结果,一般会将多次的checkpoint步数结果供查看


image.png

同时命令行会给出评估结果mAP、AP等等


image.png

最后是保存模型

经过多次训练,预览了一个你觉得最好的迭代次数保存下来的模型后,可以将该训练好的模型导出为pb文件,即Tensorflow的训练好的模型文件,可拷贝至其他机器供编程使用
该脚本名为export_inference_graph.py,脚本放在了object_detection目录下
使用方法:

 python export_inference_graph.py  --pipeline_config_path=voc\trainfcn\faster_rcnn_resnet101_voc07.config
--trained_checkpoint_prefix=voc\trainfcn\model.ckpt-10324 --output_directory voc\jieguo

其中model.ckpt-10324表示使用第10324步保存的模型。我们需要根据voc/trainfcn中你想要导出的checkpoint步数更改。output表示输出目录,这里我新建了输出目录结果,导出的模型会被存到里面


可以看到,导出的模型结构和我们最早下载的模型内容基本一致其中.pb文件就是模型本身了,该网络就包含了我们训练得出的全部参数

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