全网最详细win10+anaconda+GPU+Tensorflow Object Detection API训练自己数据+新手教程+训练过程问题解决

参考链接

anaconda安装gpu-tensorflow

tensorflow 在windows 下使用gpu

超详细的目标识别api训练教程

软硬件配置

  • cpu i7-6700hq -2.6GHz
  • gpu gtx960M
  • 内存8G
  • windows10操作系统
  • anaconda3,python3.5
  • cuda8.0
  • cudnn6.0

总效果:

输入一张图片(一个视频流也是一帧一帧图片组成的)——>模型——>输出需要识别物体在图片中的位置,和物体的类别

实现步骤:

配置好基本的软件环境(anaconda3、cuda8.0、cudnn6.0、tensorflow1.4、几个必要的包)-->下载好tensorflow/models-->

图片数据采集-->图片标注(labelImg)-->图片排序等预处理(自己编写一些小程序)-->分为xmls和images文件-->

将处理好的数据放到下载的目标检测api,即models包中-->生成tf_record文件-->训练模型(同时可以评估模型)-->导出模型-->测试模型-->

多试试,看看不同的效果~

前言:

1、关于faster_rcnn的介绍,大家可以看看知乎或者博客上的一些文章,推荐 一文读懂Faster R-CNN

不过,我觉得大概都看不懂,看懂了,改起来也挺麻烦的,其实只需要知道这个接口的优势性能就好了。

2、faster-rcnn分两步,先定位,再分类,而且可以多分类,还不受输入图片大小的限制。这样的网络基本上可以满足很多情况的使用,但是目前知道好像只能用方框进行定位,不能根据物体的实际形状进行完全精确的定位,不知道现在有没有更好的解决方案~

3、faster-rcnn关键点还是快,如果配置高的话,几乎可以本机实时识别,对视频流进行实时识别,这个就比较溜了~当然这个也只是达到了基本的门槛,目前我试过的几次,调用这个模型,消耗的资源还是蛮大的,图片越清晰自然就更大了~

4、ubuntu系统安装cuda总是失败,所以只好转战windows,具体的可以看看我前面的博客

5、这篇博客前后借鉴了好多博主的内容,综合他们的内容,加上自己踩的一些坑,以及一些小技巧,都列出来了。再次感谢~

1、安装anaconda:

目的:anaconda可以建立很多独立的python虚拟环境,可以替你管理很多乱七八糟的包,因为操作过程中,很容易会出现包的版本不兼容,可是卸载更容易出错,怎么办?到时候也许只能重装系统了~所以建议先安装anaconda.

Anaconda3-4.1.1-windows-x64.exe下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

安装和配置,参考链接:https://www.cnblogs.com/afangxin/p/6992050.html

需要设置国内镜像,输入命令:

# 添加Anaconda的TUNA镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# TUNA的help中镜像地址加有引号,需要去掉
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes

安装完成以后,将prompt快捷键发送到桌面,打开prompt。建立一个虚拟环境,比如 gtf ,并安装需要的包。输入命令:

  conda create -n gtf36 jupyter matplotlib pillow lxml python=3.5

经尝试,这种创建会比较卡,得多试几次。最好还是简单的创建环境

conda create -n gtf36 python=3.5
然后激活环境:
activate gtf35
conda install opencv

需要安装的包,有jupyter,matplotlib,pillow,lxml,opencv,Cython


2、安装tensorflow-gpu版本:

1、不推荐:直接安装tensorflow(tf):

pip install --upgrade tensorflow-gpu

目前安装的tf基本上自动安装版本都是1.7版本了~

2、如果需要安装其他版本,比如1.4.0版本,则需要离线安装,先下载

https://pypi.python.org/pypi/tensorflow-gpu/1.4.0

然后进入到下载目录,pip install tensorflow_gpu-1.4.0-cp35-cp35m-win_amd64.whl

推荐使用离线安装。


3、安装cuda8.0和cudnn6.0:

参考链接:http://ystyle.top/2017/01/06/tensorflow-zai-windows-xia-shi-yong-gpu/

版本是和tf配套的,如果tf版本过高,比如1.7,则cuda也得升级到9.0。但是听说版本高了会有一些bug。自己没有试过,不知道到底有没有坑~

1、下载软件

附上国内容易下载的cuda8.0-win链接:

https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_win10-exe

或者这个,最好是这个,因为最后成功的就是这个:

https://pan.baidu.com/s/1c2tBiLE
cudnn6.0-win下载地址:
https://pan.baidu.com/s/1ko5kTFj5hTNrGEBpmqgs-A

2、安装软件:

刚开始安装两次都是安装到一半就失败了,试过精简版自动安装,以及自定义。

后来查看了一下显卡驱动:计算机,管理,设备管理,看到显卡驱动有一个感叹号,

问题应该在这儿,应该是冲突了,于是我就自动搜索安装了需要的显卡驱动。

安装完毕,自动重启,重启完了之后,

点击第二个链接下载的cuda继续安装,精简版,

目录路径什么都不变,C盘就C盘吧,还能怎么办,,,还好一次性点亮。

如果出现了问题,就可以看看是不是显卡驱动的问题。


接下来把cudnn的东西放到该放的位置。
解压cudnn
添加bin目录到环境变量PATH,不是PYTHONPATH。至于如何新建环境变量,这个可以自己搜百度经验~
安装好了可以试试,激活环境,输入:python。进入python命令环境,输入如下程序: 
import tensorflow as tf
hello = tf.constant("hello tensorflow")
sess = tf.Session()
print(sess.run(hello))

没有报错,并且显示cuda,那就ok了。

也可以试试nvcc -V,在命令行输入:
nvcc -V  

会显示:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Sat_Sep__3_19:05:48_CDT_2016
Cuda compilation tools, release 8.0, V8.0.44

抄的别人的一段话:
记住安装完毕以后,一定不要随意升级驱动,不然后续出现驱动与硬件不兼容的问题。
往往出现这样的问题是最不容易排查的,由于CUDA开发的资料相对较少,
很多情况下百度和谷歌也搜不到相应的解决方法。自己也曾经为了一个小问题,搜索了二个星期,

尝试了不同的解决方案,终于在一个角落里,找到了问题所在,所以从事CUDA开发相对的门槛还是比较高的。


4、下载目标检测API:

参考链接:https://www.cnblogs.com/mar-q/p/7579263.html

下载模型https://github.com/tensorflow/models

解压放到需要的目录下,比如E盘根目录。

conda list 查看是否有protobuf,如果有了就不用管了,没有就输入conda install protobuf


5、配置API环境:

参考链接:https://www.cnblogs.com/mar-q/p/7579263.html

先修改一个模型的bug,这个bug是在github中找到解决方案的,在运行train.py程序的时候,会有一个报错:

ValueError: Tried to convert 't' to a tensor and failed. Error: Argument must be a dense tensor: range(0, 3) - got shape [3], but wanted [].

解决方案在这儿:

https://github.com/tensorflow/models/issues/3705#issuecomment-375563179

    ps:多利用github和谷歌,百度搜索很多东西是没有的~

即进入models/research/object_detection/utils/learning_schedules.py 在167-169行,有这样的代码

rate_index = tf.reduce_max(tf.where(tf.greater_equal(global_step, boundaries),
                                      range(num_boundaries),
                                      [0] * num_boundaries))

修改成为:

rate_index = tf.reduce_max(tf.where(tf.greater_equal(global_step, boundaries),
                                     list(range(num_boundaries)),
                                      [0] * num_boundaries))

如果你之前已经编译过protobufs,修改之后需要再编译一次,如果第一次安装,则跟着下面的步骤继续走。

1、编译Protobuf库,在object_detection同级目录打开终端运行:

cd E:\TensorFlow\GitHub\models\research

protoc object_detection\protos\*.proto --python_out=.

没有显示啥,就算是运行成功了,打开protos可以看到里面生成了.py文件

2、在research目录下运行:

python setup.py install

3、进入slim目录运行:

python setup.py install

要是slim文件下已经有了BUILD,需要先删掉这个,然后再python setup.py install

4、添加环境变量:

添加到PYTHONPATH中,将research和slim目录添加进入环境变量。

返回research目录测试环境是否准备完毕:

python object_detection/builders/model_builder_test.py

到这儿为止,基本上没有遇到报错,可以看到tensorflow1.4版本还是比较友好的


接下来就是处理自己的数据,然后进行训练的事儿了:

6、数据处理:

采集所需要识别物体的照片,图片分辨率大小规格都没啥关系,我们调用faster-rcnn算法,对图片大小不敏感。但是为了保证能识别出来,尽量清晰些。

在环境变化不大,识别物体种类不多的情况下,数据量可以在100-300左右,数据量越大越好。但是考虑到是自己标注数据,就必须得取一个自己扛得住的量。如果有大佬会数据合成的话,即标注现有的样本,然后通过图像处理的方式,在标注信息不变的情况下,对图片进行变换,增加样本。

我本来是想试试调节图片对比度、亮度,增加数据样本的,但是还没有找到好的算法,完全模拟出亮度的差异~

好了,假设你拍了300张有效的照片,放入images文件夹。(花了一天时间,学会了使用github上传自己的代码~)

详细的可以看这篇博客——https://blog.csdn.net/hehedadaq/article/details/79879752

所有的代码都在这儿——https://github.com/kaixindelele/tensorflow-models-data_diy.git

1、进入models/research/object_detection目录,进入data文件夹,创建annotations文件夹、images文件夹,再进入annotations,创建xmls


2、复制图片进入images,复制xml文件进入xmls

3、下载好create_trainval.py和change_name.py到annotations内,如果需要排序和改内容就可以执行这些脚本了

打开prompt,activate gtf ,进入环境,cd到这个目录下,然后执行

python create_trainval.py

4、如果需要合成数据的话,还是需要自己想办法的,要是有大佬做的话,可以艾特一下我

5、基本上数据处理好了,就可以生成tf_record文件了,退出到object_detection目录下,在上面的链接中,下载create_pet_tf_record.py,train.py,test_image.py,elevator_label_map.pbtxt,最后一个可以名字要是改的话,记得改所有需要pbtxt文件的名字,不改名字就方便了,先执行下面的程序吧:

python create_pet_tf_record.py

生成的tf_record文件将会在object_detection目录下,370张1920*1080的照片,train部分得有180MB,如果太小,大概就是有问题了。

后面不加路径配置,是因为完全按照我们步骤来的,如果不是的话,那就比较复杂了~

可以看看其他教程,我也没试过


7、修改配置文件:

1、下载断点文件。在faster_rcnn训练过程中,不是从零开始训练的,而是在类似数据集,已经训练好的网络数据的基础上,继续训练,算是一种迁移训练,下载链接:http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

2、解压后后,把里面的那个文件夹放到object_detection目录下。

3、在object_detection\samples\configs目录下找到对应的.config文件,选择faster_rcnn_inception_v2_coco.config,修改num_classes为你自己的num_classes,这里我训练的只有三个类,改成3。然后修改其中5个路径:

112行 fine_tune_checkpoint: "E:\\master_gpu\\research\\object_detection\\faster_rcnn_inception_v2_coco_2018_01_28\\model.ckpt"
127行 input_path: "E:\\master_gpu\\research\\object_detection\\elevator_train.record"
129行 label_map_path: "E:\\master_gpu\\research\\object_detection\\elevator_label_map.pbtxt"
141行 input_path: "E:\\master_gpu\\research\\object_detection\\elevator_val.record"
143行 label_map_path: "E:\\master_gpu\\research\\object_detection\\elevator_label_map.pbtxt"

第一个是上面的断点文件夹,model.ckpt不用变,后面四个都可以看出来了。

其他训练的配置信息可以自己研究一下,可以针对自己的数据集进行调整,但是比如训练步数,调整了会报错,不知道为啥。 


8、开始训练:

1、上面都做好了,在object_detection目录下,建立一个training文件夹,用来保存自己训练断点的文件。而训练也就是执行一段命令了:

python train.py --logtostderr --train_dir=E:\\master_gpu\\research\\object_detection\\training --pipeline_config_path=E:\\master_gpu\\research\\object_detection\\faster_rcnn_inception_v2_coco.config
2、其中--logtostderr 不知道啥意思
--train_dir=
后面加的是输出check_point的文件夹路径
--pipeline_config_path=
加的是配置文件的路径

3、报错解决:

ValueError: Tried to convert 't' to a tensor and failed. Error: Argument must be a dense tensor: range(0, 3) - got shape [3], but wanted [].
解决方案在这儿:

https://github.com/tensorflow/models/issues/3705#issuecomment-375563179

记得重新编译一下~

就是research和slim两个install,这个上面有~

基本上gpu和cpu,以及1.4,1.6的tf都会有这个错误,看github上的描述,是因为python3的问题~

这个问题我们上面已经解决了。

第二个报错

如果没有用我们新的train.py函数,应该会有这样的报错:

报错2:
AttributeError: module 'tensorflow.contrib.data' has no attribute 'parallel_interleave'
这个是因为train.py有问题,
需要用师兄给我的训练文件

比源代码多了两个函数,虽然我也不知道这俩函数有啥用~

4、训练过程中,笔记本会很烫,记得散热!

上面的数据量GPU大概需要0.3秒一步,cpu也试过,需要4.5秒一步。

刚开始的效果:



训练了20万步,大概18个小时,每步0.33秒的节奏
INFO:tensorflow:global step 200000: loss = 0.1098 (0.328 sec/step)
INFO:tensorflow:Stopping Training.
INFO:tensorflow:Finished training! Saving model to disk.
这是最后的输出显示。
使用gpu基本上是单独cpu的25倍速。可见如果不用gpu训练的话,肯定会很尴尬的,在loss值上,cpu训练18小时,一万多步,只能达到0.5的loss,而gpu最低和平均分别是0.01和0.1

这样可以看出,gpu还是很有趣的。

5、如何停止训练?

在训练过程中如果去复制断点文件,会提示有一些文件无法复制,

虽然你最后发现和训练完的文件都一样,至少肉眼看不出有啥少的,但就是无法导出模型。

如果提前ctrl+c打断训练过程则不一样,这样训练断点文件还是可以导出模型的~

在训练的过程中,就算是让电脑睡眠,也会继续训练,所以千万别把这个本子塞包里带走,会热炸的。。。


9、模型评估:

这是一个失败的评估~

1、在dataset文件夹下新建evaluation文件夹,继续在detection目录下执行:
python eval.py --logtostderr --checkpoint_dir=E:\master_gpu\research\object_detection\training --pipeline_config_path=E:\master_gpu\research\object_detection\faster_rcnn_inception_v2_coco.config --eval_dir=E:\master_gpu\research\object_detection\evaluation
报错: 
File"C:\Users\lele\Anaconda3\envs\gtf\lib\site-packages\object_detection-0.1-py3.5.egg\object_detection\metrics\coco_tools.py", line 47, in <module>
from pycocotools import coco

ImportError: No module named 'pycocotools'

根据教程下载cocoapi,又会发现unable find vcvarsall.bat,网上说要安装vs2015,安装了也没用~

这个问题的解决方案我还没找到,所以就放弃了evaluation~

不过这个也没关系~还可以挣扎,直接导出训练模型,,,只是无法直观的看出实时的精确度变化曲线,这样也就不知道训练是否过拟合了~


10、导出模型:

1、detection同目录下,其中:

  • input_type后面的不用管,
  • pipline还是配置文件路径,
  • trained_checkpoint_prefix后面是训练过程的断点文件夹trianing。model.ckpt-198938是训练次数,
  • output_directory是存放训练模型的文件夹,需要自己建立。

执行:

python export_inference_graph.py --input_type=image_tensor --pipeline_config_path=E:\master_gpu\research\object_detection\faster_rcnn_inception_v2_coco.config --trained_checkpoint_prefix=E:\master_gpu\research\object_detection\training\model.ckpt-198938 --output_directory=E:\master_gpu\research\object_detection\pb
2、生成我们需要的
frozen_inference_graph.pb

文件


11、调用模型:

1、如果有object_detection_tutorial.py,可以修改一下,但是如果是object_detection_tutorial.ipynb文件,就不好改了,也很难嵌入到需要的程序中;

2、所以下载test_image.py文件,在object_detection目录下,

3、发现,上次好像无法在gpu环境下,使用cpu训练出来的模型~


12、训练可视化-tensorboard:

在输入训练的命令以后,(也就是训练过程中,不是训练结束)我们打开一个新的prompt,进入相同的虚拟环境,进入train.py文件相同的路径,然后输入:

tensorboard --logdir=E:\master_gpu\research\object_detection\training

即如下:

(gtf) E:\master_gpu\research\object_detection>tensorboard --logdir=E:\master_gpu\research\object_detection\training

这个logdir,后面的是你训练过程中,存放断点数据的目录,一定要写对。

把    http://LAPTOP-D1QQCSFC:6006

复制粘贴到谷歌浏览器中,然后就可以看到训练断点的过程了,好像有些浏览器打不开~


13、训练小技巧:

1、避免过拟合:大家可以看loss曲线,如果降得不太多了,就可以停止了。ctrl+c,不同的训练次数,多试几次,看看哪个效果好。

2、其他的以后想起来了再补充吧



猜你喜欢

转载自blog.csdn.net/hehedadaq/article/details/79845761