一、标注工具rolabelImg
rolabelImg和labelimg差不多,只是在rolabelImg中可以画旋转的矩形,下载地址rolabelImg
具体操作如下:
进入这个目录下,输入cmd进入终端:依次输入以下代码将会启动程序
pyrcc5 -o resources.py resources.qrc
python labelImg.py
接下来就是标记了,画出第一个旋转矩形
注意,使用z,x,c,v控制旋转。其他功能和labelimg差不多,生成的都是xml文件,接下来就是将xml文件转换为txt文件。
二、格式转换
在文本检测时用到的是txt文件,其中包含的是文本框的四个点坐标及文本内容,接下来就用代码实现xml转换为txt
# coding=utf-8
import os
import xml.dom.minidom
import cv2 as cv
def xml_to_txt(indir, outdir):
os.chdir(indir)
xmls = os.listdir('.')
for i, file in enumerate(xmls):
file_save = file.split('.')[0] + '.txt'
file_txt = os.path.join(outdir, file_save)
f_w = open(file_txt, 'w')
# actual parsing
DOMTree = xml.dom.minidom.parse(file)
annotation = DOMTree.documentElement
filename = annotation.getElementsByTagName("path")[0]
imgname = filename.childNodes[0].data
img_temp = imgname.split('\\')[-1]
img_temp = os.path.join(image_dir, img_temp)
image = cv.imread(imgname)
cv.imwrite(img_temp, image)
objects = annotation.getElementsByTagName("object")
print(file)
for object in objects:
bbox = object.getElementsByTagName("robndbox")[0]
cx = bbox.getElementsByTagName("cx")[0]
x = float(cx.childNodes[0].data)
print(x)
cy = bbox.getElementsByTagName("cy")[0]
y = float(cy.childNodes[0].data)
print(y)
cw = bbox.getElementsByTagName("w")[0]
w = float(cw.childNodes[0].data)
print(w)
ch = bbox.getElementsByTagName("h")[0]
h = float(ch.childNodes[0].data)
print(h)
cangel = bbox.getElementsByTagName("angle")[0]
angle = float(cangel.childNodes[0].data)
print(angle)
cname = object.getElementsByTagName("name")[0]
name = cname.childNodes[0].data
print(name)
x1 = x - w / 2.
y1 = y - h / 2.
x2 = x + w / 2.
y2 = y - h / 2.
x3 = x + w / 2.
y3 = y + h / 2.
x4 = x - w / 2.
y4 = y + h / 2.
temp = str(x1) + ' ' + str(y1) + ' ' + str(x2) + ' ' + str(y2) + ' ' + str(x3) + ' ' + str(y3) + ' ' + str(
x4) + ' ' + str(y4) + ' ' + name + '\n'
f_w.write(temp)
f_w.close()
image_dir = 'D:/Data/che/image'
indir = 'D:/Data/che/xml' # xml目录
outdir = 'D:/Data/che/txt' # txt目录
xml_to_txt(indir, outdir)
效果如下:
以上就是制作数据集和数据转换的全部内容,希望对大家有所帮助!