用tensorflow-gpu训练自己的神经网络Win10

一、配置深度学习开发环境(Windows10 GPU)

品颜完月:配置深度学习开发环境(Windows10 GPU)zhuanlan.zhihu.com图标

我的配置环境如下:

1、操作系统:Windows 10 64位

2、GPU:NVIDIA GeForce GTX 1050

3、GPU驱动: 385.54

4、visual studio community 2015

5、CUDA 9.0

6、cuDNN7.1.4

7、python 3.5.2

8、tensorflow-gpu 1.8

不用gpu和话也可以运行,但是训练速度太慢,个人实践的对比结果是:其他条件完全相同,只是CPU与GPU的区别,在CPU上训练要十天左右,而在GPU上只需要三个小时左右。

二、安装Tensorflow object detection API

TensorFlow object detection API要求使用其GitHub库中提供的特定目录结构。

具体步骤参见下面的网页:

品颜完月:安装 TF object detection API w10zhuanlan.zhihu.com图标

三、标记数据集

图片数据的整理(切割,重命名)

品颜完月:图片批量重命名和按像素分割zhuanlan.zhihu.com图标

图片标记工具下载地址:

LabelImgtzutalin.github.io

下载解压后得到:

这是一个绿色软件,点击labeling.exe 即可使用。

选择要标记的图片进行标注:

labelImg常用功能的快捷键

标注成功后生成对应的.xml文件:

三、生成可训练数据

这一步的主要工作是:【标注生产的.xml】 -->【.csv 】-->【 .record】(可用于训练的数据)

1、.xml -->.csv:

运行一下代码

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET


def xml_to_csv(path):
    xml_list = []
    for xml_file in glob.glob(path + '/*.xml'):
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall('object'):
            value = (root.find('filename').text,
                     int(root.find('size')[0].text),
                     int(root.find('size')[1].text),
                     member[0].text,
                     int(member[4][0].text),
                     int(member[4][1].text),
                     int(member[4][2].text),
                     int(member[4][3].text)
                     )
            xml_list.append(value)
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)
    return xml_df


def train():
    image_path = os.path.join(os.getcwd(), 'train')
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('train_labels.csv', index=None)
    print('Successfully converted xml to csv (train).')

def test():
    image_path = os.path.join(os.getcwd(), 'test')
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('test_labels.csv', index=None)
    print('Successfully converted xml to csv (test).')    
    
train()
test()
程序运行后在jupyter notebook 中显示的输出结果

代码与‘train’‘test’文件以及生成的.csv文件的位置关系如下图所示:

把‘train’‘test’和‘train_labels’‘test_labels'文件放在文件夹images中


最后把文件夹images放在了这个目录下:D:\tensorflow1\models\research\object_detection

2、.csv --> .record:

下载generate_tfrecord.py 文件

下载地址:

datitran/raccoon_datasetgithub.com图标

下载后,我把generate_tfrecord.py 文件放在了这个目录下:D:\tensorflow1\models\research\object_detection。

把代码修改到适合自己的目标分类:

修改前:

修改后:

把文件夹images和generate_tfrecord.py 文件放在这个目录下:D:\tensorflow1\models\research\object_detection

在控制台运行如下代码:

 # Create train data:
  python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record

  # Create test data:
  python generate_tfrecord.py --csv_input=images/test_labels.csv  --image_dir=images/test --output_path=test.record
"""

在这个目录下:D:\tensorflow1\models\research\object_detection会产生test.record和train.record文件。

四、建立 Label Map 和 训练配置

1、建立 Label Map

item {
  id: 1
  name: 'meter'
}
item {
  id: 2
  name: 'red light'
}
item {
  id: 3
  name: 'blue light'
}
item {
  id: 4
  name: 'disconnector_open'
}
item {
  id: 5
  name: 'disconnector_close'
}

建立一个新的文件,文件名为 labelmap.pbtxt ,文件的id要与generate_tfrecord.py保持一致性

新建的taining文件夹,把新建的labelmap.pbtxt保存到taining文件夹下。

2、下载模型

下载地址:

tensorflow/modelsgithub.com图标

从上面的网站中下载 Faster-RCNN-Inception-V2 model

把文件faster_rcnn_inception_v2_coco_2018_01_28放到D:\tensorflow1\models\research\object_detection 的路径下

3、配置training pipeline

把faster_rcnn_inception_v2_pets.config复制到新建的taining文件夹下

配置文件:faster_rcnn_inception_v2_pets.config

1、要检测的目标个数

2、fine_tune_checkpoint:

"D:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"

3、train_input_reader:

input_path: "D:/tensorflow1/models/research/object_detection/train.record"
label_map_path: "D:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"

4、num_examples

5、eval_input_reader:

input_path: "D:/tensorflow1/models/research/object_detection/test.record"
label_map_path: "D:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"

最后把包含上述两个文件的taining文件夹放到这个目录下:D:\tensorflow1\models\research\object_detection

五、训练

在anaconda prompt下配置环境变量:

set PYTHONPATH=D:\tensorflow1\models;D:\tensorflow1\models\research;D:\tensorflow1\models\research\slim

如果关闭了环境要重新配置。

在anaconda prompt下改变路径到

D:\tensorflow1\models\research\object_detection  

然后运行下面的语句

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config

开始训练:

六、用tensorboard观察模型

在anaconda prompt中改变路径到D:\tensorflow1\models\research\object_detection

然后输入下面的语句(其中traning是保存训练过程中的数据的地方)

tensorboard --logdir=training

把网址复制到浏览器中,就可以看到如下图所示的画面;

七、保存训练成功的模型

在anaconda prompt中改变路径到D:\tensorflow1\models\research\object_detection

然后输入下面的语句

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph

其中model.ckpt-XXXX中的XXXX应该被training文件夹中的最大数值的.ckpt的文件代替

如下图所示,应该用29639代替XXXX

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-29639 --output_directory inference_graph

在路径D:\tensorflow1\models\research\object_detection 生成inference_graph文件夹,并且包含文件frozen_inference_graph.pb

八、用训练好的目标检测分类器

从参考网址中下载下面这三个文件,分别是从图片,视频和摄像头实现检测目标的功能

做适当修改后运行Object_detection_image的效果图如下图所示:

参考网址:

eric-erki/How-To-Train-an-Object-Detection-Classifier-for-Multiple-Objects-Using-TensorFlow-GPU-on-Windows-1github.com图标

错误总结 :

品颜完月:用tensorflow-gpu训练自己的神经网络(错误总结)zhuanlan.zhihu.com图标

编辑于 2018-10-04

文章被以下专栏收录