目标检测yolo, voc, coco的BBox格式转换

本文介绍了目标检测中常用的三种BBox(边界框)格式——YOLO、VOC和COCO,并提供了它们之间的转换函数。YOLO格式使用中心坐标和宽高,归一化到0-1范围;VOC格式使用左上和右下角坐标;COCO格式则采用左上角坐标和宽度、高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

yolo, voc, coco bbox格式互转函数

yolo: [xmid, ymid, w, h],归一化到0-1

voc: [x1, y1, x2, y2]

coco: [xmin, ymin, w, h]

 

def voc2yolo(bboxes, image_height=720, image_width=1280):
    """
    voc  => [x1, y1, x2, y2]
    yolo => [xmid, ymid, w, h] (normalized)
    """
    
    bboxes = bboxes.copy().astype(float) # otherwise all value will be 0 as voc_pascal dtype is np.int
    
    bboxes[..., [0, 2]] = bboxes[..., [0, 2]]/ image_width
    bboxes[..., [1, 3]] = bboxes[..., [1, 3]]/ image_height
    
    w = bboxes[..., 2] - bboxes[..., 0]
    h = bboxes[..., 3] - bboxes[..., 1]
    
    bboxes[..., 0] = bboxes[..., 0] + w/2
    bboxes[..., 1] = bboxes[..., 1] + h/2
    bboxes[..., 2] = w
    bboxes[..., 
### 将目标检测数据集从一种格式转换为另一种格式 对于特定的目标检测任务,不同框架可能支持不同的数据集格式。例如,YOLO、Faster R-CNN等模型通常接受MSCOCOVOC格式的数据集。当需要将遥感目标检测(RSOD) 数据集由PASCAL VOC格式转换成MSCOCO格式时,主要工作集中在调整标注文件结构以及确保各类元数据的一致性上[^1]。 #### 主要差异对比 - **PASCAL VOC**: XML文件描述每张图片中的对象位置及其类别标签;每个实例对应一个矩形框。 - **COCO (Common Objects in Context)**: JSON文件记录整个训练/验证集中所有图像的信息,包括但不限于边界框坐标、分割多边形、关键点标记等等;还提供了丰富的属性字段如超像素图、日期时间戳等额外信息。 为了实现上述两种格式间的互,可以遵循如下逻辑: 1. 解析原始的XML文档获取必要的参数; 2. 构建新的JSON字典并填充必要项; 3. 序列化最终的结果保存至磁盘。 下面给出一段简单的Python脚本作为示范,展示如何读取多个`.xml`文件并将它们汇总到单个`.json`文件中去。 ```python import os from xml.etree import ElementTree as ET import json def parse_voc_xml(xml_file_path): tree = ET.parse(xml_file_path) root = tree.getroot() filename = root.find('filename').text size = { 'width': int(root.find('size')[0].text), 'height': int(root.find('size')[1].text), 'depth': int(root.find('size')[2].text) } objects = [] for obj in root.findall('object'): name = obj.find('name').text bndbox = obj.find('bndbox') bbox = [ float(bndbox.find('xmin').text), float(bndbox.find('ymin').text), float(bndbox.find('xmax').text), float(bndbox.find('ymax').text)] objects.append({ "category_id": get_category_id(name), # 需定义此辅助方法映射名称到ID "bbox": bbox, "area": (bbox[2]-bbox[0])*(bbox[3]-bbox[1]), "iscrowd": 0 }) return {"file_name": filename, "objects": objects} def voc_to_coco(voc_dir, output_json='annotations.json'): images = [] annotations = [] image_id = 0 annotation_id = 0 for file in os.listdir(voc_dir): if not file.endswith('.xml'): continue parsed_data = parse_voc_xml(os.path.join(voc_dir, file)) img_info = {**parsed_data} del img_info['objects'] img_info.update({"id":image_id}) images.append(img_info) for obj in parsed_data["objects"]: ann = dict(obj,**{"id":annotation_id,"image_id":image_id}) annotations.append(ann) annotation_id += 1 image_id+=1 coco_format = {'images': images,'annotations': annotations} with open(output_json, 'w') as f: json.dump(coco_format,f) if __name__ == '__main__': voc_directory = './path/to/voc/dataset' voc_to_coco(voc_directory) ``` 这段代码实现了基本的功能需求,但实际应用中还需要考虑更多细节处理,比如错误捕捉机制、路径配置灵活性等问题。此外,在执行批量操作之前建议先测试少量样本以确认无误后再扩大规模运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值