无人机航拍图像数据集汇总

2024-03-10 01:20

本文主要是介绍无人机航拍图像数据集汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

最近的项目涉及到对无人机航拍图像的目标检测,检测的目标包含车辆、人、无人机、船舶,比较热门的航拍数据集大多是遥感图像的数据集,与本项目相关的数据集查找不易,本文分享一下相关的航拍数据数据集,以及数据集的处理方法。

文中部分数据集已经下载,需要获取文中涉及到的数据集请私信(目录中的文件名是本人为了方便自己定义的)

数据集处理

1、获取感兴趣的类别

在训练过程中,数据集中的部分类别使用不到,需要提取中感兴趣的类别,如果以图像中没有感兴趣的类别,将图像舍弃,如果图像中既有感兴趣的类别也有不感兴趣的类别,则将不感兴趣的类别从标签文件中删除,只保存感兴趣的类别信息

import os
import shutil
#voc格式标签的地址
ann_filepath='VOCdevkit/VOC2012/Annotations/'
#原图像的地址
img_filepath='VOCdevkit/VOC2012/JPEGImages/'
#转换后图像的存放地址
img_savepath='VOCdevkit/VOC2012/JPEGImages_ssd/'
#转换后标签的存放地址
ann_savepath='VOCdevkit/VOC2007/Annotations_ssd/'
if not os.path.exists(img_savepath):os.mkdir(img_savepath)if not os.path.exists(ann_savepath):os.mkdir(ann_savepath)
names = locals()#数据集中所有的类别,类别名称要与标签号对应,如aeroplane对应name_id为0,将其放在第一个位置
#以voc数据集为例如下24~27
classes = ['aeroplane','bicycle','bird', 'boat', 'bottle','bus', 'car', 'cat', 'chair', 'cow','diningtable','dog', 'horse', 'motorbike', 'pottedplant','sheep', 'sofa', 'train', 'tvmonitor', 'person']for file in os.listdir(ann_filepath):print(file)fp = open(ann_filepath +  file)ann_savefile=ann_savepath+filefp_w = open(ann_savefile, 'w')lines = fp.readlines()ind_start = []ind_end = []lines_id_start = lines[:]lines_id_end = lines[:]#设置感兴趣的类别:classesn = '\t\t<name>RoiClassName</name>\n'#RoiClassName为具体的类别名称classes1 = '\t\t<name>aeroplane</name>\n'classes2 = '\t\t<name>boat</name>\n'classes3 = '\t\t<name>bus</name>\n'classes4 = '\t\t<name>car</name>\n'classes5 = '\t\t<name>person</name>\n'#在xml中找到object块,并将其记录下来while "\t<object>\n" in lines_id_start:a = lines_id_start.index("\t<object>\n")ind_start.append(a)lines_id_start[a] = "delete"while "\t</object>\n" in lines_id_end:b = lines_id_end.index("\t</object>\n")ind_end.append(b)lines_id_end[b] = "delete"#names中存放所有的object块i = 0for k in range(0, len(ind_start)):names['block%d' % k] = []for j in range(0, len(classes)):if classes[j] in lines[ind_start[i] + 1]:a = ind_start[i]for o in range(ind_end[i] - ind_start[i] + 1):names['block%d' % k].append(lines[a + o])breaki += 1#print(names['block%d' % k])#xml头string_start = lines[0:ind_start[0]]#xml尾string_end = [lines[len(lines) - 1]]#在给定的类中搜索,若存在则,写入object块信息a = 0for k in range(0, len(ind_start)):if classes1 in names['block%d' % k]:a += 1string_start += names['block%d' % k]if classes2 in names['block%d' % k]:a += 1string_start += names['block%d' % k]if classes3 in names['block%d' % k]:a += 1string_start += names['block%d' % k]if classes4 in names['block%d' % k]:a += 1string_start += names['block%d' % k]if classes5 in names['block%d' % k]:a += 1string_start += names['block%d' % k]string_start += string_endfor c in range(0, len(string_start)):fp_w.write(string_start[c])fp_w.close()#如果没有我们寻找的模块,则删除此xml,有的话拷贝图片if a == 0:os.remove(ann_savepath+file)else:name_img = img_filepath + os.path.splitext(file)[0] + ".jpg"shutil.copy(name_img, img_savepath)fp.close()

2、修改和删除相应类别ID以及标注信息

  • 在实际应用中,数据集无需划分子类,如原数据集中含有货船、邮轮、客船等船的子类;但是项目中只需要检测到船,并不需要划分子类,这就需要我们对将数据集中的类别进行和并重构

  • 数据集中含有的与项目无关的类别也可以删除

import os
import random
import numpy as np
from numpy import *txt_file_path = '/mnt/dir1/database/VisDrone2019/VisDrone2019-DET-val/labels'  # 原始的标签路径
save_file_path = '/mnt/dir1/database/VisDrone2019/VisDrone2019-DET-val/labels1'  # 修改后的标签路径labels_name = os.listdir(txt_file_path)  # 获得每一个标签名字的列表 / os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
num = len(labels_name)  # 获取列表长度
list = range(num)  # 创建从0到num的整数列表  list = range(0, num)
files = os.listdir(save_file_path)for i in list:  # 遍历每一个文件name = labels_name[i]  # 获取每一个文件的文件名read_file = open(txt_file_path + "/" + name, 'r')  # 读取txt_file_path/labels路径中的文件,r表示以只读方式打开文件fline = read_file.readlines()  # 读取txt文件中每一行 / readlines()表示读取整行 / fline是列表类型,fline列表里的元素是str类型save_txt = open(save_file_path + "/" + name, 'w+')  # 读取save_file_path/labels路径中的文件. w+表示打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。for j in fline:  # 遍历txt文件中每一行list1 = j.split()# print(list1)# 删除类别if list1[0] != '2':  # 删除类别2if list1[0] != '6':  # 删除类别6if list1[0] != '7':  # 删除类别7if list1[0] != '9':  # 删除类别9list2 = list1#print(list2)# 修改类别if list2[0] == '1':list2[0] = '0'  # 将类别1改成类别0elif list2[0] == '3':list2[0] = '1'  # 将类别3改成类别1elif list2[0] == '4':list2[0] = '1'  # 将类别4改成类别1elif list2[0] == '5':list2[0] = '1'  # 将类别5改成类别1elif list2[0] == '8':list2[0] = '1'  # 将类别8改成类别1b = " ".join(list2)   # 将列表转换成字符串类型,且用空格分割save_txt.write(b)  # 写入新的文件中save_txt.write('\n')  # 换行

3、VOC数据集转YOLO

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import joindef convert(size, box):x_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]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')#folder = os.path.exists(save_txt_files_path)if not folder: #判断是否存在文件夹如果不存在则创建为文件夹os.makedirs(save_txt_files_path) #makedirs 创建文件时如果路径不存在会创建这个路径##out_txt_f = open(out_txt_path, 'w', encoding="utf-8")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__":# 需要转换的类别,需要一一对应classes1 = ['aeroplane', 'boat', 'bus', 'car', 'person']# 2、voc格式的xml标签文件路径xml_files1 = r'VOCdevkit/VOC2012/Annotations_ssd/'# 3、转化为yolo格式的txt标签文件存储路径save_txt_files1 = r'VOCdevkit/VOC2012/labels_ssd/'convert_annotation(xml_files1, save_txt_files1, classes1)

无人机数据集介绍

 FW-UAV1

固定翼无人机数据集,其中包含1817幅图像,图像格式为.png,已经转换为yolo格式,但是还未划分数据集、标签和图像在一个文件夹中。

下载地址:Fixed Wing UAV Dataset (kaggle.com)

 图像实例:

FW-UAV2

固定翼无人机,554幅图像,yolo格式,标签和图像在一个文件夹中

 下载地址:Fixed Wing UAV Dataset (kaggle.com)

图像实例:

FW-UAV3

固定翼无人机数据集,包含1790幅图像,包含yolo标签格式

下载地址:Fixed Wing UAV - Plane (kaggle.com)

 

 图片实例:

 

UAV1

旋翼式无人机数据集,其中包含4010幅图像,已经标注好了yolo格式,标签和图片在一个文件夹中,数据集未划分

下载地址:Drone Object Detection (kaggle.com)

图像实例:

UAV2

旋翼式无人机数据集,其中包含4014幅图像,已经标注好了yolo格式,标签和图片在一个文件夹中,数据集未划分

下载地址:Amateur Unmanned Air Vehicle Detection (kaggle.com)

 图像实例:

 

车辆和行人数据集

VisDrone

VisDrone数据集中的一部分,一共有5138幅图像,已经转换为yolo格式,划分好了训练集、验证集、测试集

下载地址:visdrone (kaggle.com)

 图像实例:

HIT-UAV

车辆和行人数据集,共有2866幅图像,Person8000个,Car5000个,可以直接使用

数据集地址:HIT-UAV: A High-altitude Infrared Thermal Dataset (kaggle.com)

 图像实例:

 

船舶数据集

SHIP1

航拍船只数据集(卫星),一共有621幅图像,标注格式为voc ,archive2

下载地址:Ship Detection from Aerial Images (kaggle.com)

 图像实例:

 

SHIP2

共有134000幅航拍船只图像(遥感),标签格式为yolo archive3

下载地址:Ships/Vessels in Aerial Images (kaggle.com)

 图像实例:

SHIP3

航拍鸟瞰图,没有标签,8932幅图像

下载地址:ship-imageclassify (kaggle.com)

图像实例:

这篇关于无人机航拍图像数据集汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792558

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核