YOLOv4数据集制作与批量处理工具.py代码

这篇文章主要复现数据集打标签的制作过程,以及与YOLOv4的数据集制作和数据增强。 

包括:

一、voc标签

二、.xml(voc格式)转.txt(yolo格式)

三、批量改文件名

四、批量修改txt文件内容

五、数据增强工具

下面进行详述:

一、voc标签

这里主要讲LabelImage的使用:

博文教程:(111条消息) 睿智的目标检测12——使用labelimg进行目标检测数据集标注_Bubbliiiing的博客-CSDN博客_目标检测数据集标注技巧https://blog.csdn.net/weixin_44791964/article/details/103481681?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165035630916780366598841%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165035630916780366598841&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-103481681.142%5Ev9%5Epc_search_result_control_group,157%5Ev4%5Econtrol&utm_term=labelimg&spm=1018.2226.3001.4187

视频教程:

Pytorch 搭建自己的YoloV4目标检测平台(Bubbliiiing 深度学习 教程)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q54y1D7vj?p=11

详述如下:

① abelImg工具下载:

         下载地址:https://pan.baidu.com/s/1yk8ff56Xu40-ZLBghEQ5nw 
          提取码:vj8f 

         下载的文件是编译好的,可执行的labelImg.exe文件。直接将文件放在windows环境下,双击可执行。

② labelImg工具使用方法:

       1.双击labelImg执行文件图标,会出现操作界面:

       出现这样的窗口界面,说明labelImg已经正常开启,背景黑色的窗口是终端界面,不要理会.......

       在labelImg窗口的左边,有一些操作的功能,其中:

“Open”:打开单个图像;

“Open Dir” 打开文件夹;

"Change Save Dir" :图像保存的路径;

“Next Image” :切换到下一张图像;

“Prev Image”:切换到上一张图像;

“Verify Image”校验图像;

“Save”:保存图像;

“Create RectBox”:画标注框一个;

“Duplicate RectBox”:重复标注框;

“Delete RectBox”:删除标注框;

“Zoom In”: 放大图像;

“Zoom Out” :缩小图像;

“Fit Window”:图像适用窗口;

“Fit Width”图像适应宽度。

当然,使用操作按钮不是很方便,下面介绍一些快速的快捷键,为无聊的标注工作节省一些时间。


③开始图像数据标注:

         一般操作的顺序:“open file ”  -----"create rectbox " -----"输入类别名称 "-----“change save dir ”-----"Save"

         最后在保存文件的路径下生成.xml文件,.xml文件的名字是和标注照片的名字一样,如果要修改已经标注过的图像,.xml中的信息也会随之改变。得到的.xml 和PASCAL VOC所用格式一样!

二、.xml(voc格式)转.txt(yolo格式)

① 按如下格式创建文件夹,并放好图片与voc标签文件:

按如下目录创建VOCdevkit 文件夹,放自己的训练数据,层级结构如下所示:

VOCdevkit
--VOC2007
----Annotations  #(放XML标签文件)
----ImageSets
------Main
----JPEGImages   # (放原始图片)

②创建转换.py文件:voc_label.py

classes = [“person”,“car” ] 按自己的类别修改,但是顺序要和obj.name 保持一致:

# -*- coding:utf-8 -*-
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = [('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ["person", "car"]

# 设置错误标签的log输出位置
write_path = open(r'D:\error.txt', 'w')

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(year, image_id):
    in_file = open('D:/yolov4/mybuild/Release/scripts/VOCdevkit/VOC%s/Annotations/%s.xml' % (year, image_id),
                   encoding="utf-8")
    out_file = open('D:/yolov4/mybuild/Release/scripts/VOCdevkit/VOC%s/labels/%s.txt' % (year, image_id), 'w',
                    encoding="utf-8")
    #这里根据自己的路径修改
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        # difficult = obj.find('difficult').text
        cls = obj.find('name').text
        # if cls not in classes or int(difficult) == 1:
        #     continue
        # print(in_file)
        # 标签自查
        if cls not in classes:
            print(in_file, cls)
            write_path.write('%s.xml' % image_id +' '+ cls +'\n')
            continue
        else:
            cls_id = classes.index(cls)

            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            bb = convert((w, h), b)
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/' % (year)):
        os.makedirs('VOCdevkit/VOC%s/labels/' % (year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt' % (year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt' % (year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n' % (wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

运行后,在VOC2007文件下生成labels文件,文件夹里包含相应的txt.(现在voc2007文件里多出一个labels 文件夹)

三、批量改文件名

批量修改图片文件名:

import os

# 需要改变的图像文件的路径,我放于桌面了
path ='C:\\Users\\Wise\\Desktop\\VOC2007\\JPEGImages'

# 改变后存放图片的文件夹路径,我也放于桌面了
path1 = path
filelist = os.listdir(path)

j = 1

for i in filelist:
    # 判断该路径下的文件是否为图片
    if i.endswith('.jpg'):#png可以改为jpg
        # 打开图片
        src = os.path.join(os.path.abspath(path), i)
        # 重命名
        dst = os.path.join(os.path.abspath(path1), format(str(j), '0>6s') + '.jpg')#0>s的意思是 图片的名称没有0,例如1_label.png,
                                                                                             #   如果改为0>3s,则结果为001_label.png
        # 执行操作
        os.rename(src, dst)
        j += 1

批量修改.txt标签文件名:

import os

# 需要改变的图像文件的路径,我放于桌面了
path ='C:\\Users\\Wise\\Desktop\\15\\Annotations'

# 改变后存放图片的文件夹路径,我也放于桌面了
path1 = path
filelist = os.listdir(path)

j = 9969

for i in filelist:
    # 判断该路径下的文件是否为图片
    if i.endswith('.xml'):#png可以改为jpg
        # 打开图片
        src = os.path.join(os.path.abspath(path), i)
        # 重命名
        dst = os.path.join(os.path.abspath(path1), format(str(j), '0>6s') + '.xml')#0>s的意思是 图片的名称没有0,例如1_label.png,
                                                                                             #   如果改为0>3s,则结果为001_label.png
        # 执行操作
        os.rename(src, dst)
        j += 1

四、批量修改txt文件内容

两种方法:

①借助visual studio 2019:

(111条消息) VisualStudio Code怎么同时编辑多处?vscode同时编辑多处的三种方法_A是曾同学呀的博客-CSDN博客_vscode怎么同时写多行https://blog.csdn.net/qq_45272642/article/details/122156406VS2019 技巧 - Linybo2008 - 博客园大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道。因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS “骚”操作,他们会好奇地问:你https://www.cnblogs.com/linybo/p/13217497.html ②借助python:

(111条消息) 使用python批量修改txt文件中的信息_码字的小农的博客-CSDN博客_python批量修改txt文件https://blog.csdn.net/no__matter/article/details/108069563?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-108069563.nonecase&spm=1018.2226.3001.4187.py代码:

import os
import random
import numpy as np
from numpy import *

txtfilepath = "/root/object/data/Main1" #原始txt文件所存文件夹,文件夹可以有一个或多个txt文件
savefilepath = "/root/object/data/Main" #更改后txt文件存放的文件夹
total_txt = os.listdir(txtfilepath) # 返回指定的文件夹包含的文件或文件夹的名字的列表
num = len(total_txt)
list = range(num) #创建从0到num的整数列表 
files = os.listdir(savefilepath)
for i in list: #遍历每一个文件
    name = total_txt[i]
    readfile = open(txtfilepath+"/"+name, 'r') #读取文件
    fline = readfile.readlines() #读取txt文件中每一行
    savetxt = open(savefilepath+"/"+name)

    for j in fline:
        if "你查找的内容" in j:
            b = j.replace('你所查找的内容', '替换成的内容') #替换固定行内容
            savetxt.write(b) #写入新的文件中

五、图像增强软件:

使用教程与下载地址:

图像增强软件V2.0,适用于|目标检测|图像分割|图像分类|_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1gZ4y1C7ExGitHub - Fafa-DL/Image-Augmentationhttps://github.com/Fafa-DL/Image-Augmentation本文仅作个人笔记使用,无其他用途。

并向上述内容涉及到的解决方案的提供者表示衷心感谢。

猜你喜欢

转载自blog.csdn.net/m0_54111890/article/details/124277555