Skip to content

quasi2317/ccpy

Repository files navigation

接触网定位装置点云识别

基于 LiDAR 点云的铁路接触网定位装置自动识别与定位

项目概述

全管线:LAS 点云 → 去噪 → 切片渲染 → YOLO 检测 → 3D 映射

对去噪后的 LAS 点云沿 X 轴切片,渲染为 Y-Z 散点图,使用 YOLO ONNX 模型检测 Top_Joint(承力索连接点)和 Bottom_Joint(接触线连接点),再将 2D 检测结果映射回 3D 点云空间,计算空间参考点。

类别定义

ID 名称 含义
0 Top_Joint 承力索侧连接点(定位器上端)
1 Bottom_Joint 接触线侧连接点(定位器下端)

目录结构

ccpy/
├── README.md                 # 本文件
├── best.onnx                 # YOLO ONNX 模型
├── render_slices.py          # 步骤1: 切片渲染(Y-Z散点图)
├── las_mapping.py            # 步骤3: 2D→3D 映射(含YZ窗口过滤+迭代探针标定)
├── verify_mapping.py         # 步骤4: 可视化验证
├── point_cloud_denoise.py    # 去噪模块(DBSCAN+SOR+KDE精炼)
├── clean_las.py              # 步骤0: LAS文件去噪
├── generate_slice_metadata.py # 步骤3: 切片元数据导出
├── run_pipeline.sh            # 一键运行脚本(Git Bash)
├── src/
│   ├── detect.py             # 步骤2: YOLO ONNX 推理
│   ├── data.yaml             # 数据集类别定义
│   ├── las/                  # 原始 LAS 点云(.gitignore)
│   ├── las_clean/            # 去噪后 LAS(推荐使用,尤其LAS 2)
│   ├── image/                # 渲染的切片 PNG
│   └── reout/                # 检测CSV、映射结果、验证图
└── .gitignore

环境配置

python -m venv .venv
.venv\Scripts\activate
pip install numpy laspy opencv-python-headless scipy scikit-learn onnxruntime onnx ultralytics

之后每次运行前先激活:.venv\Scripts\activate,命令行出现 (.venv) 前缀即为激活成功。

运行流程

全部命令在 ccpy/父目录执行。

0. LAS 去噪(首次必做)

python ccpy/clean_las.py --las-dir ccpy/src/las --output-dir ccpy/src/las_clean --method v1 --sor-k 20 --voxel-size 150 --density-percentile 25

src/las/ 下的原始点云去噪输出到 src/las_clean/。LAS 2 噪声极高,必须去噪。

1. 渲染切片

python ccpy/render_slices.py --las-dir ccpy/src/las_clean --output-dir ccpy/src/image --density-threshold 6 --density-bin-size 50 --z-margin 600 --y-margin 300

2. YOLO 检测

python ccpy/src/detect.py --input-dir ccpy/src/image --output-dir ccpy/src/reout

3. 生成切片元数据

cd ccpy; python generate_slice_metadata.py; cd ..

4. 3D 映射

python ccpy/las_mapping.py --las-idx 1 --x-mode two_stage --denoise-method combined --z-margin 600 --y-margin 300 --las-dir ccpy/src/las_clean --csv ccpy/src/reout/detection_coordinates.csv --image-dir ccpy/src/image --slice-metadata ccpy/src/reout/slice_metadata_clean.csv --output-dir ccpy/src/reout/mapping_las1

python ccpy/las_mapping.py --las-idx 2 --x-mode two_stage --denoise-method combined --z-margin 600 --y-margin 300 --las-dir ccpy/src/las_clean --csv ccpy/src/reout/detection_coordinates.csv --image-dir ccpy/src/image --slice-metadata ccpy/src/reout/slice_metadata_clean.csv --output-dir ccpy/src/reout/mapping_las2

5. 验证图

python ccpy/verify_mapping.py --las-dir ccpy/src/las_clean --csv ccpy/src/reout/detection_coordinates.csv --image-dir ccpy/src/image --output-dir ccpy/src/reout/verify --density-threshold 5 --z-margin 600 --y-margin 300

输出文件

文件 内容
mapping_las*/reference_points_cloudcompare.csv 参考点 3D 坐标,可导入 CloudCompare
mapping_las*/reference_points_detailed.csv 含诊断信息的详细映射结果
reout/verify/verify_*.png YOLO检测 vs 映射框对照验证图

X 坐标精炼策略

Bottom_Joint YZ 窗口过滤

Bottom 框选点 X 分散(框内混入大量背景点),但 Top 区域点密集、X 可靠。利用这一特性:

  1. 从 Bottom 已知的 ref_y 偏移到 Top 区域:Y ∈ [ref_y+100, ref_y+350]
  2. Z 排除近零噪点:100 < |Z| < 1800
  3. 过滤后点计算 X 均值作为 Bottom 的 X 坐标

迭代探针标定工具

analyze_optimal_x_window() 函数以 Top 的可靠 X 为探针,迭代扩大 X 半宽,计算 |mean_X - X_top| 误差曲线。误差最小值对应的窗口即为最优密集区域,可用于标定 YZ 过滤参数。

重要提示

  • scikit-learn 必须安装:SOR 去噪依赖 sklearn,缺失时去噪会静默失效(保留 100% 点)
  • LAS 2 必须使用去噪点云 (las_clean/2.las),原始点云噪声太大会导致 YOLO 检测效果差
  • clean_las.py 可重新生成去噪点云,正确参数:--method v1 --sor-k 20 --sor-std 0.8 --voxel-size 150 --density-percentile 25
  • 渲染与映射的 --z-margin --y-margin 必须一致(默认 600/300)
  • --x-mode two_stage 使用两阶段 X 精炼,推荐
  • --denoise-method combined 对框内点做 DBSCAN+SOR 去噪

工具与环境

工具 用途
CloudCompare 点云可视化,导入 reference_points CSV 验证
Python 3.9+ 全管线运行环境
Ultralytics YOLO 模型训练(best.onnx 为导出权重)
MATLAB (可选) 原始切片参考实现(main.mlx

仓库贡献者

About

西南交通大学电气工程创新设计——接触网点云识别定位装置部分

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages