可见光船舶目标检测数据集,7000张
数据集包含6个类别,相对应标签为xml格式
可转化为txt标签格式,用于yolov5/v7训练
可见光船舶目标检测数据集
数据集描述
该数据集专为可见光条件下的船舶目标检测而设计,旨在支持计算机视觉和深度学习研究者开发高效的船舶识别与跟踪系统。它包含7000张高质量的图像,每张图像中都标注了至少一艘船舶的位置信息。所有标签以XML格式提供,并且可以轻松转换为YOLOv5/v7所需的TXT格式,以便进行模型训练。数据集涵盖了多种环境、天气状况以及不同的光照条件,确保了模型在实际应用中的鲁棒性。
数据规模
- 总样本数量:7000张图像
- 类别数量:6个不同类型的船舶
- 标注格式:
- 原始:XML (PASCAL VOC)
- 转换后:TXT (YOLO)
图像特性
- 多样化场景:数据集中包括了从开阔海域到繁忙港口的各种场景。
- 多变环境:图像拍摄于不同的天气条件下(晴天、阴天、雨天等)以及不同的时间点(白天、黄昏、夜间),保证了算法对各种环境因素的适应能力。
- 高质量标注:每个船舶目标都经过精确的手动标注,提供了准确的边界框坐标。
类别列表
- 油轮
- 集装箱船
- 散货船
- 游艇
- 拖船
- 其他小型船只
应用场景
- 海上交通管理:监控海上的船舶流量,预防碰撞事故。
- 边境安全:加强海岸线的安全监控,防止非法入境。
- 环境保护:监测海洋污染源,如油泄漏事件。
- 科研用途:支持海洋生物学研究,比如追踪特定种类的船只活动。
数据集结构
一个典型的文件夹结构可能如下所示:
1ship_detection_dataset/
2├── images/
3│ ├── img_00001.jpg
4│ ├── img_00002.jpg
5│ └── ...
6├── annotations/
7│ ├── img_00001.xml
8│ ├── img_00002.xml
9│ └── ...
10├── labels/ # 可选,如果已转换为YOLO格式
11│ ├── img_00001.txt
12│ ├── img_00002.txt
13│ └── ...
14├── train.txt # 训练集图像路径列表
15├── val.txt # 验证集图像路径列表
16└── test.txt # 测试集图像路径列表
标签格式说明
-
原始XML格式: 使用PASCAL VOC标准,包含每个对象的类别名及其对应的边界框坐标(xmin, ymin, xmax, ymax)。
-
转换后的TXT格式: YOLO要求的格式是
class_id x_center y_center width height
,其中所有的值都是相对于图像尺寸的比例形式(归一化到[0, 1]之间)。
示例
假设一张图片img_00001.jpg
的分辨率为800x600像素,其对应的XML文件img_00001.xml
中有一艘油轮,位置信息如下:
1<object>
2 <name>oil_tanker</name>
3 <bndbox>
4 <xmin>100</xmin>
5 <ymin>50</ymin>
6 <xmax>200</xmax>
7 <ymax>150</ymax>
8 </bndbox>
9</object>
转换成YOLO格式的TXT文件img_00001.txt
内容将是:
10 0.15625 0.08333333 0.125 0.125
这里0
代表油轮类别的ID,其余数值分别是中心点的x/y坐标及宽度和高度的比例。
数据准备
为了使用此数据集来训练YOLOv5或v7模型,您需要执行以下步骤:
- 将所有XML标签文件转换为YOLO兼容的TXT格式。
- 创建图像路径列表文件(
train.txt
,val.txt
,test.txt
),列出用于训练、验证和测试的图像路径。 - 设置YOLO配置文件,指定类别数和其他相关参数。
- 开始训练过程。
工具和脚本
您可以利用Python库如xml.etree.ElementTree
来读取XML文件并将其转换为YOLO格式。下面是一个简单的示例脚本,用于将XML标注转换为YOLO格式:
1import os
2import xml.etree.ElementTree as ET
3
4def convert(size, box):
5 dw = 1./size[0]
6 dh = 1./size[1]
7 x = (box[0] + box[1])/2.0
8 y = (box[2] + box[3])/2.0
9 w = box[1] - box[0]
10 h = box[3] - box[2]
11 x = x*dw
12 w = w*dw
13 y = y*dh
14 h = h*dh
15 return (x,y,w,h)
16
17def convert_annotation(xml_file, output_dir, class_dict):
18 tree = ET.parse(xml_file)
19 root = tree.getroot()
20 size = root.find('size')
21 w = int(size.find('width').text)
22 h = int(size.find('height').text)
23
24 out_file = open(os.path.join(output_dir, os.path.basename(xml_file).replace('.xml', '.txt')), 'w')
25
26 for obj in root.iter('object'):
27 cls = obj.find('name').text
28 if cls not in class_dict:
29 continue
30 cls_id = class_dict[cls]
31 xmlbox = obj.find('bndbox')
32 b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
33 bb = convert((w,h), b)
34 out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
35
36# 定义类别字典
37classes = {'oil_tanker': 0, 'container_ship': 1, 'bulk_carrier': 2, 'yacht': 3, 'tugboat': 4, 'other_small_vessels': 5}
38
39# 执行转换
40for xml_file in os.listdir('annotations/'):
41 if xml_file.endswith('.xml'):
42 convert_annotation(os.path.join('annotations/', xml_file), 'labels/', classes)
这段代码会遍历指定目录下的所有XML文件,并根据给定的类别映射表生成相应的TXT标签文件。