In this assignment, you will implement a PointNet based architecture for classification and segmentation with point clouds (you don't need to worry about the tranformation blocks).
I implemented the tranformation blocks regardless :)
Correct samples
Failure cases
GT: chairs GT: vases GT: lamps
Without armrest, the silhouette looks like a lamp base. Tall neck resembled a lamp stem. The wide base makes it look like a vase.
| Sample | Accuracy | GT | Pred | Note |
|---|---|---|---|---|
| Good 1 | 0.9962 | ![]() |
![]() |
Nearly perfect segmentation. |
| Good 2 | 0.9677 | ![]() |
![]() |
Also nearly perfect segmentation. |
| Good 3 | 0.9129 | ![]() |
![]() |
Looks clean to me. |
| Bad 1 | 0.6279 | ![]() |
![]() |
Wrong labels on base. |
| Bad 2 | 0.7243 | ![]() |
![]() |
Confusion between arm rest and seat region. |
Two stress tests on the classifier: (1) aggressive downsampling with no rotation, and (2) heavy rotation with all points kept.
Downsample sweep (rot=0)
| keep fraction | accuracy | sample render |
|---|---|---|
| 1.0 | 0.981 | ![]() |
| 0.5 | 0.981 | ![]() |
| 0.1 | 0.971 | ![]() |
| 0.05 | 0.970 | ![]() |
| 0.01 | 0.924 | ![]() |
| 0.005 | 0.769 | ![]() |
| 0.001 | 0.317 | ![]() |
Observation: accuracy stays near baseline down to 5% of points, then collapses quickly as points be come so sparse that some details are lost.
Rotation sweep (keep=1.0)
| rotation (deg) | accuracy | sample render |
|---|---|---|
| 0 | 0.981 | ![]() |
| 30 | 0.768 | ![]() |
| 60 | 0.448 | ![]() |
| 90 | 0.216 | ![]() |
| 120 | 0.193 | ![]() |
| 150 | 0.197 | ![]() |
| 180 | 0.583 | ![]() |
Observation: the model is highly orientation sensitive, recovering only near 180 degree.
Full comparison:
Observation: For a 3-way classification, uniform random guess expects a 33% accuracy, but our test set is imbalanced (class counts: [617, 102, 234], majority = 64.7%), so the real lower bound can be much lower than 33%, which is shown in the experiements.
Downsample sweep (rot=0)
| keep fraction | accuracy | GT | Pred |
|---|---|---|---|
| 1.0 | 0.915 | ![]() |
![]() |
| 0.1 | 0.908 | ![]() |
![]() |
| 0.01 | 0.809 | ![]() |
![]() |
| 0.001 | 0.496 | ![]() |
![]() |
The model tolerates aggresive downsampling until key details are lost.
Rotation sweep (keep=1.0)
| rotation (deg) | accuracy | GT | Pred |
|---|---|---|---|
| 0 | 0.915 | ![]() |
![]() |
| 60 | 0.488 | ![]() |
![]() |
| 120 | 0.270 | ![]() |
![]() |
| 180 | 0.368 | ![]() |
![]() |
The segmentations are roughly structured by vertical layers. Which makes it extremely sensitive to rotations. It also explains the slight accuracy improvement when rotation=180 degrees.
Full comparison: