pictures_12的相关工作

发布时间:2026/11/6 6:38:55
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.10

2.激活虚拟环境

conda activate SAM2_zj

Shell 终端没有自动加载 Conda 初始化脚本

重新激活

source /opt/conda/etc/profile.d/conda.sh conda activate SAM2_zj

3.查看支持的cuda版本

conda search cudatoolkit --info

url : https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda

4.下载 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 cudatoolkit

6.安装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 cudnn

7.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_between80
multi_single_anchor_positional_topological20
order_object_center_distance67
order_object_visible_surface_distance67

为适配数据集,这部分做了一些小调整,具体如下:

shaixuan_qa_zj_1.py:

原内容改为
说明为pictures_12、每类 100 条00061、每类 20 条
outputs/pictures_14outputs/00061
输入outputs/pictures_14/qa/qa_pairs.jsonoutputs/00061/qa/qa_pairs.json
输出outputs/pictures_14/evaluation/evaluation_qa.jsonoutputs/00061/evaluation/evaluation_qa.json
RGB 路径data/pictures/colordata/00061/color
overlay 路径outputs/pictures_14/2D_segment/overlayoutputs/00061/2D_segment/overlay
SAMPLES_PER_TYPE = 100SAMPLES_PER_TYPE = 20

20x18条题目抽取:

.\.venv\Scripts\python.exe tools\qa\shaixuan_qa_zj_1.py

人工审核:

原位置/内容新内容
data/picturesdata/00061
outputs/pictures_12outputs/00061
默认评测目录outputs/00061/evaluation
默认 RGB 图目录data/00061/color
默认 overlay 目录outputs/00061/2D_segment/overlay
默认评测文件说明中的“全部子类、分组文件”改为“00061 的全部待审核题目”
左右关系辅助文件的查找目录outputs/pictures_12/qaoutputs/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