制作coco数据集以在Detectron框架上进行数据的训练

图片预处理

首先,根据Detectron官方介绍,数据集一般为jpg格式,分辨率一般为800*600左右。
在这里我们可以photoshop批量对图片进行处理

使用labelImg对数据集进行标注。

安装labelImg之后,打开文件目录,找到data文件夹下的predefined_classes.txt并打开,修改里面的内容,将自己定义的标签名添加到下面,这样在标注图片的时候,就会显示标签供选择。

打开labelImg
Change Save Dir 为你选择保存XML文件的目录,Open Dir 为你需要标注图片的目录。

点击Creat RectBox 在图片上画框,选择标签的名字。

点击Save对其进行保存,点击Next Image选择下一个图片进行处理。

XML文件修改(不是必须的)

因为我后来又通过高斯模糊、加噪声等方式对图片进行了扩充,需要重新使用labelImg对数据集进行标注,而加入噪声的图片和原始图片分辨率以及框的位置都是不变的,只有文件名需要修改,于是可以通过简单的python脚本对xml文件进行批量修改。我的python脚本如下,仅对我的数据有效(仅供参考)。


#!/usr/bin/python
# -*- coding: UTF-8 -*-
#修改文件夹、文件名等内容
import os
import os.path
import sys
from xml.etree.ElementTree import parse, Element

def test():
    path="D:/Train_Object_Detection/Python_Rename/labelXml/"
    files=os.listdir(path)  #得到文件夹下所有文件名称
    #s=[]
    for xmlFile in files: #遍历文件夹
        if not os.path.isdir(xmlFile): #判断是否是文件夹,不是文件夹才打开
            print(xmlFile)
            pass
        path="D:/Train_Object_Detection/Python_Rename/labelXml/"
        newStr=os.path.join(path,xmlFile)
        dom=parse(newStr)  ###最核心的部分,路径拼接,输入的是具体路径
        root=dom.getroot()
        #print root
        part=xmlFile[0:6]
        part1=part+sys.argv[2]+'.jpg'
        newStr1='D:/Train_Object_Detection/'+part1

        #root.remove(root.find('path'))

        #e=Element('path')
        #print root.find('path').text
        root.find('folder').text=sys.argv[1]
        root.find('path').text=newStr1
        oldName=root.find('filename').text
        root.find('filename').text=oldName[0:6]+sys.argv[2]+'.jpg'
        # #打印输出
        print ('path after change')
        #print n0.firstChild.data  

        # print '修改后的 pose'
        # print p0.firstChild.data
        # print '~~~~~'
        dom.write(newStr, xml_declaration=True)
        pass

if __name__=='__main__':
    print (sys.argv[1:])
    test()

(安利!!!)使用《拖把更名器》批量对文件名进行修改。
突然发现有一些别人制作的数据集不正确,在这里我也写了一个脚本对其进行修改。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#新建filename节点  将标记的错误float的数据更改为正确的int数据
import os
import os.path
import sys
from xml.etree.ElementTree import parse, Element
import xml.etree.ElementTree as ET 

def test():
    path="./data/"
    files=os.listdir(path)  #得到文件夹下所有文件名称
    for xmlFile in files: #遍历文件夹
        if not os.path.isdir(xmlFile): #判断是否是文件夹,不是文件夹才打开
            print(xmlFile)
            pass
        path="./data/"
        newStr=os.path.join(path,xmlFile)
        dom=parse(newStr)
        root=dom.getroot()

        part=xmlFile[0:5]
        part1=part+'.jpg'
        print(part1)

        element= Element('filename')
        element.text=part1
        root.append(element)

        width = root.find('size').find('width')
        new_width = str(int(float(width.text))+1)
        width.text= new_width

        for obj in root.findall('object'):
            xmin = obj.find('bndbox').find('xmin')
            ymin = obj.find('bndbox').find('ymin')
            xmax = obj.find('bndbox').find('xmax')
            ymax = obj.find('bndbox').find('ymax')
            new_xmin = str(int(float(xmin.text))+1)
            new_ymin = str(int(float(ymin.text))+1)
            new_xmax = str(int(float(xmax.text))+1)
            new_ymax = str(int(float(ymax.text))+1)
            xmin.text = new_xmin
            ymin.text = new_ymin
            xmax.text = new_xmax
            ymax.text = new_ymax

        print ('path after change')  

        dom.write(newStr, xml_declaration=True)
        pass

if __name__=='__main__':
    print (sys.argv[1:])
    test()

划分数据集

根据个人设置,将数据集划分为train、val、test等
下面是一个简单的随机划分和批量移动文件脚本

##深度学习过程中,需要制作训练集和验证集、测试集。
##先把JPEG文件扩展名改为 xml,这样就和 annotation一样了,随机种子可以一块给移动了
##之后再重新改回来

import os, random, shutil
def moveFile(XMLfileDir,JPEGfileDir):
        XMLpathDir = os.listdir(XMLfileDir)    #取xml&图片的原始路径
        XMLfilenumber=len(XMLpathDir)
        rate=0.2    #自定义抽取图片的比例,比方说100张抽10张,那就是0.1
        picknumber=int(XMLfilenumber*rate) #按照rate比例从文件夹中取一定数量图片
        random.seed(0)
        sample1 = random.sample(XMLpathDir, picknumber)  #随机选取picknumber数量的样本图片
        random.seed(0)
        print (sample1)
        print ("```````````````")
        for name in sample1:
                shutil.move(XMLfileDir+name, XMLtarDir+name)
                print (XMLfileDir+name)
                shutil.move(JPEGfileDir+name, JPEGtarDir+name)
                print (JPEGfileDir+name)
        return

if __name__ == '__main__':
    XMLfileDir = "./XML_train/"    #源xml文件夹路径
    XMLtarDir = './XML_val/'    #移动到新的文件夹路径
    JPEGfileDir = "./JPEG_train/"    #源图片文件夹路径
    JPEGtarDir = './JPEG_val/'    #移动到新的文件夹路径
    moveFile(XMLfileDir,JPEGfileDir)

训练数据

原文地址:https://www.cnblogs.com/superfly123/p/11695587.html

时间: 2024-08-08 04:39:20

制作coco数据集以在Detectron框架上进行数据的训练的相关文章

Pascal VOC & COCO数据集介绍 & 转换

目录 Pascal VOC & COCO数据集介绍 Pascal VOC数据集介绍 1. JPEGImages 2. Annotations 3. ImageSets 4. SegmentationObject & SegmentationClass COCO数据集介绍 数据集分类 Coco VOC数据集转化为COCO数据集格式 训练detectron 训练 测试 评估 Reference Pascal VOC & COCO数据集介绍 Pascal VOC数据集介绍 Annotat

FineReport中如何制作树数据集来实现组织树报表

1. 问题描述 FineReport,组织树报表中由id与父id来实现组织树报表,若层级数较多时,对每个单元格设置过滤条件和形态会比较繁琐,因此FineReport提供了一种特殊的数据集--树数据集,只需要简单的设置就能自动递归出层级,方便的实现如下图组织树报表: 图一   图二 2. FineReport构建树 2.1 新建报表,添加数据集 新建工作薄,添加数据集ds1取出原始数据,SQL语句为SELECT * FROM 公司部门. 2.2 定义树数据集 1)根据父字段构建树 使用情形:原始表

TensorFlow 制作自己数据集时,xml转csv

TensorFlow 制作自己数据集时,xml转csv千篇一律,把我拐入坑里了. 如果训练自己的数据集只有一个类别,用网络上的xml_to_csv,完全没有问题,源码如下: # -*- coding: utf-8 -*- 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 g

android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上

先上效果图: 我这里用的是GifCam来制作的gif动画,可以在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件 这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类,作为操作的对象: public class MyView extends View { private Paint m

Python制作本地数据集

1 ##################################################### 2 # 功能:Python制作本地数据集 3 ##################################################### 4 5 # 导入相应包 6 import os 7 from PIL import Image 8 import numpy as np 9 from keras.utils import to_categorical 10 11 d

ASIHTTPRequest框架使用(4)--上传数据

数据上传是通过ASIFormDataRequest类实现的.相当于HTML的表单,因此ASIFormDataRequest请求对象的作用相当于提交表单数据,默认是Post请求方法. - (IBAction)onClick:(id)sender { NSString *strUrl = @"http://iosbook3.com/service/upload.php"; NSURL *url = [NSURL URLWithString:[strUrl URLEncodedString]

Caffe1——Mnist数据集创建lmdb或leveldb类型的数据

Caffe1——Mnist数据集创建lmdb或leveldb类型的数据 Leveldb和lmdb简单介绍 Caffe生成的数据分为2种格式:Lmdb和Leveldb.它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库.虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集. 因此lmdb取代了leveldb成为Caffe默认的数据集生成格式(http://blog.csd

基于MVC+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform里面的通用导入导出模块的设计和开发过程,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件Uploadify 的使用,实现文件上传后马上进行处理并显示,然后确认后把数据写入数据库的过程. 我们知道,Web上对Excel的处理和Winform的有所差异,如果是在We

基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform里面的通用导入导出模块的设计和开发过程,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件Uploadify 的使用,实现文件上传后马上进行处理并显示,然后确认后把数据写入数据库的过程. 我们知道,Web上对Excel的处理和Winform的有所差异,如果是在We