win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)

训练自己的数据集

  • 1.建立VOC数据集
    • (1)建立数据集文件结构
    • (2)JPEGImages
    • (3)Annotations
    • (4)ImageSets
  • 2.训练数据集
    • (1)下载预训练的VGG16网络模型
    • (2)修改pascal_voc.py
    • (3)修改config.py
    • (4)运行train.py
  • 3.测试数据集
    • 修改demo.py

1.建立VOC数据集

参考链接:从零开始制作自己的Pascal VOC数据集.
上述参考链接中有标注工具labelimg的下载。

(1)建立数据集文件结构

建立如下格式的文件结构(仿照标准VOC数据集,先构建框架如下图所示的数据集框架)
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第1张图片

(2)JPEGImages

  1. 首先找图片,数据集中占比最大最优先的是图像。可以手动从网上另存为,也可以用爬虫去爬,或者其他手段。待准备好一堆图片之后
  2. resize:
    在实际的应用中,这个数据集肯定是自己项目里面拍摄的。
    首先,拍摄的图片可能分辨率太大,不利于训练,通过一顿操作把他们差不多缩小到跟voc数据集里的图片差不多大小。通过以下代码实现:
# coding=utf-8
import os  # 打开文件时需要
from PIL import Image
import re

Start_path = 'D:/1Aqilei/photos/'  # 你的图片目录
width_max = 375  # 图片最大宽度
depth_max = 500  # 图片最大高度

list = os.listdir(Start_path)
# print list
count = 0
for pic in list:
    path = Start_path + pic
    print(path)
    im = Image.open(path)
    w, h = im.size
    print (w,h)

#如果图片分辨率超过这个值,进行图片的等比例压缩
    if w > width_max:
        print(pic)
        print("图片名称为" + pic + "图片被修改")
        h_new = width_max * h // w
        w_new = width_max
        count = count + 1
        out = im.resize((w_new, h_new), Image.ANTIALIAS)
        new_pic = re.sub(pic[:-4], pic[:-4] , pic)
        # print new_pic
        new_path = Start_path + new_pic
        out.save(new_path)

    if h > depth_max:
        print(pic)
        print("图片名称为" + pic + "图片被修改")
        w_new = depth_max * w // h
        h_new = depth_max
        count = count + 1
        out = im.resize((w_new, h_new), Image.ANTIALIAS)
        new_pic = re.sub(pic[:-4], pic[:-4] , pic)
        # print new_pic
        new_path = Start_path + new_pic
        out.save(new_path)

print('END')
count = str(count)
print("共有" + count + "张图片尺寸被修改")

3.rename: 将图片重命名统一修改成0x6d.jpg格式,代码如下:

import cv2 as cv
import os

# ==================可能需要修改的地方=====================================#
g_root_path = "E:/Pycharm/try_my_dataset_proj/datas"
os.chdir(g_root_path)  # 更改工作路径到图片根目录
org_path = "org/"  # 原图片目录
dst_path = "rename/"  # 目标图片目录
img_cnt = 5000 # 图片的起始名字,这里是‘005000.jpg’
# ==================================================================#

file_list = os.listdir(org_path)
if os.path.exists(dst_path) is False:
    os.makedirs(dst_path)
for idx, file in enumerate(file_list):
    img = cv.imread(org_path + file)
    # img=cv.resize(img,(512,512))
    img_name = os.path.join(dst_path, "%06d.jpg" % img_cnt)
    cv.imwrite(img_name, img)
    img_cnt += 1

  1. 最后将已经预处理并重新命名的图片全部存放到JPEGImages目录下。

(3)Annotations

此文件夹放的是xml标注文件。
使用labelimg将JPEGImages的图片进行标注并生成xml,生成的xml要保存在Annotations目录下。
具体操作如下:

  1. 点击左侧第二个 Open Dir按钮,选择刚才生成好的图片目录JPEGImages。
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第2张图片
    选择好打开的图片路径后会自动显示图片

  2. 更改xml文件保存的路径
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第3张图片

  3. 标注
    在英文输入法模式下,按下W,就可以选择标注区域了,用鼠标拖动,把要检测的类别标注出来,然后选择类别。
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第4张图片
    点击ok后如下所示
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第5张图片

  4. 保存
    一张图片可以标注多个物体,所有物体都标注结束,Ctrl+S保存,然后D或者左边的Next Image框下张图片继续标注保存。
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第6张图片

(4)ImageSets

简单运行下面的脚本即可。

# -*- coding: utf-8 -*-
# @Time    : 2018/11/12 13:03
# @Author  : lazerliu
# @File    : xml2voc.py
import os
import random

# ==================可能需要修改的地方=====================================#
g_root_path = "D:/VOCdevkit/VOC2007/"
xmlfilepath = "Annotations"  # 标注文件存放路径
saveBasePath = "ImageSets/Main/"  # ImageSets信息生成路径
trainval_percent = 0.98
train_percent = 0.98
# ==================可能需要修改的地方=====================================#

os.chdir(g_root_path)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
xml_list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(xml_list, tv)
train = random.sample(trainval, tr)

print("train and val size", tv)
print("train  size", tr)
ftrainval = open(saveBasePath + "trainval.txt", "w")
ftest = open(saveBasePath + "test.txt", "w")
ftrain = open(saveBasePath + "train.txt", "w")
fval = open(saveBasePath + "val.txt", "w")

for i in xml_list:
    name = total_xml[i][:-4] + "\n"
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

会在ImageSets的目录下生成下面四个文件。
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第7张图片
此时自己的数据集就算是建完了,下面就是使用此数据集进行训练了。

2.训练数据集

参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP.
将上方自己建立的数据集VOCdevkit放到Faster-RCNN-TensorFlow-Python3-master\data目录下,此处要注意VOCdevkit的名称一定要改成VOCDevkit2007,如下
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第8张图片

(1)下载预训练的VGG16网络模型

下载地址:http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz.

下载之后解压,文件重命名为vgg16.ckpt,新建文件夹imagenet_weights,把vgg16.ckpt放到imagenet_weights下,再将imagenet_weights文件夹拷贝到data文件夹下,

这样,VGG16网络模型的地址应该类似于这样:…/data/imagenet_weights/vgg16.ckpt

(2)修改pascal_voc.py

在Faster-RCNN-TensorFlow-Python3-master\lib\datasets\pascal_voc.py里面第36行修改自己的标注的类别,其中

'__background__'(背景)不能删除,其他的可以根据自己的类别添加或删除。

此处我所训练的只有一类,故修改如下
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第9张图片

(3)修改config.py

具体可以修改的部分如下,为了演示我将最大训练批次,及每批训练量进行了更改,结果显示和保存的轮次进行了更改
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第10张图片

(4)运行train.py

在TensorFlow的虚拟环境中进入Faster-RCNN-TensorFlow-Python3-master目录下,运行train.py
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第11张图片
下面fixed后的结果会在训练一段时间之后显示。
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第12张图片
结果如下,训练结果被保存到了Faster-RCNN-TensorFlow-Python3-master\default\voc_2007_trainval\default
win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第13张图片

3.测试数据集

依然是参考链接:Win10+Faster-RCNN-TensorFlow-Python3-master训练自己的数据 测试图像并输出mAP.

修改demo.py

在Faster-RCNN-TensorFlow-Python3-master目录下有个demo.py文件

  1. 修改类别,跟pascal_voc.py里的类别一致
CLASSES = ('__background__',
           'gun')
  1. 测试数据集改成自己的数据,并替换Faster-RCNN-TensorFlow-Python3-master\data\demo中的图像文件,图像文件的名字与修改后的文件名要一致
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第14张图片
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第15张图片

NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',), 'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}
DATASETS = {'pascal_voc': ('voc_2007_trainval',), 'pascal_voc_0712': ('voc_2007_trainval+voc_2012_trainval',)}

改为

NETS = {'vgg16': ('vgg16.ckpt',), 'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}
DATASETS = {'pascal_voc': ('voc_2007_trainval',), 'pascal_voc_0712': ('voc_2007_trainval',)}
  1. 新建Faster-RCNN-TensorFlow-Python3-master\output\vgg16\voc_2007_trainval\default目录,将Faster-RCNN-TensorFlow-Python3-master\default\voc_2007_trainval\default下的这四个文件复制到output\vgg16\voc_2007_trainval\default中,最下方的四个文件是最新生成的模型文件
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第16张图片
    并改名为
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第17张图片
  2. 将104行代码中的default='res101’改为default=‘vgg16’
  3. 运行demo.py
    结果显示如下:
    win10系统使用Faster-RCNN-TensorFlow-python3-master训练自己的数据集(二)_第18张图片
    因为训练次数较少,故测试结果并不理想,不过到此就可以跑通了。

你可能感兴趣的:(人工智能,python,深度学习,tensorflow)