目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集

DOTA数据集包含2806张航空图像,尺寸大约从800x800到4000x4000不等,包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形(区别于传统的对边平行bbox)。类别分别为:plane, ship, storage tank, baseball dia- mond, tennis court, swimming pool, ground track field, har- bor, bridge, large vehicle, small vehicle, helicopter, round- about, soccer ball field , basketball court。

提取感兴趣类别数据

我们需求可能只感兴趣某一个或几个类别,这时候我们需要剔除掉不包含我们感兴趣类别的数据。下面,以船只ship为例,为大家介绍提取感兴趣类别数据的代码:

import os
from shutil import copyfiledef filterTxt(srcTxtPah, dstTxtPath, selected_class):selected_class_num = 0#  r:读取文件,若文件不存在则会报错with open(srcTxtPah, "r") as rf:for line in rf.readlines():if(selected_class in line):selected_class_num += 1#  a:写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾with open(dstTxtPath,"a") as af:af.write(line)  # 自带文件关闭功能,不需要再写f.close()rf.close()return selected_class_num#  DOTA数据的txt文件夹
txtFolder = r"I:\Remote_Sensing_Data\DOTA_Dataset\train\labelTxt-v1.0\labelTxt"
#  DOTA数据的image文件夹
imgFolder = r"I:\Remote_Sensing_Data\DOTA_Dataset\train\images\images"
#  要复制到的image文件夹
copy_imageFolder = r"I:\ship_detect\Data\DOTA_ship\train\images"
#  要复制到的txt文件夹
copy_txtFolder = r"I:\ship_detect\Data\DOTA_ship\train\labelTxt-v1.0"
#  感兴趣类别
selected_class = "ship"txtNameList = os.listdir(txtFolder)
for i in range(len(txtNameList)):#  判断当前文件是否为txt文件if(os.path.splitext(txtNameList[i])[1] == ".txt"):txt_path = txtFolder + "\\" + txtNameList[i]#  设置文件对象f = open(txt_path, "r")#  读取一行文件,包括换行符line = f.readline()while line:#  若该类是selected_class,则将对应图像复制粘贴,并停止循环if(selected_class in line):#  获取txt的索引,不带扩展名的文件名txt_index = os.path.splitext(txtNameList[i])[0]#  获取对应图像文件的地址src = imgFolder + "\\" + txt_index + ".png"dst = copy_imageFolder + "\\" + txt_index + ".png"#  复制图像文件至指定位置copyfile(src, dst)#  筛选txt文件中的selected_class信息并写至指定位置selected_class_num = filterTxt(txt_path, copy_txtFolder + "\\" + txt_index + ".txt", selected_class)print(txt_index,".png have", selected_class_num, selected_class)break#  若第一行不是selected_class,继续向下读,直到读取完文件else:line = f.readline() 
f.close() #关闭文件

输出:

P0001 .png have 17 ship
P0011 .png have 1 ship
P0020 .png have 1 ship
P0129 .png have 138 ship
......
P2769 .png have 15 ship
P2770 .png have 33 ship
P2792 .png have 601 ship

这样就实现了将含有船只的数据集单独挑选出来了。

可视化边界框

我们将船只数据集单独挑选出来后,可以可视化一下边界框。DOTA提供的是OBB有向边界框,我们也可以转换成HBB水平边界框。

from PIL import Image, ImageDrawimgPath = r"I:\ship_detect\Data\DOTA_ship\train\images\P0340.png"
txtPath = r"I:\ship_detect\Data\DOTA_ship\train\labelTxt-v1.0\P0340.txt"
savePath = "obb.jpg"
drawType = "obb"img =Image.open(imgPath)
draw =ImageDraw.Draw(img)
with open(txtPath, "r") as f:for line in f.readlines():#  去掉列表中每一个元素的换行符line = line.strip('\n')  line = line.split(" ")#print(line)if(drawType == "obb"):#  绘制OBB有向边界框polygon = []for i in range(8):polygon.append(int(line[i]))polygon = tuple(polygon)draw.polygon(polygon, outline = 'red')elif(drawType == "hbb"):#  绘制HBB水平边界框xmin = min(int(line[0]), int(line[2]), int(line[4]), int(line[6]))xmax = max(int(line[0]), int(line[2]), int(line[4]), int(line[6]))ymin = min(int(line[1]), int(line[3]), int(line[5]), int(line[7]))ymax = max(int(line[1]), int(line[3]), int(line[5]), int(line[7]))draw.rectangle([xmin, ymin, xmax, ymax],outline = 'red')
img.save(savePath, quality = 95)

OBB

HBB

来源:应用推广部

供稿:技术研发部

编辑:方梅

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

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

相关文章

前端八股文

前端八股文 目录 前端八股文1.css选择优先级?2.px与rem区别?3.重绘与重排的区别?4.元素水平垂直居中的方法?5.什么是闭包,闭包有什么特点?6.什么是事件委托?7.什么是原型链?8.new操作…

交易历史记录20231205 记录

昨日回顾: select top 10000 * from dbo.CODEINFO A left join dbo.全部A股20231205010101 B ON A.CODE B.代码 left join dbo.全部A股20231205CONF D on A.CODED.代码left join dbo.全部A股20231205 G on A.CODEG.代码 left…

LeetCode-合并有序链表问题

1.合并两个有序链表 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路: 首先建立一个头节点方便后续操作,然后开始循环将两个链表的节点值进行比较,如果list1…

A Piece of Cake

A Piece of Cake 题目链接 题意 输出一个整数表示a[n]的总和 思路 输入数组a[n]在for循环中确定数学式子ans等于它本身加上数学式子 坑点 for循环中i要从0开始,不然a[1] 2 x a[2] 3 x a[3] … a[0] x a[a[0]]的值就会出错,2 x a[2]就会变成 3 x a[…

fastapi实现websocket在线聊天

最近要实现一个在线聊天功能,基于fastapi的websocket实现了这个功能。下面介绍一下遇到的技术问题 1.问题难点 在线上环境部署时,一般是多进程的方式进行部署启动fastapi服务,而每个启动的进程都有自己的独立存储空间。导致存储的连接对象分…

Windows Subsystem for Linux (WSL) 安装与使用笔记

文章目录 Part.I IntroductionPart.II 安装Chap.I 安装流程Chap.II 迁移至其他盘 Part.III 使用Chap.I 一些信息Chap.II 配置下载软件的源Chap.III 安装 pip Reference Part.I Introduction Windows Subsystem for Linux 简写为 WSL,是 Windows 的一个 Linux 子系统…

常用的建表但范式、反规范化

规范化: 规范化是用于数据库设计的一系列原理和技术,它可以减少表中数据的冗余,增加数据完整性和一致性。通常有很多范式。 第一范式(1NF): 常用的三种范式: 表中的字段都是不可再分割的原子属…

vue/uniapp - 返回上一页并onLoad/onShow刷新数据列表接口

目录 详情页(detail.vue):列表页(list.vue)大佬最后 在uni中,返回页面是不会触发 onLoad方法的; 如果我们只想在特定情况下返回上一页才需要刷新数据,那么用onShow的话,那刷新就太频繁了; 这时候&#xf…

蝴蝶Butterfly 数据集VOC+yolo-2000张(labelImg标注)

蝴蝶被誉为“会飞的花朵”,是一类非常美丽的昆虫。蝴蝶大多数体型属于中型至大型,翅展在15~260毫米之间,有2对膜质的翅。体躯长圆柱形,分为头、胸、腹三部分。体及翅膜上覆有鳞片及毛,形成各种色彩斑纹。今天要介绍的是…

C++类模板案例-实现一个通用的数组类

案例中用到的方法 可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据类型存储到堆区构造函数中可以传入数组的容量提供对应的拷贝构造函数以及operator防止浅拷贝问题提供尾插法和尾删法对数组中的数据进行增加和删除可以通过下标的方式访问数组中的元素可以…

算法导论复习(二)

算法导论第二次复习以 分治法 为专题 文章目录 分治算法是什么归并排序Strassen矩阵乘法最近点对 求解递推表达式 分治算法是什么 归并排序 代码如下&#xff1a; #include <iostream> #include <vector>using namespace std;// 归并函数&#xff0c;将两个有序数…

代码随想Day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 这道题和前一天的射箭题目思想类似&#xff0c;用总区间个数-不重叠的区间个数等于需要去除的区间个数。首先对左边界排序&#xff0c;如果当前的左边界大于等于上一区间的右边界&#xff0c;则说明是一个不重叠的区间&#xff0c;否则&#xff0c;更新上一重…

Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

生产环境中热 key 处理 热 key 问题就是某一瞬间可能某条内容特别火爆&#xff0c;大量的请求去访问这个数据&#xff0c;那么这样的 key 就是热 key&#xff0c;往往这样的 key 也是存储在了一个 redis 节点中&#xff0c;对该节点压力很大 那么对于热 key 的处理就是通过热…

nginx 优化和安装防盗链以及实验举例

目录 nginx编译安装常用模块 生产中建议设置 nginx 内核限制文件优化 先将 nginx编译安装直至 systemctl命令使用 nginx服务 安全优化 隐藏 nginx版本号 查看版本号 隐藏版本信息 修改用户与组 限制单个 IP的访问频率和连接数 防盗链相关设置 在源主机里配置防盗链 …

【C++11】右值引用与移动语义

一.左值与右值 左值&#xff1a;可以取地址的表示数据的表达式&#xff0c;左值可以出现在赋值符号左边 右值&#xff1a;不能取地址的表示数据的表达式&#xff0c;右值不能出现在赋值符号左边 int fun() {return 0; } int main() {int a 0;//a->左值const int b 1;//b-&…

【lesson14】MySQL表的基本查询(1)

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; retrieve select列 建表 基本测试 插入数据 全列查询 …

利用断路器状态统计sentinel熔断次数

最近项目需要sentinel熔断时记录熔断的次数&#xff0c;在经过一阵搜索后决定利用断路器的状态变化来实现此功能 然而&#xff0c;遇到了这样的一个情况&#xff0c;断路器的状态在第一次熔断时正常从close–>open&#xff0c;但在后续&#xff08;熔断时间内blocked或者熔断…

RocketMQ的延迟消息是如何实现的❓

RocketMQ 作为一款强大的分布式消息中间件&#xff0c;提供了丰富的功能&#xff0c;其中之一就是延迟消息。在本篇博客中&#xff0c;我们将深入探讨 RocketMQ 延迟消息的实现机制&#xff0c;了解消息的定时投递和消费流程。 1. 定时消息的发送 RocketMQ 实现延迟消息的第一…

linux应用软件下载站收集

一、这是一个别人问题帖&#xff0c;里面有很多下载站点。 谁知道可以自由下载Linux软件的论坛或者平台&#xff1f;类似52破解论坛。国内国外都可以&#xff0c;我在搜索引擎找不到&#xff1f; - 知乎

2023年度影响力出海品牌传音移动互联:开放合作 赋能更多中国企业高效出海

伴随着全球化的脚步&#xff0c;出海成为许多中国企业的“必选项”&#xff0c;与之配套的出海服务相关业务也得到了极大的发展。近日&#xff0c;第五届鲸鸣奖颁奖典礼上&#xff0c;传音移动互联凭借为企业提供高效优质的出海解决方案&#xff0c;荣获鲸鸣奖“2023年度影响力…