UA-DETRAC数据集转YOLO格式
一: 数据集下载
原官方数据集
链接:https://pan.baidu.com/s/1P_CeSIpJIYSA1dykmFhgYw
提取码: 7f4g
处理完成数据集(每10帧取一张)
链接:后续添加
提取码:后续添加
二: 处理标注文件
先处理标注文件,UA-DETRAC提供的标注文件格式是VOC格式,需要先转为XML格式,然后再将每个XML文件转为YOLO文件。
下面提供两个代码,只需要修改文件放置目录
1. 将VOC转为XML格式
import xml.etree.ElementTree as ET
from xml.dom.minidom import Document
import os
import cv2
import timedef ConvertVOCXml(file_path="", file_name=""):tree = ET.parse(file_name)root = tree.getroot()# print(root.tag)num = 0 # 计数# 读xml操作frame_lists = []output_file_name = ""for child in root:if (child.tag == "frame"):# 创建dom文档doc = Document()# 创建根节点annotation = doc.createElement('annotation')# 根节点插入dom树doc.appendChild(annotation)# print(child.tag, child.attrib["num"])pic_id = child.attrib["num"].zfill(5)# print(pic_id)output_file_name = root.attrib["name"] + "__img" + pic_id + ".xml"# print(output_file_name)folder = doc.createElement("folder")folder.appendChild(doc.createTextNode("VOC2007"))annotation.appendChild(folder)filename = doc.createElement("filename")pic_name = "img" + pic_id + ".jpg"filename.appendChild(doc.createTextNode(pic_name))annotation.appendChild(filename)sizeimage = doc.createElement("size")imagewidth = doc.createElement("width")imageheight = doc.createElement("height")imagedepth = doc.createElement("depth")imagewidth.appendChild(doc.createTextNode("960"))imageheight.appendChild(doc.createTextNode("540"))imagedepth.appendChild(doc.createTextNode("3"))sizeimage.appendChild(imagedepth)sizeimage.appendChild(imagewidth)sizeimage.appendChild(imageheight)annotation.appendChild(sizeimage)target_list = child.getchildren()[0] # 获取target_list# print(target_list.tag)object = Nonefor target in target_list:if (target.tag == "target"):# print(target.tag)object = doc.createElement('object')bndbox = doc.createElement("bndbox")for target_child in target:if (target_child.tag == "box"):xmin = doc.createElement("xmin")ymin = doc.createElement("ymin")xmax = doc.createElement("xmax")ymax = doc.createElement("ymax")xmin_value = int(float(target_child.attrib["left"]))ymin_value = int(float(target_child.attrib["top"]))box_width_value = int(float(target_child.attrib["width"]))box_height_value = int(float(target_child.attrib["height"]))xmin.appendChild(doc.createTextNode(str(xmin_value)))ymin.appendChild(doc.createTextNode(str(ymin_value)))if (xmin_value + box_width_value > 960):xmax.appendChild(doc.createTextNode(str(960)))else:xmax.appendChild(doc.createTextNode(str(xmin_value + box_width_value)))if (ymin_value + box_height_value > 540):ymax.appendChild(doc.createTextNode(str(540)))else:ymax.appendChild(doc.createTextNode(str(ymin_value + box_height_value)))if (target_child.tag == "attribute"):vehicle_type = target_child.attrib["vehicle_type"]name = doc.createElement('name')pose = doc.createElement('pose')truncated = doc.createElement('truncated')difficult = doc.createElement('difficult')name.appendChild(doc.createTextNode(str(vehicle_type)))pose.appendChild(doc.createTextNode("Left")) # 随意指定truncated.appendChild(doc.createTextNode("0")) # 随意指定difficult.appendChild(doc.createTextNode("0")) # 随意指定object.appendChild(name)object.appendChild(pose)object.appendChild(truncated)object.appendChild(difficult)bndbox.appendChild(xmin)bndbox.appendChild(ymin)bndbox.appendChild(xmax)bndbox.appendChild(ymax)object.appendChild(bndbox)annotation.appendChild(object)file_path_out = os.path.join(file_path, output_file_name)f = open(file_path_out, 'w')f.write(doc.toprettyxml(indent=' ' * 4))f.close()num = num + 1return num'''
画方框
'''def bboxes_draw_on_img(img, bbox, color=[255, 0, 0], thickness=2):# Draw bounding box...print(bbox)p1 = (int(float(bbox["xmin"])), int(float(bbox["ymin"])))p2 = (int(float(bbox["xmax"])), int(float(bbox["ymax"])))cv2.rectangle(img, p1, p2, color, thickness)def visualization_image(image_name, xml_file_name):tree = ET.parse(xml_file_name)root = tree.getroot()object_lists = []for child in root:if (child.tag == "folder"):print(child.tag, child.text)elif (child.tag == "filename"):print(child.tag, child.text)elif (child.tag == "size"): # 解析sizefor size_child in child:if (size_child.tag == "width"):print(size_child.tag, size_child.text)elif (size_child.tag == "height"):print(size_child.tag, size_child.text)elif (size_child.tag == "depth"):print(size_child.tag, size_child.text)elif (child.tag == "object"): # 解析objectsingleObject = {}for object_child in child:if (object_child.tag == "name"):# print(object_child.tag,object_child.text)singleObject["name"] = object_child.textelif (object_child.tag == "bndbox"):for bndbox_child in object_child:if (bndbox_child.tag == "xmin"):singleObject["xmin"] = bndbox_child.text# print(bndbox_child.tag, bndbox_child.text)elif (bndbox_child.tag == "ymin"):# print(bndbox_child.tag, bndbox_child.text)singleObject["ymin"] = bndbox_child.textelif (bndbox_child.tag == "xmax"):singleObject["xmax"] = bndbox_child.textelif (bndbox_child.tag == "ymax"):singleObject["ymax"] = bndbox_child.textobject_length = len(singleObject)if (object_length > 0):object_lists.append(singleObject)img = cv2.imread(image_name)for object_coordinate in object_lists:bboxes_draw_on_img(img, object_coordinate)cv2.imshow("capture", img)cv2.waitKey(0)cv2.destroyAllWindows()if (__name__ == "__main__"):# print("main")basePath = r"E:\project\dataset\UA-DETRAC\DETRAC-Test-Annotations-XML"totalxml = os.listdir(basePath)total_num = 0flag = Falseprint("正在转换")saveBasePath = r"E:\project\dataset\UA-DETRAC\test-labels-xml"if os.path.exists(saveBasePath) == False: # 判断文件夹是否存在os.makedirs(saveBasePath)# ConvertVOCXml(file_path="samplexml",file_name="000009.xml")# Start timestart = time.time()log = open("xml_statistical.txt", "w") # 分析日志,进行排错for xml in totalxml:file_name = os.path.join(basePath, xml)print(file_name)num = ConvertVOCXml(file_path=saveBasePath, file_name=file_name)print(num)total_num = total_num + numlog.write(file_name + " " + str(num) + "\n")# End timeend = time.time()seconds = end - startprint("Time taken : {0} seconds".format(seconds))print(total_num)
2. 将XML转为YOLO格式
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import joindef convert(size, box):# size=(width, height) b=(xmin, xmax, ymin, ymax)# x_center = (xmax+xmin)/2 y_center = (ymax+ymin)/2# x = x_center / width y = y_center / height# w = (xmax-xmin) / width h = (ymax-ymin) / heightx_center = (box[0] + box[1]) / 2.0y_center = (box[2] + box[3]) / 2.0x = x_center / size[0]y = y_center / size[1]w = (box[1] - box[0]) / size[0]h = (box[3] - box[2]) / size[1]# print(x, y, w, h)return (x, y, w, h)def convert_annotation(xml_files_path, save_txt_files_path, classes):xml_files = os.listdir(xml_files_path)# print(xml_files)for xml_name in xml_files:print(xml_name)xml_file = os.path.join(xml_files_path, xml_name)out_txt_path = os.path.join(save_txt_files_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').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_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))# b=(xmin, xmax, ymin, ymax)# print(w, h, b)bb = convert((w, h), b)out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')if __name__ == "__main__":# 把forklift_pallet的voc的xml标签文件转化为yolo的txt标签文件# 1、需要转化的类别classes = ['car', 'bus', 'van', 'others'] # 注意:这里根据自己的类别名称及种类自行更改# 2、voc格式的xml标签文件路径xml_files1 = r'E:\project\dataset\UA-DETRAC\test-labels-xml'# 3、转化为yolo格式的txt标签文件存储路径save_txt_files1 = r'E:\project\dataset\UA-DETRAC\test-labels-yolo'convert_annotation(xml_files1, save_txt_files1, classes)
3 处理完毕后我们会得到以下内容
其中输出YOLO格式的标注文件名为MVI_20011__img00001.txt,相比图片的文件名多了一个 MVI_20011__ 的前缀。 (其实就是存放图片文件夹的文件名)。
所以后面我们需要对图像的文件名进行下处理,将其修改为和标注文件相同的名字!
三: 修改图像名称
一个代码搞定
import os# 获取要修改的文件地址
path = r'E:\project\dataset\UA-DETRAC\test'
# 获取文件名列表
file_list = os.listdir(path)
print('文件列表如下:')
print(file_list)# # 遍历文件名,获取文件名和扩展名
for file in file_list:path_2 = path + '/' + filefile_list_inner = os.listdir(path_2)for filename in file_list_inner:pos = filename.rfind('.') - 8newname = file + '__' + filename[pos:-4] + '.jpg'#重新命名文件os.rename(path_2+'/'+filename,path_2+'/'+newname)
处理完成!接下来按照yolo训练文件格式调整下文件顺序就好了。
相关文章:

UA-DETRAC数据集转YOLO格式
一: 数据集下载 原官方数据集 链接:https://pan.baidu.com/s/1P_CeSIpJIYSA1dykmFhgYw 提取码: 7f4g 处理完成数据集(每10帧取一张) 链接:后续添加 提取码:后续添加 二: 处理标…...

代码随想录---二叉树的总结和二叉树的定义
二叉树的种类: 满二叉树:树的所有节点都是满,即都有左右孩子。 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。 完全二叉树:完全二叉树的定义如下:在完全二叉树中,…...
Hive SQL 执行计划
我们在写Hive SQL的时候,难免会在运行的时候有报错,所以知道Hive SQL的执行计划具体是什么,然后假如在之后的运行过程中有报错,可以根据执行计划定位问题,调试自己的SQL开发脚本。 一、含义 Hive SQL的执行计划描述S…...
MySQL InnoDB引擎——三层B+树可以存储多少数据量
先说结论: 3层B树大概可以存: 主键为bigint:约2000w主键为int:约4000w*备注: 在《阿里开发手册》中建议,单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,如果预计三年后…...

部署跨云容灾的五大难点
为什么企业需要跨云容灾? 据统计,全球已有70%的企业使用云计算服务。上云帮助企业更高效地管理数据资产,但它并非绝对安全。如停电、漏水等机房事故;地震、火灾等自然性灾害;亦或是人为失误,都有可能造成数…...

Docker Compose
为什么需要使用Docker ComposeDocker Compose 容器编排技术1、现在我们有一个springboot项目,需要依赖Redis、mysql、nginx。如果使用docker原生部署的话,则需要安装Redis、mysql、nginx容器,才可以启动我们springboot项目,这样的…...

【ARM架构】armv8 系统安全概述
ARMv8-A 系统中的安全 一个安全或可信的操作系统保护着系统中敏感的信息,例如,可以保护用户存储的密码,信用卡等认证信息免受攻击。 安全由以下原则定义: 保密性:保护设备上的敏感信息,防止未经授权的访问…...
数学小课堂:数学边界
文章目录 引言I 费马大定理1.1毕达哥拉斯定理的推广1.2 一波三折的定理证明过程1.3 希尔伯特第十问题II 数学的边界2.1 认识论问题2.2 在边界内做事情2.3 总结引言 了解数学本身的局限性,才能更好地使用它的原理和思维方式。 数学的边界,这是一个硬的边界,大家不要试图逾越…...

检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话
任务:检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话例如:当按键1按下之后,让LED1状态取反,并打印“LED1 down”当按键2按下之后,让LED2状态取反,并打印“LED2 down”当…...
2023年CDGA考试-第7章-数据安全(含答案)
2023年CDGA考试-第7章-数据安全(含答案) 单选题 1.数据安全不仅涉及防止不当访问,也涉及对数据的适当访问,下列理解不正确的是 ( ) A.强密码有助于提高破解风险 B.安全专家建议 45-180天修改一次密码 C.用户要尽量使用多套密码和账户 D.具有高度敏感信息权限的用户都应使…...
输出月份英文名称--C语言实现
任务描述 本关需要你编写一个用指针数组处理的c程序,然后从键盘输入月份时输出对应的英文名。 相关知识 指针 指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,你必须在使用指针存储其他变量地址之前,对其进行声明。 指针变量声明…...

6年测试经验老鸟:做不好自动化测试,还谈什么高薪?
提起自动化测试,可谓仁者见人,智者见智,心中五味杂陈啊!你从任何一个招聘渠道来看最近两年对测试岗位的要求,几乎都要求会自动化测试。而不少人一直认为手工测试才是王道,工作中有的时候也用不到程序&#…...

Java Web:开篇综述与第一章
前言 翻开这本书,又是一段新的学习路线,在学习的道路上是枯燥的,是乏味的,难免有放弃的想法。但回看曾经的学习笔记,自己也一步一步走过来了,即使会自我怀疑自我否定,但不坚持不努力是永远没有…...
ES6中对象的一些拓展
当对象键名与对应值名相等的时候,可以进行简写 const obj { name }允许字面量定义对象时,将表达式放在括号内 let lastWord last word;const a {first word: hello,[lastWord]: world };a[first word] // "hello" a[lastWord] // "wo…...

10分钟快速入门Pandas库
pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的,这篇文章主要介绍了10分钟快速入门Pandas库,重点介绍pandas常见使用方法,结合实例代码介绍的非常详细,需要的朋友可以参考下目录Pandas的介绍pandas 是基于Num…...

考研复试机试 | C++ | 王道机试课程笔记
目录Zero-complexity (上交复试题)题目:代码:括号匹配问题题目:代码:表达式解析问题 (浙大机试题)题目:代码:标准库里提供了栈 stack<typename> myStack .size() 栈的大小 .pu…...

【python科目一:生产线系统设计;激光刀切割材料】
工厂有若干条生产线,可以生产不同型号的产品,要求实现功能如下:1. ProductionLineMgmtSys 初始化生产线和产品的生产周期有num条生产线,编号从0开始periods[i]表示生产一个型号为i的产品所需的生产周期,单位为天2. Pro…...

Linux——进程概念(进程状态)
目录 进程状态 三态模型 五态模型 七态模型 Example eg1:阻塞态:等待某种资源的过程 eg2:挂起态 Linux内核源代码 Linux进程状态查看 Linux运行状态 R运行状态(running): S睡眠状态(sleeping): D磁盘休眠状…...
超详细:正则表达式从入门到入门
文章目录匹配字符\d \D\s \S量词:匹配多个字符星号*加号问号?大括号{}集合字符[]明确字符范围字符补集字符常见字符集贪婪模式和非贪婪模式匹配开头和结尾贪婪模式和非贪婪模式常用函数re.findall()re.search()re.compile()re.split()re.sub()本文章首发…...

jupyter notebook小技巧
1、.ipynb 文件转word文档 将 jupyter notebook(.ipynb 文件)转换为 word 文件(.docx)的最简单方法是使用 pandoc。 首先安装pip install pandoc, 安装后,在将 Jupyter notebook文件目录cmd 然后输入打开…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...