Files
worldmodel/plans/iphone/iphone_simplified_plan.md
T

15 KiB
Raw Blame History

基于iPhone的酒店场景建模简易方案

📱 方案概述

本方案针对预算有限或快速验证需求,使用iPhone Pro系列(配备LiDAR)作为主要采集设备,大幅降低硬件成本和技术门槛,实现酒店场景的快速数字化。

核心优势

  • 💰 成本低:硬件投入 < 3万元(vs 完整方案21万)
  • 🚀 部署快:1-2周即可开始采集(vs 完整方案1个月)
  • 📱 便携性强:单人即可完成所有采集工作
  • 🛠️ 易上手:成熟的App生态,无需专业技能

适用场景

  • 快速原型验证
  • 小规模客房建模(< 5间)
  • 预算受限的研究项目
  • 教学演示用途

一、硬件配置方案

1.1 必需设备

设备 型号推荐 价格 用途
iPhone iPhone 15 Pro Max ¥9,999 主采集设备(LiDAR + 相机)
稳定器 DJI OM 6 ¥899 视频稳定、减少抖动
三脚架 曼富图 Compact ¥299 固定站点扫描
移动电源 20000mAh快充 ¥199 续航保障
存储卡 1TB iCloud ¥68/月 云端备份

必需设备总计:约 ¥11,400(一次性)+ ¥68/月

1.2 可选设备

设备 型号推荐 价格 用途
补光灯 神牛 SL-60W ¥599 弱光环境补光
外接深度相机 Structure Sensor Pro ¥4,999 提升深度精度(可选)
iPad iPad Pro 12.9" ¥7,999 实时预览与标注

可选设备总计:¥5,000 - ¥13,000

1.3 计算设备

设备 配置 价格 用途
笔记本 MacBook Pro M3 Max
36GB RAM, 1TB SSD
¥25,999 数据处理与训练
游戏本 RTX 4070
32GB RAM, 1TB SSD
¥12,000 Windows替代方案
云GPU AutoDL / 恒源云
RTX 4090
¥3/小时 按需租用

推荐方案MacBook Pro(本地处理)+ 云GPU(训练)


二、软件工具链

2.1 数据采集App

方案APolycam(推荐)

App名称: Polycam
平台: iOS / iPadOS
价格: 免费版 + Pro订阅 $11.99/月

功能:
  - ✅ LiDAR扫描(房间模式)
  - ✅ 照片建模(NeRF模式)
  - ✅ 实时预览
  - ✅ 自动对齐
  - ✅ 导出格式:OBJ, FBX, USDZ, PLY, LAS

优势:
  - 界面友好,零学习成本
  - 自动处理,无需手动调参
  - 云端处理,手机不发热
  - 支持导出高质量Mesh

劣势:
  - 免费版有导出限制
  - 大场景需要Pro订阅
  - 精度略低于专业方案

方案B3D Scanner App

App名称: 3D Scanner App
平台: iOS
价格: 免费 + 内购 $4.99

功能:
  - ✅ LiDAR点云采集
  - ✅ 实时网格生成
  - ✅ 纹理映射
  - ✅ 导出格式:OBJ, STL, PLY

优势:
  - 完全免费基础功能
  - 本地处理,数据隐私好
  - 支持手动编辑

劣势:
  - 界面较简陋
  - 大场景处理慢
  - 需要一定学习成本

方案CRoomPlan API(开发者)

技术: Apple RoomPlan API
平台: iOS 16+
价格: 免费(需开发)

功能:
  - ✅ 自动房间结构识别
  - ✅ 家具自动检测
  - ✅ 导出USDZ格式
  - ✅ 符合曼哈顿假设

优势:
  - 完全免费
  - 自动语义标注
  - 精度高

劣势:
  - 需要编程能力
  - 仅支持标准房间
  - 定制化困难

推荐组合Polycam(快速扫描)+ RoomPlan(结构提取)

2.2 数据处理软件

点云处理:
  - CloudCompare(免费): 点云查看、配准、滤波
  - MeshLab(免费): Mesh编辑、简化、修复

3D重建:
  - COLMAP(免费): 照片建模、位姿估计
  - Instant-NGP(免费): 快速NeRF训练
  - Nerfstudio(免费): NeRF工具链

语义标注:
  - Labelbox(免费版): 2D图像标注
  - Segments.ai(免费版): 3D点云标注

渲染与展示:
  - Blender(免费): 3D建模与渲染
  - Unity(免费版): 交互式展示

三、简化工作流程

3.1 数据采集流程

阶段1:准备工作(30分钟)

1. 检查设备
   - iPhone电量 > 80%
   - 存储空间 > 20GB
   - 清洁镜头和LiDAR

2. 环境准备
   - 开启所有灯光
   - 移除动态物体(人、宠物)
   - 关闭窗帘(避免强光)

3. App设置
   - Polycam: 选择"Room"模式
   - 分辨率: 高质量
   - LiDAR: 开启

阶段2:客房扫描(15-20分钟/间)

扫描路线:
  1. 从门口开始,顺时针环绕房间
  2. 保持iPhone垂直,距离墙面1-1.5米
  3. 移动速度: 慢速(约0.3米/秒)
  4. 重点区域:
     - 床铺四周(多角度)
     - 书桌、衣柜(开门扫描内部)
     - 窗户、窗帘
     - 卫生间门口(不进入)

关键技巧:
  - 保持稳定,避免快速移动
  - 重叠率 > 70%(相邻帧)
  - 弱纹理区域多拍几张照片
  - 实时查看预览,确保覆盖完整

数据量:
  - 扫描时长: 15-20分钟
  - 采集帧数: 约500-800帧
  - 数据大小: 2-3GB

阶段3:卫生间扫描(10-15分钟)

特殊处理:
  1. 关闭顶灯,使用侧光(补光灯)
  2. 对镜子区域:
     - 多角度采集(30°间隔)
     - 避免正对镜子(减少反射)
  3. 玻璃淋浴房:
     - 内外分别扫描
     - 使用HDR模式

降级方案(如果效果不好):
  - 使用照片建模模式(非LiDAR
  - 增加拍摄数量(> 100张)
  - 后期手动修复

阶段4:固定站点补充(可选,10分钟)

使用三脚架:
  - 房间中心 × 1
  - 床头两侧 × 2
  - 书桌前方 × 1

每个站点:
  - 360°全景照片(Polycam全景模式)
  - 或使用iPhone全景功能
  - 用于纹理补充

3.2 数据处理流程

步骤1:云端处理(Polycam自动)

上传数据:
  - 扫描完成后自动上传
  - 处理时间: 10-30分钟
  - 接收邮件通知

下载结果:
  - 格式: OBJ + MTL + 纹理
  - : USDZ(用于AR预览)
  - : PLY点云

步骤2:本地优化(可选)

# 使用CloudCompare清理点云
import subprocess

def clean_pointcloud(input_ply, output_ply):
    """点云清理流程"""
    
    # 1. 统计滤波去除离群点
    subprocess.run([
        'CloudCompare', '-SILENT',
        '-O', input_ply,
        '-SOR', '6', '1.0',  # 6邻域,1.0标准差
        '-SAVE_CLOUDS', 'FILE', output_ply
    ])
    
    # 2. 体素下采样(可选,减小文件)
    subprocess.run([
        'CloudCompare', '-SILENT',
        '-O', output_ply,
        '-SS', 'SPATIAL', '0.01',  # 1cm网格
        '-SAVE_CLOUDS', 'FILE', output_ply
    ])

# 使用MeshLab修复Mesh
def repair_mesh(input_obj, output_obj):
    """Mesh修复流程"""
    
    # MeshLab脚本
    script = """
    <!DOCTYPE FilterScript>
    <FilterScript>
        <!-- 移除重复顶点 -->
        <filter name="Remove Duplicate Vertices"/>
        
        <!-- 移除重复面 -->
        <filter name="Remove Duplicate Faces"/>
        
        <!-- 移除非流形边 -->
        <filter name="Remove Non Manifold Edges"/>
        
        <!-- 填充孔洞 -->
        <filter name="Close Holes">
            <Param name="MaxHoleSize" value="30"/>
        </filter>
        
        <!-- 平滑 -->
        <filter name="Laplacian Smooth">
            <Param name="stepSmoothNum" value="3"/>
        </filter>
    </FilterScript>
    """
    
    with open('repair_script.mlx', 'w') as f:
        f.write(script)
    
    subprocess.run([
        'meshlabserver',
        '-i', input_obj,
        '-o', output_obj,
        '-s', 'repair_script.mlx'
    ])

步骤3:语义标注(简化版)

# 使用YOLO-World自动检测物体
from ultralytics import YOLO

def detect_objects_in_room(image_folder):
    """自动检测房间物体"""
    
    # 加载YOLO-World模型
    model = YOLO('yolov8x-worldv2.pt')
    
    # 定义酒店房间常见物体
    classes = [
        'bed', 'pillow', 'desk', 'chair', 'lamp',
        'TV', 'curtain', 'wardrobe', 'nightstand',
        'mirror', 'towel', 'toilet', 'sink'
    ]
    
    # 设置自定义类别
    model.set_classes(classes)
    
    # 批量检测
    results = model.predict(
        source=image_folder,
        save=True,
        save_txt=True,  # 保存标注文件
        conf=0.3
    )
    
    return results

# 生成简化场景图
def build_simple_scene_graph(detections):
    """构建简化的场景图"""
    
    scene_graph = {
        'nodes': [],
        'edges': []
    }
    
    for det in detections:
        node = {
            'id': det.id,
            'label': det.label,
            'bbox_2d': det.bbox,
            'confidence': det.conf
        }
        scene_graph['nodes'].append(node)
    
    # 简化的空间关系(基于2D位置)
    for i, node_a in enumerate(scene_graph['nodes']):
        for node_b in scene_graph['nodes'][i+1:]:
            # 如果两个物体在垂直方向上接近
            if abs(node_a['bbox_2d'][1] - node_b['bbox_2d'][1]) < 50:
                scene_graph['edges'].append({
                    'source': node_a['id'],
                    'target': node_b['id'],
                    'relation': 'next_to'
                })
    
    return scene_graph

3.3 简化的3DGS训练(可选)

# 使用Nerfstudio快速训练
# 1. 安装Nerfstudio
pip install nerfstudio

# 2. 从Polycam导出的照片训练
ns-process-data images \
  --data data/room_301/images \
  --output-dir data/room_301/processed

# 3. 训练Splatfacto3DGS变体)
ns-train splatfacto \
  --data data/room_301/processed \
  --max-num-iterations 7000 \
  --viewer.websocket-port 7007

# 4. 导出模型
ns-export gaussian-splat \
  --load-config outputs/room_301/splatfacto/config.yml \
  --output-dir exports/room_301/

四、成本与时间对比

4.1 成本对比

项目 完整方案 iPhone简易方案 节省
硬件 21.0万 1.1万 95%
软件 16.8万 0.2万 99%
人力3个月) 54.0万 9.0万 83%
总计 91.8万 10.3万 89%

4.2 时间对比

阶段 完整方案 iPhone方案 节省
准备 4周 1周 75%
采集(10场景) 4周 2周 50%
处理 8周 4周 50%
总计 16周 7周 56%

4.3 质量对比

指标 完整方案 iPhone方案 差距
几何精度 < 3cm 5-10cm 2-3倍
渲染PSNR > 28 dB 24-26 dB 略低
语义mAP > 70% 50-60% 中等
覆盖完整性 95%+ 85-90% 可接受

五、实施步骤(7周计划)

Week 1:准备阶段

任务:
  - [ ] 购买iPhone 15 Pro Max + 配件
  - [ ] 下载并熟悉Polycam App
  - [ ] 联系酒店,获得采集许可
  - [ ] 准备MacBook或租用云GPU

交付物:
  - 硬件到位
  - 测试扫描1-2个房间
  - 确认数据质量可接受

Week 2-3:数据采集

Week 2:
  - [ ] 采集5个客房
  - [ ] 采集2个公共区域
  - [ ] 每日备份数据到iCloud

Week 3:
  - [ ] 采集3个客房
  - [ ] 采集3个卫生间
  - [ ] 质量检查与补拍

Week 4-5:数据处理

Week 4:
  - [ ] Polycam云端处理(自动)
  - [ ] 下载所有Mesh模型
  - [ ] CloudCompare清理点云

Week 5:
  - [ ] MeshLab修复Mesh
  - [ ] YOLO-World物体检测
  - [ ] 构建简化场景图

Week 6:可选训练

任务:
  - [ ] Nerfstudio训练3DGS3个场景)
  - [ ] 渲染质量评估
  - [ ] 导出模型文件

或跳过(直接使用Polycam结果)

Week 7:整理与交付

任务:
  - [ ] 整理所有数据
  - [ ] 编写技术报告
  - [ ] 制作演示视频
  - [ ] 准备开源发布(可选)

交付物:
  - 10个场景的3D模型
  - 语义标注数据
  - 技术文档

六、常见问题

Q1: iPhone LiDAR精度够用吗?

A: 对于大多数应用场景够用:

  • 室内导航: 完全够用(5-10cm精度)
  • VR/AR展示: 够用
  • 机器人操作: ⚠️ 粗略规划可以,精细操作不够
  • 科研论文: ⚠️ 取决于审稿人要求

Q2: 不用3DGS可以吗?

A: 完全可以!

  • Polycam直接输出的Mesh已经很好
  • 3DGS主要用于新视角渲染
  • 如果只需要3D模型,Polycam足够

Q3: 卫生间镜子怎么处理?

A: 简化方案:

  1. 尽量避开镜子正面
  2. 使用侧光减少反射
  3. 后期手动修复(Blender
  4. 或接受一定的几何缺陷

Q4: 可以用旧款iPhone吗?

A: 取决于型号:

  • iPhone 12 Pro及以上: 有LiDAR,推荐
  • iPhone 11及以下: 无LiDAR,只能用照片建模(精度低)
  • 建议: 至少iPhone 13 Pro

Q5: 一个人能完成吗?

A: 可以!

  • 采集: 1人即可
  • 处理: 大部分自动化
  • 建议: 2人协作效率更高(1人扫描,1人质检)

七、进阶优化(可选)

7.1 提升精度

方法1_多次扫描融合:
  - 同一房间扫描2-3次
  - 使用CloudCompare配准融合
  - 精度提升20-30%

方法2_外接深度相机:
  - 购买Structure Sensor Pro
  - 精度提升至2-5cm
  - 成本增加5000元

方法3_照片补充:
  - 用iPhone拍摄高分辨率照片(> 100张)
  - 使用COLMAP重建
  - 与LiDAR融合

7.2 自动化流程

# 批量处理脚本
import os
from pathlib import Path

def batch_process_rooms(data_dir):
    """批量处理所有房间"""
    
    rooms = list(Path(data_dir).glob('room_*'))
    
    for room in rooms:
        print(f"Processing {room.name}...")
        
        # 1. 点云清理
        clean_pointcloud(
            room / 'raw.ply',
            room / 'cleaned.ply'
        )
        
        # 2. Mesh修复
        repair_mesh(
            room / 'mesh.obj',
            room / 'mesh_repaired.obj'
        )
        
        # 3. 物体检测
        detections = detect_objects_in_room(
            room / 'images'
        )
        
        # 4. 场景图构建
        scene_graph = build_simple_scene_graph(detections)
        
        # 5. 保存结果
        with open(room / 'scene_graph.json', 'w') as f:
            json.dump(scene_graph, f, indent=2)
        
        print(f"✓ {room.name} completed")

# 运行
batch_process_rooms('data/')

八、总结

适合人群

  • 预算有限的研究生/博士生
  • 快速原型验证需求
  • 教学演示用途
  • 小规模商业项目

不适合场景

  • 需要毫米级精度
  • 大规模场景(> 1000㎡)
  • 高反光场景为主
  • 顶级会议论文(可能被质疑精度)

核心优势

  1. 成本: 仅需完整方案的10%
  2. 时间: 7周 vs 16周
  3. 便携: 单人单设备
  4. 易用: 零技术门槛

推荐路径

阶段11-2周): iPhone快速验证
    ↓
评估结果是否满足需求
    ↓
满足 → 继续使用iPhone方案
不满足 → 升级到完整方案

文档版本: v1.0
适用设备: iPhone 12 Pro及以上
最后更新: 2026-05-16


💡 提示: 本方案是完整方案的简化版本,适合快速启动。如需更高精度,请参考完整实施计划