import json
import re
import os
import xml.dom.minidom
import cv2
import xml.etree.ElementTree as ET
import random
txt_path = "jsonFile.txt"
image_Path = "./VOC2007/JPEGImages/"
voc_classes_path = "./voc_classes.txt"
_ANNOTATION_SAVE_PATH = './VOC2007/Annotations'
# 想把xml文件存在哪里就写哪里
# xml文件规范定义
_INDENT = '' * 4
_NEW_LINE = '\n'
_FOLDER_NODE = 'WHUT2022'
_ROOT_NODE = 'annotation'
_DATABASE_NAME = 'Dection'
_ANNOTATION = 'WHUT2022'
_AUTHOR = 'CTX'
_SEGMENTED = '0'
_DIFFICULT = '0'
_TRUNCATED = '0'
_POSE = 'Unspecified'
#--------------------------------------------------------------------------------------------------------------------------------#
# annotation_mode用于指定该文件运行时计算的内容
# annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
# annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
# annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
#--------------------------------------------------------------------------------------------------------------------------------#
annotation_mode = 0
#-------------------------------------------------------------------#
# 必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
# 与训练和预测所用的classes_path一致即可
# 如果生成的2007_train.txt里面没有目标信息
# 那么就是因为classes没有设定正确
# 仅在annotation_mode为0和2的时候有效
#-------------------------------------------------------------------#
classes_path = "./voc_classes.txt"
#--------------------------------------------------------------------------------------------------------------------------------#
# trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
# train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
# 仅在annotation_mode为0和1的时候有效
#--------------------------------------------------------------------------------------------------------------------------------#
trainval_percent = 0.95
train_percent = 0.95
#-------------------------------------------------------#
# 指向VOC数据集所在的文件夹
# 默认指向根目录下的VOC数据集
#-------------------------------------------------------#
# VOCdevkit_path = 'VOCdevkit'
VOCdevkit_path = './'
# 借鉴Fast-rcnn
def convert_annotation(year, image_id, list_file):
in_file = open(os.path.join(VOCdevkit_path, 'VOC%s/Annotations/%s.xml'%(year, image_id)))
xml_text = in_file.read()
root = ET.fromstring(xml_text)
with open(classes_path, encoding='utf-8') as f:
class_names = f.readlines()
classes = [c.strip() for c in class_names]
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))
# 借鉴Fast-rcnn
def get_txt(annotation_mode,trainval_percent,train_percent):
random.seed(0)
VOCdevkit_sets = [('2007', 'train'), ('2007', 'val')]
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.")
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')
list_file.close()
print("Generate 2007_train.txt and 2007_val.txt for train done.")
# 获取所有图像名
# for file in os.listdir(image_Path):
# name = os.path.splitext(file)
# 得到一个json组成的列表,并把类别名称放在voc_classes_path里
def getJsonAndClasses(txt_path,voc_classes_path):
clsname = set() # 所有类别的集合
inputfile = [] # 所有的目标信息的字典形式组成的列表
with open(txt_path, "r", encoding='UTF-8') as f: # 修改key的名字
txt_all = f.read()
print(type(txt_all))
dic_all = json.loads(txt_all)
for k, v in dic_all.items():
for i in v:
classes = re.split('-+|NAN', i['regionClass'])
for cls in classes:
if cls == '' or cls[0] == "请":
continue
clsname.add(cls)
inner = {
"filename": k,
"class": cls,
"bndbox": [i['xmin'], i['xmax'], i['ymin'], i['ymax']]
}
inputfile.append(inner)
clsname = list(clsname)
file = open(voc_classes_path, 'w',encoding='UTF-8')
for i in range(len(clsname)):
s = str(clsname[i])
file.write(s)
file.write("\n")
return inputfile
# 封装创建节点的
def createElementNode(doc, tag, attr):
element_node = doc.createElement(tag)
text_node = doc.createTextNode(attr)
element_node.appendChild(text_node)
return element_node
# 封装添加一个子节点的
def createChildNode(doc, tag, attr, parent_node):
child_node = createElementNode(doc, tag, attr)
parent_node.appendChild(child_node)
# object节点比较特殊
def createObjectNode(doc, attrs):
object_node = doc.createElement('object')
createChildNode(doc, 'name', attrs['class'],
object_node)
createChildNode(doc, 'pose',
_POSE, object_node)
createChildNode(doc, 'truncated',
_TRUNCATED, object_node)
createChildNode(doc, 'difficult',
_DIFFICULT, object_node)
bndbox_node = doc.createElement('bndbox')
createChildNode(doc, 'xmin', str(int(attrs['bndbox'][0])),
bndbox_node)
createChildNode(doc, 'ymin', str(int(attrs['bndbox'][2])),
bndbox_node)
createChildNode(doc, 'xmax', str(int(attrs['bndbox'][1])),
bndbox_node)
createChildNode(doc, 'ymax', str(int(attrs['bndbox'][3])),
bndbox_node)
object_node.appendChild(bndbox_node)
return object_node
# 将documentElement写入XML文件
def writeXMLFile(doc, filename):
tmpfile = open('tmp.xml', 'w')
doc.writexml(tmpfile, addindent='' * 4, newl='\n', encoding='utf-8')
tmpfile.close()
# 删除第一行默认添加的标记
fin = open('tmp.xml')
# print(filename)
fout = open(filename, 'w')
# print(os.path.dirname(fout))
lines = fin.readlines()
for line in lines[1:]:
if line.split():
fout.writelines(line)
fin.close()
fout.close()
if __name__ == "__main__":
##读取图片列表
img_path = image_Path
fileList = os.listdir(img_path)
if fileList == 0:
os._exit(-1)
# 第一步获得json列表
ann_data = getJsonAndClasses(txt_path,voc_classes_path)
current_dirpath = os.path.dirname(os.path.abspath('__file__'))
if not os.path.exists(_ANNOTATION_SAVE_PATH):
os.mkdir(_ANNOTATION_SAVE_PATH)
# if not os.path.exists(_IMAGE_COPY_PATH):
# os.mkdir(_IMAGE_COPY_PATH)
for imageName in fileList:
saveName = imageName.strip(".jpg")
print(saveName)
xml_file_name = os.path.join(_ANNOTATION_SAVE_PATH, (saveName + '.xml'))
# 获得图像
img = cv2.imread(os.path.join(img_path, imageName))
print(os.path.join(img_path, imageName))
# cv2.imshow(img)
height, width, channel = img.shape
print(height, width, channel)
my_dom = xml.dom.getDOMImplementation()
doc = my_dom.createDocument(None, _ROOT_NODE, None)
# 获得根节点
root_node = doc.documentElement
# folder节点
createChildNode(doc, 'folder', _FOLDER_NODE, root_node)
# filename节点
createChildNode(doc, 'filename', saveName + '.jpg', root_node)
# source节点
source_node = doc.createElement('source')
# source的子节点
createChildNode(doc, 'database', _DATABASE_NAME, source_node)
createChildNode(doc, 'annotation', _ANNOTATION, source_node)
createChildNode(doc, 'image', 'flickr', source_node)
createChildNode(doc, 'flickrid', 'NULL', source_node)
root_node.appendChild(source_node)
# owner节点
owner_node = doc.createElement('owner')
# owner的子节点
createChildNode(doc, 'flickrid', 'NULL', owner_node)
createChildNode(doc, 'name', _AUTHOR, owner_node)
root_node.appendChild(owner_node)
# size节点
size_node = doc.createElement('size')
createChildNode(doc, 'width', str(width), size_node)
createChildNode(doc, 'height', str(height), size_node)
createChildNode(doc, 'depth', str(channel), size_node)
root_node.appendChild(size_node)
# segmented节点
createChildNode(doc, 'segmented', _SEGMENTED, root_node)
for ann in ann_data:
if (saveName == ann["filename"]):
# object节点
object_node = createObjectNode(doc, ann)
root_node.appendChild(object_node)
else:
continue
# 构建XML文件名称
print(xml_file_name)
writeXMLFile(doc, xml_file_name)
get_txt(annotation_mode, trainval_percent, train_percent)
相关推荐
Caltech行人数据集转化VOC数据集
CaltechPestrian2VOC 代码仓库地址 将Caltech数据集转化成PASCAL VOC的格式,下载地址 文件结构如下:其中红框中的是原始的文件夹,其余4个文件夹是在执行过程中生成的 1. Seq文件转化成JEPG图像文件 调用seq2jpg.py文件,输入data文件夹,输出到JPEG文件夹中 2. VBB标注文件转化为XML文件 调用vbb2voc.py文件...
VOC 数据集格式的生成
voc数据集生成
STM32掉电保存配置参数技巧
本文介绍了使用STM32内置备份寄存器(BKP)实现掉电保存配置参数的方法。相比外接EEPROM或Flash,备份寄存器无需外设但存储容量有限,需通过VBAT引脚连接纽扣电池供电。文章详细说明了初始化步骤,包括使能PWR时钟、允许访问备份寄存器等操作,并提供了RTC初始化的代码示例。同时介绍了HAL库中读写备份寄存器的函数使用方法,包括HAL_RTCEx_BKUPWrite和HAL_RTCEx_BKUPRead函数的具体参数和调用示例。该方法适用于需要小容量数据掉电保存的应用场景。
制作VOC数据集——生成ImageSets/Main下的txt文件
import os import random trainval_percent = 0.7 # 可以自己设置 train_percent = 0.8 # 可以自己设置 xmlfilepath = f"/Users/Administrator/Desktop/ship_detection_online/Annotations_new" # 地址填自己的 txtsavepath = f"/...
工程伦理ppt
工程伦理学 第一章 工程与伦理 1.1 如何理解工程 一、技术与工程的区别 二、技术与工程的联系 三、工程的定义 五、工程具有不确定性和探索性 六、理解工程活动的7个维度 1.2 如何理解伦理 一、道德与伦理 二、不同的伦理立场 三、伦理困境与伦理选择 1.3 工程实践中的伦理问题 一、工程活动中的行动者网络(具有动态性和网络性) 二、主要的工程伦理问题 三、工程伦理问题的特点 1.4 如何处理工程实践中的伦理问题 一、工程实践中伦理问题的辨识 二、处理工程伦理问题的基本原则 三、应对工程伦理问题的基本思路
AS7262六通道可见光传感器:从光谱原理到物联网色彩检测实战
光谱检测是嵌入式感知领域的关键技术,其核心原理是通过特定波长的滤光片分离光线并转换为电信号,从而实现对环境光或物体反射光的成分分析。这项技术的价值在于将复杂的光学分析简化为可编程读取的数字信号,极大降低了色彩检测在物联网和智能设备中的应用门槛。在智能农业、工业分拣、环境监测等场景中,精确的光谱数据能够驱动自动化决策,例如评估植物光照条件或识别物料颜色。本文以Adafruit AS7262传感器为例,深入解析其基于硅干涉滤光片的六通道设计,并通过Arduino与Python实战,演示如何快速构建从数据采集到可
【数据集制作】VOC2007格式数据集制作和处理教程(Faster-RCNN模型标准输入)
此数据集可用于目标检测和图像分割,此次实验案例是讲解Faster-RCNN、YOLOv3等模型的进行目标检测的标准数据集输入,没讲分割,所有用不到上述所有数据集,只讲其中目标检测部分数据集的制作。此次案例是制作VOC2007数据集的制作教程,用于目标检测,此次数据集处理可用于Faster-RCNN、YOLOv3等网络进行目标检测模型的标准输入。至此,VOC2007格式数据集制作完成。
【算法】图解A* 搜索算法
A* 算法是启发式搜索算法,是根据Dijkstra算法改进而来。 问题引入 如下图所示,S为起始(start)节点,G为目标(goal)节点。 节点之间连线是两点的路径长度,如A到E的路径长度c(A,E) = 9。 节点旁的h值时当前节点到达目标节点(G)的预估值,如h(A)=15, 表示从当前点A到达目标点G的估计路径长度为15,此处h(x)即为启发函数,启发函数的设计有很多方法,具体可......
快速制作自己的VOC语义分割数据集
PASCAL VOC2012是语义分割任务极为重要的官方数据集,大量优秀的语义分割模型都会刷一下这个数据集,因此我们在使用别人的开源代码时,如果能将自己的数据集整理成官方数据集的格式,则可快速验证模型性能,减少自身工作量。
地瓜派RDK X5部署YOLOv11n避坑指南:手把手教你解决Softmax算子导致的性能暴跌问题
本文详细介绍了在地瓜派RDK X5开发板上部署YOLOv11n模型时遇到的性能问题及解决方案。通过强制BPU部署Softmax算子,成功将推理速度从7FPS提升至47FPS,并提供了完整的优化流程和技术细节,帮助开发者避免类似性能陷阱。
脑机接口技术介绍、应用与挑战
脑机接口的概念最先于1973年提出,伴随着计算机性能的飞速提高,在美国“人类脑计划”的资金支持下,脑机接口的研究进入了高速发展期。去年年末,我国科技部会议透露:中国将拿出540亿元,推进中国脑计划的发展。同时,这一举措也推动了我国脑机接口的研究发展。 脑机接口属于多学科交叉科技,涉及神经科学、计算机科学、认知科学、控制与信息科学技术、医学等多个学科。技术实现方式是通过信号采集设备从大脑皮层采集脑电信号,经过放大、滤波、A/D转换等处理,转换为可以被计算机识别的信号,然后对信号进行预处理,提取特征信号,再利
VOC格式数据集制作:ImageSets->Segmentation文件中的train.txt,test.txt,trainval.txt,val.txt详细制作(详细图文教程)
VOC格式数据集制作:ImageSets->Segmentation文件中的train.txt,test.txt,trainval.txt,val.txt详细制作过程。
数据分享:中国历年省、市、县行政区划shp(1949~2023年共计75年)
中华人民共和国县级以上行政区沿革》(三册,1949-1983年)“The Atlas of Changes of Administrative Regions of China”;《中华人民共和国行政区划沿革地图集》The yearly publications of “The Administrative Regions”, 1985-2014;每年的出版行政区划简册(1985-2014年)行政区划网:www.xzqh.org。行政区划网:www.xzqh.org。
voc定位数据xml转coco数据集格式json
[toc] 代码里面集合了python处理xml的精髓 ## 1. voc定位数据xml转coco数据集格式json import xml.etree.ElementTree as ET import os import json coco = dict() coco['images'] = [] coco['type'] = 'instances' coco['annotations'...
前端技能树,面试复习第 54 天—— 手写代码:情景题
前端修罗场提供全网最专业的前端优质文章与社区服务,为应届生,初中级前端工程师提供全面、优质的面试服务、技能提升、职场解惑服务!内容包含:前端面试辅导,前端面试题,前端交流,前端答疑,前端基础知识,前端知识体系,技能树搭建,Javascript,CSS,CSS3,HTML,React,Vue,小程序,前端简历,职业交流,远程工作,英文交流,英文提升,外企,互联网,国企,大厂,牛客面试题,掘金面试题,面经,优质前端文章分享...
RU DOS版、EFI版32bit/64bit BIOS常用工具
DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。
深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化
在深度学习中,第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴,数据集经常要用Voc格式的,比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化,附详细代码!
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
告别混乱!Potsdam遥感数据集预处理全攻略:格式转换、数据增强与COCO/VOC格式一键生成
本文详细介绍了Potsdam遥感数据集的预处理全流程,包括TIF格式转换、数据增强以及COCO/VOC格式一键生成。通过专业级代码示例和工程化实践,帮助开发者高效处理高分辨率遥感图像,优化语义分割任务的模型训练效果。
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
Labelme标注的数据集转VOC2007格式的数据集。
VOC2007数据文件夹说明 1)JPEGImages文件夹 文件夹里包含了训练图片和测试图片,混放在一起 2)Annatations文件夹 文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片 3)ImageSets文件夹 Action存放的是人的动作,我们暂时不用 Layout存放的人体部位的数据。我们暂时不用 Main存放的是图...
图像语义分割网络实战(一)增强数据集PASCAL VOC2012 Aug的制作
接下来的几篇中,我将作为一个小白记录自己在图像语义分割领域实战的步骤和问题。 VOC数据集下载 VOC2012中一共有10000+图,但并不都用于分割任务,有的用以物体标识或者动作识别等。所谓其增强版就是指联合了SBD数据集(Semantic Boundaries Dataset and Benchmark),一般放在benchmark Release文件夹里。 Pascal VOC官网:http://host.robots.ox.ac.uk/pascal/VOC/ SBD官网:http://hom
自定义csv转VOC目标检测数据集脚本
简介 代码是基于其他blog的代码进行修改的,把csv行数据提取独立为一个函数。根据自己的csv文件格式对返回进行调整。 功能说明 按VOC数据集格式生成对应文件夹,自动在脚本当前目录下生成 可设置训练集与验证集比例,随机分配 根据上一点分配的比例分别生成all.txt、train.txt和val.txt(分别记录对应图片的文件名,不含尾缀) 生成对应Annotations的XML文件 csv文件里面多个bbox使用同一张图片,能自动加入到同一个XML的object中 Code # encoding=u
coco数据集转换为voc格式
1。coco数据集简介,共标注了90类 1:person 2:bicycle 3:car 4:motorcycle 5:airplane 6:bus 7:train 8:truck 9:boat 10:traffic light 11:fire hydrant 13:stop sign 14:parking meter 15:bench 16:bird 17:cat 18:dog 19:hors...
raw2voc数据集格式处理
前言 用深度学习做目标检测,经常会接触到pascal voc这个数据集。目前很多开源项目对数据的处理格式都采用和voc一样的格式,逐渐这成为了一种标准数据处理格式,这里记一次制作符合自己需求的VOC格式数据集。 VOC数据集简介 文件夹树结构 └── VOCdevkit #根目录 └── VOC2007 #不同年份的数据集,这里只下载了2007的,还有2012等其它年份的 ...
读取voc中的数据集路径修改_制作VOC2007数据集常用代码
研究背景由于研究时常根据使用情况,制作符合要求的数据集,因而将需要的代码整理。数据集结构└── VOCdevkit #根目录└── VOC2012 #不同年份的数据集,这里只下载了2012的,还有2007等其它年份的├── Annotations #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等├── ImageSets #该...
xml2txt 转换代码示例参考。 VOC转YOLO格式
使用U-Net分割模型处理耕地提取与耕地非农化分割数据集数据集 土地非农化监测,土地利用变化监测,耕地识别等应用 耕地提取数据集
Pytorch机器学习(三)——VOC数据集转换为YOLO数据集
Pytorch机器学习(二)——利用torchvision.datasets分析,处理,可视化VOC数据集 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本文为利用pytorch官方提供的datasets读取VOC数据集的方法,来处理数据集并把其转化为yolo的格式。如果对datasets读取VOC数据集的方法不熟悉,可以看上篇文章 Pytorch机器学习(二)——利用torchvision.datas
python数据处理-数据清洗
目录 1.绘制图片 2.画出目标-生成xml-截取ROI-生成目标HW的直方图分布 3.画出目标-生成xml-截取ROI-生成目标HW的直方图分布-分类信息的解析 4.VOC格式的trainval.txt的生成: -1.已经处理好的txt(无越界,无错误)转换为xml文件 #-*-coding:utf-8-*- import os import cv2 import xml.e...
6996



被折叠的 条评论
为什么被折叠?



