Assignment 5 - Point Cloud Processing with PointNet and DGCNN
| Course | 16-825 (Learning for 3D Vision) |
|---|---|
| Assignment | 5 |
| Student | Kunwoo Lee |
| Code | GitHub - assignment5 |
I implement PointNet-based classification and chair-part segmentation, evaluate robustness under two perturbations, and then add a locality-based model (DGCNN) for comparison.
Q1 - Point Cloud Classification
Overall Classification Accuracy
I train a baseline PointNet classifier on 3D point clouds.
| Model | Accuracy file | Default test accuracy | Rotated test accuracy (exp1) | 100-point accuracy (exp2) |
|---|---|---|---|---|
| PointNet | output/cls/cls_accuracy_both.txt |
97.59% | 80.17% | 92.34% – 92.97% (10 runs) |
| DGCNN | output/cls/cls_dgcnn_accuracy_both.txt |
95.28% | 88.56% | 36.51% – 38.93% (10 runs, unstable) |
PointNet performs consistently well across all tests. DGCNN classification underperforms due to memory limitations and early underfitting.
Qualitative Classification Results
Below are sample test objects with predicted labels from the PointNet-based classifier.
These samples include both easy and borderline cases where some cases were confused.
Q2 - Chair Part Segmentation
Overall Segmentation Accuracy
I train both PointNet and DGCNN segmentation models. Metrics below reflect per-point accuracy over the entire test set.
| Model | Accuracy file | Default test accuracy | Rotated accuracy (exp1) | 100-point accuracy (exp2) |
|---|---|---|---|---|
| PointNet | output/seg/seg_accuracy_both.txt |
89.20% | 78.94% | 82.86% – 83.44% |
| DGCNN | output/seg/seg_dgcnn_accuracy_both.txt |
88.13% | 82.73% | 65.28% – 66.43% |
The PointNet segmentation model remains stable under rotation and subsampling. DGCNN segmentation degrades more severely, especially with 100-point input.
Qualitative Segmentation Results
Below are all the default qualitative examples saved by eval_seg.py. For each index
I show the ground truth part labels and the predicted labels side by side.
These examples span a range of chair geometries and viewpoints. Errors tend to occur on thin structures such as legs and armrests, where small changes in sampling or rotation have a large effect on local geometry.
Q3 - Robustness Experiments
3.1 Experiment 1 - Rotation robustness
In Experiment 1 I rotate test point clouds by different angles and reuse the same trained models.
Classification examples under rotation
Segmentation examples under rotation (exp1)
For rotation robustness (exp1), the script saves files in the format
seg_{index}_gt_both.gif and seg_{index}_pred_both.gif.
These rotated examples highlight where rotation sensitivity affects part boundaries. Larger chairs with wide backs are stable, while thin legs tend to drift more under rotation.
3.2 Experiment 2 - Second robustness factor
Experiment 2 uses output/cls/cls_exp2_*.gif and output/seg/exp2 to test a second
robustness factor (varying the number of points). I show representative qualitative examples.
Classification examples (exp2)
Segmentation examples (exp2)
In exp2 I repeatedly subsample only 100 points per object and re-evaluate the segmentation
model. For each run k = 1 \dots 10, the script saves
seg_0_gt_both_k.gif and seg_0_pred_both_k.gif for index 0.
Below I show ground truth vs prediction for all 10 runs.
Across the 10 subsampling runs with only 100 input points, the large scale structure of the chair is preserved, but thin parts such as legs and armrests occasionally disappear or are mislabeled, reflecting the loss of geometric detail under aggressive downsampling.
Q4 - Locality and DGCNN
4.1 DGCNN model and comparison
I implemented a DGCNN architecture following EdgeConv with dynamic k-NN graphs. However, due to GPU memory limits, DGCNN had to be trained with much smaller batch sizes and fewer epochs. As a result, it consistently underfit and performed worse than PointNet across all tasks.
| Task | Model | Accuracy file | Metric | Value |
|---|---|---|---|---|
| Classification | PointNet | cls_accuracy_both.txt |
Default | 97.59% |
| Classification | PointNet | cls_accuracy_both.txt |
Rotated (exp1) | 80.17% |
| Classification | PointNet | cls_accuracy_both.txt |
100-point (exp2) | 92.34% – 92.97% |
| Classification | DGCNN | cls_dgcnn_accuracy_both.txt |
Default | 95.28% |
| Classification | DGCNN | cls_dgcnn_accuracy_both.txt |
Rotated (exp1) | 88.56% |
| Classification | DGCNN | cls_dgcnn_accuracy_both.txt |
100-point (exp2) | 36.51% – 38.93% |
| Segmentation | PointNet | seg_accuracy_both.txt |
Default | 89.20% |
| Segmentation | PointNet | seg_accuracy_both.txt |
Rotated (exp1) | 78.94% |
| Segmentation | PointNet | seg_accuracy_both.txt |
100-point (exp2) | 82.86% – 83.44% |
| Segmentation | DGCNN | seg_dgcnn_accuracy_both.txt |
Default | 88.13% |
| Segmentation | DGCNN | seg_dgcnn_accuracy_both.txt |
Rotated (exp1) | 82.73% |
| Segmentation | DGCNN | seg_dgcnn_accuracy_both.txt |
100-point (exp2) | 65.28% – 66.43% |
Locality should help DGCNN, but because my implementation ran with extremely small batch sizes and fewer updates, the model underfit. DGCNN performs worse than PointNet in every scenario, especially under the extreme 100-point subsampling condition where performance collapses.
4.2 Qualitative comparison of locality
Even though DGCNN theoretically captures local geometric relationships, in my results the undertrained model produced
noisier and less consistent predictions than PointNet. Below I directly compare the two models using filenames that
differ only by the cls → cls_dgcnn or seg → seg_dgcnn substitution.
Classification – default test set
The DGCNN classifier showed noticeably less stable predictions, likely because the model was not trained long enough to meaningfully leverage local neighborhood features.
Segmentation – default test set
Segmentation – rotation robustness (exp1)
Segmentation – subsampling robustness (exp2)
Under point subsampling, DGCNN fluctuated more across runs, while PointNet remained more consistent. This again reflects that my DGCNN model underfit due to memory limits and reduced training depth.