Esempio n. 1
0
    def Npy_to_npz(self,
                   single_see_core_amount=8,
                   see_print_msg=False,
                   **args):  ### 因為有刪東西的動作,覺得不要multiprocess比較安全~~
        """
        把 See 資料夾內的.npy改存成.npz,存完會把.npy刪除喔~
        """
        ### See_method 第零a部分:顯示開始資訊 和 計時
        print(datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
              f"See level: doing Npy_to_npz, Current See:{self.see_name}")
        start_time = time.time()

        ### See_method 第一部分:建立資料夾:不能 build_new_dir,因為原本的 .npy 因為容量太大 , 轉完 .npz, 最後會把.npy刪掉! 因此如果 第二次以上執行 就不會有.npy了 無法重建.npz! 所以不能把 .npz資料夾刪掉重建喔!
        Check_dir_exist_and_build(self.npz_write_dir)

        ### See_method 第二部分:取得see資訊
        self.get_npy_info()

        ### See_method 第三部分:主要做的事情在這裡, 如果要有想設計平行處理的功能 就要有 1.single_see_core_amount 和 2.下面的if/elif/else 和 3._see_method 前兩個參數要為 start_index, task_amount 相關詞喔!
        if (self.npy_amount > 0):
            if (
                    single_see_core_amount == 1
            ):  ### single_see_core_amount 大於1 代表 單核心跑, 就重新導向 最原始的function囉 把 see內的任務 依序完成!
                self._npy_to_npz(start_index=0, amount=self.npy_amount)
            elif (
                    single_see_core_amount > 1
            ):  ### single_see_core_amount 大於1 代表 多核心跑, 丟進 multiprocess_interface 把 see內的任務 切段 平行處理囉
                multi_processing_interface(
                    core_amount=CORE_AMOUNT_NPY_TO_NPZ,
                    task_amount=self.npy_amount,
                    task=self._npy_to_npz,
                    print_msg=see_print_msg
                )  ### 因為和 bm_rec 的動作包一起, 外面指定的 single_see_core_amount 是比較適合 bm_rec 的, 所以 npy_to_npz 就用 在 step0 統一指定的 CORE數囉!
            else:
                print(
                    "single_see_core_amount 設定錯誤, 需要 >= 1 的數字才對喔! == 1 代表see內任務單核心跑, > 1 代表see內任務多核心跑"
                )

        ### See_method 第四部分:後處理~沒事情就空白拉

        ### See_method 第五部分:如果 write 和 read 資料夾不同,把 write完的結果 同步回 read資料夾喔!
        if (
                self.see_write_dir != self.see_read_dir
        ):  ### 因為接下去的任務需要 此任務的結果, 如果 read/write 資料夾位置不一樣, write完的結果 copy 一份 放回read, 才能讓接下去的動作 有 東西 read 喔!
            Syn_write_to_read_dir(write_dir=self.npz_write_dir,
                                  read_dir=self.npz_read_dir,
                                  build_new_dir=False)

        ### See_method 第零b部分:顯示結束資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: finish Npy_to_npz, Current See:{self.see_name}, cost time:{time.time() - start_time}"
        )
Esempio n. 2
0
    def Save_as_matplot_visual(self,
                               add_loss=False,
                               bgr2rgb=False,
                               single_see_core_amount=8,
                               see_print_msg=False,
                               **args):
        """
        Save_as_matplot_visual(_after_train) 最後想試試看 省掉他 會不會影響我的理解
        """
        ### See_method 第零a部分:顯示開始資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: doing Save_as_matplot_visual, Current See:{self.see_name}"
        )
        start_time = time.time()

        ### See_method 第一部分:建立 存結果的資料夾
        Check_dir_exist_and_build(self.see_write_dir)
        Check_dir_exist_and_build_new_dir(
            self.flow_matplot_visual_write_dir)  ### 建立 存結果的資料夾

        ### See_method 第二部分:取得see資訊
        self.get_see_base_info()  ### 取得 結果內的 某個see資料夾 內的所有影像 檔名 和 數量
        self.get_flow_info()

        ### See_method 第三部分:主要做的事情在這裡, 如果要有想設計平行處理的功能 就要有 1.single_see_core_amount 和 2.下面的if/elif/else 和 3._see_method 前兩個參數要為 start_index, task_amount 相關詞喔!
        if (
                single_see_core_amount == 1
        ):  ### single_see_core_amount 大於1 代表 單核心跑, 就重新導向 最原始的function囉 把 see內的任務 依序完成!
            self._draw_matplot_visual_after_train(0,
                                                  self.flow_ep_jpg_amount,
                                                  add_loss=add_loss,
                                                  bgr2rgb=bgr2rgb)
            ### 後處理讓結果更小 但 又不失視覺品質,單核心版
            Find_ltrd_and_crop(
                self.flow_matplot_visual_write_dir,
                self.flow_matplot_visual_write_dir,
                padding=15,
                search_amount=10,
                core_amount=1)  ### 有實驗過,要先crop完 再 壓成jpg 檔案大小才會變小喔!
            Save_as_jpg(self.flow_matplot_visual_write_dir,
                        self.flow_matplot_visual_write_dir,
                        delete_ord_file=True,
                        quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                        core_amount=1)  ### matplot圖存完是png,改存成jpg省空間
        elif (
                single_see_core_amount > 1
        ):  ### single_see_core_amount 大於1 代表 多核心跑, 丟進 multiprocess_interface 把 see內的任務 切段 平行處理囉
            ### see內的任務 有切 multiprocess
            multi_processing_interface(
                core_amount=single_see_core_amount,
                task_amount=self.flow_ep_jpg_amount,
                task=self._draw_matplot_visual_after_train,
                task_args=[add_loss, bgr2rgb],
                print_msg=see_print_msg)
            ### 後處理讓結果更小 但 又不失視覺品質,多核心版(core_amount 在 step0 裡調)
            Find_ltrd_and_crop(self.flow_matplot_visual_write_dir,
                               self.flow_matplot_visual_write_dir,
                               padding=15,
                               search_amount=10,
                               core_amount=CORE_AMOUNT_FIND_LTRD_AND_CROP
                               )  ### 有實驗過,要先crop完 再 壓成jpg 檔案大小才會變小喔!
            Save_as_jpg(self.flow_matplot_visual_write_dir,
                        self.flow_matplot_visual_write_dir,
                        delete_ord_file=True,
                        quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                        core_amount=CORE_AMOUNT_SAVE_AS_JPG
                        )  ### matplot圖存完是png,改存成jpg省空間
        else:
            print(
                "single_see_core_amount 設定錯誤, 需要 >= 1 的數字才對喔! == 1 代表see內任務單核心跑, > 1 代表see內任務多核心跑"
            )

        ### See_method 第四部分:後處理 存 video
        Video_combine_from_dir(
            self.flow_matplot_visual_write_dir,
            self.flow_matplot_visual_write_dir
        )  ### 存成jpg後 順便 把所有圖 串成影片,覺得好像還沒好到需要看影片,所以先註解掉之後有需要再打開囉

        ### See_method 第五部分:如果 write 和 read 資料夾不同,把 write完的結果 同步回 read資料夾喔!
        if (self.flow_matplot_visual_write_dir !=
                self.flow_matplot_visual_read_dir):
            Syn_write_to_read_dir(write_dir=self.flow_matplot_visual_write_dir,
                                  read_dir=self.flow_matplot_visual_read_dir,
                                  build_new_dir=True)

        ### See_method 第零b部分:顯示結束資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: finish Save_as_matplot_visual, Current See:{self.see_name}, cost_time:{time.time() - start_time}"
        )
        print("")
    def result_do_all_single_see(self, start_see, see_amount, **args):
        """
        step1: Result的功能是把 See 裡面寫的 專門給單個see 的 method ,用for 走訪所有See 然後都執行一次,
        step2: Result也可以 multiprocess,就是把 See當單位 來做multiprocess了,See 裡面本身就有 multiprocess 處理了
        所以可以  多個see 同時跑, see內的多個任務 同時跑喔!

        args舉例大概長相:args == {
            see_method_name        : str
            add_loss               : bool
            bgr2rgb                : bool

            single_see_core_amount : int
            see_print_msg          : bool
            see_core_amount       : int
            result_print_msg       : bool
        }
        method舉例怎麼呼叫:result_do_all_single_see(start_see, see_amount, see_method_name=str, add_loss=bool, bgr2rgb=bool, single_see_core_amount=int, see_print_msg=bool, see_core_amount=int, result_print_msg=bool)
            see_method_name 目前以下選擇:
                Save_as_matplot_visual
                Save_as_bm_rec_matplot_visual
                Calculate_SSIM_LD
        """
        if ("see_core_amount" not in args.keys()): args["see_core_amount"] = 1
        if ("single_see_core_amount" not in args.keys()):
            args["single_see_core_amount"] = 1
        if ("see_print_msg" not in args.keys()): args["see_print_msg"] = False
        if ("result_print_msg" not in args.keys()):
            args["result_print_msg"] = False
        result_start = time.time()
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"Result level: doing {args['see_method_name']}, Current Result:{self.result_name}"
        )
        """
        step1: see_core_amount == 1 , single_see_core_amount == 1:單核心跑, 單個see 依序跑, see內的多個任務 依序跑
        step1: see_core_amount == 1 , single_see_core_amount  > 1:多核心跑, 單個see 依序跑, see內的多個任務 同時跑
        step2: see_core_amount  > 1 , single_see_core_amount == 1:多核心跑, 多個see 同時跑, see內的多個任務 依序跑
        step2: see_core_amount  > 1 , single_see_core_amount  > 1:多核心跑, 多個see 同時跑, see內的多個任務 同時跑
        """
        if (args["see_core_amount"] == 1):
            """ step1
            see_core_amount == 1 , single_see_core_amount == 1:單核心跑, 單個see 依序跑, see內的多個任務 依序跑
            see_core_amount == 1 , single_see_core_amount  > 1:多核心跑, 單個see 依序跑, see內的多個任務 同時跑
            see內 當單位 切 multiprocess
            """
            self._result_do_all_single_see(start_see, see_amount, args)
        elif (args["see_core_amount"] > 1):
            """ step2
            see_core_amount  > 1 , single_see_core_amount == 1:多核心跑, 多個see 同時跑, see內的多個任務 依序跑
            see_core_amount  > 1 , single_see_core_amount  > 1:多核心跑, 多個see 同時跑, see內的多個任務 同時跑
            以 整個see 當單位 切 multiprocess
            """
            multi_processing_interface(core_amount=args["see_core_amount"],
                                       task_amount=see_amount,
                                       task=self._result_do_all_single_see,
                                       task_start_index=start_see,
                                       task_args=[args],
                                       print_msg=args["result_print_msg"])
        print(datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
              f"Result level: {args['see_method_name']} finish")
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"Result level: {args['see_method_name']}, cost_time = {time.time() - result_start}"
        )
    def Visual_SSIM_LD(self,
                       add_loss=False,
                       bgr2rgb=False,
                       single_see_core_amount=8,
                       see_print_msg=False):

        ### See_method 第零a部分:顯示開始資訊 和 計時
        print(datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
              f"See level: doing Visual_SSIM_LD, Current See:{self.see_name}")
        start_time = time.time()

        ### See_method 第一部分:建立 存結果的資料夾
        Check_dir_exist_and_build_new_dir(
            self.matplot_metric_visual_write_dir
        )  ### 一定要build_new_dir ,才不會有 "中斷後重新執行 或 第二次執行"時 .jpg 和 .png 混再一起 擾亂了 Find_ltrd_and_crop 喔!

        ### See_method 第二部分:取得see資訊
        self.get_see_base_info()
        self.get_bm_rec_info()
        self.get_metric_info()

        SSIMs = np.load(f"{self.metrec_read_dir}/SSIMs.npy")
        LDs = np.load(f"{self.metrec_read_dir}/LDs.npy")

        ### See_method 第三部分:主要做的事情在這裡, 如果要有想設計平行處理的功能 就要有 1.single_see_core_amount 和 2.下面的if/elif/else 和 3._see_method 前兩個參數要為 start_index, task_amount 相關詞喔!
        if (
                single_see_core_amount == 1
        ):  ### single_see_core_amount 大於1 代表 單核心跑, 就重新導向 最原始的function囉 把 see內的任務 依序完成!
            self._visual_SSIM_LD(0,
                                 self.see_rec_amount,
                                 SSIMs,
                                 LDs,
                                 add_loss=add_loss,
                                 bgr2rgb=bgr2rgb)
            Find_ltrd_and_crop(
                self.matplot_metric_visual_write_dir,
                self.matplot_metric_visual_write_dir,
                padding=15,
                search_amount=10,
                core_amount=1)  ### 有實驗過,要先crop完 再 壓成jpg 檔案大小才會變小喔!
            Save_as_jpg(self.matplot_metric_visual_write_dir,
                        self.matplot_metric_visual_write_dir,
                        delete_ord_file=True,
                        quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                        core_amount=1)  ### matplot圖存完是png,改存成jpg省空間
        elif (
                single_see_core_amount > 1
        ):  ### single_see_core_amount 大於1 代表 多核心跑, 丟進 multiprocess_interface 把 see內的任務 切段 平行處理囉
            multi_processing_interface(
                core_amount=single_see_core_amount,
                task_amount=self.see_rec_amount,
                task=self._visual_SSIM_LD,
                task_args=[SSIMs, LDs, add_loss, bgr2rgb],
                print_msg=see_print_msg)
            Find_ltrd_and_crop(self.matplot_metric_visual_write_dir,
                               self.matplot_metric_visual_write_dir,
                               padding=15,
                               search_amount=10,
                               core_amount=CORE_AMOUNT_FIND_LTRD_AND_CROP
                               )  ### 有實驗過,要先crop完 再 壓成jpg 檔案大小才會變小喔!
            Save_as_jpg(
                self.matplot_metric_visual_write_dir,
                self.matplot_metric_visual_write_dir,
                delete_ord_file=True,
                quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                core_amount=CORE_AMOUNT_SAVE_AS_JPG)  ### matplot圖存完是png,
        else:
            print(
                "single_see_core_amount 設定錯誤, 需要 >= 1 的數字才對喔! == 1 代表see內任務單核心跑, > 1 代表see內任務多核心跑"
            )

        ### See_method 第四部分:後處理 存 video
        Video_combine_from_dir(self.matplot_metric_visual_write_dir,
                               self.matplot_metric_visual_write_dir)

        ### See_method 第五部分:如果 write 和 read 資料夾不同,把 write完的結果 同步回 read資料夾喔!
        if (self.matplot_metric_visual_write_dir !=
                self.matplot_metric_visual_read_dir):
            Syn_write_to_read_dir(
                write_dir=self.matplot_metric_visual_write_dir,
                read_dir=self.matplot_metric_visual_read_dir,
                build_new_dir=True)

        ### See_method 第零b部分:顯示結束資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: finish Visual_SSIM_LD, Current See:{self.see_name}, cost_time:{time.time() - start_time}"
        )
        print("")
    def Calculate_SSIM_LD(self, single_see_core_amount=8, see_print_msg=False):
        """
        覺得還是要用 path 的方式 在 matlab 裡面 用 imread(path),
        path 的方式:8秒左右
        python內np.array 傳給 matlab:30秒左右

        假設:
            1.都要 compress_all 完以後
            2.並把結果都 集中到一起
        """
        ### See_method 第零a部分:顯示開始資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: doing Calculate_SSIM_LD, Current See:{self.see_name}")
        start_time = time.time()

        ### See_method 第一部分:建立 存結果的資料夾
        Check_dir_exist_and_build(
            self.metrec_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~
        Check_dir_exist_and_build(
            self.metric_ld_color_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~
        Check_dir_exist_and_build(
            self.metric_ld_gray_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~
        Check_dir_exist_and_build(
            self.metric_ld_matplot_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~
        Check_dir_exist_and_build(
            self.metric_im1_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~
        Check_dir_exist_and_build(
            self.metric_im2_write_dir
        )  ### 不build new_dir 是因為 覺德 算一次的時間太長了ˊ口ˋ 怕不小心操作錯誤就要重算~

        ### See_method 第二部分:取得see資訊
        self.get_see_base_info(
        )  ### 暫時寫這邊,到時應該要拉出去到result_level,要不然每做一次就要重新更新一次,但不用這麼頻繁,只需要一開始更新一次即可
        self.get_bm_rec_info(
        )  ### 暫時寫這邊,到時應該要拉出去到result_level,要不然每做一次就要重新更新一次,但不用這麼頻繁,只需要一開始更新一次即可

        ### See_method 第三部分:主要做的事情在這裡, 如果要有想設計平行處理的功能 就要有 1.single_see_core_amount 和 2.下面的if/elif/else 和 3._see_method 前兩個參數要為 start_index, task_amount 相關詞喔!
        with Manager() as manager:  ### 設定在 multiprocess 裡面 共用的 list
            ### multiprocess 內的 global 的 list, share memory 的概念了,就算不multiprocess 也可以用喔! 不過記得如果要在with外用, 要先轉回list() 就是了!
            SSIMs = manager.list()  # []的概念
            LDs = manager.list()  # []的概念

            if (
                    single_see_core_amount == 1
            ):  ### single_see_core_amount 大於1 代表 單核心跑, 就重新導向 最原始的function囉 把 see內的任務 依序完成!
                self._do_matlab_SSIM_LD(0, self.see_rec_amount, SSIMs, LDs)
                Save_as_jpg(
                    self.metric_ld_matplot_write_dir,
                    self.metric_ld_matplot_write_dir,
                    delete_ord_file=True,
                    quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                    core_amount=1)  ### matplot圖存完是png,改存成jpg省空間
            elif (
                    single_see_core_amount > 1
            ):  ### single_see_core_amount 大於1 代表 多核心跑, 丟進 multiprocess_interface 把 see內的任務 切段 平行處理囉
                multi_processing_interface(core_amount=single_see_core_amount,
                                           task_amount=self.see_rec_amount,
                                           task=self._do_matlab_SSIM_LD,
                                           task_args=[SSIMs, LDs],
                                           print_msg=see_print_msg)
                Save_as_jpg(
                    self.metric_ld_matplot_write_dir,
                    self.metric_ld_matplot_write_dir,
                    delete_ord_file=True,
                    quality_list=[cv2.IMWRITE_JPEG_QUALITY, JPG_QUALITY],
                    core_amount=CORE_AMOUNT_SAVE_AS_JPG
                )  ### matplot圖存完是png,改存成jpg省空間
            else:
                print(
                    "single_see_core_amount 設定錯誤, 需要 >= 1 的數字才對喔! == 1 代表see內任務單核心跑, > 1 代表see內任務多核心跑"
                )

            # SSIMs = list(SSIMs)  ### share memory 的list 轉回 python list
            # LDs   = list(LDs)    ### share memory 的list 轉回 python list
            SSIMs = sorted(
                SSIMs, key=lambda ssim: ssim[0])  ### 有轉 list 的功效喔!所以上面兩行可省!
            LDs = sorted(LDs, key=lambda LD: LD[0])  ### 有轉 list 的功效喔!所以上面兩行可省!

        ### See_method 第四部分:後處理,去除 在 share memory 的 index 後 存成 npy
        SSIMs = np.array(SSIMs)[:, 1]
        LDs = np.array(LDs)[:, 1]
        # print("SSIMs", SSIMs)
        # print("LDs", LDs)
        np.save(f"{self.metrec_write_dir}/SSIMs", SSIMs)
        np.save(f"{self.metrec_write_dir}/LDs", LDs)

        ### See_method 第五部分:如果 write 和 read 資料夾不同,把 write完的結果 同步回 read資料夾喔!
        ###   記得順序是 先同步父 再 同步子 喔!
        if (
                self.metrec_write_dir != self.metrec_read_dir
        ):  ### 因為接下去的任務需要 此任務的結果, 如果 read/write 資料夾位置不一樣, write完的結果 copy 一份 放回read, 才能讓接下去的動作 有 東西 read 喔!
            Syn_write_to_read_dir(write_dir=self.metrec_write_dir,
                                  read_dir=self.metrec_read_dir,
                                  build_new_dir=True)  ### 父
            Syn_write_to_read_dir(write_dir=self.metric_ld_color_write_dir,
                                  read_dir=self.metric_ld_color_read_dir,
                                  build_new_dir=True)  ### 子
            Syn_write_to_read_dir(write_dir=self.metric_ld_gray_write_dir,
                                  read_dir=self.metric_ld_gray_read_dir,
                                  build_new_dir=True)  ### 子

        ### See_method 第零b部分:顯示結束資訊 和 計時
        print(
            datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"),
            f"See level: finish Calculate_SSIM_LD, Current See:{self.see_name}, cost_time:{time.time() - start_time}"
        )
        print("")