VOC格式的数据生成训练需要的train.txt和vla.txt
'''
txt存放图片名字
'''
def train_val():
path = 'data/VOCdevkit/VOC2007/Annotations'
trainpath = 'data/VOCdevkit/VOC2007/ImageSets/Main/train.txt'
valpath = 'data/VOCdevkit/VOC2007/ImageSets/Main/val.txt'
with open(trainpath,'w') as train:
for i in os.listdir(path):
name = i.split('.')
train.writelines(name[0]+'\n')
with open(valpath,'w') as val:
for num,i in enumerate(os.listdir(path)):
if num%4==0:
name = i.split('.')
val.writelines(name[0]+'\n')
图片类型转化png转为jpg
def png_jpg(dirName):
D_list = os.listdir(dirName)
for FileName in D_list:
NewName = FileName
NewName = NewName.split('.')
if NewName[-1] == 'png':
NewName[-1] = 'jpg'
NewName = str.join('.', NewName)
Filename = dirName + FileName
NewName = dirName + NewName
os.rename(Filename, NewName)
print(NewName, "修改成功!")
图片标签同时候重命名为A00000格式
def renamefile(xml_path,img_path,imgtype='.jpg'):
'''
传入需要重命名的图片标签路径
'''
A = os.listdir(xml_path)
strs = 'A00000'
k = 0
for a in A:
i = str(k)
xml = strs[:-len(i)]+i+'.xml'
img = strs[:-len(i)]+i+imgtype
xmlname = os.path.join(xml_path,a)
newxmlname = os.path.join(xml_path,xml)
imgname = os.path.join(img_path,(a[:-4]+imgtype))
newimgname = os.path.join(img_path,img)
os.rename(xmlname,newxmlname)
os.rename(imgname,newimgname)
k+=1
删除标签xml为空的图片和标签文件
def rm_none_obj(xmlpath,imgpath):
for xml_name in os.listdir(xmlpath):
filename = os.path.join(xml_path,xml_name)
imgname = os.path.join(img_path,(xml_name[:-3]+'jpg'))
tree = ET.parse(filename)
objs = tree.findall('object')
num_objs = len(objs)
if num_objs == 0:
print('-=-=-=-=-=',filename)
os.remove(filename)
os.remove(imgname)
坐标转化为偏移量
def ScaleCovertor(width,height,xmin,ymin,xmax,ymax):
width = int(width)
height = int(height)
xmax = int(xmax)
ymax = int(ymax)
xmin = int(xmin)
ymin = int(ymin)
xp = str((xmin+xmax)/(2*width))
yp = str((ymin+ymax)/(2*height))
wp = str((xmax-xmin)/width)
hp = str((ymax-ymin)/height)
plist = [xp,yp,wp,hp]
sp = ' '.join(plist)
return plist
p = ScaleCovertor(1280,720,597,406,628,500)
根据txt存放的坐标生成xml文件
import os, sys
import glob
from PIL import Image
def onelines(label_txt,img_path,src_xml_dir):
names = os.path.split(label_txt)[-1].split('.')[0]
print(names)
save_xml = os.path.join(src_xml_dir,names+'.xml')
img_path = os.path.join(img_path,names+'.jpg')
img = Image.open(img_path)
width, height = img.size
xml_file = open(save_xml, 'w')
xml_file.write('<annotation>\n')
xml_file.write(' <folder>MeData</folder>\n')
xml_file.write(' <filename>' + names + '</filename>\n')
xml_file.write(' <size>\n')
xml_file.write(' <width>' + str(width) + '</width>\n')
xml_file.write(' <height>' + str(height) + '</height>\n')
xml_file.write(' <depth>3</depth>\n')
xml_file.write(' </size>\n')
for f in open(label_txt):
spt = f.strip('\n').split(' ')
xml_file.write(' <object>\n')
xml_file.write(' <name>' + class_dict[spt[4]] + '</name>\n')
xml_file.write(' <pose>Unspecified</pose>\n')
xml_file.write(' <truncated>0</truncated>\n')
xml_file.write(' <difficult>0</difficult>\n')
xml_file.write(' <bndbox>\n')
xml_file.write(' <xmin>' + str(spt[0]) + '</xmin>\n')
xml_file.write(' <ymin>' + str(spt[1]) + '</ymin>\n')
xml_file.write(' <xmax>' + str(spt[2]) + '</xmax>\n')
xml_file.write(' <ymax>' + str(spt[3]) + '</ymax>\n')
xml_file.write(' </bndbox>\n')
xml_file.write(' </object>\n')
xml_file.write('</annotation>')
if __name__ == "__main__":
class_dict = {'0':'person','1':'head','2':'coat','3':'pants','4':'shoes'}
path = '/home/sdkj/software/OpenLabeling/main/output/YOLO_darknet/'
for txt in os.listdir(path):
label_txt = os.path.join(path,txt)
img_path = 'image_path/'
src_xml_dir = 'save_xml_path/'
onelines(label_txt,img_path,src_xml_dir)
根据xml获取坐标并且以txt文件存起来
def get_car(xml_path, name,save_txt_path,class_dict):
save_txt_path = save_txt_path+name[:-3]+'txt'
filename = os.path.join(xml_path,name)
print(filename)
tree = ET.parse(filename)
W = tree.find('size').find('width').text
H = tree.find('size').find('height').text
objs = tree.findall('object')
with open(save_txt_path,'w+') as f:
for ix, obj in enumerate(objs):
bbox = obj.find('bndbox')
ne = obj.find('name').text
x1 = int(bbox.find('xmin').text) if int(bbox.find('xmin').text) > 0 else 0
y1 = int(bbox.find('ymin').text) if int(bbox.find('ymin').text) > 0 else 0
x2 = int(bbox.find('xmax').text) if int(bbox.find('xmax').text) > 0 else 0
y2 = int(bbox.find('ymax').text) if int(bbox.find('ymax').text) > 0 else 0
p = ScaleCovertor(W,H,x1,y1,x2,y2)
sp = class_dict[ne]+' '+' '.join(p)
f.writelines(sp+'\n')
f.close()
class_dict = {'person':'0','head':'1','coat':'2','pants':'3','shoes':'4'}
for xmlname in os.listdir(xml_path):
get_car(xml_path,xmlname,save_txt_path,class_dict)