这篇文章主要复现数据集打标签的制作过程,以及与YOLOv4的数据集制作和数据增强。
包括:
一、voc标签
二、.xml(voc格式)转.txt(yolo格式)
三、批量改文件名
四、批量修改txt文件内容
五、数据增强工具
下面进行详述:
一、voc标签
这里主要讲LabelImage的使用:
视频教程:
详述如下:
① 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:
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本文仅作个人笔记使用,无其他用途。
并向上述内容涉及到的解决方案的提供者表示衷心感谢。