当前位置:网站首页>The XML file generated by labelimg is converted to VOC format
The XML file generated by labelimg is converted to VOC format
2022-07-03 03:09:00 【AphilGuo】
Personal records
import os
import random
import xml.etree.ElementTree as ET
import numpy as np
from utils.utils import get_classes
#--------------------------------------------------------------------------------------------------------------------------------#
# annotation_mode Used to specify the contents of the file to be calculated at run time
# annotation_mode by 0 Represents the entire label processing process , Including getting VOCdevkit/VOC2007/ImageSets Inside txt And for training 2007_train.txt、2007_val.txt
# annotation_mode by 1 On behalf of VOCdevkit/VOC2007/ImageSets Inside txt
# annotation_mode by 2 Stands for... For training 2007_train.txt、2007_val.txt
#--------------------------------------------------------------------------------------------------------------------------------#
annotation_mode = 0
#-------------------------------------------------------------------#
# It has to be changed , Used to generate 2007_train.txt、2007_val.txt Target information for
# And the... Used for training and prediction classes_path It's OK to be consistent
# If generated 2007_train.txt There is no target information in it
# So it's because classes Not set correctly
# Only in annotation_mode by 0 and 2 In force
#-------------------------------------------------------------------#
classes_path = 'model_data/voc_classes.txt'
#--------------------------------------------------------------------------------------------------------------------------------#
# trainval_percent Is used to specify the ( Training set + Verification set ) Ratio to test set , By default ( Training set + Verification set ): Test set = 9:1
# train_percent Is used to specify the ( Training set + Verification set ) The ratio of training set to verification set in , By default Training set : Verification set = 9:1
# Only in annotation_mode by 0 and 1 In force
#--------------------------------------------------------------------------------------------------------------------------------#
trainval_percent = 0.9
train_percent = 0.9
#-------------------------------------------------------#
# Point to VOC The folder where the dataset is located
# By default, it points to... In the root directory VOC Data sets
#-------------------------------------------------------#
VOCdevkit_path = 'VOCdevkit'
VOCdevkit_sets = [('2007', 'train'), ('2007', 'val')]
classes, _ = get_classes(classes_path)
#-------------------------------------------------------#
# Count the number of targets
#-------------------------------------------------------#
photo_nums = np.zeros(len(VOCdevkit_sets))
nums = np.zeros(len(classes))
def convert_annotation(year, image_id, list_file):
in_file = open(os.path.join(VOCdevkit_path, 'VOC%s/Annotations/%s.xml'%(year, image_id)), encoding='utf-8')
tree=ET.parse(in_file)
root = tree.getroot()
for obj in root.iter('object'):
difficult = 0
if obj.find('difficult')!=None:
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 = (int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)), int(float(xmlbox.find('xmax').text)), int(float(xmlbox.find('ymax').text)))
list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))
nums[classes.index(cls)] = nums[classes.index(cls)] + 1
if __name__ == "__main__":
random.seed(0)
if " " in os.path.abspath(VOCdevkit_path):
raise ValueError(" No space is allowed in the folder path and picture name where the dataset is stored , Otherwise, normal model training will be affected , Please pay attention to the modification .")
if annotation_mode == 0 or annotation_mode == 1:
print("Generate txt in ImageSets.")
xmlfilepath = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')
saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Main')
temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
if xml.endswith(".xml"):
total_xml.append(xml)
num = len(total_xml)
list = range(num)
tv = int(num*trainval_percent)
tr = int(tv*train_percent)
trainval= random.sample(list,tv)
train = random.sample(trainval,tr)
print("train and val size",tv)
print("train size",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
print("Generate txt in ImageSets done.")
if annotation_mode == 0 or annotation_mode == 2:
print("Generate 2007_train.txt and 2007_val.txt for train.")
type_index = 0
for year, image_set in VOCdevkit_sets:
image_ids = open(os.path.join(VOCdevkit_path, 'VOC%s/ImageSets/Main/%s.txt'%(year, image_set)), encoding='utf-8').read().strip().split()
list_file = open('%s_%s.txt'%(year, image_set), 'w', encoding='utf-8')
for image_id in image_ids:
list_file.write('%s/VOC%s/JPEGImages/%s.jpg'%(os.path.abspath(VOCdevkit_path), year, image_id))
convert_annotation(year, image_id, list_file)
list_file.write('\n')
photo_nums[type_index] = len(image_ids)
type_index += 1
list_file.close()
print("Generate 2007_train.txt and 2007_val.txt for train done.")
def printTable(List1, List2):
for i in range(len(List1[0])):
print("|", end=' ')
for j in range(len(List1)):
print(List1[j][i].rjust(int(List2[j])), end=' ')
print("|", end=' ')
print()
str_nums = [str(int(x)) for x in nums]
tableData = [
classes, str_nums
]
colWidths = [0]*len(tableData)
len1 = 0
for i in range(len(tableData)):
for j in range(len(tableData[i])):
if len(tableData[i][j]) > colWidths[i]:
colWidths[i] = len(tableData[i][j])
printTable(tableData, colWidths)
if photo_nums[0] <= 500:
print(" The number of training sets is less than 500, It belongs to a small amount of data , Please pay attention to setting a larger training generation (Epoch) To meet sufficient gradient descent times (Step).")
if np.sum(nums) == 0:
print(" No goals were achieved in the dataset , Please pay attention to the modification classes_path Corresponding to their own data set , And make sure the label name is correct , Otherwise, the training will have no effect !")
print(" No goals were achieved in the dataset , Please pay attention to the modification classes_path Corresponding to their own data set , And make sure the label name is correct , Otherwise, the training will have no effect !")
print(" No goals were achieved in the dataset , Please pay attention to the modification classes_path Corresponding to their own data set , And make sure the label name is correct , Otherwise, the training will have no effect !")
print("( Important things are to be repeated for 3 times ).")
边栏推荐
- open file in 'w' mode: IOError: [Errno 2] No such file or directory
- VS 2019配置tensorRT
- Kubernetes cluster log and efk architecture log scheme
- QT based tensorrt accelerated yolov5
- Vs Code configure virtual environment
- How to make backgroundworker return an object
- 超好用的日志库 logzero
- [C language] MD5 encryption for account password
- 处理数据集,使用LabelEncoder将所有id转换为从0开始
- 文件重命名
猜你喜欢
SqlServer行转列PIVOT
Thunderbolt Chrome extension caused the data returned by the server JS parsing page data exception
函数栈帧的创建与销毁
The process of connecting MySQL with docker
【PyG】理解MessagePassing过程,GCN demo详解
Creation and destruction of function stack frame
MySQL practice 45 [SQL query and update execution process]
C language beginner level - pointer explanation - paoding jieniu chapter
ASP. Net core 6 framework unveiling example demonstration [02]: application development based on routing, MVC and grpc
Le processus de connexion mysql avec docker
随机推荐
MySQL practice 45 [SQL query and update execution process]
Privatization lightweight continuous integration deployment scheme -- 01 environment configuration (Part 2)
Use of check boxes: select all, deselect all, and select some
用docker 連接mysql的過程
How to return ordered keys after counter counts the quantity
当lambda没有输入时,是何含义?
Counter统计数量后,如何返回有序的key
The idea cannot be loaded, and the market solution can be applied (pro test)
[Fuhan 6630 encodes and stores videos, and uses RTSP server and timestamp synchronization to realize VLC viewing videos]
Vs 2019 configure tensorrt to generate engine
BigVision代码
I2C subsystem (IV): I2C debug
迅雷chrome扩展插件造成服务器返回的数据js解析页面数据异常
Spark on yarn资源优化思路笔记
Agile certification (professional scrum Master) simulation exercises
MySql实战45讲【行锁】
Introduction to cron expression
I2C 子系统(四):I2C debug
The left value and the right finger explain better
Cron表达式介绍