尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ETH数据集obsmat.txt文件解析与可视化:如何正确绘制行人轨迹

ETH数据集obsmat.txt文件解析与可视化:如何正确绘制行人轨迹 ETH数据集obsmat.txt文件解析与行人轨迹可视化实战指南行人轨迹分析是计算机视觉和行为理解领域的重要研究方向。ETH数据集作为该领域的经典基准数据其obsmat.txt文件记录了丰富的行人运动信息。本文将深入解析该文件结构并演示从原始数据到可视化呈现的全流程操作。1. 理解ETH数据集与obsmat.txt文件结构ETH行人数据集包含多个场景的轨迹数据主要用于行人行为分析和轨迹预测研究。obsmat.txt作为核心数据文件采用特定格式存储行人运动信息。该文件通常位于数据集子目录中如seq_hotel/与场景图像、单应性矩阵文件配套使用。文件每行对应一个行人轨迹点包含以下字段以空格分隔帧编号 行人ID pos_x pos_z pos_y v_x v_z v_y注意坐标轴命名可能造成混淆实际使用时需特别注意pos_x世界坐标系下的x坐标pos_y世界坐标系下的z轴高度通常较小pos_z世界坐标系下的y坐标关键提示原始数据中的坐标命名与常规认知不同这是后续可视化时容易出错的关键点。2. 数据预处理与坐标转换2.1 读取与解析obsmat.txt使用Python处理时推荐以下方法读取数据import pandas as pd file_path ./ewap_dataset/seq_hotel/obsmat.txt column_names [frame_number, human_id, pos_x, pos_z, pos_y, v_x, v_z, v_y] data pd.read_csv(file_path, headerNone, sep\s, namescolumn_names)2.2 世界坐标到像素坐标的转换数据集通常提供单应性矩阵文件如H.txt用于坐标转换。以下为完整的转换类实现import numpy as np from numpy.linalg import inv class HomographyTransformer: def __init__(self, h_matrix_path): 初始化单应性矩阵 with open(h_matrix_path) as f: h_values list(map(float, f.read().split())) self.P np.array([ [h_values[0], h_values[1], h_values[2]], [h_values[3], h_values[4], h_values[5]], [h_values[6], h_values[7], h_values[8]] ]) self.P_inv inv(self.P) def world_to_pixel(self, world_coord): 世界坐标转像素坐标 homogenous_coord np.append(world_coord, 1) pixel_coord np.matmul(self.P_inv, homogenous_coord) pixel_coord / pixel_coord[-1] return pixel_coord[:2].astype(int)2.3 常见问题排查实际应用中可能遇到以下典型问题坐标轴顺序错误现象可视化结果明显偏离预期位置解决方案交换x/y坐标顺序尝试单应性矩阵方向错误检查矩阵是否应该使用逆矩阵验证矩阵数值是否与文档描述一致坐标范围异常世界坐标通常为米制单位数值范围在几十以内像素坐标应与图像尺寸匹配3. 轨迹可视化实现3.1 单帧可视化以下代码展示如何可视化特定帧的行人位置import cv2 def visualize_single_frame(data, frame_num, img_path, transformer): # 筛选指定帧数据 frame_data data[data[frame_number] frame_num] # 读取背景图片 img cv2.imread(img_path) # 绘制每个行人位置 for _, row in frame_data.iterrows(): world_coord np.array([row[pos_x], row[pos_z]]) # 注意使用pos_z作为y坐标 pixel_coord transformer.world_to_pixel(world_coord) # 绘制圆形标记 cv2.circle(img, tuple(pixel_coord), 8, (0, 0, 255), -1) return img3.2 轨迹动画生成创建轨迹动画能更直观展示行人运动import imageio def create_trajectory_animation(data, img_path, transformer, output_gif): frames sorted(data[frame_number].unique()) images [] for frame in frames[:100]: # 限制前100帧避免文件过大 img visualize_single_frame(data, frame, img_path, transformer) images.append(img) imageio.mimsave(output_gif, images, fps10)4. 高级分析与应用4.1 轨迹特征提取从原始数据可提取多种运动特征特征名称计算方式物理意义瞬时速度√(v_x² v_z²)行人移动快慢运动方向arctan2(v_z, v_x)行人前进方向加速度Δv/Δt速度变化率4.2 常见分析场景行人交互分析计算行人间的相对距离检测避让行为模式轨迹预测模型验证划分训练/测试集评估预测误差指标场景语义理解识别常见路径检测聚集区域4.3 性能优化技巧处理大规模轨迹数据时可考虑以下优化数据分块处理按帧范围或空间区域分割数据集并行计算使用multiprocessing加速特征计算内存优化指定数据类型减少内存占用# 示例优化内存使用 dtypes { frame_number: int32, human_id: int16, pos_x: float32, pos_z: float32, pos_y: float32 } data pd.read_csv(file_path, dtypedtypes)5. 实际项目经验分享在真实项目中处理ETH数据集时有几个容易忽视但至关重要的细节坐标系一致性验证始终先在小样本上验证坐标转换结果准备已知的参考点进行交叉验证数据清洗策略过滤异常位置数据如超出场景范围的点处理缺失值通常直接删除对应帧可视化优化技巧使用渐变色表示时间维度添加轨迹序号提高可读性调整标记大小反映速度变化# 示例速度相关的可视化 def visualize_with_speed(data, frame_num, img_path, transformer): img cv2.imread(img_path) frame_data data[data[frame_number] frame_num] for _, row in frame_data.iterrows(): speed np.sqrt(row[v_x]**2 row[v_z]**2) radius int(5 speed * 10) # 速度越大标记越大 color (0, int(255 * speed/2), 255) # 速度影响颜色 world_coord np.array([row[pos_x], row[pos_z]]) pixel_coord transformer.world_to_pixel(world_coord) cv2.circle(img, tuple(pixel_coord), radius, color, -1) return img处理过程中发现原始数据中pos_y字段实际对应高度信息在平面可视化中通常可以忽略。而pos_z才是真正需要的y坐标值这个设计选择虽然文档中有说明但很容易被忽视导致错误。
返回列表