Skip to content

Commit 8fae2bb

Browse files
authored
Fix coordinates normalization for segmentation (release) (#2148)
* fix coordinates normalization * fix black * fix unit-tests * check if contour more than 2
1 parent 848de1a commit 8fae2bb

File tree

8 files changed

+85
-83
lines changed

8 files changed

+85
-83
lines changed

otx/algorithms/detection/task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def _ins_seg_add_predictions_to_dataset(self, all_results, width, height, confid
491491
if len(contour) <= 2 or probability < confidence_threshold:
492492
continue
493493
if self._task_type == TaskType.INSTANCE_SEGMENTATION:
494-
points = [Point(x=point[0][0] / width, y=point[0][1] / height) for point in contour]
494+
points = [Point(x=point[0][0] / (width - 1), y=point[0][1] / (height - 1)) for point in contour]
495495
else:
496496
box_points = cv2.boxPoints(cv2.minAreaRect(contour))
497497
points = [Point(x=point[0] / width, y=point[1] / height) for point in box_points]

otx/algorithms/detection/tools/instance_segmentation_sample.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def get_image(split_type, subset, label_id):
108108
if len(contour) <= 2:
109109
continue
110110

111-
points = [Point(x=point[0][0] / width, y=point[0][1] / height) for point in contour]
111+
points = [Point(x=point[0][0] / (width - 1), y=point[0][1] / (height - 1)) for point in contour]
112112

113113
return DatasetItemEntity(
114114
media=Image(data=image),

otx/algorithms/segmentation/adapters/mmseg/utils/data_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def create_annotation_from_hard_seg_map(hard_seg_map: np.ndarray, labels: List[L
9393
if len(contour) <= 2:
9494
continue
9595

96-
points = [Point(x=point[0][0] / width, y=point[0][1] / height) for point in contour]
96+
points = [Point(x=point[0][0] / (width - 1), y=point[0][1] / (height - 1)) for point in contour]
9797

9898
annotations.append(
9999
Annotation(

otx/algorithms/segmentation/tools/segmentation_sample.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def get_image(data_type, subset, label_id):
104104
if len(contour) <= 2:
105105
continue
106106

107-
points = [Point(x=point[0][0] / width, y=point[0][1] / height) for point in contour]
107+
points = [Point(x=point[0][0] / (width - 1), y=point[0][1] / (height - 1)) for point in contour]
108108
return DatasetItemEntity(
109109
media=Image(data=image),
110110
annotation_scene=AnnotationSceneEntity(

otx/api/usecases/exportable_code/prediction_to_annotation_converter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,8 @@ def convert_to_annotation(self, predictions: tuple, metadata: Dict[str, Any]) ->
432432
contour = list(contour)
433433
points = [
434434
Point(
435-
x=point[0][0] / metadata["original_shape"][1],
436-
y=point[0][1] / metadata["original_shape"][0],
435+
x=point[0][0] / (metadata["original_shape"][1] - 1),
436+
y=point[0][1] / (metadata["original_shape"][0] - 1),
437437
)
438438
for point in contour
439439
]

otx/api/utils/segmentation_utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,15 @@ def create_annotation_from_segmentation_map(
216216

217217
if hierarchies is not None:
218218
for contour, hierarchy in zip(contours, hierarchies[0]):
219+
if len(contour) <= 2 or cv2.contourArea(contour) < 1.0:
220+
continue
221+
219222
if hierarchy[3] == -1:
220223
# In this case a contour does not represent a hole
221224
contour = list((point[0][0], point[0][1]) for point in contour)
222225

223226
# Split contour into subcontours that do not have self intersections.
224227
subcontours = get_subcontours(contour)
225-
226228
for subcontour in subcontours:
227229
# compute probability of the shape
228230
mask = np.zeros(hard_prediction.shape, dtype=np.uint8)
@@ -236,7 +238,7 @@ def create_annotation_from_segmentation_map(
236238
probability = cv2.mean(current_label_soft_prediction, mask)[0]
237239

238240
# convert the list of points to a closed polygon
239-
points = [Point(x=x / width, y=y / height) for x, y in subcontour]
241+
points = [Point(x=x / (width - 1), y=y / (height - 1)) for x, y in subcontour]
240242
polygon = Polygon(points=points)
241243

242244
if polygon.get_area() > 0:

tests/unit/api/usecases/exportable_code/test_prediction_to_annotation_converter.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -637,27 +637,27 @@ def check_annotation(
637637
expected_label=labels[0],
638638
expected_probability=0.8333333333333333,
639639
expected_points=[
640-
Point(0.0, 0.25),
641-
Point(0.0, 0.5),
642-
Point(0.0, 0.75),
643-
Point(0.25, 0.75),
644-
Point(0.25, 0.5),
645-
Point(0.25, 0.25),
640+
Point(0.0, 0.3333333333333333),
641+
Point(0.0, 0.6666666666666666),
642+
Point(0.0, 1.0),
643+
Point(0.3333333333333333, 1.0),
644+
Point(0.3333333333333333, 0.6666666666666666),
645+
Point(0.3333333333333333, 0.3333333333333333),
646646
],
647647
)
648648
check_annotation(
649649
actual_annotation=predictions_to_annotations.annotations[1],
650650
expected_label=labels[1],
651651
expected_probability=0.8125,
652652
expected_points=[
653-
Point(0.5, 0.0),
654-
Point(0.5, 0.25),
655-
Point(0.5, 0.5),
656-
Point(0.5, 0.75),
657-
Point(0.75, 0.75),
658-
Point(0.75, 0.5),
659-
Point(0.75, 0.25),
660-
Point(0.75, 0.0),
653+
Point(0.6666666666666666, 0.0),
654+
Point(0.6666666666666666, 0.3333333333333333),
655+
Point(0.6666666666666666, 0.6666666666666666),
656+
Point(0.6666666666666666, 1.0),
657+
Point(1.0, 1.0),
658+
Point(1.0, 0.6666666666666666),
659+
Point(1.0, 0.3333333333333333),
660+
Point(1.0, 0.0),
661661
],
662662
)
663663

tests/unit/api/utils/test_segmentation_utils.py

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -414,14 +414,14 @@ def check_annotation(
414414
check_annotation(
415415
annotation=annotations[0],
416416
expected_points=[
417-
Point(0.4, 0.0),
418-
Point(0.2, 0.2),
419-
Point(0.2, 0.4),
420-
Point(0.2, 0.6),
421-
Point(0.4, 0.6),
422-
Point(0.6, 0.6),
423-
Point(0.6, 0.4),
424-
Point(0.6, 0.2),
417+
Point(0.5, 0.0),
418+
Point(0.25, 0.25),
419+
Point(0.25, 0.5),
420+
Point(0.25, 0.75),
421+
Point(0.5, 0.75),
422+
Point(0.75, 0.75),
423+
Point(0.75, 0.5),
424+
Point(0.75, 0.25),
425425
],
426426
expected_label="true_label",
427427
expected_probability=0.7375,
@@ -446,27 +446,27 @@ def check_annotation(
446446
check_annotation(
447447
annotation=annotations[0],
448448
expected_points=[
449-
Point(0.0, 0.25),
450-
Point(0.0, 0.5),
451-
Point(0.0, 0.75),
452-
Point(0.25, 0.75),
453-
Point(0.25, 0.5),
454-
Point(0.25, 0.25),
449+
Point(0.0, 0.3333333333333333),
450+
Point(0.0, 0.6666666666666666),
451+
Point(0.0, 1.0),
452+
Point(0.3333333333333333, 1.0),
453+
Point(0.3333333333333333, 0.6666666666666666),
454+
Point(0.3333333333333333, 0.3333333333333333),
455455
],
456456
expected_label="class_1",
457457
expected_probability=0.83333,
458458
)
459459
check_annotation(
460460
annotation=annotations[1],
461461
expected_points=[
462-
Point(0.5, 0.0),
463-
Point(0.5, 0.25),
464-
Point(0.5, 0.5),
465-
Point(0.5, 0.75),
466-
Point(0.75, 0.75),
467-
Point(0.75, 0.5),
468-
Point(0.75, 0.25),
469-
Point(0.75, 0.0),
462+
Point(0.6666666666666666, 0.0),
463+
Point(0.6666666666666666, 0.3333333333333333),
464+
Point(0.6666666666666666, 0.6666666666666666),
465+
Point(0.6666666666666666, 1.0),
466+
Point(1.0, 1.0),
467+
Point(1.0, 0.6666666666666666),
468+
Point(1.0, 0.3333333333333333),
469+
Point(1.0, 0.0),
470470
],
471471
expected_label="class_2",
472472
expected_probability=0.8125,
@@ -513,18 +513,18 @@ def check_annotation(
513513
check_annotation(
514514
annotation=annotations[0],
515515
expected_points=[
516-
Point(0.25, 0.25),
517-
Point(0.25, 0.375),
518-
Point(0.25, 0.5),
519-
Point(0.25, 0.625),
520-
Point(0.375, 0.625),
521-
Point(0.5, 0.625),
522-
Point(0.625, 0.625),
523-
Point(0.625, 0.5),
524-
Point(0.625, 0.375),
525-
Point(0.625, 0.25),
526-
Point(0.5, 0.25),
527-
Point(0.375, 0.25),
516+
Point(0.2857142857142857, 0.2857142857142857),
517+
Point(0.2857142857142857, 0.42857142857142855),
518+
Point(0.2857142857142857, 0.5714285714285714),
519+
Point(0.2857142857142857, 0.7142857142857143),
520+
Point(0.42857142857142855, 0.7142857142857143),
521+
Point(0.5714285714285714, 0.7142857142857143),
522+
Point(0.7142857142857143, 0.7142857142857143),
523+
Point(0.7142857142857143, 0.5714285714285714),
524+
Point(0.7142857142857143, 0.42857142857142855),
525+
Point(0.7142857142857143, 0.2857142857142857),
526+
Point(0.5714285714285714, 0.2857142857142857),
527+
Point(0.42857142857142855, 0.2857142857142857),
528528
],
529529
expected_label="true_label",
530530
expected_probability=0.90833,
@@ -533,33 +533,33 @@ def check_annotation(
533533
annotation=annotations[1],
534534
expected_points=[
535535
Point(0.0, 0.0),
536-
Point(0.0, 0.125),
537-
Point(0.0, 0.25),
538-
Point(0.0, 0.375),
539-
Point(0.0, 0.5),
540-
Point(0.0, 0.625),
541-
Point(0.0, 0.75),
542-
Point(0.0, 0.875),
543-
Point(0.125, 0.875),
544-
Point(0.25, 0.875),
545-
Point(0.375, 0.875),
546-
Point(0.5, 0.875),
547-
Point(0.625, 0.875),
548-
Point(0.75, 0.875),
549-
Point(0.875, 0.875),
550-
Point(0.875, 0.75),
551-
Point(0.875, 0.625),
552-
Point(0.875, 0.5),
553-
Point(0.875, 0.375),
554-
Point(0.875, 0.25),
555-
Point(0.875, 0.125),
556-
Point(0.875, 0.0),
557-
Point(0.75, 0.0),
558-
Point(0.625, 0.0),
559-
Point(0.5, 0.0),
560-
Point(0.375, 0.0),
561-
Point(0.25, 0.0),
562-
Point(0.125, 0.0),
536+
Point(0.0, 0.14285714285714285),
537+
Point(0.0, 0.2857142857142857),
538+
Point(0.0, 0.42857142857142855),
539+
Point(0.0, 0.5714285714285714),
540+
Point(0.0, 0.7142857142857143),
541+
Point(0.0, 0.8571428571428571),
542+
Point(0.0, 1.0),
543+
Point(0.14285714285714285, 1.0),
544+
Point(0.2857142857142857, 1.0),
545+
Point(0.42857142857142855, 1.0),
546+
Point(0.5714285714285714, 1.0),
547+
Point(0.7142857142857143, 1.0),
548+
Point(0.8571428571428571, 1.0),
549+
Point(1.0, 1.0),
550+
Point(1.0, 0.8571428571428571),
551+
Point(1.0, 0.7142857142857143),
552+
Point(1.0, 0.5714285714285714),
553+
Point(1.0, 0.42857142857142855),
554+
Point(1.0, 0.2857142857142857),
555+
Point(1.0, 0.14285714285714285),
556+
Point(1.0, 0.0),
557+
Point(0.8571428571428571, 0.0),
558+
Point(0.7142857142857143, 0.0),
559+
Point(0.5714285714285714, 0.0),
560+
Point(0.42857142857142855, 0.0),
561+
Point(0.2857142857142857, 0.0),
562+
Point(0.14285714285714285, 0.0),
563563
],
564564
expected_label="true_label",
565565
expected_probability=0.91071,

0 commit comments

Comments
 (0)