Test Accuracy of the best Model : 98.11%
Visualization Table:
| Input Point-Cloud | Ground Truth | Predicted Class | Prediction - Success/Failure |
|---|---|---|---|
![]() |
Chair | Chair | Success |
![]() |
Vase | Vase | Success |
![]() |
Lamp | Lamp | Success |
![]() |
Lamp | Vase | Failure |
![]() |
Vase | Lamp | Failure |
By checking the failure cases it is clear that the pointclouds that the model fails for has a very similar geometry for the other class. Even I was confused a little bit. Pointclouds inherently check only the structure but has no information about the semantics. So if there's an object which has a similar geometry but is a different class it is bound to fail. We should use semantic information or image information for better performance. Interestingly, there was no failure with the chairs class. I believe because of the completely different geometric figure, it would be hard to mis-classify the chair class pointclouds.
Test Accuracy of the best Model : 90.32%
Visualization Table:
| GT Point-Cloud | Predicted Point-Cloud | Segmentation - Success/Failure | Prediction Accuracy |
|---|---|---|---|
![]() |
![]() |
Failure | 50.82% |
![]() |
![]() |
Success | 96.95% |
![]() |
![]() |
Success | 97.99% |
![]() |
![]() |
Failure | 54.76% |
![]() |
![]() |
Success | 96.17% |
By checking the failure cases I observe that the segmentation fails if the pointclouds are too big. If the object itself is very big then the segmentation gets confused and is not able to distinguish certain features. This might be worse when curved features are involved as well.
Procedure:
Baseline Evaluation: First, evaluate the model on the original test set without any rotation to establish baseline accuracy (0° rotation).
Rotation Transformation: For each test point cloud, apply a 3D rotation transformation around the z-axis using Euler angles. The rotation is performed by:
Rotation.from_euler() functionrotated_points = points @ rotation_matrix.TEvaluation at Multiple Angles: Test the model at rotation angles of 15°, 30°, 45°, 60° and 90° around the z-axis. For each angle:
Accuracy Performance Table:
Baseline: 0 degrees in Z axis
| Angle (degrees) in Z axis | Accuracy (%) | Drop from Baseline (%) | Visualisation |
|---|---|---|---|
| 0 | 98.11 | 0.00 | ![]() |
| 15 | 91.50 | 6.61 | ![]() |
| 30 | 59.50 | 38.61 | ![]() |
| 45 | 30.75 | 67.37 | ![]() |
| 60 | 28.44 | 69.67 | ![]() |
| 90 | 24.45 | 73.66 | ![]() |
The poor performance for higher rotations is very much expected as there are no transforms encoded in the current architecture. If i visualise the rotated pointcloud i can clearly see that the current geometry does not match with the classes properly (without rotation that is). As expected, the performance worsens as rotation increases.
Procedure:
Baseline Evaluation: First, evaluate the model on the full test set with all 10,000 points per object to establish baseline accuracy.
Point Subsampling: For each test point cloud, randomly subsample a specified number of points (e.g., 1000, 2000, 5000, 8000) from the original 10,000 points. The subsampling is performed by:
np.random.choice(10000, num_points, replace=False) to randomly select num_points indices without replacementsampled_data = test_data_full[:, ind, :]sampled_label = test_label_full[:, ind]Evaluation at Multiple Point Counts: Test the model with different numbers of points (1000, 2000, 5000, 8000). For each point count:
Accuracy Performance Table:
Baseline: 10000 Points
| Number of Points | Accuracy (%) | Drop from Baseline (%) | Visualization |
|---|---|---|---|
| 1000 | 97.38 | 0.73 | ![]() |
| 2000 | 97.69 | 0.42 | ![]() |
| 5000 | 97.80 | 0.31 | ![]() |
| 8000 | 98.01 | 0.10 | ![]() |
| 10000 | 98.11 | 0.00 | ![]() |
The number of points in the point cloud is not affecting drastically. This makes sense considering that as long as there's enough pointclouds to capture the geometry of the object, the number of pointclouds dont affect the accuracy (drastically). We can see some improvement with increase in number of points as it gives us clearer geometry.
Procedure:
Already explained in section 3.1.1.
Accuracy/Performance Table:
| Angle (degrees) | Accuracy (%) | Drop from Baseline (%) | Ground Truth Segmentation | Predicted Segmentation |
|---|---|---|---|---|
| 0 | 90.32 | 0.00 | ![]() |
![]() |
| 15 | 82.96 | 7.36 | ![]() |
![]() |
| 30 | 69.88 | 20.44 | ![]() |
![]() |
| 45 | 59.65 | 30.67 | ![]() |
![]() |
| 60 | 53.23 | 37.10 | ![]() |
![]() |
| 90 | 45.71 | 44.61 | ![]() |
![]() |
Reasoning: I believe the same reasoning for the classification model can be used here as well. Due to lack of transformations the model is not able to learn to segment efficiently.
Procedure:
Already explained in section 3.1.2.
Accuracy/Performance Table:
| Number of Points | Accuracy (%) | Drop from Baseline (%) | Ground Truth Segmentation | Predicted Segmentation |
|---|---|---|---|---|
| 1000 | 89.77 | 0.55 | ![]() |
![]() |
| 2000 | 90.23 | 0.09 | ![]() |
![]() |
| 5000 | 90.34 | -0.02 | ![]() |
![]() |
| 8000 | 90.32 | 0.00 | ![]() |
![]() |
| 10000 | 90.32 | 0.00 | ![]() |
![]() |
Reasoning: The same reasoning used in section 3.1.2 is applicable here as well.