diff --git a/Project-2/Part-1/Project 2 (Part-I)_ PaaS.pdf b/Project-2/Part-1/Project 2 (Part-I)_ PaaS.pdf new file mode 100644 index 0000000..c92530a Binary files /dev/null and b/Project-2/Part-1/Project 2 (Part-I)_ PaaS.pdf differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_0.mp4 b/Tooling/Project_2/dataset/test_case_1/test_0.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_0.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_1.mp4 b/Tooling/Project_2/dataset/test_case_1/test_1.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_1.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_2.mp4 b/Tooling/Project_2/dataset/test_case_1/test_2.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_2.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_4.mp4 b/Tooling/Project_2/dataset/test_case_1/test_4.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_4.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_5.mp4 b/Tooling/Project_2/dataset/test_case_1/test_5.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_5.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_6.mp4 b/Tooling/Project_2/dataset/test_case_1/test_6.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_6.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_7.mp4 b/Tooling/Project_2/dataset/test_case_1/test_7.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_7.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_1/test_8.mp4 b/Tooling/Project_2/dataset/test_case_1/test_8.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_1/test_8.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_00.mp4 b/Tooling/Project_2/dataset/test_case_2/test_00.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_00.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_01.mp4 b/Tooling/Project_2/dataset/test_case_2/test_01.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_01.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_02.mp4 b/Tooling/Project_2/dataset/test_case_2/test_02.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_02.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_03.mp4 b/Tooling/Project_2/dataset/test_case_2/test_03.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_03.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_04.mp4 b/Tooling/Project_2/dataset/test_case_2/test_04.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_04.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_05.mp4 b/Tooling/Project_2/dataset/test_case_2/test_05.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_05.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_06.mp4 b/Tooling/Project_2/dataset/test_case_2/test_06.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_06.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_07.mp4 b/Tooling/Project_2/dataset/test_case_2/test_07.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_07.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_08.mp4 b/Tooling/Project_2/dataset/test_case_2/test_08.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_08.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_09.mp4 b/Tooling/Project_2/dataset/test_case_2/test_09.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_09.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_10.mp4 b/Tooling/Project_2/dataset/test_case_2/test_10.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_10.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_11.mp4 b/Tooling/Project_2/dataset/test_case_2/test_11.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_11.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_12.mp4 b/Tooling/Project_2/dataset/test_case_2/test_12.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_12.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_13.mp4 b/Tooling/Project_2/dataset/test_case_2/test_13.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_13.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_14.mp4 b/Tooling/Project_2/dataset/test_case_2/test_14.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_14.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_15.mp4 b/Tooling/Project_2/dataset/test_case_2/test_15.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_15.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_16.mp4 b/Tooling/Project_2/dataset/test_case_2/test_16.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_16.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_17.mp4 b/Tooling/Project_2/dataset/test_case_2/test_17.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_17.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_18.mp4 b/Tooling/Project_2/dataset/test_case_2/test_18.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_18.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_19.mp4 b/Tooling/Project_2/dataset/test_case_2/test_19.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_19.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_20.mp4 b/Tooling/Project_2/dataset/test_case_2/test_20.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_20.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_21.mp4 b/Tooling/Project_2/dataset/test_case_2/test_21.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_21.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_22.mp4 b/Tooling/Project_2/dataset/test_case_2/test_22.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_22.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_23.mp4 b/Tooling/Project_2/dataset/test_case_2/test_23.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_23.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_24.mp4 b/Tooling/Project_2/dataset/test_case_2/test_24.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_24.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_25.mp4 b/Tooling/Project_2/dataset/test_case_2/test_25.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_25.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_26.mp4 b/Tooling/Project_2/dataset/test_case_2/test_26.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_26.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_27.mp4 b/Tooling/Project_2/dataset/test_case_2/test_27.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_27.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_28.mp4 b/Tooling/Project_2/dataset/test_case_2/test_28.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_28.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_29.mp4 b/Tooling/Project_2/dataset/test_case_2/test_29.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_29.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_30.mp4 b/Tooling/Project_2/dataset/test_case_2/test_30.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_30.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_31.mp4 b/Tooling/Project_2/dataset/test_case_2/test_31.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_31.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_32.mp4 b/Tooling/Project_2/dataset/test_case_2/test_32.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_32.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_33.mp4 b/Tooling/Project_2/dataset/test_case_2/test_33.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_33.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_34.mp4 b/Tooling/Project_2/dataset/test_case_2/test_34.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_34.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_35.mp4 b/Tooling/Project_2/dataset/test_case_2/test_35.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_35.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_36.mp4 b/Tooling/Project_2/dataset/test_case_2/test_36.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_36.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_37.mp4 b/Tooling/Project_2/dataset/test_case_2/test_37.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_37.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_38.mp4 b/Tooling/Project_2/dataset/test_case_2/test_38.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_38.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_39.mp4 b/Tooling/Project_2/dataset/test_case_2/test_39.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_39.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_40.mp4 b/Tooling/Project_2/dataset/test_case_2/test_40.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_40.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_41.mp4 b/Tooling/Project_2/dataset/test_case_2/test_41.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_41.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_42.mp4 b/Tooling/Project_2/dataset/test_case_2/test_42.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_42.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_43.mp4 b/Tooling/Project_2/dataset/test_case_2/test_43.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_43.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_44.mp4 b/Tooling/Project_2/dataset/test_case_2/test_44.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_44.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_45.mp4 b/Tooling/Project_2/dataset/test_case_2/test_45.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_45.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_46.mp4 b/Tooling/Project_2/dataset/test_case_2/test_46.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_46.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_47.mp4 b/Tooling/Project_2/dataset/test_case_2/test_47.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_47.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_48.mp4 b/Tooling/Project_2/dataset/test_case_2/test_48.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_48.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_49.mp4 b/Tooling/Project_2/dataset/test_case_2/test_49.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_49.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_50.mp4 b/Tooling/Project_2/dataset/test_case_2/test_50.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_50.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_51.mp4 b/Tooling/Project_2/dataset/test_case_2/test_51.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_51.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_52.mp4 b/Tooling/Project_2/dataset/test_case_2/test_52.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_52.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_53.mp4 b/Tooling/Project_2/dataset/test_case_2/test_53.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_53.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_54.mp4 b/Tooling/Project_2/dataset/test_case_2/test_54.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_54.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_55.mp4 b/Tooling/Project_2/dataset/test_case_2/test_55.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_55.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_56.mp4 b/Tooling/Project_2/dataset/test_case_2/test_56.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_56.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_57.mp4 b/Tooling/Project_2/dataset/test_case_2/test_57.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_57.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_58.mp4 b/Tooling/Project_2/dataset/test_case_2/test_58.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_58.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_59.mp4 b/Tooling/Project_2/dataset/test_case_2/test_59.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_59.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_60.mp4 b/Tooling/Project_2/dataset/test_case_2/test_60.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_60.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_61.mp4 b/Tooling/Project_2/dataset/test_case_2/test_61.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_61.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_62.mp4 b/Tooling/Project_2/dataset/test_case_2/test_62.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_62.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_63.mp4 b/Tooling/Project_2/dataset/test_case_2/test_63.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_63.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_64.mp4 b/Tooling/Project_2/dataset/test_case_2/test_64.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_64.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_65.mp4 b/Tooling/Project_2/dataset/test_case_2/test_65.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_65.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_66.mp4 b/Tooling/Project_2/dataset/test_case_2/test_66.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_66.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_67.mp4 b/Tooling/Project_2/dataset/test_case_2/test_67.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_67.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_68.mp4 b/Tooling/Project_2/dataset/test_case_2/test_68.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_68.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_69.mp4 b/Tooling/Project_2/dataset/test_case_2/test_69.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_69.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_70.mp4 b/Tooling/Project_2/dataset/test_case_2/test_70.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_70.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_71.mp4 b/Tooling/Project_2/dataset/test_case_2/test_71.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_71.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_72.mp4 b/Tooling/Project_2/dataset/test_case_2/test_72.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_72.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_73.mp4 b/Tooling/Project_2/dataset/test_case_2/test_73.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_73.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_74.mp4 b/Tooling/Project_2/dataset/test_case_2/test_74.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_74.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_75.mp4 b/Tooling/Project_2/dataset/test_case_2/test_75.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_75.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_76.mp4 b/Tooling/Project_2/dataset/test_case_2/test_76.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_76.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_77.mp4 b/Tooling/Project_2/dataset/test_case_2/test_77.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_77.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_78.mp4 b/Tooling/Project_2/dataset/test_case_2/test_78.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_78.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_79.mp4 b/Tooling/Project_2/dataset/test_case_2/test_79.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_79.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_80.mp4 b/Tooling/Project_2/dataset/test_case_2/test_80.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_80.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_81.mp4 b/Tooling/Project_2/dataset/test_case_2/test_81.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_81.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_82.mp4 b/Tooling/Project_2/dataset/test_case_2/test_82.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_82.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_83.mp4 b/Tooling/Project_2/dataset/test_case_2/test_83.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_83.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_84.mp4 b/Tooling/Project_2/dataset/test_case_2/test_84.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_84.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_85.mp4 b/Tooling/Project_2/dataset/test_case_2/test_85.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_85.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_86.mp4 b/Tooling/Project_2/dataset/test_case_2/test_86.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_86.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_87.mp4 b/Tooling/Project_2/dataset/test_case_2/test_87.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_87.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_88.mp4 b/Tooling/Project_2/dataset/test_case_2/test_88.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_88.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_89.mp4 b/Tooling/Project_2/dataset/test_case_2/test_89.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_89.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_90.mp4 b/Tooling/Project_2/dataset/test_case_2/test_90.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_90.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_91.mp4 b/Tooling/Project_2/dataset/test_case_2/test_91.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_91.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_92.mp4 b/Tooling/Project_2/dataset/test_case_2/test_92.mp4 new file mode 100644 index 0000000..bd5261d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_92.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_93.mp4 b/Tooling/Project_2/dataset/test_case_2/test_93.mp4 new file mode 100644 index 0000000..4972144 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_93.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_94.mp4 b/Tooling/Project_2/dataset/test_case_2/test_94.mp4 new file mode 100644 index 0000000..a2c55c2 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_94.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_95.mp4 b/Tooling/Project_2/dataset/test_case_2/test_95.mp4 new file mode 100644 index 0000000..e451419 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_95.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_96.mp4 b/Tooling/Project_2/dataset/test_case_2/test_96.mp4 new file mode 100644 index 0000000..899d123 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_96.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_97.mp4 b/Tooling/Project_2/dataset/test_case_2/test_97.mp4 new file mode 100644 index 0000000..fd4dfd3 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_97.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_98.mp4 b/Tooling/Project_2/dataset/test_case_2/test_98.mp4 new file mode 100644 index 0000000..6f5be79 Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_98.mp4 differ diff --git a/Tooling/Project_2/dataset/test_case_2/test_99.mp4 b/Tooling/Project_2/dataset/test_case_2/test_99.mp4 new file mode 100644 index 0000000..141f32d Binary files /dev/null and b/Tooling/Project_2/dataset/test_case_2/test_99.mp4 differ diff --git a/Tooling/Project_2/grading_scripts/README.md b/Tooling/Project_2/grading_scripts/README.md new file mode 100644 index 0000000..66cd7a6 --- /dev/null +++ b/Tooling/Project_2/grading_scripts/README.md @@ -0,0 +1,75 @@ +### Grading Scripts + + - How to run the script: + ``` + usage: grader_script_p1.py [-h] [--access_key ACCESS_KEY] [--secret_key SECRET_KEY] [--input_bucket INPUT_BUCKET] [--lambda_name LAMBDA_NAME] + Grading Script + options: + -h, --help show this help message and exit + --access_key ACCESS_KEY + ACCCESS KEY ID of the grading IAM user + --secret_key SECRET_KEY + SECRET KEY of the grading IAM user + --input_bucket INPUT_BUCKET + Name of the S3 Input Bucket + --output_bucket OUTPUT_BUCKET + Name of the S3 Output Bucket + --lambda_name LAMBDA_NAME + Name of the Lambda function + + ``` + **Note**: We will follow the naming conventions for S3 Bucket and Lambda function names as described in the project document to grade your submission + +**Examples**: + +We will show examples for each option below. + +**Validate Lambda**: + + - Successful Test + ``` + python grading_scripts/grader_script_p1.py --access_key XXXX --secret_key XXXX --input_bucket 1234567890-input --lambda_name Video-splitting + + ============================================================================= +======== Welcome to CSE546 Cloud Computing AWS Console ====================== +============================================================================= +IAM ACESS KEY ID: XXXX +IAM SECRET ACCESS KEY: XXXX +============================================================================= +1 - Validate 1 Lambda function +2 - Validate S3 Buckets names and initial states +3 - Validate S3 output bucket subfolders +4 - Validate S3 output objects +5 - Check lambda average duration +6 - Check lambda concurrency +0 - Exit +Enter a choice: 1 + +Lambda function Video-splitting HTTPStatusCode 200 +Test status of Test_1 : PASS + + + + ``` + - Failed Test + ``` + python grading_scripts/grader_script_p1.py --access_key XXXX --secret_key XXXX --input_bucket 1234567890-input --lambda_name Video-splitting + + ============================================================================= +======== Welcome to CSE546 Cloud Computing AWS Console ====================== +============================================================================= +IAM ACESS KEY ID: XXXX +IAM SECRET ACCESS KEY: XXXX +============================================================================= +1 - Validate 1 Lmabda function +2 - Validate S3 Buckets names and initial states +3 - Validate S3 output bucket subfolders +4 - Validate S3 output objects +5 - Check lambda average latency +6 - Check lambda concurrency +0 - Exit +Enter a choice: 1 + +Error An error occurred (ResourceNotFoundException) when calling the GetFunction operation: Function not found: arn:aws:lambda:us-east-1:252116767176:function:Video-splitting +Test status of Test_1 : FAIL + ``` diff --git a/Tooling/Project_2/grading_scripts/grader_script_p1.py b/Tooling/Project_2/grading_scripts/grader_script_p1.py new file mode 100644 index 0000000..2a1cd34 --- /dev/null +++ b/Tooling/Project_2/grading_scripts/grader_script_p1.py @@ -0,0 +1,270 @@ +__copyright__ = "Copyright 2024, VISA Lab" +__license__ = "MIT" + +import pdb +import time +import botocore +import argparse +import textwrap +import boto3 +from boto3 import client as boto3_client +from botocore.exceptions import ClientError +from datetime import datetime,timezone,timedelta + +class aws_grader(): + def __init__(self, access_key, secret_key, input_bucket, output_bucket, lambda_name, region): + + self.access_key = access_key + self.secret_key = secret_key + self.region = region + self.s3 = boto3_client('s3', aws_access_key_id=self.access_key, + aws_secret_access_key=self.secret_key, region_name=region) + self.cloudwatch = boto3_client('cloudwatch', aws_access_key_id=self.access_key, + aws_secret_access_key=self.secret_key, region_name=region) + self.iam_session = boto3.Session(aws_access_key_id=self.access_key, + aws_secret_access_key=self.secret_key) + self.s3_resources = self.iam_session.resource('s3', region) + self.lambda_function = boto3_client('lambda', aws_access_key_id=self.access_key, + aws_secret_access_key=self.secret_key, region_name=region) + self.in_bucket_name = input_bucket + self.out_bucket_name = output_bucket + self.lambda_name = lambda_name + self.test_result = {} + + def validate_lambda_exists(self, TC_num): + try: + response = self.lambda_function.get_function( + FunctionName=self.lambda_name + ) + print(f"Lambda function {self.lambda_name} HTTPStatusCode {response['ResponseMetadata']['HTTPStatusCode']}") + self.test_result[TC_num] = "PASS" + except self.lambda_function.exceptions.ResourceNotFoundException as e: + print(f"Error {e}") + self.test_result[TC_num] = "FAIL" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + def validate_s3_subfolders(self, TC_num): + in_objects = self.s3.list_objects_v2(Bucket=self.in_bucket_name) + if in_objects['KeyCount']==0: + self.test_result[TC_num] = "FAIL" + print(f"Empty bucket {self.in_bucket_name}") + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + return + self.test_result[TC_num] = "PASS" + for obj in in_objects['Contents']: + folder_name = obj['Key'].rsplit('.',1)[0] + out_objects = self.s3.list_objects_v2(Bucket=self.out_bucket_name, Prefix=folder_name, Delimiter='/') + if out_objects['KeyCount'] == 1 or out_objects['KeyCount'] == 11: + folder_name = out_objects['CommonPrefixes'][0]['Prefix'].rsplit("/")[0] + prefix_name = out_objects['Prefix'] + if folder_name == prefix_name: + print(f"{prefix_name} matches with {folder_name}") + else: + prefix_name = out_objects['Prefix'] + self.test_result[TC_num] = "FAIL" + print(f"NO folder named {prefix_name}") + print(out_objects) + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + def validate_s3_output_objects(self, TC_num): + bucket = self.s3_resources.Bucket(self.out_bucket_name) + in_bucket = self.s3_resources.Bucket(self.in_bucket_name) + + try: + objects = list(bucket.objects.all()) + print(f"Got {len(objects)} objects {[o.key for o in objects]} from bucket {bucket.name}") + in_objects = list(in_bucket.objects.all()) + self.test_result[TC_num] = "PASS" + + for i,folder_n in enumerate(in_objects): + if len(in_objects) * 10 == len(objects) or len(in_objects) * 11 == len(objects): + print(f"Number of objects matches for given input {folder_n}") + self.test_result[TC_num] = "PASS" + else: + self.test_result[TC_num] = "FAIL" + break + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + + except ClientError: + print(f"Couldn't get objects for bucket {bucket.name}") + raise + else: + return + + # You have to make sure to run the workload generator and it executes within 15 mins + # of polling for cloudwatch metrics. + def check_lambda_duration(self, TC_num): + response = self.cloudwatch.get_metric_data( + MetricDataQueries=[ + { + 'Id': 'testDuration', + 'MetricStat': { + 'Metric': { + 'Namespace': 'AWS/Lambda', + 'MetricName': 'Duration' + }, + 'Period': 600, + 'Stat': 'Average' + }, + 'ReturnData': True, + }, + ], + StartTime=datetime.now().utcnow() - timedelta(minutes=15), + EndTime=datetime.now().utcnow(), + ScanBy='TimestampAscending' + ) + print(response['MetricDataResults'][0]['Values']) + values = response['MetricDataResults'][0]['Values'] + if not values: + self.test_result[TC_num] = "FAIL" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + return + if max(values) > 10000: + self.test_result[TC_num] = "FAIL" + else: + self.test_result[TC_num] = "PASS" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + def check_lambda_concurrency(self,TC_num): + response = self.cloudwatch.get_metric_data( + MetricDataQueries=[ + { + 'Id': 'testConcurrency', + 'MetricStat': { + 'Metric': { + 'Namespace': 'AWS/Lambda', + 'MetricName': 'ConcurrentExecutions' + }, + 'Period': 600, + 'Stat': 'Maximum' + }, + 'ReturnData': True, + }, + ], + StartTime=datetime.now().utcnow() - timedelta(minutes=15), + EndTime=datetime.now().utcnow(), + ScanBy='TimestampAscending' + ) + print(response['MetricDataResults'][0]['Values']) + values = response['MetricDataResults'][0]['Values'] + if not values: + self.test_result[TC_num] = "FAIL" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + return + if max(values) < 5: + self.test_result[TC_num] = "FAIL" + else: + self.test_result[TC_num] = "PASS" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + def check_bucket_exist(self, bucket): + if not bucket: + print(f"Bucket name is empty!") + return False + try: + self.s3.head_bucket(Bucket=bucket) + print(f"Bucket {bucket} Exists!") + return True + except botocore.exceptions.ClientError as e: + # If a client error is thrown, then check that it was a 404 error. + # If it was a 404 error, then the bucket does not exist. + error_code = int(e.response['Error']['Code']) + if error_code == 403: + print("Private Bucket. Forbidden Access!") + return True + elif error_code == 404: + print(f"Bucket {bucket} does Not Exist!") + return False + def empty_s3_bucket(self, bucket_name): + bucket = self.s3_resources.Bucket(bucket_name) + bucket.objects.all().delete() + print(f"{bucket_name} S3 Bucket is now EMPTY !!") + + def count_bucket_objects(self, bucket_name): + bucket = self.s3_resources.Bucket(bucket_name) + count = 0 + for index in bucket.objects.all(): + count += 1 + #print(f"{bucket_name} S3 Bucket has {count} objects !!") + return count + + def validate_s3_buckets_initial(self, TC_num): + print(" - Run this BEFORE the workload generator client starts. Press Ctrl^C to exit.") + print(" - WARN: If there are objects in the S3 buckets; they will be deleted") + print(" ---------------------------------------------------------") + + in_isExist = self.check_bucket_exist(self.in_bucket_name) + out_isExist = self.check_bucket_exist(self.out_bucket_name) + + if in_isExist: + ip_obj_count = self.count_bucket_objects(self.in_bucket_name) + print(f"S3 Input Bucket:{self.in_bucket_name} has {ip_obj_count} object(s)") + if out_isExist: + op_obj_count = self.count_bucket_objects(self.out_bucket_name) + print(f"S3 Output Bucket:{self.out_bucket_name} has {op_obj_count} object(s)") + + if in_isExist and out_isExist and ip_obj_count==0 and op_obj_count==0: + self.test_result[TC_num] = "PASS" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + else: + self.test_result[TC_num] = "FAIL" + print(f"Test status of {TC_num} : {self.test_result[TC_num]}") + + def display_menu(self): + print("\n") + print("=============================================================================") + print("======== Welcome to CSE546 Cloud Computing AWS Console ======================") + print("=============================================================================") + print(f"IAM ACESS KEY ID: {self.access_key}") + print(f"IAM SECRET ACCESS KEY: {self.secret_key}") + print("=============================================================================") + print("1 - Validate 1 Lambda function") + print("2 - Validate S3 Buckets names and initial states") + print("3 - Validate S3 output bucket subfolders") + print("4 - Validate S3 output objects") + print("5 - Check lambda average duration") + print("6 - Check lambda concurrency") + print("0 - Exit") + print("Enter a choice:") + choice = input() + return choice + + def main(self): + while(1): + choice = self.display_menu() + if int(choice) == 1: + self.validate_lambda_exists('Test_1') + elif int(choice) == 2: + self.validate_s3_buckets_initial('Test_2') + elif int(choice) == 3: + self.validate_s3_subfolders('Test_3') + elif int(choice) == 4: + self.validate_s3_output_objects('Test_4') + elif int(choice) == 5: + self.check_lambda_duration('Test_5') + elif int(choice) == 6: + self.check_lambda_concurrency('Test_6') + elif int(choice) == 0: + break + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Grading Script') + parser.add_argument('--access_key', type=str, help='ACCCESS KEY ID of the grading IAM user') + parser.add_argument('--secret_key', type=str, help='SECRET KEY of the grading IAM user') + parser.add_argument('--input_bucket', type=str, help='Name of the S3 Input Bucket') + parser.add_argument('--output_bucket', type=str, help='Name of the S3 Output Bucket') + parser.add_argument('--lambda_name', type=str, help="Name of the Lambda function") + + + args = parser.parse_args() + + access_key = args.access_key + secret_key = args.secret_key + input_bucket = args.input_bucket + output_bucket = args.output_bucket + lambda_name = args.lambda_name + region = 'us-east-1' + + aws_obj = aws_grader(access_key, secret_key, input_bucket, output_bucket, lambda_name,region) + aws_obj.main() diff --git a/Tooling/Project_2/src/Dockerfile b/Tooling/Project_2/src/Dockerfile new file mode 100644 index 0000000..ec7c2e7 --- /dev/null +++ b/Tooling/Project_2/src/Dockerfile @@ -0,0 +1,59 @@ +#__copyright__ = "Copyright 2024, VISA Lab" +#__license__ = "MIT" + +# Define global args +ARG FUNCTION_DIR="/home/app/" +ARG RUNTIME_VERSION="3.8" +ARG DISTRO_VERSION="3.12" + +FROM alpine:latest +FROM python:${RUNTIME_VERSION} AS python-alpine + +#RUN apt-get update \ +# && apt-get install -y cmake ca-certificates libgl1-mesa-glx +RUN python${RUNTIME_VERSION} -m pip install --upgrade pip + +FROM python-alpine AS build-image + +# Include global args in this stage of the build +ARG FUNCTION_DIR +ARG RUNTIME_VERSION +# Create function directory +RUN mkdir -p ${FUNCTION_DIR} + +# Install Lambda Runtime Interface Client for Python +RUN python${RUNTIME_VERSION} -m pip install awslambdaric --target ${FUNCTION_DIR} + +# Stage 3 - final runtime image +# Grab a fresh copy of the Python image +FROM python-alpine +# Include global arg in this stage of the build +ARG FUNCTION_DIR +# Set working directory to function root directory +WORKDIR ${FUNCTION_DIR} +# Copy in the built dependencies +COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} +# (Optional) Add Lambda Runtime Interface Emulator and use a script in the ENTRYPOINT for simpler local runs +ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie +RUN chmod 755 /usr/bin/aws-lambda-rie + +# Install ffmpeg +RUN apt-get update +RUN apt-get install -y ffmpeg +#RUN apk --no-cache add ffmpeg + +# Copy handler function +COPY requirements.txt ${FUNCTION_DIR} +#COPY ffmpeg ${FUNCTION_DIR} +#COPY ffmpeg /usr/bin + +RUN python${RUNTIME_VERSION} -m pip install -r requirements.txt --target ${FUNCTION_DIR} +COPY entry.sh / + +# Copy function code +COPY handler.py ${FUNCTION_DIR} +RUN chmod 777 /entry.sh + +# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) +ENTRYPOINT [ "/entry.sh" ] +CMD [ "handler.handler" ] diff --git a/Tooling/Project_2/src/entry.sh b/Tooling/Project_2/src/entry.sh new file mode 100644 index 0000000..a608361 --- /dev/null +++ b/Tooling/Project_2/src/entry.sh @@ -0,0 +1,6 @@ +#!/bin/sh +if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then + exec /usr/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $1 +else + exec /usr/local/bin/python -m awslambdaric $1 +fi diff --git a/Tooling/Project_2/src/face-extraction-code.py b/Tooling/Project_2/src/face-extraction-code.py new file mode 100644 index 0000000..8bcdecd --- /dev/null +++ b/Tooling/Project_2/src/face-extraction-code.py @@ -0,0 +1,37 @@ +__copyright__ = "Copyright 2024, VISA Lab" +__license__ = "MIT" + +import os +import imutils +import cv2 +import json +from PIL import Image +from facenet_pytorch import MTCNN +from shutil import rmtree + +mtcnn = MTCNN(keep_all=True, device='cpu') + +def face_extraction_function(folder_name): + if not os.path.exists(folder_name): + print(f"Folder {folder_name} does not exist!") + return None + + pics = sorted(os.listdir(folder_name)) + for pic in pics: + path = os.path.join(folder_name, pic) + frame = cv2.imread(path, cv2.IMREAD_COLOR) + boxes, _ = mtcnn.detect(frame) + + if boxes is None: + rmtree(folder_name) + return + + for box in boxes: + cv2.rectangle(frame, + (int(box[0]), int(box[1])), + (int(box[2]), int(box[3])), + (0, 255, 0), + 2) + cv2.imwrite(path,frame) + return folder_name + diff --git a/Tooling/Project_2/src/face-recognition-code.py b/Tooling/Project_2/src/face-recognition-code.py new file mode 100644 index 0000000..9594dc1 --- /dev/null +++ b/Tooling/Project_2/src/face-recognition-code.py @@ -0,0 +1,44 @@ +__copyright__ = "Copyright 2024, VISA Lab" +__license__ = "MIT" + +import os +import imutils +import cv2 +import json +from PIL import Image, ImageDraw, ImageFont +from facenet_pytorch import MTCNN, InceptionResnetV1 +from shutil import rmtree +import numpy as np +import torch + + +mtcnn = MTCNN(image_size=240, margin=0, min_face_size=20) # initializing mtcnn for face detection +resnet = InceptionResnetV1(pretrained='vggface2').eval() # initializing resnet for face img to embeding conversion + +def face_recognition_function(folder_name): + if not os.path.exists(folder_name): + print(f"Folder {folder_name} does not exist!") + return None + name = "" + pics = sorted(os.listdir(folder_name)) + return_names = dict() + for pic in pics: + path = os.path.join(folder_name, pic) + img = cv2.imread(path, cv2.IMREAD_COLOR) + img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) + face,prob = mtcnn(img, return_prob=True, save_path=None) + saved_data = torch.load('/tmp/data.pt') # loading data.pt file + if face != None: + emb = resnet(face.unsqueeze(0)).detach() # detech is to make required gradient false + embedding_list = saved_data[0] # getting embedding data + name_list = saved_data[1] # getting list of names + dist_list = [] # list of matched distances, minimum distance is used to identify the person + for idx, emb_db in enumerate(embedding_list): + dist = torch.dist(emb, emb_db).item() + dist_list.append(dist) + idx_min = dist_list.index(min(dist_list)) + pic_extension = pic.split(".")[0] + return_names[pic_extension] = name_list[idx_min] + return return_names + + diff --git a/Tooling/Project_2/src/face_recognition_additional_files/tmp/data.pt b/Tooling/Project_2/src/face_recognition_additional_files/tmp/data.pt new file mode 100644 index 0000000..184abd7 Binary files /dev/null and b/Tooling/Project_2/src/face_recognition_additional_files/tmp/data.pt differ diff --git a/Tooling/Project_2/src/handler.py b/Tooling/Project_2/src/handler.py new file mode 100644 index 0000000..d3b3625 --- /dev/null +++ b/Tooling/Project_2/src/handler.py @@ -0,0 +1,8 @@ +#__copyright__ = "Copyright 2024, VISA Lab" +#__license__ = "MIT" + +from boto3 import client as boto3_client + + +def handler(event, context): + print("Hello") diff --git a/Tooling/Project_2/src/motion-detection-function.py b/Tooling/Project_2/src/motion-detection-function.py new file mode 100644 index 0000000..88f3510 --- /dev/null +++ b/Tooling/Project_2/src/motion-detection-function.py @@ -0,0 +1,53 @@ +__copyright__ = "Copyright 2024, VISA Lab" +__license__ = "MIT" + +import os +import imutils +import cv2 +def detect(lgray, frame, min_area): + frame = imutils.resize(frame, width=320) + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + gray = cv2.GaussianBlur(gray, (21, 21), 0) + + frameDelta = cv2.absdiff(lgray, gray) + thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] + + thresh = cv2.dilate(thresh, None, iterations=2) + contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, + cv2.CHAIN_APPROX_SIMPLE) + contours = imutils.grab_contours(contours) + for c in contours: + if cv2.contourArea(c) > min_area: + return True, gray + return False, gray + +def motion_detection_function(folder_name): + if not os.path.exists(folder_name): + print(f"Folder {folder_name} does not exist!") + return None + + # Motion detection specific parameters + min_area = 10 # if 10% of the frame was changed, motion happens + last_gray = None + + pics = sorted(os.listdir(folder_name)) + for pic in pics: + path = os.path.join(folder_name, pic) + frame = cv2.imread(path, cv2.IMREAD_COLOR) + if frame is None: + print("failed to open picture %s" % path) + return None + + if last_gray is None: + frame = imutils.resize(frame, width=320) + last_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + last_gray = cv2.GaussianBlur(last_gray, (21, 21), 0) + continue + + detected, gray = detect(last_gray, frame, min_area) + if detected: + break + else: + last_gray = gray + os.remove(path) + return folder_name diff --git a/Tooling/Project_2/src/requirements.txt b/Tooling/Project_2/src/requirements.txt new file mode 100644 index 0000000..36f1741 --- /dev/null +++ b/Tooling/Project_2/src/requirements.txt @@ -0,0 +1,4 @@ +boto3 +ffmpeg +ffmpeg-python + diff --git a/Tooling/Project_2/src/video-splitting-cmdline.py b/Tooling/Project_2/src/video-splitting-cmdline.py new file mode 100644 index 0000000..e11ef3a --- /dev/null +++ b/Tooling/Project_2/src/video-splitting-cmdline.py @@ -0,0 +1,30 @@ +#__copyright__ = "Copyright 2024, VISA Lab" +#__license__ = "MIT" + + +import os +import ffmpeg +import subprocess +import math + + +def video_splitting_cmdline(video_filename): + filename = os.path.basename(video_filename) + outdir = os.path.splitext(filename)[0] + outdir = os.path.join("/tmp",outdir) + output_dir = outdir + if not os.path.exists(outdir): + os.makedirs(outdir) + + split_cmd = '/usr/bin/ffmpeg -ss 0 -r 1 -i ' +video_filename+ ' -vf fps=1/10 -start_number 0 -vframes 10 ' + outdir + "/" + 'output-%02d.jpg -y' + try: + subprocess.check_call(split_cmd, shell=True) + except subprocess.CalledProcessError as e: + print(e.returncode) + print(e.output) + + fps_cmd = 'ffmpeg -i ' + video_filename + ' 2>&1 | sed -n "s/.*, \\(.*\\) fp.*/\\1/p"' + fps = subprocess.check_output(fps_cmd, shell=True).decode("utf-8").rstrip("\n") + fps = math.ceil(float(fps)) + return outdir + diff --git a/Tooling/Project_2/workload_generator/README.md b/Tooling/Project_2/workload_generator/README.md new file mode 100644 index 0000000..f9c03dc --- /dev/null +++ b/Tooling/Project_2/workload_generator/README.md @@ -0,0 +1,50 @@ +# CSE546 workload_generator for Project 2 + +This repository contains code examples for you to use our workload generator. + +Usage: +``` +usage: workload_generator.py [-h] [--access_key AWS_ACCESS_KEY_ID] [--secret_key AWS_SECRET_KEY] [--input_bucket S3_INPUT_BUCKET_NAME] [--testcase_folder TESTCASE_FOLDER] + +Upload videos to input S3 + +options: + -h, --help show this help message and exit + --access_key ACCESS_KEY + ACCCESS KEY of the grading IAM user + --secret_key SECRET_KEY + SECRET KEY of the grading IAM user + --input_bucket INPUT_BUCKET + Name of the input bucket, e.g. 1234567890-input + --output_bucket OUTPUT_BUCKET + Name of the output bucket, e.g. 1234567890-stage-1 + --testcase_folder TESTCASE_FOLDER + the path of the folder where videos are saved, e.g. test_cases/test_case_1/ +``` + +Examples: + +The following command sends videos from test_case_1 folder to 1234567890-input bucket. +``` +python3 workload_generator.py \ + --access_key \ + --secret_key \ + --input_bucket 1234567890-input \ + --testcase_folder test_cases/test_case_1/ \ +``` + +Sample output: +``` +Nothing to clear in input bucket +Uploading to input bucket.. name: test_5.mp4 +Uploading to input bucket.. name: test_2.mp4 +Uploading to input bucket.. name: test_8.mp4 +Uploading to input bucket.. name: test_7.mp4 +Uploading to input bucket.. name: test_6.mp4 +Uploading to input bucket.. name: test_4.mp4 +Uploading to input bucket.. name: test_1.mp4 +Uploading to input bucket.. name: test_0.mp4 +Time to run = 11.037546873092651 (seconds) + +``` + diff --git a/Tooling/Project_2/workload_generator/workload_generator.py b/Tooling/Project_2/workload_generator/workload_generator.py new file mode 100644 index 0000000..d55cd2a --- /dev/null +++ b/Tooling/Project_2/workload_generator/workload_generator.py @@ -0,0 +1,73 @@ +#__copyright__ = "Copyright 2024, VISA Lab" +#__license__ = "MIT" + +from boto3 import client as boto3_client +import os +import argparse +import time + +input_bucket = "546proj2" +output_bucket = "546proj2output" +test_cases = "test_cases/" + +start_time = time.time() +parser = argparse.ArgumentParser(description='Upload videos to input S3') +# parser.add_argument('--num_request', type=int, help='one video per request') +parser.add_argument('--access_key', type=str, help='ACCCESS KEY of the grading IAM user') +parser.add_argument('--secret_key', type=str, help='SECRET KEY of the grading IAM user') +parser.add_argument('--input_bucket', type=str, help='Name of the input bucket, e.g. 1234567890-input') +parser.add_argument('--output_bucket', type=str, help='Name of the output bucket, e.g. 1234567890-stage-1') +parser.add_argument('--testcase_folder', type=str, help='the path of the folder where videos are saved, e.g. test_cases/test_case_1/') + +args = parser.parse_args() + +access_key = args.access_key +secret_key = args.secret_key +input_bucket = args.input_bucket +output_bucket = args.output_bucket +test_cases = args.testcase_folder +region = 'us-east-1' + +s3 = boto3_client('s3', aws_access_key_id = access_key, + aws_secret_access_key = secret_key, region_name=region) +def clear_input_bucket(input_bucket): + global s3 + list_obj = s3.list_objects_v2(Bucket=input_bucket) + try: + for item in list_obj["Contents"]: + key = item["Key"] + s3.delete_object(Bucket=input_bucket, Key=key) + except: + print("Nothing to clear in input bucket") + +def clear_output_bucket(output_bucket): + global s3 + list_obj = s3.list_objects_v2(Bucket=output_bucket) + try: + for item in list_obj["Contents"]: + key = item["Key"] + s3.delete_object(Bucket=output_bucket, Key=key) + except: + print("Nothing to clear in output bucket") + +def upload_to_input_bucket_s3(input_bucket, path, name): + global s3 + s3.upload_file(path + name, input_bucket, name) + +def upload_files(input_bucket, test_dir): + for filename in os.listdir(test_dir): + if filename.endswith(".mp4") or filename.endswith(".MP4"): + print("Uploading to input bucket.. name: " + str(filename)) + upload_to_input_bucket_s3(input_bucket, test_dir, filename) + + + +clear_input_bucket(input_bucket) +clear_input_bucket(output_bucket) + +upload_files(input_bucket,test_cases) + +end_time = time.time() +print("Time to run = ", end_time-start_time, "(seconds)") +print(f"Timestamps: start {start_time}, end {end_time}") +