深度学习实战(七)——目标检测API训练自己的数据集(R-FCN数据集制作+训练+测试)

这篇博客介绍了如何使用TensorFlow的目标检测API训练自己的数据集,重点在于R-FCN数据集的制作,包括图片重命名、标注、格式转换,以及训练和测试的详细步骤。内容涵盖了从创建数据集文件夹、图片标注,到XML到CSV再到TFRecord的转换,还涉及到训练配置、模型选择和训练过程,最后是模型的测试和评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TensorFlow提供的网络结构的预训练权重:https://cloud.tencent.com/developer/article/1006123

将voc数据集转换成.tfrecord格式供tensorflow训练用:https://blog.youkuaiyun.com/guoyunfei20/article/details/80626040

训练自己的数据集大体流程如右侧所示:

caffe版的流程:RFCN使用教程(测试或训练自己的数据)

在进行深度学习时,对数据集的制作通常包括以下几个步骤:

1、对图片重新命名

2、图片标注(生成.xml文件)

3、将.xml文件转成相应数据集的格式

4、建立.test格式文件

这个人的博客里有好多关于xml文件的处理https://blog.youkuaiyun.com/gusui7202?t=1

具体以VOC数据的制作为例进行说明:

      新建一个存放数据集的文件,可命名为VOC,VOC下一共有五个文件夹,对于目标检测任务来说,通常只用到前三个文件夹,Annotations、JPEGImages和ImageSets

                                         

下面分别来讲。

1)JPEGImages文件夹

      文件夹里包含了训练图片和测试图片,混放在一起

注:train图片和test图片要分两个文件夹放,它们里面的图片的命名必须都从000001开始顺序往下编号。要不后面有你哭的

2)Annatations文件夹

      文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片

3)ImageSets文件夹

      Action存放的是人的动作,暂时不用

      Layout存放的人体部位的数据,暂时不用

      Main存放的是图像物体识别的数据,Main里面有test.txt , train.txt, val.txt ,trainval.txt.这四个文件我们后面会生成

      Segmentation存放的是可用于分割的数据

4)其他的文件夹不解释了,分割XXX等用的

一、对图片重命名【1】【2】

1.1 建数据集文件夹+图片重命名               

新建以上三个文件夹,再ImageSets文件夹下在新建Main文件夹。

"""
用来对图片进行重命名,并初始化目录结构
"""
import cv2
import os

if __name__=='__main__':
    path = os.getcwd()
    #imgs = os.listdir(path+"\\imgs\\shengdaixirou\\")
    imgs = os.listdir(path+"\\JPEGImages\\mixture3\\") #进入当前目录
    
    #print(imgs)#查看读取的文件内容
    #creat file
    if os.path.exists('JPEGImages') == False:
        os.mkdir('JPEGImages')
    if os.path.exists('Annotations') == False:
        os.mkdir('Annotations')
    if os.path.exists('ImageSets') == False:
        os.mkdir('ImageSets')
        os.mkdir('ImageSets/Main')
    cnt = 391 #图片名字从000391开始编号
    prename = "000390"
    for img in imgs:
        #temp=cv2.imread(path+"\\imgs\\shengdaixirou\\"+img)
        temp=cv2.imread(path+"\\JPEGImages\\mixture3\\"+img)
        #os.remove(path+"\\imgs\\"+img) #清空该文件夹
        #print(prename[0:len(prename)-len(str(cnt))]+str(cnt)) #验证重命名是否好用.中括号里面的部分表示名字的前3位‘000’,str(cnt)负责后三位的计数
        cv2.imwrite(path+"\\JPEGImages\\text1_remaining\\"+prename[0:len(prename)-len(str(cnt))]+str(cnt)+".jpg",temp)
        print ("renamed "+img+" to "+prename[0:len(prename)-len(str(cnt))]+str(cnt)+".jpg")
        cnt+=1
    print ("done!")

或者另一种方法(未检验):

import os
path = "E:\\image"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
    print(file)
for file in filelist:   #遍历所有文件
    Olddir=os.path.join(path,file)   #原来的文件路径
    if os.path.isdir(Olddir):   #如果是文件夹则跳过
        continue
    filename=os.path.splitext(file)[0]   #文件名
    filetype=os.path.splitext(file)[1]   #文件扩展名
    Newdir=os.path.join(path,str(count).zfill(6)+filetype)  #用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)#重命名
    count+=1

摘自:https://blog.youkuaiyun.com/u011574296/article/details/72956446

二、图片标注

使用labelIImg来标注图片,具体的安装过程及使用过程如下:

https://mp.youkuaiyun.com/postedit/88706760

注:

  • 每个图片和标注得到的xml文件,JPEGImages文件夹里面的一个训练图片,对应Annotations里面的一个同名XML文件,一一对应,命名一致。

  • 标注自己的图片的时候,类别名称请用小写字母,比如汽车使用car,不要用Car
  • 写的只识别小写字母,如果你的标签含有大写字母,可能会出现KeyError的错误。

三、格式转换.xml-》.csv-》tfrecord

3.1 xml转csv

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 16 00:52:02 2018

@author: Xiang Guo
"""

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

os.chdir('E:\\Tensorflowtext\\VOCMaker-master\\VOCMaker\\VOCMaker\\Annotations\\text1_eightclass')#cvs的保存路径
path = 'E:\\Tensorflowtext\\VOCMaker-master\\VOCMaker\\VOCMaker\\Annotations\\text1_eightclass'#xml文件的路径
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 main():
    image_path = path
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('tv_vehicle_labels.csv', index=None) #csv文件名(改成自己的名字)
    print('Successfully converted xml to csv.')


main()

3.2 csv转tfrecord

在工程文件下创建py文件,命名为generate_tfrecord.py或者其他的名字(train文件夹下是所有的图片)

# -*- coding: utf-8 -*-
"""
由CSV文件生成TFRecord文件
"""
"""
Usage: 
  #一、程序中要根据你的工作路径修改:
  1、os.chdir('E:\\Tensorf
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值