EgoSmith 数据处理管线(数据流)
依据:
ref_paper/EgoSteerv1+egosmith范围:只讲数据过滤与 4D/标注主路径,按数据流向自上而下。
数据过滤流示意图
#mermaid-svg-rzSa8cyplaYbzL1v{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rzSa8cyplaYbzL1v .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rzSa8cyplaYbzL1v .error-icon{fill:#552222;}#mermaid-svg-rzSa8cyplaYbzL1v .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rzSa8cyplaYbzL1v .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rzSa8cyplaYbzL1v .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rzSa8cyplaYbzL1v .marker.cross{stroke:#333333;}#mermaid-svg-rzSa8cyplaYbzL1v svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rzSa8cyplaYbzL1v p{margin:0;}#mermaid-svg-rzSa8cyplaYbzL1v .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rzSa8cyplaYbzL1v .cluster-label text{fill:#333;}#mermaid-svg-rzSa8cyplaYbzL1v .cluster-label span{color:#333;}#mermaid-svg-rzSa8cyplaYbzL1v .cluster-label span p{background-color:transparent;}#mermaid-svg-rzSa8cyplaYbzL1v .label text,#mermaid-svg-rzSa8cyplaYbzL1v span{fill:#333;color:#333;}#mermaid-svg-rzSa8cyplaYbzL1v .node rect,#mermaid-svg-rzSa8cyplaYbzL1v .node circle,#mermaid-svg-rzSa8cyplaYbzL1v .node ellipse,#mermaid-svg-rzSa8cyplaYbzL1v .node polygon,#mermaid-svg-rzSa8cyplaYbzL1v .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rzSa8cyplaYbzL1v .rough-node .label text,#mermaid-svg-rzSa8cyplaYbzL1v .node .label text,#mermaid-svg-rzSa8cyplaYbzL1v .image-shape .label,#mermaid-svg-rzSa8cyplaYbzL1v .icon-shape .label{text-anchor:middle;}#mermaid-svg-rzSa8cyplaYbzL1v .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rzSa8cyplaYbzL1v .rough-node .label,#mermaid-svg-rzSa8cyplaYbzL1v .node .label,#mermaid-svg-rzSa8cyplaYbzL1v .image-shape .label,#mermaid-svg-rzSa8cyplaYbzL1v .icon-shape .label{text-align:center;}#mermaid-svg-rzSa8cyplaYbzL1v .node.clickable{cursor:pointer;}#mermaid-svg-rzSa8cyplaYbzL1v .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rzSa8cyplaYbzL1v .arrowheadPath{fill:#333333;}#mermaid-svg-rzSa8cyplaYbzL1v .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rzSa8cyplaYbzL1v .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rzSa8cyplaYbzL1v .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rzSa8cyplaYbzL1v .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rzSa8cyplaYbzL1v .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rzSa8cyplaYbzL1v .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rzSa8cyplaYbzL1v .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rzSa8cyplaYbzL1v .cluster text{fill:#333;}#mermaid-svg-rzSa8cyplaYbzL1v .cluster span{color:#333;}#mermaid-svg-rzSa8cyplaYbzL1v div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rzSa8cyplaYbzL1v .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rzSa8cyplaYbzL1v rect.text{fill:none;stroke-width:0;}#mermaid-svg-rzSa8cyplaYbzL1v .icon-shape,#mermaid-svg-rzSa8cyplaYbzL1v .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rzSa8cyplaYbzL1v .icon-shape p,#mermaid-svg-rzSa8cyplaYbzL1v .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rzSa8cyplaYbzL1v .icon-shape .label rect,#mermaid-svg-rzSa8cyplaYbzL1v .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rzSa8cyplaYbzL1v .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rzSa8cyplaYbzL1v .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rzSa8cyplaYbzL1v :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 粗→细质检
语义
几何重建
Hand Gate:遮挡 / 无手 / 路人手
Camera Gate:走路 / 大幅头动
是
否
否
是
是
否
违规
通过
原始 Egocentric RGB 视频
- Pre-filtering
128 点网格稀疏光流
金字塔 Lucas--Kanade 追 15 帧
RANSAC 拟合相似变换
平移 > 图像长边 10% ?
不合格帧
相机门通过
YOLO 检手
conf≥0.30 且
面积∈2%,50% 且
落入下中部 ROI ?
合格手数 ≥ 2 ?
不合格帧
手部门通过
连续 ≥3 帧不合格 ?
剪掉该段
保留片段:相机稳 + 双手清晰
丢弃
2. 4D Motion Estimation
HaWoR ViT
相机系 MANO 手
DPVO
up-to-scale 相机轨迹
Any4D
逐帧度量深度
s = median(D_Any4D / D_DPVO)
背景像素标定尺度
x_world = Rᵀ(x_cam − p)
世界系双手轨迹
3. Language Labeling
Qwen3.5-VL-Plus
再滤无有效手--物操作 ~3.5%
生成粗→细五级指令
4. Post-filtering
Episode:相机平移/旋转
vs 数据集 IQR Q1−2.5IQR, Q3+2.5IQR
Chunk:腕相对相机 / 指相对腕
IQR + 1.5m 物理上限
Frame:邻帧硬阈值
相机≤0.20m / 腕指≤0.30m
相机转≤28° / 腕转≤41°
整段丢弃
5. 导出 WebDataset
图像 + lowdim/动作 + MANO + meta + 指令
1. Pre-filtering:丢掉不适合重建的片段
两道门一起判;连续 ≥3 帧不合格才剪掉,单帧闪一下放过。
走路 / 大幅头动(camera gate)
稀疏光流:每帧取 128 个网格点,用金字塔 Lucas--Kanade 追回 15 帧前;RANSAC 拟合相似变换,看平移量。平移超过图像长边的 10% → 判不合格(走路/甩头)。
遮挡 / 无手 / 路人手(hand gate)
YOLO 检手,框要同时满足:conf ≥ 0.30;面积在画面 2%--50% ;与下中部 ROI(横 0.075,0.925、纵 0.075,1.0)相交。一帧至少 2 个合格手才过关------没手、被挡、只有远处旁人手都会掉。
留下的片段:相机相对稳 + 双手清晰可见。
2. 4D Motion Estimation:造度量世界系手轨迹
数据流是三段拼起来:
- 手(相机系):HaWoR 的 ViT,对检测裁剪后的手做时序窗回归 → MANO 姿态/形状 + 相机系根平移。
- 相机(无尺度轨迹):DPVO 替代原 HaWoR 的 DROID-SLAM → 得到 up-to-scale 的相机位姿 + 焦距。
- 尺度(变成米制) :Any4D 出逐帧度量深度;窗口间做 scale 对齐;在背景像素上算
s = median(D_Any4D / D_DPVO),用s把 DPVO 轨迹拉到真实尺度。
最后用度量相机位姿,把相机系手关节变到世界系:
x_world = Rᵀ (x_cam − p)。
输出:世界系双手状态/动作、内外参、MANO、度量深度。
3. Language Labeling:语义过滤 + 五层指令
Qwen3.5-VL-Plus 先砍掉「启发式过了但没有有效手--物操作」的 clip(约再丢 3.5%);留下的生成 粗→细五级 语言指令(任务语义 + 动作时空描述)。
4. Post-filtering:重建结果质检(粗→细)
Episode :本段相机平移/旋转统计 vs 同数据集分布;落在 [Q1−2.5·IQR, Q3+2.5·IQR] 外 → 整段丢(追漂、仍像走路/东张西望)。
Chunk :滑窗(约过去 5s + 未来 30 帧)里,腕相对相机、指相对腕;再套同款 IQR,并卡 1.5 m 物理上限;任一窗违规 → 整 episode 丢。
Frame:邻帧增量硬阈值------相机平移 ≤0.20 m、腕/指 ≤0.30 m、相机转 ≤28°、腕转 ≤41°;超了当重建跳变,整段丢。
5. 导出
过检样本打成 WebDataset:图像 + lowdim/动作 + MANO + meta(+可选深度)+ 多粒度指令,供后续 VLA 预训。