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

HICO-DET数据集实战:用Python解析anno_bbox.mat,快速提取人-物交互标注信息

HICO-DET数据集实战:用Python解析anno_bbox.mat,快速提取人-物交互标注信息

在计算机视觉领域,人-物交互(Human-Object Interaction, HOI)检测是一个极具挑战性的任务。HICO-DET作为该领域的标杆数据集,其标注文件anno_bbox.mat采用MATLAB格式存储,这对习惯使用Python的开发者来说是个不小的障碍。本文将手把手教你如何用Python高效解析这个文件,提取关键信息并转换为深度学习框架友好的格式。

1. 环境准备与数据加载

首先确保已安装必要的Python库:

pip install scipy numpy pandas

anno_bbox.mat文件采用MATLAB v7.3格式,需要使用h5py库而非传统的scipy.io来加载:

import h5py def load_mat(file_path): """加载MATLAB v7.3格式文件""" with h5py.File(file_path, 'r') as f: data = {k: [f[v[0]][()] for v in f[k]] for k in f.keys()} return data

注意:HICO-DET的标注文件可能因版本不同而采用不同格式。如果遇到加载错误,可尝试先用scipy.io.loadmat(),失败后再切换至h5py方案。

2. 理解数据结构与关键字段

加载后的数据结构包含三个主要部分:

字段名数据类型描述
bbox_train结构化数组训练集标注,包含文件名、图像尺寸和HOI信息
bbox_test结构化数组测试集标注,结构与训练集相同
list_action结构化数组600个HOI类别的动名词组合

其中hoi字段的结构最为复杂,每个样本包含:

  • id: 动作类别索引
  • bboxhuman: 人物边界框数组[N,4]
  • bboxobject: 物体边界框数组[M,4]
  • connection: 交互对数组[K,2],表示人物与物体的配对索引
  • invis: 可见性标记

3. 标注信息提取实战

3.1 基础信息提取

首先提取图像基本信息:

def extract_basic_info(mat_data, split='train'): bbox_data = mat_data[f'bbox_{split}'] return { 'filenames': [str(f[0]) for f in bbox_data['filename'][0]], 'sizes': [tuple(map(int, s)) for s in bbox_data['size'][0]], 'hois': bbox_data['hoi'][0] }

3.2 交互关系解析

核心的HOI信息提取函数:

def parse_hoi_annotations(hoi_data): annotations = [] for i in range(len(hoi_data['id'][0])): hoi_id = int(hoi_data['id'][0][i][0]) human_boxes = hoi_data['bboxhuman'][0][i].reshape(-1,4) if hoi_data['bboxhuman'][0][i].size else [] obj_boxes = hoi_data['bboxobject'][0][i].reshape(-1,4) if hoi_data['bboxobject'][0][i].size else [] connections = hoi_data['connection'][0][i].reshape(-1,2) if hoi_data['connection'][0][i].size else [] annotations.append({ 'hoi_id': hoi_id, 'human_boxes': human_boxes.tolist(), 'object_boxes': obj_boxes.tolist(), 'connections': connections.tolist() }) return annotations

3.3 动作类别映射

list_action包含600个HOI类别的详细信息:

def get_action_mapping(mat_data): return [{ 'id': i+1, 'verb': str(mat_data['list_action']['vname'][0][i][0]), 'object': str(mat_data['list_action']['nname'][0][i][0]) } for i in range(len(mat_data['list_action']['nname'][0]))]

4. 转换为COCO格式

为方便训练,我们将数据转换为COCO风格的JSON格式:

def convert_to_coco(mat_data, split='train'): # 初始化COCO结构 coco_data = { 'images': [], 'annotations': [], 'categories': get_action_mapping(mat_data) } basic_info = extract_basic_info(mat_data, split) for img_idx, (filename, size) in enumerate(zip(basic_info['filenames'], basic_info['sizes'])): # 添加图像信息 coco_data['images'].append({ 'id': img_idx, 'file_name': filename, 'width': size[0], 'height': size[1] }) # 处理该图像的所有HOI标注 hoi_anns = parse_hoi_annotations(basic_info['hois'][img_idx]) for hoi in hoi_anns: for conn in hoi['connections']: human_idx, obj_idx = conn human_box = hoi['human_boxes'][human_idx-1] # MATLAB索引从1开始 obj_box = hoi['object_boxes'][obj_idx-1] coco_data['annotations'].append({ 'image_id': img_idx, 'hoi_id': hoi['hoi_id'], 'human_bbox': human_box, 'object_bbox': obj_box, 'category_id': hoi['hoi_id'] }) return coco_data

5. 实用技巧与性能优化

处理大型MAT文件时,可采用以下优化策略:

  1. 分块处理:对于特别大的文件,可以分块加载和处理数据
def process_in_chunks(mat_path, chunk_size=1000): with h5py.File(mat_path, 'r') as f: total = len(f['bbox_train/filename']) for i in range(0, total, chunk_size): chunk = {k: f[k][i:i+chunk_size] for k in f.keys()} yield chunk
  1. 并行处理:利用多进程加速
from multiprocessing import Pool def parallel_parse(args): img_idx, hoi_data = args return parse_hoi_annotations(hoi_data) with Pool(4) as p: # 使用4个进程 results = p.map(parallel_parse, enumerate(basic_info['hois']))
  1. 缓存机制:将解析结果保存为JSON,避免重复解析
import json from pathlib import Path def load_or_parse(mat_path, cache_dir='cache'): cache_path = Path(cache_dir) / (Path(mat_path).stem + '.json') if cache_path.exists(): return json.loads(cache_path.read_text()) data = load_mat(mat_path) coco_data = convert_to_coco(data) cache_path.parent.mkdir(exist_ok=True) cache_path.write_text(json.dumps(coco_data)) return coco_data

6. 可视化验证

为确保解析正确,建议可视化部分结果:

import cv2 import matplotlib.pyplot as plt def visualize_hoi(image_path, human_box, obj_box, action_name): img = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB) # 绘制边界框 cv2.rectangle(img, (human_box[0], human_box[1]), (human_box[2], human_box[3]), (255,0,0), 2) cv2.rectangle(img, (obj_box[0], obj_box[1]), (obj_box[2], obj_box[3]), (0,255,0), 2) # 添加动作标签 plt.imshow(img) plt.title(action_name) plt.axis('off') plt.show()

7. 与深度学习框架集成

最后,我们可以创建PyTorch Dataset类方便训练使用:

from torch.utils.data import Dataset class HOIDataset(Dataset): def __init__(self, coco_data, image_dir, transform=None): self.data = coco_data self.image_dir = Path(image_dir) self.transform = transform def __len__(self): return len(self.data['images']) def __getitem__(self, idx): img_info = self.data['images'][idx] img_path = self.image_dir / img_info['file_name'] image = cv2.imread(str(img_path)) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 获取该图像的所有标注 anns = [a for a in self.data['annotations'] if a['image_id'] == idx] if self.transform: image = self.transform(image) return image, anns
http://www.jsqmd.com/news/900026/

相关文章:

  • 2026年 沈阳一站式注册公司榜单:小规模/一般纳税人/无地址注册与创业全流程解析 - 品牌企业推荐师(官方)
  • 告别命令行恐惧:用Xmanager 5在Windows上图形化操作CentOS服务器(保姆级配置)
  • 百考通AI:智能问卷设计,轻松输出专业内容
  • 2026年5月热门的南京洁净室翻新公司有哪些厂家推荐榜,净化板修复/无尘车间翻新/GMP车间维护/洁净室密封优化厂家选择指南 - 海棠依旧大
  • p-Bit非理想特性对组合优化与概率逻辑计算的影响与设计指南
  • LightGlue:突破性自适应特征匹配技术实现10倍速度提升
  • 百考通AI:源码图纸库,轻松输出专业内容
  • 2026年 东莞聚氧乙烯醚推荐榜单:脂肪醇聚氧乙烯醚/异构十醇聚氧乙烯醚/异辛醇聚氧乙烯醚磷酸酯优质厂家精选 - 品牌企业推荐师(官方)
  • 2026现阶段广西农业轮胎市场格局与优质服务商综合指南 - 2026年企业资讯
  • 非具身智能(纯数字 AI)/离身智能
  • 【力扣100题】62.滑动窗口最大值
  • 微信推文发布前必做的4项AI校验:错别字、敏感词、传播力、转化漏斗——ChatGPT自动化实现
  • 开发团队如何通过Taotoken实现API密钥的统一管理与审计
  • AI产品经理学习汇总
  • DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程7-8
  • 2026年上海/贵阳门窗厂家推荐榜单:系统门窗、平开/推拉门窗品质与工艺深度解析 - 品牌企业推荐师(官方)
  • 2026年工业气体/特种气体厂家实力榜单:液氮液氩液氧高纯气体及稀有气体供应商深度推荐 - 品牌企业推荐师(官方)
  • 03、单线通讯—SIF协议在资源受限MCU中的定时器驱动实现与优化
  • 告别PyTorch卡顿:树莓派5从YOLOv5迁移到YOLOv8+ncnn的完整踩坑实录
  • 2026年5月更新江苏无尘室净化空调系统:一体化服务商的深度选择指南 - 2026年企业资讯
  • 【小白零基础】 OpenClaw2.7.5 Windows 快速部署方法(包含安装包)
  • 学术创作提速新思路:okbiye 智能论文撰写模块,适配高校全品类论文创作需求
  • 2026年5月长春数字科技职业大专选校指南:深度解析长春数字科技职业学院 - 2026年企业资讯
  • YOLO 数据集构建与效果验证实战指南
  • 用STM32F103C8T6做个可调电源:从原理图到代码的保姆级教程(含LCD1602显示与过流保护)
  • 实战复盘:我用Python+Appium给公司老旧的Win32客户端做自动化回归测试,踩了这些坑
  • 基于树莓派Ubuntu Mate与PX4的UDP通信:搭建QGC地面站远程监控系统
  • 从单体AI代理到协调者模式:架构演进提升任务完成率与可维护性
  • 避坑指南:Unity中用C# DateTime处理时间,别忘了时区和性能这两件事
  • 具身智能(Embodied AI)