Skip to content

Commit 99b755a

Browse files
authored
docs(readme): show Patchwork++ as ROS 2 default + advertise SemanticKITTI eval harness (#98)
* docs(readme): show Patchwork++ as the ROS 2 default + advertise eval harness ROS 2 section: - Make explicit that `ros2 launch patchworkpp patchworkpp.launch.py` alone runs Patchwork++; only `algorithm:=patchwork` opts into the classic algorithm. The launch file's LaunchConfiguration default is already "patchworkpp" (ros/launch/patchworkpp.launch.py:20), so this is a doc fix, not a behavioural change. What's-in-this-repo: - Add a bullet for python/examples/evaluate_semantickitti.py and note that the two algorithms use different SemanticKITTI evaluation protocols (Patchwork paper counts low-z vegetation as ground; Patchwork++ paper Sec. IV.A excludes vegetation entirely because the SemanticKITTI `vegetation` label mixes spurious leaves / branches with low ground cover). Point at USAGE.md §1 and §4 for the protocol switch and per-sequence numbers. Docs-only; no version bump. * docs(readme): pip-first Python install, demote make pyinstall to a contributors note pypatchworkpp ships on PyPI since v1.3.0; the pip banner is already at the top of the README, but the Python install section was still making `make pyinstall` the headline command. Switch the order: - Lead with `pip install pypatchworkpp` and `pip install 'pypatchworkpp[demo]'` (the `[demo]` extra is defined in python/pyproject.toml and pulls open3d). - Keep `make pyinstall` / `make pyinstall_with_demo` in a collapsed <details> block labelled "Build from source (contributors / unreleased main)" so the source-build path is still discoverable without competing with the pip path for new users. Docs-only; same PR as the ROS 2 default clarification + eval-harness bullet. * docs: move vegetation-protocol rationale out of README into USAGE.md §1 The README "What's in this repo" bullet was carrying a 4-line wall of text about why Patchwork and Patchwork++ disagree on the vegetation class. Shrink it to a single sentence + link to USAGE.md §1, and put the full rationale (low ground cover vs. overhead foliage, why the two papers chose different resolutions) where it belongs. * Finally update README.md
1 parent 26b4c01 commit 99b755a

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

README.md

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
- C++ source code of Patchwork++ ([patchworkpp][sourcecodelink])
4242
- Python binding of Patchwork++ using pybind11 ([python_wrapper][wraplink])
4343
- Examples codes of [C++][cppexamplelink], [Python][pyexamplelink], and [ROS2][rosexamplelink] :thumbsup:
44+
- Full suppor of a reproducible **SemanticKITTI evaluation harness** for both Patchwork and Patchwork++ ([`python/examples/evaluate_semantickitti.py`][evallink]). In the papers of Patchwork and Patchwork++, we use **different evaluation protocols** — see [`USAGE.md`][usagelink] §1 for why and §4 for per-sequence numbers.
4445

4546
> If you are familiar with ROS1, you can also visit [here][roslink] and try executing ROS1-based Patchwork++!
4647
@@ -68,23 +69,23 @@ Eigen is fetched automatically by CMake, so no extra system package is required
6869

6970
### Python
7071

71-
**Pure installation**
72+
The released library is on PyPI:
7273

7374
```commandline
74-
make pyinstall
75+
pip install pypatchworkpp # core library
76+
pip install 'pypatchworkpp[demo]' # + Open3D for the visual demos
7577
```
7678

77-
Then, you can use Patchwork++ by `import pypatchworkpp`, which is super simple!
78-
79-
**Installation to run demo**
79+
Then `import pypatchworkpp` in your script — see the [Python examples][pyexamplelink].
8080

81-
Only Open3D (> 0.17.0) is additionally installed for visualization purposes.
81+
<details><summary>Build from source (contributors / unreleased main)</summary>
8282

8383
```commandline
84-
make pyinstall_with_demo
84+
make pyinstall # equivalent to `pip install ./python/`
85+
make pyinstall_with_demo # also installs Open3D >= 0.17.0
8586
```
8687

87-
How to run Python demos is explained [here][pyexamplelink].
88+
</details>
8889

8990
### C++
9091

@@ -135,9 +136,13 @@ pp_default = p.patchworkpp(p.Parameters()) # Patchwork++
135136
pp_classic = p.patchwork(p.PatchworkParams()) # Patchwork (classic)
136137
```
137138

138-
**ROS2:**
139+
**ROS2:** Patchwork++ is the default; pass `algorithm:=patchwork` to switch to the classic Patchwork.
139140

140141
```bash
142+
# Default — runs Patchwork++
143+
ros2 launch patchworkpp patchworkpp.launch.py
144+
145+
# Override to the classic Patchwork
141146
ros2 launch patchworkpp patchworkpp.launch.py algorithm:=patchwork
142147
```
143148

@@ -193,6 +198,7 @@ ______________________________________________________________________
193198

194199
[arxivlink]: https://arxiv.org/abs/2207.11919
195200
[cppexamplelink]: https://github.com/url-kaist/patchwork-plusplus/tree/master/cpp
201+
[evallink]: python/examples/evaluate_semantickitti.py
196202
[htlink]: https://github.com/LimHyungTae
197203
[patchworkarxivlink]: https://arxiv.org/abs/2108.05560
198204
[patchworkieeelink]: https://ieeexplore.ieee.org/document/9466396
@@ -203,4 +209,5 @@ ______________________________________________________________________
203209
[roslink]: https://github.com/url-kaist/patchwork-plusplus-ros
204210
[sjlink]: https://github.com/seungjae24
205211
[sourcecodelink]: https://github.com/url-kaist/patchwork-plusplus/tree/master/cpp/patchworkpp
212+
[usagelink]: USAGE.md
206213
[wraplink]: https://github.com/url-kaist/patchwork-plusplus/tree/master/python/patchworkpp

USAGE.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ ______________________________________________________________________
1414

1515
The Patchwork and Patchwork++ papers use **different** ground-truth definitions on SemanticKITTI. The eval driver `python/examples/evaluate_semantickitti.py` supports both via `--eval_protocol {patchwork, patchworkpp}`.
1616

17+
### Why the two papers disagree
18+
19+
The disagreement is concentrated on one class: **`vegetation` (label 70)**. SemanticKITTI's `vegetation` label conflates two visually similar but physically very different things — low ground cover (grass, terrain weeds, leaves on flat ground) and overhead foliage / branches / hedge tops. The first is essentially ground; the second is not.
20+
21+
- The **original Patchwork paper** picked a height-based proxy: `vegetation` points with `z < −1.30 m` w.r.t. the sensor frame count as ground, anything above does not. Simple, but it mislabels overhead foliage in low-mounted sensors and ground vegetation on hills.
22+
- The **Patchwork++ paper** (Sec. IV.A) treats this as fundamentally unresolvable from labels alone and **excludes** `vegetation` from the evaluation entirely: *"the points labeled as vegetation are not evaluated as ground nor non-ground points exceptionally because it is impractical to regard the vegetation as a single ground or non-ground class"*. The points are still fed to the algorithm — only the scoring drops them.
23+
24+
Either choice is defensible; they just yield different numbers on the same predictions. Always use the protocol that matches the paper you're comparing against.
25+
1726
### A. `--eval_protocol patchwork` (original Patchwork repo protocol)
1827

1928
- **Ground GT** = `{ROAD (40), PARKING (44), SIDEWALK (48), OTHER_GROUND (49), LANE_MARKING (60), VEGETATION (70, only if z < −1.30 m), TERRAIN (72)}`

0 commit comments

Comments
 (0)