当前位置:网站首页>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 ).")
边栏推荐
- The process of connecting MySQL with docker
- Notifydatasetchanged not applicable to recyclerview - notifydatasetchanged not working on recyclerview
- Getting started | jetpack hilt dependency injection framework
- Can netstat still play like this?
- Practice of traffic recording and playback in vivo
- 后管中编辑与预览获取表单的值写法
- How to select the minimum and maximum values of columns in the data table- How to select min and max values of a column in a datatable?
- MySQL Real combat 45 [SQL query and Update Execution Process]
- Concrete CMS vulnerability
- VS code配置虚拟环境
猜你喜欢
随机推荐
Unity3d human skin real time rendering real simulated human skin real time rendering "suggestions collection"
labelimg生成的xml文件转换为voc格式
Tensorflow to pytorch notes; tf. gather_ Nd (x, y) to pytorch
Serious security vulnerabilities reported by moxa mxview network management software
敏捷认证(Professional Scrum Master)模拟练习题-2
SqlServer行转列PIVOT
Segmentation fault occurs during VFORK execution
Nasvit: neural architecture search of efficient visual converter with gradient conflict perception hypernetwork training
Getting started | jetpack hilt dependency injection framework
I2C subsystem (III): I2C driver
Destroy the session and empty the specified attributes
Force freeing memory in PHP
How do you adjust the scope of activerecord Association in rails 3- How do you scope ActiveRecord associations in Rails 3?
一文带你了解 ZigBee
The process of connecting MySQL with docker
MySql实战45讲【事务隔离】
Last update time of all sqlserver tables
后管中编辑与预览获取表单的值写法
VS code配置虚拟环境
Check log4j problems using stain analysis


![MySQL practice 45 lecture [row lock]](/img/71/344daddee537a96f0d38241e6896e1.png)






