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

HRSC2016数据集处理避坑指南:从XML旋转框到YOLO格式的完整转换流程

HRSC2016数据集实战:旋转框转换与YOLO格式处理的深度解析

第一次接触HRSC2016数据集时,我被那些复杂的旋转框标注弄得晕头转向。作为专门用于船舶检测的数据集,HRSC2016的XML标注格式与常规水平框完全不同,而将其转换为YOLO可用的格式更是一路踩坑。本文将分享我从原始XML到最终YOLO格式的完整转换经验,特别聚焦那些容易出错的细节和验证方法。

1. 理解HRSC2016数据集结构

HRSC2016数据集包含两个主要文件夹:Train和Test。每个文件夹下都有两个关键子目录:

  • AllImages:存储.bmp格式的原始图像
  • Annotations:包含XML格式的标注文件

XML标注的核心信息集中在HRSC_Object节点中,特别是以下几个关键字段:

<HRSC_Object> <Class_ID>17001</Class_ID> <mbox_cx>569.5045</mbox_cx> <mbox_cy>263.4875</mbox_cy> <mbox_w>261.0578</mbox_w> <mbox_h>65.08137</mbox_h> <mbox_ang>-1.562451</mbox_ang> </HRSC_Object>

这些字段定义了旋转框的中心点坐标(cx,cy)、宽度(w)、高度(h)和旋转角度(ang)。需要注意的是:

  • 角度以弧度表示,正值表示顺时针旋转
  • 宽度和高度是旋转前的原始尺寸
  • Class_ID的前两位通常表示大类,后三位表示具体子类

2. 从XML到DOTA格式:旋转框顶点计算

转换的第一步是将中心点表示法转换为四个顶点坐标。这是通过hrsc2dota.py脚本完成的,核心在于旋转矩阵的应用:

def get_rotated_box_vertices(labels, label_path): with open(label_path,'w') as f: for i in range(len(labels)): class_id, mbox_cx, mbox_cy, mbox_w, mbox_h, angle_rad = labels[i] # 构建旋转矩阵 rotation_matrix = np.array([ [np.cos(angle_rad), -np.sin(angle_rad)], [np.sin(angle_rad), np.cos(angle_rad)] ]) # 计算半宽高 box_half_width = mbox_w / 2 box_half_height = mbox_h / 2 # 定义原始顶点(未旋转) box_vertices = np.array([ [-box_half_width, -box_half_height], [box_half_width, -box_half_height], [box_half_width, box_half_height], [-box_half_width, box_half_height] ]) # 应用旋转 rotated_vertices = np.dot(box_vertices, rotation_matrix.T) # 平移至中心点 rotated_vertices[:, 0] += mbox_cx rotated_vertices[:, 1] += mbox_cy # 四舍五入为整数 rotated_vertices = np.round(rotated_vertices).astype(np.int32) rotated_vertices = rotated_vertices.reshape(-1) # 写入文件:x1 y1 x2 y2 x3 y3 x4 y4 class_id f.write(" ".join([str(a) for a in rotated_vertices]) + " " + str(class_id) + '\n')

注意:实际应用中,建议先创建DOTA_labels目录再运行脚本,否则会报错。对于Train和Test集需要分别处理。

3. 可视化验证:确保转换正确性

转换后必须验证结果,dota_drawed.py脚本可以将旋转框绘制到图像上:

img = cv2.imread(img_path) poly = [] for i in range(len(objects)): poly.append(np.array(objects[i]['poly'], dtype=np.int32)) cv2.polylines(img, poly, isClosed=True, color=(255, 0, 0), thickness=2) cv2.imwrite(drawed_img_path, img)

常见问题及排查方法:

  1. 框体错位:检查旋转矩阵计算是否正确,特别是角度符号
  2. 框体变形:确认宽度和高度是否对应正确的边
  3. 类别错误:验证Class_ID的解析逻辑

4. DOTA到YOLO格式的转换策略

dota2yolo.py脚本完成了关键的类型映射和归一化处理。这里有几个技术要点:

4.1 类别映射简化

原始HRSC2016有31个细粒度类别,但实际应用中常合并为4个大类:

aircraft_carrier = [2,5,6,12,13,31,32,33] # 航空母舰 warcraft = [3,7,8,9,10,11,14,15,16,17,19,28,29] # 军舰 merchant_ship = [4,18,20,22,24,25,26,30] # 商船 submarine = [27] # 潜艇

4.2 归一化处理

YOLO格式要求坐标归一化到[0,1]范围:

x1_normalized = x1 / image_width y1_normalized = y1 / image_height # 其他坐标点同理...

4.3 关于"+14"的谜团

原始代码中有个令人困惑的操作:

# 原作者注释掉的代码 # aircraft_carrier = [x + 14 for x in aircraft_carrier]

经过分析,这是早期版本中类别ID偏移导致的。在最新HRSC2016数据集中:

  • Class_ID直接从XML读取即可
  • 取模运算class_id = int(obj.find('Class_ID').text) % 100已足够
  • 不需要额外+14的偏移量

5. 数据集划分与YOLO适配

使用split.py脚本划分训练集和验证集时,需要注意:

  1. 路径设置必须与实际目录结构一致
  2. 建议比例:
    • 训练集:80%
    • 验证集:20%

最终YOLO数据集目录结构应如下:

mydataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/

每个标签文件内容格式示例:

1 0.512345 0.423456 0.534567 0.412345 0.545678 0.456789 0.523456 0.467890

6. 高级技巧与性能优化

在实际项目中,我还发现几个提升效率的方法:

  1. 批量处理加速:使用多进程处理大量图像

    from multiprocessing import Pool def process_single(args): xml_path, txt_path = args get_rotated_box_vertices(get_label(xml_path), txt_path) if __name__ == '__main__': args_list = [(os.path.join(xml_root,name), os.path.join(txt_root,name.split('.')[0]+'.txt')) for name in os.listdir(xml_root)] with Pool(4) as p: # 4个进程 p.map(process_single, args_list)
  2. 验证脚本增强:添加随机颜色和透明度

    color = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) overlay = img.copy() cv2.fillPoly(overlay, [poly], color) img = cv2.addWeighted(overlay, 0.3, img, 0.7, 0)
  3. 异常处理:对无效标注的容错机制

    try: angle_rad = float(obj.find('mbox_ang').text) if not -math.pi <= angle_rad <= math.pi: angle_rad = angle_rad % (2*math.pi) if angle_rad > math.pi: angle_rad -= 2*math.pi except: print(f"Invalid angle in {xml_path}, using 0") angle_rad = 0.0

处理HRSC2016数据集最耗时的部分不是代码运行,而是反复验证每个转换环节的正确性。我建议在关键步骤都添加可视化验证,虽然这会增加一些开发时间,但能避免后续训练时的各种诡异问题。

http://www.jsqmd.com/news/633846/

相关文章:

  • AEUX:设计到动效的智能转换架构深度解析
  • 商汤UniParse实战:5分钟搞定财务发票自动识别与数据提取(附避坑指南)
  • 讲述靠谱的DNC程序管理与传输系统推荐厂家,如何选择看这里 - 工业品网
  • 保姆级教程:在AutoDL上从零复现DAB-DETR并训练自定义数据集(附Tensorboard可视化)
  • 2026年4月江苏多功能跑步机/智能走步机/小户型跑步机/实景运动机/沉浸式跑步机公司选购指南:五大可靠销售商深度评测 - 2026年企业推荐榜
  • 从EMD到VMD:信号分解算法是如何“卷”起来的?聊聊故障诊断领域的十年演进
  • Gin项目日志管理踩坑实录:从控制台输出到ELK收集的完整链路
  • 基础薄弱者备考托福,为何首选多次元APP?——6款主流工具深度对比 - 速递信息
  • Windows Cleaner终极指南:免费开源工具彻底解决系统卡顿和磁盘空间不足问题
  • MySQL 二级索引性能分析
  • Vivado中移位寄存器优化的关键路径分析与实践
  • 2025最权威的十大AI论文助手推荐榜单
  • Unity Addressables 加载实战:从异步操作到资源生命周期管理
  • 盘点2026年口碑好的豆包AI推广GEO推广品牌,哪家值得托付? - 工业品网
  • 2026年靠谱的索必克影像仪厂家推荐,为你揭秘优质采购渠道 - 工业品牌热点
  • Ventoy多系统启动盘制作:从入门到精通的完整指南
  • GO学习日志10
  • 面向对象语法糖ArrayList集合,队列,栈泛型与异常
  • XRECODE3音频格式转换:音频格式转换软件轻松解决MP3转换与批量处理难题
  • 自动COD分析仪品牌对比:四家国产厂家的产品特点与适用场景 - 品牌推荐大师1
  • 《SAP FICO系统配置从入门到精通共40篇》003、SAP FICO核心组织架构:公司代码、信贷控制范围
  • 别再手动转格式了!用MATLAB+ENVI 5.6从.mat到3D高光谱立方体的保姆级流程
  • 储能系统数据采集与监控一体化融合架构设计:基于边缘微服务并发本地 Web 监控与 MQTT 上云的实现
  • 喜马拉雅FM下载器GUI:跨平台音频下载的终极解决方案
  • HEIF Utility:Windows平台HEIF图像格式转换的终极解决方案
  • 溯源难题破解:搭建向量数据与原始文件的精准映射关系
  • dashscope-sb20260413
  • AD域管理员必看:UserAccountControl属性详解与常见配置误区避坑指南
  • 017、归一化层改进策略:从训练震荡到推理加速的实战调优
  • C#学习笔记2