2
2
from pathlib import Path
3
3
from unittest import mock
4
4
5
+ from numpy .testing import assert_array_equal
5
6
from PIL import Image
6
7
import pytest
7
8
10
11
from landingai .pipeline .frameset import FrameSet , Frame , PredictionList
11
12
12
13
13
- def get_frameset () -> FrameSet :
14
- return FrameSet .from_image ("tests/data/images/cereal1.jpeg" )
14
+ def get_frameset (image_path : str = "tests/data/images/cereal1.jpeg" ) -> FrameSet :
15
+ return FrameSet .from_image (image_path )
15
16
16
17
17
- def get_frame () -> Frame :
18
- return Frame .from_image ("tests/data/images/cereal1.jpeg" )
18
+ def get_frame (image_path : str = "tests/data/images/cereal1.jpeg" ) -> Frame :
19
+ return Frame .from_image (image_path )
19
20
20
21
21
- def get_frameset_with_od_coffee_prediction () -> FrameSet :
22
- frameset = get_frameset ()
22
+ def get_frameset_with_od_coffee_prediction (
23
+ image_path : str = "tests/data/images/cereal1.jpeg" ,
24
+ ) -> FrameSet :
25
+ frameset = get_frameset (image_path )
23
26
frameset .frames [0 ].predictions = PredictionList (
24
27
[
25
28
ObjectDetectionPrediction (
@@ -34,8 +37,10 @@ def get_frameset_with_od_coffee_prediction() -> FrameSet:
34
37
return frameset
35
38
36
39
37
- def get_frame_with_od_coffee_prediction () -> Frame :
38
- frame = get_frame ()
40
+ def get_frame_with_od_coffee_prediction (
41
+ image_path : str = "tests/data/images/cereal1.jpeg" ,
42
+ ) -> Frame :
43
+ frame = get_frame (image_path )
39
44
frame .predictions = PredictionList (
40
45
[
41
46
ObjectDetectionPrediction (
@@ -234,6 +239,106 @@ def test_frameset_downsize_bigger_than_original(frame_getter):
234
239
assert get_image_from_frame_or_frameset (frame ).size == (width , height )
235
240
236
241
242
+ @pytest .mark .parametrize (
243
+ "frame_getter" ,
244
+ [
245
+ get_frameset_with_od_coffee_prediction ,
246
+ get_frame_with_od_coffee_prediction ,
247
+ ],
248
+ )
249
+ def test_crop (frame_getter ):
250
+ frame = frame_getter ()
251
+ image = get_image_from_frame_or_frameset (frame )
252
+ width , height = image .size
253
+ # Crop 5px from each side
254
+ frame .crop ((5 , 5 , width - 5 , height - 5 ))
255
+ assert get_image_from_frame_or_frameset (frame ).size == (width - 10 , height - 10 )
256
+
257
+
258
+ @pytest .mark .parametrize (
259
+ "frame_getter" ,
260
+ [
261
+ get_frameset_with_od_coffee_prediction ,
262
+ get_frame_with_od_coffee_prediction ,
263
+ ],
264
+ )
265
+ @pytest .mark .parametrize (
266
+ "enhancement" ,
267
+ [
268
+ ("adjust_sharpness" , 1.0 ),
269
+ ("adjust_brightness" , 1.0 ),
270
+ ("adjust_contrast" , 1.0 ),
271
+ ("adjust_color" , 1.0 ),
272
+ ],
273
+ )
274
+ def test_enhancements_no_op (enhancement , frame_getter ):
275
+ """Checks each enhancement method with it's no-op factor, making sure the frame
276
+ will be exactly the same after the operation"""
277
+ enhancement_method , enhancement_factor = enhancement
278
+ frame = frame_getter ()
279
+ original_frame = frame .copy ()
280
+ getattr (frame , enhancement_method )(enhancement_factor )
281
+
282
+ original_image = get_image_from_frame_or_frameset (original_frame )
283
+ image = get_image_from_frame_or_frameset (frame )
284
+ assert original_image is not image
285
+ assert_array_equal (original_image , image )
286
+
287
+
288
+ @pytest .mark .parametrize (
289
+ "frame_getter" ,
290
+ [
291
+ get_frameset_with_od_coffee_prediction ,
292
+ get_frame_with_od_coffee_prediction ,
293
+ ],
294
+ )
295
+ @pytest .mark .parametrize (
296
+ "enhancement" ,
297
+ [
298
+ ("adjust_sharpness" , 1.5 , "sharpness-1.5.jpeg" ),
299
+ ("adjust_brightness" , 1.5 , "brightness-1.5.jpeg" ),
300
+ ("adjust_contrast" , 1.5 , "contrast-1.5.jpeg" ),
301
+ ("adjust_color" , 1.5 , "color-1.5.jpeg" ),
302
+ ],
303
+ )
304
+ def test_enhancements (enhancement , frame_getter ):
305
+ """Checks each enhancement method with it's factor, making sure the frame
306
+ wil be changed after the operation"""
307
+ enhancement_method , enhancement_factor , expected_img_file = enhancement
308
+ img_folder = "tests/data/images/cereal-tiny/"
309
+ frame = frame_getter (image_path = f"{ img_folder } /original.jpeg" )
310
+ original_frame = frame .copy ()
311
+ getattr (frame , enhancement_method )(enhancement_factor )
312
+
313
+ original_image = get_image_from_frame_or_frameset (original_frame )
314
+ image = get_image_from_frame_or_frameset (frame )
315
+ assert original_image is not image
316
+
317
+ expected_content = Image .open (f"{ img_folder } /{ expected_img_file } " )
318
+ assert_array_equal (image , expected_content )
319
+
320
+
321
+ @pytest .mark .parametrize (
322
+ "frame_getter" ,
323
+ [
324
+ get_frameset_with_od_coffee_prediction ,
325
+ get_frame_with_od_coffee_prediction ,
326
+ ],
327
+ )
328
+ def test_copy_operation (frame_getter ):
329
+ frame = frame_getter ()
330
+ width , height = get_image_from_frame_or_frameset (frame ).size
331
+ new_frame = frame .copy ()
332
+ # Do any operation on the new frame, so we can test if the original frame is preserved
333
+ new_frame .crop ((0 , 0 , 1 , 1 ))
334
+
335
+ original_image = get_image_from_frame_or_frameset (frame )
336
+ new_image = get_image_from_frame_or_frameset (new_frame )
337
+ assert frame .predictions == new_frame .predictions
338
+ assert original_image is not new_image
339
+ assert original_image .size == (width , height )
340
+
341
+
237
342
@pytest .mark .parametrize (
238
343
"frame_getter" ,
239
344
[
0 commit comments