代码使用方法注意修改一下路径、验证集比例、类别名称,其他均不需要改动,自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下,大家可以直接修改相应的配置文件进行训练。
目录
使用方法:
全部代码:
使用方法:
全部代码:
import os,random,shutil
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir,getcwd
from os.path import join
def convert(size,box):
x_center=(box[0]+box[1])/2.0
y_center=(box[2]+box[3])/2.0
x=x_center/size[0]
y=y_center/size[1]
w=(box[1]-box[0])/size[0]
h=(box[3]-box[2])/size[1]
return (x,y,w,h)
def convert_annotation(xml_file_path,save_txt_file_path,classes):
xml_file=os.listdir(xml_file_path)
print(xml_file)
for xml_name in xml_file:
print(xml_file)
xml_file=os.path.join(xml_file_path,xml_name)
out_txt_path=os.path.join(save_txt_file_path,xml_name.split('.')[0]+".txt")
out_txt_f=open(out_txt_path,'w')
tree=ET.parse(xml_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
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))
print(w,h,b)
bb=convert((w,h),b)
out_txt_f.write(str(cls_id)+" "+" ".join([str(a) for a in bb])+"\n")
def moving(fileDir,tarDir,rate=0.2):
pathDir=os.listdir(fileDir)
filenumber=len(pathDir)
#自定义抽取图片比例
picknumber=int(filenumber*rate)#按照rate比例从文件夹中取一定数量的图片
sample=random.sample(pathDir,picknumber)#随机选取picknumber数量的图片
print(sample)
for name in sample:
shutil.move(fileDir+"/"+name,tarDir+"/"+name)
return
def movelabel(file_list,file_label_train,file_label_val):
for i in file_list:
if i.endswith(".png") or i.endswith(".jpg"):
#filename=file_label_train+"/"+i[:-4] 可以将.xml文件将.txt改成.xml文件
filename=file_label_train+"/"+i[:-4]+".xml" #可以改成xml文件将.txt改成.xml
if os.path.exists(filename):
shutil.move(filename,file_label_val)
print("处理成功")
if __name__=="__main__":
"""
设置图片路径、label路径、验证集比例、类别
"""
fileDir=r"./JPEGImages" #图片的路径
file_label_train = r"./Annotations" #标签文件的路径
rate=0.2 #验证集的比例
classes1 = ['fire']
"""
以下均不需要改动
"""
if not os.path.exists("./JPEGImages_val"):
# Create the folder
os.makedirs("./JPEGImages_val")
tarDir=r"./JPEGImages_val"
moving(fileDir,tarDir,rate)
file_list=os.listdir(tarDir)
if not os.path.exists("./Annotations_val"):
# Create the folder
os.makedirs("./Annotations_val")
file_label_val=r"./Annotations_val"
movelabel(file_list,file_label_train,file_label_val)
#VOC转Yolo格式
# 2 voc 格式的xml标签文件
if not os.path.exists("./val"):
# Create the folder
os.makedirs("./val")
if not os.path.exists("./train"):
# Create the folder
os.makedirs("./train")
xml_files1 = r"./Annotations_val"
save_txt_files1 = r"./val"
convert_annotation(xml_files1, save_txt_files1, classes1)
xml_files1 = r"./Annotations"
save_txt_files1 = r"./train"
convert_annotation(xml_files1, save_txt_files1, classes1)
#创建所有文件夹
if not os.path.exists("./images"):
# Create the folder
os.makedirs("./images")
if not os.path.exists("./labels"):
# Create the folder
os.makedirs("./labels")
#将所有文件移动到最终的文件夹中
import shutil
# Define the source and destination folders
source_folder = "./train"
destination_folder = "./labels"
# Move the files from the source folder to the destination folder
shutil.move(source_folder, destination_folder)
source_folder = "./val"
destination_folder = "./labels"
# Move the files from the source folder to the destination folder
shutil.move(source_folder, destination_folder)
source_folder = "./JPEGImages"
destination_folder = "./images"
# Move the files from the source folder to the destination folder
shutil.move(source_folder, destination_folder)
os.rename("./images/JPEGImages", "./images/train")
source_folder = "./JPEGImages_val"
destination_folder = "./images"
# Move the files from the source folder to the destination folder
shutil.move(source_folder, destination_folder)
os.rename("./images/JPEGImages_val", "./images/val")