@@ -105,54 +105,6 @@ def test_segmentation():
105105 )
106106 assert "Received mask with shape '(1, 2)'" in str (e )
107107
108- # test ground truths cannot overlap
109- with pytest .raises (ValueError ) as e :
110- Segmentation (
111- uid = "uid" ,
112- groundtruths = [
113- Bitmask (
114- mask = np .array ([[True , True , True ]]),
115- label = "label1" ,
116- ),
117- Bitmask (
118- mask = np .array ([[False , False , True ]]),
119- label = "label2" ,
120- ),
121- ],
122- predictions = [
123- Bitmask (
124- mask = np .array ([[True , False , False ]]),
125- label = "label" ,
126- )
127- ],
128- shape = (1 , 3 ),
129- )
130- assert "ground truth masks cannot overlap" in str (e )
131-
132- # test predictions cannot overlap
133- with pytest .raises (ValueError ) as e :
134- Segmentation (
135- uid = "uid" ,
136- groundtruths = [
137- Bitmask (
138- mask = np .array ([[True , True , True ]]),
139- label = "label1" ,
140- ),
141- ],
142- predictions = [
143- Bitmask (
144- mask = np .array ([[True , False , True ]]),
145- label = "label" ,
146- ),
147- Bitmask (
148- mask = np .array ([[False , False , True ]]),
149- label = "label2" ,
150- ),
151- ],
152- shape = (1 , 3 ),
153- )
154- assert "prediction masks cannot overlap" in str (e )
155-
156108 # allow missing ground truths
157109 Segmentation (
158110 uid = "uid" ,
@@ -179,6 +131,22 @@ def test_segmentation():
179131 shape = (1 , 2 ),
180132 )
181133
134+ # wrong annotation type
135+ with pytest .raises (ValueError ):
136+ Segmentation (
137+ uid = "uid" ,
138+ groundtruths = [{"a" : 1 }], # type: ignore - testing
139+ predictions = [],
140+ shape = (1 , 2 ),
141+ )
142+ with pytest .raises (ValueError ):
143+ Segmentation (
144+ uid = "uid" ,
145+ groundtruths = [],
146+ predictions = [{"a" : 1 }], # type: ignore - testing
147+ shape = (1 , 2 ),
148+ )
149+
182150
183151def test_segmentation_shape ():
184152 Segmentation (uid = "uid" , groundtruths = [], predictions = [], shape = (1 , 1 ))
@@ -197,3 +165,58 @@ def test_segmentation_shape():
197165 Segmentation (
198166 uid = "uid" , groundtruths = [], predictions = [], shape = (- 100 , 100 )
199167 )
168+
169+
170+ def _create_overlapped_masks () -> tuple [Bitmask , Bitmask ]:
171+ mask0 = np .zeros ((100 , 100 ), dtype = np .bool_ )
172+ mask0 [:50 , :] = True
173+ mask1 = np .ones ((100 , 100 ), dtype = np .bool_ )
174+ bitmask0 = Bitmask (mask = mask0 , label = "dog" )
175+ bitmask1 = Bitmask (mask = mask1 , label = "cat" )
176+ return bitmask0 , bitmask1
177+
178+
179+ def test_segmentations_overlap ():
180+ bitmask0 , bitmask1 = _create_overlapped_masks ()
181+ Segmentation (
182+ uid = "uid123" ,
183+ groundtruths = [bitmask0 ],
184+ predictions = [bitmask1 ],
185+ shape = (100 , 100 ),
186+ )
187+ assert bitmask0 .mask .sum () == 5000
188+ assert bitmask1 .mask .sum () == 10000
189+
190+ bitmask0 , bitmask1 = _create_overlapped_masks ()
191+ with pytest .warns (UserWarning ) as e :
192+ Segmentation (
193+ uid = "uid123" ,
194+ groundtruths = [bitmask0 , bitmask1 ],
195+ predictions = [],
196+ shape = (100 , 100 ),
197+ )
198+ assert (
199+ str (e ._list [0 ].message )
200+ == "ground truth masks for datum 'uid123' had 5000 / 10000 pixels overlapped."
201+ )
202+ assert bitmask0 .mask .sum () == 5000
203+ assert (
204+ bitmask1 .mask .sum () == 5000
205+ ) # overlapped pixels omitted from second mask
206+
207+ bitmask0 , bitmask1 = _create_overlapped_masks ()
208+ with pytest .warns (UserWarning ) as e :
209+ Segmentation (
210+ uid = "uid123" ,
211+ groundtruths = [],
212+ predictions = [bitmask0 , bitmask1 ],
213+ shape = (100 , 100 ),
214+ )
215+ assert (
216+ str (e ._list [0 ].message )
217+ == "prediction masks for datum 'uid123' had 5000 / 10000 pixels overlapped."
218+ )
219+ assert bitmask0 .mask .sum () == 5000
220+ assert (
221+ bitmask1 .mask .sum () == 5000
222+ ) # overlapped pixels omitted from second mask
0 commit comments