tf-faster-rcnn[cpu]实现目标检测(三)训练自己的数据

在前两篇博客中我们分别[配置了环境](https://blog.csdn.net/King_key/article/details/84781608)和进行了[demo的测试](https://blog.csdn.net/King_key/article/details/84900581),接下来我们训练自己的图像数据并进行检测.

### (1)制作数据集

我们采用VOC2007的数据模板,进行数据制作

- VOC2007数据文件图:

```shell

VOC2007

├── Annotations    #图像标签文件,是.xml格式

├── ImageSets 

│  ├── Layout

│  ├── Main    #训练和测试用到的数据文件

│  └── Segmentation

└── JPEGImages  #图像文件

#Layout和Segmentation文件在这里不需要

```

- 采用[labelimg](https://github.com/tzutalin/labelImg)进行图像标记.可以[下载](https://pan.baidu.com/s/1t3usWCqnkgN7NtGyvNVPCw),直接运行可能会出现错误,先根据项目网址中的提示安装依赖文件,再运行.

      - 修改data/predefined_classes.txt文件,改成自己的类名

      - 运行程序,界面如下图所示:

      ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181228160926475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tpbmdfa2V5,size_16,color_FFFFFF,t_70)     

      - 点击Change Save Dir修改标签文件的保存目录

      - 点击Open Dir ,打开图片路径

      - 点击图片进行标注,如下图

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181228162049732.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tpbmdfa2V5,size_16,color_FFFFFF,t_70)

    详细的使用可以参考网上的其他说明.至此,标签数据我们已经做好.我们将制作的数据按照VOC2007的格式进行放入.


    -生成训练,测试数据.在这里,我们利用代码来生成

    ```python

    import os

    import random


    def _main():

        trainval_percent = 0.5

        train_percent = 0.5

        xmlfilepath = 'Annotations'

        total_xml = os.listdir(xmlfilepath)

        num = len(total_xml)

        list = range(num)

        tv = int(num * trainval_percent)

        tr = int(tv * train_percent)

        trainval = random.sample(list, tv)

        train = random.sample(trainval, tr)

        ftrainval = open('ImageSets/Main/trainval.txt', 'w')

        ftest = open('ImageSets/Main/test.txt', 'w')

        ftrain = open('ImageSets/Main/train.txt', 'w')

        fval = open('ImageSets/Main/val.txt', 'w')

        for i in list:

            name = total_xml[i][:-4] + '\n'

            if i in trainval:

                ftrainval.write(name)

                if i in train:

                    ftest.write(name)

                else:

                    fval.write(name)

            else:

                ftrain.write(name)

        ftrainval.close()

        ftrain.close()

        fval.close()

        ftest.close()


    if __name__ == '__main__':

        _main()

    ```

    将程序文件放在VOC2007文件夹下(本人是按照这个路径进行编写的),其中trainval_percent与 train_percent可以根据需要修改,随后执行,会生成四个文件

    ```shell

    /ImageSets/Main$ tree

    .

    ├── test.txt

    ├── train.txt

    ├── trainval.txt

    └── val.txt

    ```

    在VOC数据中,对图像的像素比例有一定的要求,因此我们将图像进行修改.代码如下:

    ```python

    import cv2

    import os

    file_path='./JPEGImages/'

    for filename in os.listdir(file_path):

    print(filename)

    img=cv2.imread(file_path+filename)

    size=cv2.resize(img,(500,375))

    cv2.imwrite(file_path+filename,size)

    if img is not None:

    continue

    ```

    现在,我们自己的数据集总算是完成了,将制作好的数据集与原先的数据进行替换,就可以开始训练自己的模型了.


### (2)  训练自己的数据模型

  - 在lib/pascal_voc.py文件中,修改类别参数

```python

self._classes = ('__background__',  # always index 0

                '#自己的类名'

```

  - 在train_faster_rcnn.sh和test_faster_rcnn.sh修改

  ```python

  ITEMS=#自己设置,本人设置为10000

  ```

  - 在项目根目录下执行

```shell

./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc_0712 res101

```

此时会生成:```output```和```tensorboard```文件

```shell

output #生成的训练模型

└── res101

    ├── voc_2007_test

    │  └── default

    │      └── res101_faster_rcnn_iter_100

    │          ├── detections.pkl

    │          ├── license_pr.pkl

    │          └── _pr.pkl

    └── voc_2007_trainval+voc_2012_trainval

        └── default

            ├── checkpoint

            ├── res101_faster_rcnn_iter_10000.ckpt.data-00000-of-00001

            ├── res101_faster_rcnn_iter_10000.ckpt.index

            ├── res101_faster_rcnn_iter_10000.ckpt.meta

            ├── res101_faster_rcnn_iter_10000.pkl

tensorboard #可视化文件,可利用命令tensorboard --logdir=tensorborad/res101进行可视化观察

└── res101

    └── voc_2007_trainval+voc_2012_trainval

        ├── default

        │  ├── events.out.tfevents.1545706608.guo-ThinkPad-E550

        │  ├── events.out.tfevents.1545711447.guo-ThinkPad-E550

        │  ├── events.out.tfevents.1545732554.guo-ThinkPad-E550

        │  └── events.out.tfevents.1545818970.guo-ThinkPad-E550

        └── default_val

            ├── events.out.tfevents.1545706693.guo-ThinkPad-E550

            ├── events.out.tfevents.1545711504.guo-ThinkPad-E550

            ├── events.out.tfevents.1545732622.guo-ThinkPad-E550

            └── events.out.tfevents.1545819033.guo-ThinkPad-E550

```

### (3)最后,就是测试了

修改demo.py

- 修改类名

```python

CLASSES = ('__background__',

          '#自己的类')

```

- 修改模型

```python

NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_10000.ckpt',)}#其中的10000,是我自己的训练设置,个人要根据自己的设置修改,一定要和初始设置的参数一致

```

- 修改测试图片

原文是:

```python

im_names=['#demo中图片的名称']

```

本人进行了修改,遍历文件夹下所有的图片进行读取,修改代码如下

```python

im_path='#图片文件的路径'

im_names = os.listdir(im_path)

#这里的im_path是以项目的根路径进行设置的,此时如果你读取的不是demo或者demo下的文件夹,那就需要再修改一处

#im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)其中的demo就要根据自己的进行修改

```

- 执行测试,执行命令

```shell

./tools/demo.py

```

在这里,如果图片太多,或者不想显示的时候,可以进行结果的保存,添加一行代码,如下:

```python

demo(sess,net,im_name)

plt.savefig('./../data/demo-show/'+im_name)

#前面是路径,demo-show文件需要自己创建,也是以项目的根路径进行设置的

#im_name是图片原本的名称,所以在保存的时候,如果还是在测试图片的文件下进行保存,会被覆盖

```

### (4)最后,就是小小的庆祝一下,总算是完成了...

这是本人自己的记录,其中可能遇到和大家不一样的问题,的如果有什么疑问,可以下方留言讨论!!!!

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

推荐阅读更多精彩内容