Skip to content

Commit 3274a50

Browse files
author
Tao Peng
authored
improve error message for duplication errors (#609)
* improve error message for duplication errors * fix * fix types
1 parent efbbd4d commit 3274a50

File tree

3 files changed

+43
-41
lines changed

3 files changed

+43
-41
lines changed

mapillary_tools/exceptions.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ class MapillaryInvalidBlackVueVideoError(
6767

6868

6969
class MapillaryDuplicationError(_MapillaryDescriptionError):
70-
def __init__(self, message: str, desc: T.Mapping) -> None:
70+
def __init__(
71+
self,
72+
message: str,
73+
desc: T.Mapping,
74+
distance: float,
75+
angle_diff: T.Optional[float],
76+
) -> None:
7177
super().__init__(message)
7278
self.desc = desc
79+
self.distance = distance
80+
self.angle_diff = angle_diff

mapillary_tools/process_sequence_properties.py

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -40,52 +40,53 @@ def cut_sequence_by_time_distance(
4040
return sequences
4141

4242

43-
def find_duplicates(
43+
def duplication_check(
4444
sequence: PointSequence,
4545
duplicate_distance: float,
4646
duplicate_angle: float,
47-
) -> T.List[int]:
48-
if not sequence:
49-
return []
47+
) -> T.Tuple[PointSequence, T.List[types.ErrorMetadata]]:
48+
dedups: PointSequence = []
49+
dups: T.List[types.ErrorMetadata] = []
5050

51-
duplicates = []
5251
sequence_iter = iter(sequence)
5352
prev = next(sequence_iter)
54-
for idx, cur in enumerate(sequence_iter):
53+
if prev is None:
54+
return dedups, dups
55+
dedups.append(prev)
56+
57+
for cur in sequence_iter:
58+
# invariant: prev is processed
5559
distance = geo.gps_distance(
5660
(prev.lat, prev.lon),
5761
(cur.lat, cur.lon),
5862
)
59-
distance_duplicated = distance <= duplicate_distance
6063

6164
if prev.angle is not None and cur.angle is not None:
62-
bearing_delta = geo.diff_bearing(prev.angle, cur.angle)
63-
angle_duplicated = bearing_delta <= duplicate_angle
65+
angle_diff = geo.diff_bearing(prev.angle, cur.angle)
6466
else:
65-
angle_duplicated = False
66-
67-
if distance_duplicated and angle_duplicated:
68-
duplicates.append(idx + 1)
69-
continue
70-
71-
prev = cur
72-
73-
return duplicates
67+
angle_diff = None
7468

69+
if distance <= duplicate_distance and (
70+
angle_diff is not None and angle_diff <= duplicate_angle
71+
):
72+
dups.append(
73+
types.describe_error_metadata(
74+
MapillaryDuplicationError(
75+
f"Duplicate of its previous image in terms of distance <= {duplicate_distance} and angle <= {duplicate_angle}",
76+
types.as_desc(cur),
77+
distance=distance,
78+
angle_diff=angle_diff,
79+
),
80+
cur.filename,
81+
filetype=types.FileType.IMAGE,
82+
),
83+
)
84+
# prev does not change
85+
else:
86+
dedups.append(cur)
87+
prev = cur
88+
# invariant: cur is processed
7589

76-
def duplication_check(
77-
sequence: PointSequence,
78-
duplicate_distance: float,
79-
duplicate_angle: float,
80-
) -> T.Tuple[PointSequence, PointSequence]:
81-
dup_indices = find_duplicates(
82-
sequence,
83-
duplicate_distance=duplicate_distance,
84-
duplicate_angle=duplicate_angle,
85-
)
86-
dup_set = set(dup_indices)
87-
dedups = [image for idx, image in enumerate(sequence) if idx not in dup_set]
88-
dups = [image for idx, image in enumerate(sequence) if idx in dup_set]
8990
return dedups, dups
9091

9192

@@ -207,14 +208,7 @@ def process_sequence_properties(
207208
duplicate_angle=duplicate_angle,
208209
)
209210
assert len(sequence) == len(dedups) + len(dups)
210-
for dup in dups:
211-
error_metadatas.append(
212-
types.describe_error_metadata(
213-
MapillaryDuplicationError("duplicated", types.as_desc(dup)),
214-
dup.filename,
215-
filetype=types.FileType.IMAGE,
216-
),
217-
)
211+
error_metadatas.extend(dups)
218212

219213
# interpolate angles
220214
if interpolate_directions:

tests/unit/test_exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def test_all():
2121
if exc is exceptions.MapillaryOutsideGPXTrackError:
2222
e = exc("hello", "world", "hey", "aa")
2323
elif exc is exceptions.MapillaryDuplicationError:
24-
e = exc("hello", {})
24+
e = exc("hello", {}, 1, float("inf"))
2525
else:
2626
e = exc("hello")
2727
# should not raise

0 commit comments

Comments
 (0)