【目标检测】旋转目标检测COCO格式标注转DOTAv1格式

DOTAv1数据集格式:

'imagesource':imagesource
'gsd':gsd
x1, y1, x2, y2, x3, y3, x4, y4, category, difficult
x1, y1, x2, y2, x3, y3, x4, y4, category, difficult
...

imagesource: 图片来源  
gsd: 分辨率
x1, y1, x2, y2, x3, y3, x4, y4:四边形的四个顶点的坐标 顶点按顺时针顺序排列,第一个起点为左上第一个点
category:实例类别
difficult:表示该实例是否难以检测(1表示困难,0表示不困难)

COCO转DOTA:

import json
import cv2
import numpy as np
import osdef calculate_rotated_bbox(poly):"""将多边形坐标转换为旋转边界框"""contour = np.array(poly).reshape((-1, 1, 2)).astype(np.float32)rect = cv2.minAreaRect(contour)box = cv2.boxPoints(rect)return np.int0(box)def coco_to_dota(coco_annotation_path, dota_annotation_folder, imagesource="Unknown", gsd="Unknown"):"""将COCO格式的标注转换为DOTA格式,包括imagesource和gsd信息"""# 类别ID到名称的映射category_map = {1: 'Class1',2: 'Class2',}# 确保输出目录存在if not os.path.exists(dota_annotation_folder):os.makedirs(dota_annotation_folder)# 读取COCO格式的JSON文件with open(coco_annotation_path, 'r') as f:coco_data = json.load(f)# 遍历每个图像的标注for image in coco_data['images']:image_id = image['id']image_filename = image['file_name']dota_filename = os.path.splitext(image_filename)[0] + '.txt'  # 去掉原始扩展名,添加.txtdota_filepath = os.path.join(dota_annotation_folder, dota_filename)with open(dota_filepath, 'w') as dota_file:# 写入imagesource和gsd信息# dota_file.write(f"'imagesource':{imagesource}\n'gsd':{gsd}\n")# 找到当前图像的所有标注for annotation in filter(lambda x: x['image_id'] == image_id, coco_data['annotations']):if 'segmentation' in annotation:for seg in annotation['segmentation']:if type(seg[0]) is list:  # 检查是否是多边形格式seg = seg[0]box = calculate_rotated_bbox(seg)# 从映射中获取类别名称category_name = category_map.get(annotation['category_id'], 'Unknown')# 格式化DOTA标注box_str = ' '.join(map(str, box.flatten().tolist()))dota_annotation = f"{box_str} {category_name} 0\n"dota_file.write(dota_annotation)# 调用函数,转换COCO到DOTA
coco_annotation_path = 'instances.json'
dota_annotation_folder = 'dota'
coco_to_dota(coco_annotation_path, dota_annotation_folder)

标注可视化:

import cv2
import numpy as np
import osdef draw_rotated_box(img, box, label):"""在图像上绘制旋转的边界框和标签。"""points = np.int0(box)cv2.drawContours(img, [points], 0, (0, 255, 0), 2)  # 绘制旋转框cv2.putText(img, label, tuple(points[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)  # 添加文本标签def visualize_dota_annotations(image_folder, annotation_folder, output_folder):"""批量处理图像和DOTA标注文件,绘制旋转边界框和标签"""# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历图像文件for img_filename in os.listdir(image_folder):img_path = os.path.join(image_folder, img_filename)if os.path.isfile(img_path) and img_filename.endswith(('.jpg', '.png')):annot_filename = os.path.splitext(img_filename)[0] + '.txt'annot_path = os.path.join(annotation_folder, annot_filename)output_img_path = os.path.join(output_folder, img_filename)# 读取图像img = cv2.imread(img_path)if img is None:continue  # 如果图像文件无法读取,则跳过# 处理对应的标注文件if os.path.isfile(annot_path):with open(annot_path, 'r') as f:lines = f.readlines()# 跳过文件开头的imagesource和gsd信息for line in lines[2:]:  # 开始处理从第三行起的标注信息parts = line.strip().split(' ')if len(parts) < 9:  # 跳过非标准行continuebox = np.array([float(part) for part in parts[:8]]).reshape(4, 2)label = parts[8]  # 标签draw_rotated_box(img, box, label)# 保存绘制了旋转边界框的图像cv2.imwrite(output_img_path, img)# 路径配置
image_folder = 'images'
annotation_folder = 'dota'
output_folder = 'visual'visualize_dota_annotations(image_folder, annotation_folder, output_folder)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递增三元组(第九届蓝桥杯)

文章目录 题目原题链接思路分析二分做法1二分做法2双指针做法前缀和解法 题目 原题链接 递增三元组 思路分析 由时间复杂度可知需要至少优化到 O ( n l o g n ) O(nlogn) O(nlogn)才行 而纯暴力枚举三个数组的话&#xff1a; O ( n 3 ) O(n^3) O(n3) 可以考虑将b[]作为标志&…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示&#xff0c;两个队列绑定到了direct交换器上&#xff0c;第一个队列绑定的 binding key 为 orange &#xff0c;第二个队列有两个绑定&#xff0c;分别是 black 和 green 。 如上图所示…

Java引用类型

目录 什么是引用类型 引用类型的特点 引用类型有哪些 什么是引用类型 引用类型(reference type)是编程语言中用于表示对象或集合的一种数据类型。与基本数据类型不同,引用类型存储的是对实际数据的引用(或指针),而不是数据本身。这意味着,当操作一个引用类型变量时,…

常用算法部分

学习地址 二 算法 10 搜索 10.1 二分查找 11 排序 12 分治 13 回溯 14 动态规划 15 贪心

基础小白快速入门web前端开发技术------>web概述

Web概述 我们在编程的学习中&#xff0c;随着学习的深入&#xff0c;我们会理解到WEB这个东西&#xff0c;那么 web究竟是个啥&#xff0c;到底该咋用&#xff1f; web&#xff0c;是网站的英文意思&#xff0c;又被称作“下一代Web3.0&#xff0c;互联网”&#xff0c;是在We…

学Python如此简单--OS模块

&#xff08;未完成&#xff09; 模块方法 OS模块 方法说明chdir(path)修改当前工作目录 os.chdir("c:\")------os.chdir("..") ,一般不会更改curdir获取当前目录 属性 注意返回的是相对路径 &#xff08;绝对路径os.path.abspath(os.curdir)&#xff0…

vue在线查看pdf文件

1.引入组件 npm install --save vue-pdf2、pdf组件页面模板 <template><div class"scrollBox" ><el-dialog :visible.sync"open" :top"1" width"50%" append-to-body><div slot"title"><el…

混沌工程-经典案例分享

目录 前言 案例 1、强弱依赖不合理 2、预案不生效 3、异常数据不兼容 4、监控体系缺陷 5、系统缺整体架构设计 总结 前言 我们公司从启动混沌工程到现在已经几乎覆盖了线上的所有核心业务&#xff0c;先后进行过2000次演练共挖掘出120个漏洞。这些漏洞有些得了及时修复…

DevEco Studio编译时候自动生成js、js.map文件导致项目无法运行

这算是开发工具的bug吧&#xff0c;估计后期能修复。 解决办法&#xff0c;手动删除.js、.js.map文件即可&#xff1b; 文件太多&#xff0c;删除很麻烦&#xff0c;有个大佬写了个插件&#xff0c;可一键删除&#xff1a;ArkCompilerSupport DevEco Studio 运行项目有时会自动…

二叉树进阶leetcode

606. 根据二叉树创建字符串 要点&#xff1a;前序遍历&#xff0c;当左子树为空时&#xff0c;右结点有数字时要给左边加括号 class Solution { public:string tree2str(TreeNode* root) {string s;//创建一个字符串if(rootnullptr){return s;}sto_string(root->val);//保存…

网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程&#xff0c;主要讲了网络、网络协议模型以及UDP编程 网络 网络主要是进行&#xff1a;数据传输和数据共享 网络协议模型 OSI协议模型应用层 实际发送的数据表示层 发送的数据是否加密会话层 是否建立会话连接传…

调研图基础模型(Graph Foundation Models)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 图基础模型&#xff08;Graph Foundation Models&#xff0c;简称 GFMs&#xff09; 是一种经过预训练的图大模型&#xff0c;旨在处理不同领域的图数据和任务。让我们详细探讨一下这个概念。 Github …

详解openGauss客户端工具gsql的高级用法

前言&#xff1a; gsql是openGauss提供在命令行下运行的数据库连接工具&#xff0c;可以通过此工具连接服务器并对其进行操作和维护&#xff0c;除了具备操作数据库的基本功能&#xff0c;gsql还提供了若干高级特性&#xff0c;便于用户使用。 gsql的基本功能 连接数据库&…

https 加密解密过程是什么?

HTTPS 加密通信过程中&#xff0c;主要涉及到以下几个步骤&#xff1a; 握手阶段(handshake phase)&#xff1a; 客户端向服务器端发送一个加密通信请求&#xff0c;并提供自己的加密能力列表&#xff0c;以及一个随机生成的密钥&#xff08;Pre-master secret&#xff09;。…

uniapp让输入框保持聚焦状态,不会失去焦点

使用场景&#xff1a;当输入框还有发送按钮的时候&#xff0c;点击发送希望软键盘不消失&#xff0c;还可以继续输入&#xff0c;或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法&#xff0c;适用input输入框和editor输入框 解决办法&#xff1a;把cli…

AXI4总线解析

一、读地址 AWVALID和AWREADY同时为高时&#xff0c;在这个上升沿&#xff0c;图中黄线&#xff0c;将接下来的数据写入地址40000000中。 在

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

springboot/ssm图书管理系统Java图书馆图书统计系统web

springboot/ssm图书管理系统Java图书馆图书统计系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql …

DataFunSummit 2023:洞察现代数据栈技术的创新与发展(附大会核心PPT下载)

随着数字化浪潮的推进&#xff0c;数据已成为企业竞争的核心要素。为了应对日益增长的数据挑战&#xff0c;现代数据栈技术日益受到业界的关注。DataFunSummit 2023年现代数据栈技术峰会正是在这样的背景下应运而生&#xff0c;汇聚了全球数据领域的精英&#xff0c;共同探讨现…

Linux 文件操作命令

1 文件与目录操作 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录cd ../.. 返回上两级目录cd - 返回上次所在目录cp file1 file2 将file1复制为file2cp -a dir1 dir2 复制一个目录 cp -a /tmp/dir1 . 复制一个…