pictures_12的相关工作
处理过程:
1.补全00061数据集
原有的00061数据集缺少朝向类别表:orientation.txt和排除朝向类别表:no_orientation.txt两个文件,需要补全。
sofa(沙发)有正面,其余归类为不判断正面
2.完善pictures_12代码,以适配00061数据集。
复制pictures_12并重命名为pictures_zj_1进行修改,修改情况如下:
1.文件顶部注释修改(修改成00061的实际结构)
2.默认输入输出目录修改
输入
输出
3.深度图读取方式
4.深度图、位姿、深度内参路径
深度图
位姿
深度内参
原本每帧是去camera_poses/0.info.txt找
现在新增:
也就是使用 data/00061/intrinsic/intrinsic_depth.txt
5.三维反投影函数的参数名称
原本:color_intrinsic
现在:intrinsic
实际传入的是:intrinsic_depth.txt
6.run_point3d_projection()的内参来源和深度单位
原流程
读 0.info.txt
→ 解析 m_calibrationDepthIntrinsic
→ 解析 m_depthShift
现在:
读 intrinsic/intrinsic_depth.txt
→ 直接读 4×4 矩阵
→ 固定 depth_shift = 1000.0
同时删掉了原本的info_cache(用于缓存.info.txt,00061用不到)
7.点云输出 JSON 的说明文字
原本:
相机信息来自每帧 .info.txt
深度比例来自 m_depthShift
现在:
相机信息来源:intrinsic/intrinsic_depth.txt
深度比例来源:ScanNet PNG 深度,1000 单位等于 1 米
8. OBB 朝向阶段读取 RGB 内参和位姿
位姿路径
RGB内参
现在:直接读取intrinsic/intrinsic_color.txt
在物体朝向阶段会调用
9. QA 阶段读取深度图
这部分用于空间关系中的深度遮挡、物体前后关系、可见表面距离等判断。
这里直接除以1000.0,因此 QA 使用的深度值已经是米
10. QA 阶段读取 RGB 内参
原来load_color_intrinsic()会解析.info.txt中的:m_calibrationColorIntrinsic
现在直接读取intrinsic/intrinsic_color.txt
并取左上角3x3相机内参
11. QA 阶段读取位姿和内参路径
原本:
pose_dir = resolve_scan_data_dir(data_root, "camera_poses") pose_path = pose_dir / f"{frame_id}.pose.txt" info_path = pose_dir / f"{frame_id}.info.txt" camera_intrinsic = load_color_intrinsic(info_path)现在:
pose_dir = data_root / "pose" color_intrinsic_path = ( data_root / "intrinsic" / "intrinsic_color.txt" ) pose_path = pose_dir / f"{frame_id}.txt" camera_intrinsic = load_color_intrinsic(color_intrinsic_path)QA 阶段不再依赖任何.info.txt
3.分割主代码
在修整后的pictures_zj_1的基础上将代码分割成两部分,第一部分是pictures_zj_1_1(负责空间关系生成前的全部工作),余下部分是pictures_zj_2_1。(后续修改时重命名会对末尾数字进行改动)
思路:
pictures_zj_1_1.py负责的流程
类别标签
→ VLM 实例识别
→ SAM 2 二维分割
→ 2D mask 导出与预览
→ 三维点云反投影
→ 点云清洗
→ OBB
→ VLM 物体朝向
会生成并更新:
outputs/00061/
├─ label.json
├─ 2D_segment/
├─ 3D_point/
├─ 3D_point_clean/
├─ 3D_OBB/
└─ pipeline_timing.txt
pictures_zj_2_1.py
负责流程
读取第一部分已有结果
//需要第一部分提供:
outputs/00061/
├─ 2D_segment/instances_2d.json
├─ 2D_segment/merged_masks/
├─ 3D_point_clean/object_3d_points_clean/
└─ 3D_OBB/
→ 生成空间关系
→ 生成 QA
→ 输出 QA 汇总和计时
最后输出:
outputs/00061/qa/
├─ <帧名>_spatial_relationships.json
├─ <帧名>_qa.json
└─ generation_summary.json
实现过程
按“功能边界”分割
pictures_zj_1.py │ ├─ 前半部分: │ 输入、VLM、SAM 2、点云、清洗、OBB、朝向 │ └─ 后半部分: 空间关系规则、QA 生成规则具体做法:
找到空间关系代码的开始位置:
# Integrated spatial-QA policy for pictures_12 (self-contained)这段之后就是空间关系、拓扑判断、距离题、排序题和 QA 生成代码。
创建pictures_zj_1_1.py
它保留从文件开头到:
run_obb_pipeline(...)为止的所有代码。
并删除了run_obb_pipeline()末尾原本的:
generate_inline_spatial_qa(...)所以第一部分完成 OBB 朝向后就结束。
修改第一部分的main()
原来:
--qa_only → 直接生成空间关系与 QA现在改为提示:
空间关系与 QA 已拆到 pictures_zj_2_1.py避免第一部分再去调用已被移走的函数。
创建pictures_zj_2_1.py
它保留原文件的空间关系和 QA 代码,包括:
evaluate_topology_geometry(...) _generate_wy_zj_spatial_qa(...) apply_cxm2_qa_rules(...) generate_inline_spatial_qa(...)这些函数仍然完整保留在第二部分。
第二部分导入第一部分
在pictures_zj_2_1.py开头:
import pictures_zj_1_1 as upstream然后复用第一部分已有的公共内容:
路径配置 00061 的深度和内参适配 点云与 OBB 数据结构 JSON 工具函数 计时器 相机和几何工具函数给第二部分写了独立main()
第二部分启动时只检查:
data/00061 是否存在 outputs/00061/3D_OBB 是否存在 outputs/00061/2D_segment/instances_2d.json 是否存在检查通过后只执行:
generate_inline_spatial_qa(...)因此它不会加载 SAM 2、不请求 VLM、不重新生成点云或 OBB。
补充:
关于计时文件
第一部分:pipeline_timing.txt
第二部分:pipeline_timing_qa.txt
上一步补全代码时遗漏了 处理读取info_path的问题
现做修改两处
第一部分:"info_path": str(info_path) if info_path.exists() else "",改为"info_path": "",
第二部分:'source_camera_info': str(info_path)改为:'source_camera_info': ''
4.在服务器上的操作记录
1.上传项目文件夹
2.搭建环境
1.创建虚拟环境
conda create --name SAM2_zj python=3.102.激活虚拟环境
conda activate SAM2_zjShell 终端没有自动加载 Conda 初始化脚本
重新激活
source /opt/conda/etc/profile.d/conda.sh conda activate SAM2_zj3.查看支持的cuda版本
conda search cudatoolkit --infourl : https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda4.下载 cudatoolkit
wget https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda 5.安装cudatoolkit
conda install ./cudatoolkit-11.8.0-h4ba93d1_13.conda检查是否安装成功
conda list cudatoolkit6.安装cudnn
查看支持版本
conda search cudnn --info下载
wget https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.3.0.75-hc149ed2_0.conda安装
conda install ./cudnn-9.3.0.75-hc149ed2_0.conda检查安装成功
conda list cudnn7.torch
安装
pip install --isolated --retries 5 --timeout 120 torch==2.5.1 torchvision==0.20.1 --index-url https://download.pytorch.org/whl/cu118检查
conda list | grep -E 'torch|torchvision|torchmetrics'8.其他依赖
env -u PIP_EXTRA_INDEX_URL PIP_CONFIG_FILE=/dev/null pip install -r requirements.txt -i https://pypi.org/simple 3.确认SAM2源码正确导入
PYTHONPATH=./models python -c "from sam2.build_sam import build_sam2; from sam2.sam2_image_predictor import SAM2ImagePredictor; print('SAM2 导入成功')"至此,环境、PyTorch、CUDA、SAM2 依赖全部正常
4.pictures_zj_1_1的运行
加载并初始化 Conda 环境:source /opt/conda/etc/profile.d/conda.sh
激活名为SAM2_zj的虚拟环境:conda activate SAM2_zj
切换当前工作目录:cd /djtu48/SAM2_zj/SAM2_zj
打印当前工作目录:pwd
应显示:/djtu48/SAM2_zj/SAM2_zj
在当前目录下创建一个名为outputs的文件夹,并在里面再创建一个名为00061的子文件夹:记录输出:mkdir -p outputs/00061
启动当前任务(指定使用第一块显卡,在后台静默运行一个 Python 脚本(处理图像),并将结果输出到指定的文件夹中):CUDA_VISIBLE_DEVICES=0 nohup python -u tools/pictures/pictures_zj_1_1.py --scan_root data/00061 --output_dir outputs/00061 --skip_label_generation --label_file outputs/00061/label.json --device cuda:0 --log_level INFO > outputs/00061/server_stage.log 2>&1 &
查看日志:tail -f outputs/00061/server_stage.log
下一次重新进入shell查看进度:
source /opt/conda/etc/profile.d/conda.sh
conda activate SAM2_zj
cd /djtu48/SAM2_zj/SAM2_zj
tail -f outputs/00061/server_stage.log
如果想确认任务是否还在运行
ps -p 22075 -o pid,stat,cmd
结果输出:
outputs/00061/
├─ label.json
├─ 2D_segment/
│ └─ instances_2d.json
├─ 3D_point/
├─ 3D_point_clean/
│ └─ object_3d_points_clean.json
├─ 3D_OBB/
├─ pipeline_timing.txt
└─ server_stage.log
5.本机操作记录
空间关系+问答对:
E:\project\3D\sam2-main_2 - 副本
测试环境
.\.venv\Scripts\python.exe tools\pictures\pictures_zj_2_1.py --help
执行命令
.\.venv\Scripts\python.exe tools\pictures\pictures_zj_2_1.py --scan_root data\00061 --output_dir outputs\00061 --log_level INFO
读取:
outputs/00061/2D_segment/
outputs/00061/3D_point_clean/
outputs/00061/3D_OBB/
输出:
outputs/00061/qa/
outputs/00061/pipeline_timing_qa.txt
筛选+人工:
每类抽取20条:(考虑到不是每类都是100+,这里取最小数)
| 题型 | 当前数量 |
|---|---|
multi_between | 80 |
multi_single_anchor_positional_topological | 20 |
order_object_center_distance | 67 |
order_object_visible_surface_distance | 67 |
为适配数据集,这部分做了一些小调整,具体如下:
shaixuan_qa_zj_1.py:
| 原内容 | 改为 |
|---|---|
说明为pictures_12、每类 100 条 | 00061、每类 20 条 |
outputs/pictures_14 | outputs/00061 |
输入outputs/pictures_14/qa/qa_pairs.json | outputs/00061/qa/qa_pairs.json |
输出outputs/pictures_14/evaluation/evaluation_qa.json | outputs/00061/evaluation/evaluation_qa.json |
RGB 路径data/pictures/color | data/00061/color |
overlay 路径outputs/pictures_14/2D_segment/overlay | outputs/00061/2D_segment/overlay |
SAMPLES_PER_TYPE = 100 | SAMPLES_PER_TYPE = 20 |
20x18条题目抽取:
.\.venv\Scripts\python.exe tools\qa\shaixuan_qa_zj_1.py
人工审核:
| 原位置/内容 | 新内容 |
|---|---|
data/pictures | data/00061 |
outputs/pictures_12 | outputs/00061 |
| 默认评测目录 | outputs/00061/evaluation |
| 默认 RGB 图目录 | data/00061/color |
| 默认 overlay 目录 | outputs/00061/2D_segment/overlay |
| 默认评测文件说明中的“全部子类、分组文件” | 改为“00061 的全部待审核题目” |
左右关系辅助文件的查找目录outputs/pictures_12/qa | outputs/00061/qa |
重绘审核叠加图时读取的2D_segment目录 | outputs/00061/2D_segment |
文件选择框标题、命令行帮助、路径解析说明中pictures_12 | 全部改为00061 |
| manifest 的旧数据集说明 | 改为 00061 不使用 manifest |
.\.venv\Scripts\python.exe tools\view\manual_answer_3.py --input outputs\00061\evaluation\evaluation_qa.json