当前位置: 首页 > article >正文

保姆级教程:用Python脚本将VisDrone2019数据集一键转成COCO格式(附完整代码)

从VisDrone到COCO无人机视觉数据格式转换实战指南当你第一次打开VisDrone2019数据集时可能会被那些密密麻麻的.txt标注文件弄得一头雾水。作为计算机视觉领域最常用的无人机视角数据集之一VisDrone却采用了与主流框架不兼容的自定义格式——这就像拿到了珍贵的食材却找不到合适的菜谱。本文将带你用Python脚本打通这个关键环节把VisDrone2019-DET数据集完美转换为COCO格式让你能立即在MMDetection、Detectron2等框架中开展目标检测实验。1. 理解VisDrone与COCO格式的本质差异在动手写代码之前我们需要先搞清楚两种格式的DNA差异。VisDrone2019-DET数据集采用简单的每图对应一个.txt文件的标注方式而COCO格式则将所有标注信息整合到一个结构化的JSON文件中。VisDrone标注文件示例例如000001.txt641,420,73,72,0,4,1,1 322,424,97,51,0,4,1,1 ...每行代表一个目标实例各字段含义为前4个数字边界框的左上角x,y坐标和宽高x,y,w,h第5个数字目标可见性评分0-1第6个数字类别ID对应11类物体最后2个数字暂时不用关注相比之下COCO格式的核心结构包含三个关键部分{ images: [{id: 1, file_name: 000001.jpg, ...}], annotations: [{image_id: 1, category_id: 4, bbox: [x,y,w,h], ...}], categories: [{id: 1, name: pedestrian}, ...] }2. 项目环境搭建与目录准备开始转换前确保你的Python环境已安装以下关键包pip install opencv-python tqdm numpyVisDrone2019-DET的标准目录结构应该是这样的VisDrone2019-DET/ ├── VisDrone2019-DET-train/ │ ├── annotations/ # 训练集标注文件 │ └── images/ # 训练集图片 ├── VisDrone2019-DET-val/ │ ├── annotations/ # 验证集标注文件 │ └── images/ # 验证集图片 └── VisDrone2019-DET-test-dev/ # 测试集无标注提示建议在输出目录预先创建好annotations/子目录这是MMDetection等框架默认寻找COCO标注文件的位置。3. 核心转换代码逐行解析让我们构建一个完整的转换脚本visdrone2coco.py关键函数如下3.1 类别映射定义categories [ {id: 0, name: ignored regions}, {id: 1, name: pedestrian}, {id: 2, name: people}, {id: 3, name: bicycle}, # ...完整类别见原始代码 ]VisDrone的11个类别需要与COCO格式中的categories数组精确对应。注意第一个类别是ignored regions这在评估时需要特殊处理。3.2 主转换函数def convert_to_coco(dir_path, output_dir): # 初始化COCO数据结构 coco_dict { images: [], annotations: [], categories: categories } annotation_id 0 # 每个标注实例的唯一ID for mode in [train, val]: img_dir os.path.join(dir_path, fVisDrone2019-DET-{mode}, images) ann_dir os.path.join(dir_path, fVisDrone2019-DET-{mode}, annotations) for filename in tqdm(os.listdir(ann_dir)): # 处理每个标注文件 base_name filename.replace(.txt, ) img_path os.path.join(img_dir, base_name .jpg) # 获取图片尺寸 img cv2.imread(img_path) height, width img.shape[:2] # 添加图片信息 coco_dict[images].append({ id: base_name, file_name: base_name .jpg, height: height, width: width }) # 解析标注文件 with open(os.path.join(ann_dir, filename)) as f: for line in f: parts [int(x) for x in line.strip().split(,)] if len(parts) 6: continue # 构建COCO标注格式 bbox [parts[0], parts[1], parts[2], parts[3]] coco_dict[annotations].append({ id: annotation_id, image_id: base_name, category_id: parts[5], bbox: bbox, area: bbox[2] * bbox[3], iscrowd: 0, segmentation: [] }) annotation_id 1 # 保存为JSON文件 os.makedirs(output_dir, exist_okTrue) for mode in [train, val]: subset_dict { images: [img for img in coco_dict[images] if img[file_name].startswith(mode[:3])], annotations: [ann for ann in coco_dict[annotations] if ann[image_id].startswith(mode[:3])], categories: categories } with open(f{output_dir}/instances_{mode}2019.json, w) as f: json.dump(subset_dict, f)3.3 边界框处理技巧VisDrone的边界框有时会超出图像范围我们需要进行裁剪处理def clamp_bbox(bbox, img_width, img_height): x, y, w, h bbox x1 max(0, x) y1 max(0, y) x2 min(img_width, x w) y2 min(img_height, y h) return [x1, y1, x2 - x1, y2 - y1]4. 实战应用与验证转换完成后我们可以用以下代码验证生成的COCO格式文件是否正确from pycocotools.coco import COCO import matplotlib.pyplot as plt # 加载生成的COCO标注 coco COCO(output/instances_train2019.json) # 随机可视化一个样本 img_id coco.getImgIds()[0] img_info coco.loadImgs(img_id)[0] ann_ids coco.getAnnIds(imgIdsimg_id) anns coco.loadAnns(ann_ids) img cv2.imread(os.path.join(VisDrone2019-DET-train/images, img_info[file_name])) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) coco.showAnns(anns) plt.show()5. 进阶技巧与性能优化对于大规模数据集转换可以考虑以下优化策略多进程处理使用Python的multiprocessingfrom multiprocessing import Pool def process_file(args): filename, ann_dir, img_dir args # ...处理单个文件的逻辑 with Pool(processes4) as pool: args_list [(f, ann_dir, img_dir) for f in os.listdir(ann_dir)] results pool.map(process_file, args_list)内存优化分批处理图片避免同时加载所有图像数据使用生成器逐步构建JSON结构格式扩展# 添加额外的COCO字段可选 annotation.update({ attributes: { occluded: parts[4] 1, # 根据可见性评分判断是否遮挡 weather: sunny # 可从文件名推断天气条件 } })6. 常见问题解决方案问题1转换后某些标注框位置异常检查确认是否正确处理了边界框越界情况修复添加clamp_bbox函数确保坐标在图像范围内问题2COCO验证时报类别ID不连续原因VisDrone的类别ID从0开始但0对应的是忽略区域解决在categories数组中确保ID连续性问题3大型数据集转换内存不足方案改用流式JSON写入方式import ijson def stream_write_json(output_path, data_generator): with open(output_path, w) as f: f.write({images: [) # 分批写入图片数据 f.write(], annotations: [) # 分批写入标注数据 f.write(], categories: [...]})7. 集成到训练流程转换后的数据集可以直接用于主流框架。以MMDetection为例配置文件中只需指定data dict( traindict( typeCocoDataset, ann_filedata/VisDrone/annotations/instances_train2019.json, img_prefixdata/VisDrone/VisDrone2019-DET-train/images/, classesclasses # 你的类别列表 ), valdict(...), testdict(...) )对于需要YOLO格式的情况可以基于COCO格式进一步转换# 将COCO的[x,y,w,h]转换为YOLO的[center_x, center_y, w, h]归一化 def coco2yolo(bbox, img_w, img_h): x_center (bbox[0] bbox[2]/2) / img_w y_center (bbox[1] bbox[3]/2) / img_h width bbox[2] / img_w height bbox[3] / img_h return [x_center, y_center, width, height]

相关文章:

保姆级教程:用Python脚本将VisDrone2019数据集一键转成COCO格式(附完整代码)

从VisDrone到COCO:无人机视觉数据格式转换实战指南 当你第一次打开VisDrone2019数据集时,可能会被那些密密麻麻的.txt标注文件弄得一头雾水。作为计算机视觉领域最常用的无人机视角数据集之一,VisDrone却采用了与主流框架不兼容的自定义格式—…...

Stata也可以绘制词云图了!wordcloud2 命令实战

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。 作者: 连小白 (连享会) 邮箱: lianxhcn163.com Title: Stata也可以绘制词云图了!wordcloud2 命令实战Keywords: Stata, 词云图, wordcloud…...

异步电机直接转矩控制进阶:12扇区三电平SVPWM的仿真优化与实践

1. 异步电机直接转矩控制的核心痛点 我第一次接触异步电机直接转矩控制(DTC)是在2015年做电动汽车驱动项目时。当时团队使用传统两电平逆变器方案,电机运行时总伴随着明显的"嗡嗡"声,实测转矩波动幅度高达额定值的15%。…...

Block Copy 的内存布局详解榔

核心摘要:这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景,告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”,并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...

你好,放大器——失调与偏置的实战分析与优化策略

1. 放大器失调与偏置的真相大白 第一次用运放做电流检测电路时,我盯着输出端那0.5mV的"幽灵电压"百思不得其解——明明输入接地,输出却像闹鬼似的飘着电压。后来才发现,这其实是所有工程师都会遇到的经典问题:失调电压和…...

安全智能:MongoDB EF Core 提供程序中的可查询加密和向量搜索牙

一、各自优势和对比 这是检索出来的数据,据说是根据第三方评测与企业数据,三款产品在代码生成质量上各有侧重: 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一;Python首生成率达92.3% SQL生成准确率提升35%&…...

清华教授:心情差的时候,做这8件小事,比硬扛管用多了

你有没有这样的时刻:心情突然就不好了,说不清为什么,就是闷闷的、烦躁、提不起劲。硬扛?扛不住。发泄?发完更累。清华大学的彭凯平教授总结了8个简单易行的方法,专门用来调节负面情绪。从传统文化里来&…...

【C++第三十章】线程库

前言 🚀C11 的线程库并不只是“把系统线程 API 换了个写法”,而是在标准库层面,给并发编程提供了一套更统一、更可移植的抽象:线程怎么创建,如何等待结束,如何保护共享资源,线程之间怎么同步通知…...

智能EFI配置终极方案:OpCore-Simplify自动化解决黑苹果安装难题

智能EFI配置终极方案:OpCore-Simplify自动化解决黑苹果安装难题 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpenCore EFI配置是黑苹果…...

2026深度评测:谷歌Gemini功能完整性全解析,技术旗舰的真实能力与短板

一、行业背景:大模型竞争从"参数内卷"走向"实用为王" 2026年AI行业已告别单纯参数竞赛,转向全场景功能覆盖、本土化适配、低门槛落地的实用化竞争。百度SEO与GEO优化成为技术内容核心流量入口,用户搜索关键词从"大模型哪家强"转向"Gemi…...

AlwaysOnTop:让Windows窗口始终置顶的效率神器

AlwaysOnTop:让Windows窗口始终置顶的效率神器 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾经在同时处理多个任务时,频繁在窗口间切换&#x…...

【JAVA基础面经】进程间的通信方式

文章目录前言1.管道(Pipe)2.命名管道(FIFO)3.消息队列4.共享内存5.信号量6.信号(Signal)7.Socket面试问题前言 进程是系统资源分配的最小单位,每个进程拥有独立的地址空间。为了保证不同进程之间…...

.NET对象转JSON,到底有几种方式?荣

背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...

如何用Python的NLTK库玩转FrameNet语义分析(附代码示例)

如何用Python的NLTK库玩转FrameNet语义分析(附代码示例) 自然语言处理(NLP)领域的一个核心挑战是如何让机器真正理解人类语言背后的含义。传统的关键词匹配或语法分析往往停留在表面,而FrameNet提供的框架语义学方法&a…...

2025届学术党必备的六大AI写作神器横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 具备自然语言处理技术的智能辅助,AI 写作软件能够快速生成文章、报告、营销文案等…...

TP4056P防反接及 OVP 功能 1A 锂电池线性充电芯片

简介 TP4056P 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器,并带有锂电池正负极反接保护功能,可以保护芯片和用户安全。由于采用了内部PMOSFET 架构,加上防倒充电路,所以不需要外部检测电阻和隔离二极管。热反馈可对…...

OPUS编解码器在audio DSP上的移植和应用闯

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...

一款轻量级、纯粹的 Linux 服务器监控工具

👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事上…...

全球数据库各个细分领域的TOP1产品

文章目录一、关系型数据库(RDBMS)领域二、NoSQL数据库领域三、云原生数据库领域四、向量数据库(AI时代新兴)领域五、时间序列数据库领域六、NewSQL数据库领域七、数据仓库/OLAP领域八、嵌入式关系型数据库领域九、国产数据库市场格局十、发展趋势与洞察十一、数据库选型建议十二…...

从Java到Kotlin:线程同步的平滑迁移(Synchronized/Volatile篇)

从Java到Kotlin:线程同步的平滑迁移(Synchronized/Volatile篇) 当开发者从Java生态转向Kotlin时,线程同步机制的差异往往成为技术栈迁移过程中的关键挑战。本文将深入剖析Synchronized与Volatile在两种语言中的实现差异&#xff…...

基于非对称纳什谈判理论的微网电能共享与P2P交易优化策略:MATLAB复现及隐私保护技术探究

基于非对称纳什谈判的多微网电能共享运行优化策略 MATLAB代码,电网技术文献复现: 关键词:纳什谈判 合作博弈 微网 电转气-碳捕集 P2P电能交易交易 参考文档:《基于非对称纳什谈判的多微网电能共享运行优化策略》完美复现 仿…...

腾讯云轻量服务器一键部署OpenClaw教程

本文主要分享如何利用腾讯云轻量应用服务器,搭建个人可用的AI应用,全程聚焦技术实操,适合零基础个人开发者、AI爱好者参考,步骤清晰可落地,兼顾稳定性和实用性。 一、选择腾讯云搭建个人AI应用的核心原因(客…...

保姆级教程:用MediaPipe和BlazePose在Python里实时追踪你的健身动作(附完整代码)

从零构建健身动作分析系统:基于BlazePose的实时姿态追踪实战指南 在居家健身和数字化运动监测日益普及的今天,计算机视觉技术为个人健身提供了全新的可能性。想象一下,当你对着摄像头完成一组深蹲时,系统能实时指出"膝盖内扣…...

如何三步搞定macOS安装包下载:Download Full Installer终极指南

如何三步搞定macOS安装包下载:Download Full Installer终极指南 【免费下载链接】DownloadFullInstaller macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application. 项目地址: https://gitcode.com/gh_mi…...

C++ vs .NET 数组原地反转实测:小数组 C++ 碾压,大数组 .NET 反杀?级

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

新概念英语第一册131_Do not be so sure

Lesson 131: Don’t be so sure! 别那么肯定 Watch the story and answer the question What’s the problem about deciding on a holiday? Who’s going to look after everything.Key words and expressions Egypt 埃及worry 担心 worry about sth. abroad…...

AI 首次实现电影级多镜头长视频生成!快手港中文开源ShotStream,可实现单NVIDIA GPU上可达16 FPS 互式故事讲述和高效即时帧生成。

在 AI 视频生成领域,我们长期被困在“单镜头”的牢笼里:生成的视频往往只有几秒到十几秒,且缺乏场景切换和叙事逻辑。想要生成一个有起承转合、有多角度运镜的完整故事片段,通常需要生成几十个独立视频再手动剪辑,不仅…...

突破60帧限制:EldenRingFPSUnlockAndMore让你的《艾尔登法环》焕然新生

突破60帧限制:EldenRingFPSUnlockAndMore让你的《艾尔登法环》焕然新生 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/g…...

Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解

Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解 你有没有遇到过这样的场景?面对一段几分钟的监控录像,需要快速知道里面发生了什么;或者刷到一个短视频,想让它自动生成一段文字描述。单纯靠人眼去看、人脑…...

WarcraftHelper终极指南:5分钟让魔兽争霸3完美适配现代电脑

WarcraftHelper终极指南:5分钟让魔兽争霸3完美适配现代电脑 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代系统上的…...