基于 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/ 的父目录执行。
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 噪声极高,必须去噪。
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 300python ccpy/src/detect.py --input-dir ccpy/src/image --output-dir ccpy/src/reoutcd ccpy; python generate_slice_metadata.py; cd ..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_las2python 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 映射框对照验证图 |
Bottom 框选点 X 分散(框内混入大量背景点),但 Top 区域点密集、X 可靠。利用这一特性:
- 从 Bottom 已知的 ref_y 偏移到 Top 区域:
Y ∈ [ref_y+100, ref_y+350] - Z 排除近零噪点:
100 < |Z| < 1800 - 过滤后点计算 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) |