def _get_bm_rec_and_gt_bm_gt_rec(self, epoch, dis_img):
        ### pred flow part
        flow_pre = np.load(
            self.npz_epoch_flow_read_paths[epoch]
        )["arr_0"]  ### see資料夾 內的flow 該epoch產生的flow 讀出來,npz的讀法要["arr_0"],因為我存npz的時候沒給key_value,預設就 arr_0 囉!
        flow = Value_Range_Postprocess_to_01(
            flow_pre, self.result_obj.exp_obj_use_gt_range)
        bm, rec = check_flow_quality_then_I_w_F_to_R(dis_img, flow)

        ### gt flow part
        gt_flow = np.load(self.flow_gt_npz_path)[
            "arr_0"]  ### npz的讀法要["arr_0"],因為我存npz的時候沒給key_value,預設就 arr_0 囉!
        if (
                "real" in self.see_name
        ):  ### 因為 see-real 沒有gt_flow, 本來全黑沒問題, 不過我後來有玩 fake_see 不是全黑就會出問題, 所以乾脆 see-real 就不要處理
            h, w = gt_flow.shape[:2]
            gt_bm = np.zeros(shape=(h, w, 2))
            gt_rec = np.zeros(shape=(h, w, 3))
        else:
            gt_bm, gt_rec = check_flow_quality_then_I_w_F_to_R(dis_img, flow)
        return bm, rec, gt_bm, gt_rec
def I_w_Mgt_Gen_Cx_Cy_to_C_with_Mgt_to_F_see(model_G,
                                             phase,
                                             index,
                                             in_img,
                                             in_img_pre,
                                             _3,
                                             gt_mask_coord_pre,
                                             rec_hope=None,
                                             exp_obj=None,
                                             training=True,
                                             see_reset_init=True,
                                             postprocess=False,
                                             add_loss=False,
                                             bgr2rgb=True):
    current_ep = exp_obj.current_ep
    current_time = exp_obj.current_time
    if (phase == "see"): used_sees = exp_obj.result_obj.sees
    elif (phase == "test"): used_sees = exp_obj.result_obj.tests
    private_write_dir = used_sees[
        index].see_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_rec_write_dir = used_sees[
        index].rec_visual_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    public_write_dir = "/".join(used_sees[index].see_write_dir.replace(
        "\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    gt_mask_coord_pre[0] 為 mask  (1, h, w, 1)
    gt_mask_coord_pre[1] 為 coord (1, h, w, 2) 先y 在x

    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''
    ### 這裡是轉第1次的bgr2rgb, 轉成cv2 的 bgr
    in_img, I_w_M_visual, flow, flow_visual, Mgt_visual, gt_flow_visual, gt_flow, Cx_visual, Cy_visual, Cxgt_visual, Cygt_visual, rec_hope = I_w_Mgt_Gen_Cx_Cy_to_C_w_Mgt_to_F_basic_data(
        model_G,
        in_img,
        in_img_pre,
        gt_mask_coord_pre,
        rec_hope,
        exp_obj=exp_obj,
        training=training,
        bgr2rgb=bgr2rgb)

    if (current_ep == 0
            or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)  ### 建立 放輔助檔案 的資料夾
        Check_dir_exist_and_build(private_rec_write_dir)  ### 建立 放輔助檔案 的資料夾
        cv2.imwrite(private_write_dir + "/" + "0a_u1a0-dis_img.jpg", in_img)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-gt_mask.jpg",
                    Mgt_visual)
        cv2.imwrite(
            private_write_dir + "/" + "0a_u1a2-dis_img_w_Mgt((in_img)).jpg",
            I_w_M_visual)
        ''' 覺得 u1b 不用寫 mask, 因為 unet1 又沒有 output mask! '''
        np.save(private_write_dir + "/" + "0b_u1b1-gt_b_gt_flow",
                gt_flow)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b2-gt_b_gt_flow.jpg",
                    gt_flow_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_b_gt_Cx.jpg",
                    Cxgt_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_b_gt_Cy.jpg",
                    Cygt_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(
            private_write_dir + "/" + "0c-rec_hope.jpg", rec_hope
        )  ### 寫一張 rec_hope圖進去,hope 我 rec可以做到這麼好ˊ口ˋ,0c是為了保證自動排序會放在第三張
    np.save(private_write_dir + "/" + "epoch_%04i_u1b1_flow" % current_ep,
            flow)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" +
                "epoch_%04i_u1b2_flow.jpg" % current_ep,
                flow_visual)  ### 把 生成的 flow_visual 存進相對應的資料夾
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b3_Cx.jpg" % current_ep,
        Cx_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b4_Cy.jpg" % current_ep,
        Cy_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~

    if (postprocess):
        current_see_name = used_sees[index].see_name.replace(
            "/", "-"
        )  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾

        bm, rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=flow)
        '''gt不能做bm_rec,因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!'''
        # gt_bm, gt_rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=gt_flow)
        cv2.imwrite(
            private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep,
            rec)
        # print("private_rec_write_dir:", private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep)

        single_row_imgs = Matplot_single_row_imgs(
            imgs=[
                in_img, Mgt_visual, I_w_M_visual, flow_visual, rec, rec_hope
            ],  ### 把要顯示的每張圖包成list
            img_titles=[
                "in_img", "gt_mask", "I_with_M", "pred_flow_v", "pred_rec",
                "rec_hope"
            ],  ### 把每張圖要顯示的字包成list
            fig_title="%s, epoch=%04i" %
            (current_see_name, int(current_ep)),  ### 圖上的大標題
            add_loss=add_loss,
            bgr2rgb=bgr2rgb)  ### 這裡是轉第2次的bgr2rgb, 剛好轉成plt 的 rgb
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(
            dst_dir=public_write_dir,
            name=current_see_name)  ### 如果沒有要接續畫loss,就可以存了喔!
        print("save to:", exp_obj.result_obj.test_write_dir)
def I_gen_M_w_I_gen_C_w_M_to_F_see(model_G,
                                   phase,
                                   index,
                                   in_img,
                                   in_img_pre,
                                   gt_mask_coord,
                                   _4,
                                   rec_hope=None,
                                   exp_obj=None,
                                   training=True,
                                   see_reset_init=True,
                                   postprocess=False,
                                   add_loss=False,
                                   bgr2rgb=True):
    current_ep = exp_obj.current_ep
    current_time = exp_obj.current_time
    if (phase == "see"): used_sees = exp_obj.result_obj.sees
    elif (phase == "test"): used_sees = exp_obj.result_obj.tests
    private_write_dir = used_sees[
        index].see_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_rec_write_dir = used_sees[
        index].rec_visual_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    public_write_dir = "/".join(used_sees[index].see_write_dir.replace(
        "\\", "/").split("/")[:-1])  ### private 的上一層資料夾

    in_img, M_visual, Mgt_visual, I_with_M_visual, F, F_visual, Fgt, Fgt_visual, Cx_visual, Cy_visual, Cxgt_visual, Cygt_visual, rec_hope = I_gen_M_w_I_gen_C_w_M_to_F_basic_data(
        model_G,
        in_img,
        in_img_pre,
        gt_mask_coord,
        rec_hope=rec_hope,
        exp_obj=exp_obj,
        training=training,
        bgr2rgb=bgr2rgb)
    if (current_ep == 0
            or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)  ### 建立 放輔助檔案 的資料夾
        Check_dir_exist_and_build(private_rec_write_dir)  ### 建立 放輔助檔案 的資料夾
        cv2.imwrite(f"{private_write_dir}/0a_u1a0-dis_img(in_img).jpg", in_img)

        cv2.imwrite(f"{private_write_dir}/0b_u1b1-gt_mask.jpg", Mgt_visual)
        np.save(f"{private_write_dir}/0b_u2b2-gt_flow.npy", Fgt)
        cv2.imwrite(f"{private_write_dir}/0b_u2b3-gt_flow.jpg", Fgt_visual)
        cv2.imwrite(f"{private_write_dir}/0b_u2b4-gt_Cx.jpg", Cxgt_visual)
        cv2.imwrite(f"{private_write_dir}/0b_u2b5-gt_Cy.jpg", Cygt_visual)
        cv2.imwrite(f"{private_write_dir}/0c-rec_hope.jpg", rec_hope)

    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b1-mask.jpg" % current_ep,
        M_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u2a1-I_w_M.jpg" % current_ep,
        I_with_M_visual)
    np.save(private_write_dir + "/" + "epoch_%04i_u2b2-flow.npy" % current_ep,
            F)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u2b3-flow.jpg" % current_ep,
        F_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u2b4-Cx.jpg" % current_ep,
        Cx_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u2b5-Cy.jpg" % current_ep,
        Cy_visual)

    if (postprocess):
        current_see_name = used_sees[index].see_name.replace(
            "/", "-"
        )  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾
        bm, rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=F)
        '''gt不能做bm_rec,因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!'''
        # gt_bm, gt_rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=gt_flow)  ### 因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!
        cv2.imwrite(
            private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep,
            rec)

        single_row_imgs = Matplot_single_row_imgs(
            imgs=[
                in_img, M_visual, Mgt_visual, I_with_M_visual, F_visual,
                Fgt_visual, rec, rec_hope
            ],  ### 把要顯示的每張圖包成list
            img_titles=[
                "in_img", "Mask", "gt_Mask", "I_with_M", "pred_flow_v",
                "gt_flow_v", "pred_rec", "rec_hope"
            ],  ### 把每張圖要顯示的字包成list
            fig_title="%s, current_ep=%04i" %
            (current_see_name, int(current_ep)),  ### 圖上的大標題
            add_loss=add_loss,
            bgr2rgb=bgr2rgb)  ### 這裡會轉第2次bgr2rgb, 剛好轉成plt 的 rgb
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(
            dst_dir=public_write_dir, name=current_see_name
        )  ### 這裡是轉第2次的bgr2rgb, 剛好轉成plt 的 rgb  ### 如果沒有要接續畫loss,就可以存了喔!
        print("save to:", exp_obj.result_obj.test_write_dir)
def I_Generate_F_see(model_G,
                     phase,
                     index,
                     in_img,
                     in_img_pre,
                     gt_flow,
                     _4,
                     rec_hope,
                     exp_obj=None,
                     training=True,
                     see_reset_init=True,
                     postprocess=False,
                     add_loss=False,
                     bgr2rgb=True):
    current_ep = exp_obj.current_ep
    current_time = exp_obj.current_time
    if (phase == "see"): used_sees = exp_obj.result_obj.sees
    elif (phase == "test"): used_sees = exp_obj.result_obj.tests
    private_write_dir = used_sees[
        index].see_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_rec_write_dir = used_sees[
        index].rec_visual_write_dir  ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    public_write_dir = "/".join(used_sees[index].see_write_dir.replace(
        "\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''
    in_img, flow, gt_flow, rec_hope, flow_visual, M_visual, Cx_visual, Cy_visual, gt_flow_visual, Mgt_visual, Cxgt_visual, Cygt_visual = I_Gen_F_basic_data(
        model_G,
        in_img,
        in_img_pre,
        gt_flow,
        rec_hope,
        exp_obj=exp_obj,
        training=training,
        bgr2rgb=bgr2rgb)

    if (current_ep == 0
            or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)  ### 建立 see資料夾
        Check_dir_exist_and_build(private_rec_write_dir)  ### 建立 see資料夾
        cv2.imwrite(private_write_dir + "/" + "0a_u1a0-dis_img(in_img).jpg",
                    in_img)  ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張

        np.save(private_write_dir + "/" + "0b_u1b1-gt_flow",
                gt_flow)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b2-gt_flow.jpg",
                    gt_flow_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_Cx.jpg",
                    Cxgt_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_Cy.jpg",
                    Cygt_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(
            private_write_dir + "/" + "0c-rec_hope.jpg", rec_hope
        )  ### 寫一張 rec_hope圖進去,hope 我 rec可以做到這麼好ˊ口ˋ,0c是為了保證自動排序會放在第三張
    np.save(private_write_dir + "/" + "epoch_%04i_u1b1_flow" % current_ep,
            flow)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" +
                "epoch_%04i_u1b2_flow.jpg" % current_ep,
                flow_visual)  ### 把 生成的 flow_visual 存進相對應的資料夾
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b3_Cx.jpg" % current_ep,
        Cx_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b4_Cy.jpg" % current_ep,
        Cy_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~

    ### matplot_visual的部分,記得因為用 matplot 所以要 bgr轉rgb,但是因為有用matplot_visual_single_row_imgs,裡面會bgr轉rgb了,所以這裡不用轉囉!
    ### 這部分要記得做!在 train_step3 的 exp_obj.result_obj.Draw_loss_during_train(epoch, self.epochs) 才有畫布可以畫loss!
    ### 目前覺得好像也不大會去看matplot_visual,所以就先把這註解掉了
    # exp_obj.result_obj.sees[see_index].save_as_matplot_visual_during_train(current_ep, bgr2rgb=True)

    if (postprocess):
        current_see_name = used_sees[index].see_name.replace(
            "/", "-"
        )  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾
        bm, rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=flow)
        '''gt不能做bm_rec,因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!'''
        # gt_bm, gt_rec = check_flow_quality_then_I_w_F_to_R(dis_img=in_img, flow=gt_flow)

        cv2.imwrite(
            private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep,
            rec)
        single_row_imgs = Matplot_single_row_imgs(
            imgs=[in_img, flow_visual, rec, rec_hope],  ### 把要顯示的每張圖包成list
            img_titles=["in_img", "pred_flow_v", "pred_rec",
                        "rec_hope"],  ### 把每張圖要顯示的字包成list
            fig_title="%s, current_ep=%04i" %
            (current_see_name, int(current_ep)),  ### 圖上的大標題
            add_loss=add_loss,
            bgr2rgb=bgr2rgb)  ### 這裡會轉第2次bgr2rgb, 剛好轉成plt 的 rgb
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(
            dst_dir=public_write_dir, name=current_see_name
        )  ### 這裡是轉第2次的bgr2rgb, 剛好轉成plt 的 rgb  ### 如果沒有要接續畫loss,就可以存了喔!
        print("save to:", exp_obj.result_obj.test_write_dir)
def I_w_Mgt_Gen_Cx_Cy_focus_to_C_with_Mgt_to_F_see(model_G, phase, index, dis_img, dis_img_pre, _3, Mgt_C_pre, rec_hope=None, exp_obj=None, training=True, see_reset_init=True, postprocess=False, add_loss=False, bgr2rgb=True):
    current_ep = exp_obj.current_ep
    current_time = exp_obj.current_time
    if  (phase == "see"):  used_sees = exp_obj.result_obj.sees
    elif(phase == "test"): used_sees = exp_obj.result_obj.tests
    private_write_dir     = used_sees[index].see_write_dir          ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_rec_write_dir = used_sees[index].rec_visual_write_dir   ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    public_write_dir     = "/".join(used_sees[index].see_write_dir.replace("\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    Mgt_C_pre[0] 為 mask  (1, h, w, 1)
    Mgt_C_pre[1] 為 C (1, h, w, 2) 先y 在x

    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''
    '''
    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
                                但 plt 存圖是rgb, 所以存圖不用轉ch, 把 bgr2rgb設False喔!
    '''
    dis_img   = dis_img[0].numpy()

    C_raw, I_w_M_visual, Mgt_pre = use_model(model_G, None, dis_img_pre, None, Mgt_C_pre, exp_obj.use_gt_range, training=training)

    Mgt = Mgt_C_pre[0, ..., 0:1].numpy()
    Cgt = Mgt_C_pre[0, ..., 1:3].numpy()
    Mgt_visual = (Mgt * 255).astype(np.uint8)

    F_raw, F_raw_visual, Cx_raw_visual, Cy_raw_visual, F_w_Mgt,   F_w_Mgt_visual,   Cx_w_Mgt_visual,   Cy_w_Mgt_visual = C_and_C_w_M_to_F_and_visualize(C_raw,   Mgt)
    Fgt,   Fgt_visual,   Cxgt_visual,   Cygt_visual,         _,                _,                 _,                 _ = C_and_C_w_M_to_F_and_visualize(Cgt,     Mgt)

    ### 這裡是轉第1次的bgr2rgb, 轉成cv2 的 bgr
    F_raw_visual   = F_raw_visual  [:, :, ::-1]  ### cv2 處理完 是 bgr, 但這裡都是用 tf2 rgb的角度來處理, 所以就模擬一下 轉乘 tf2 的rgb囉!
    F_w_Mgt_visual = F_w_Mgt_visual[:, :, ::-1]  ### cv2 處理完 是 bgr, 但這裡都是用 tf2 rgb的角度來處理, 所以就模擬一下 轉乘 tf2 的rgb囉!
    Fgt_visual     = Fgt_visual    [:, :, ::-1]  ### cv2 處理完 是 bgr, 但這裡都是用 tf2 rgb的角度來處理, 所以就模擬一下 轉乘 tf2 的rgb囉!
    rec_hope       = rec_hope[0].numpy()
    if(bgr2rgb):
        dis_img        = dis_img       [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        I_w_M_visual   = I_w_M_visual  [:, :, ::-1]
        rec_hope       = rec_hope      [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        F_raw_visual   = F_raw_visual  [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        F_w_Mgt_visual = F_w_Mgt_visual[:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        Fgt_visual     = Fgt_visual    [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch

    if(current_ep == 0 or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)    ### 建立 放輔助檔案 的資料夾
        Check_dir_exist_and_build(private_rec_write_dir)    ### 建立 放輔助檔案 的資料夾
        cv2.imwrite(private_write_dir + "/" + "0a_u1a0-dis_img.jpg",  dis_img)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-Mgt.jpg",      Mgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a2-dis_img_w_Mgt(dis_img).jpg", I_w_M_visual)

        ''' 覺得 u1b 不用寫 mask, 因為 unet1 又沒有 output mask! '''
        np.save    (private_write_dir + "/" + "0b_u1b1-gt_b_Fgt",      Fgt)                        ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b2-gt_b_Fgt.jpg",  Fgt_visual)                 ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_b_Cgtx.jpg", Cxgt_visual)                    ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_b_Cgty.jpg", Cygt_visual)                    ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0c-rec_hope.jpg",       rec_hope)                       ### 寫一張 rec_hope圖進去,hope 我 rec可以做到這麼好ˊ口ˋ,0c是為了保證自動排序會放在第三張
    np.save(    private_write_dir + "/" + "epoch_%04i_u1b1_F_w_Mgt"      % current_ep, F_w_Mgt)          ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b2_F_raw.jpg"    % current_ep, F_raw_visual)     ### 把 生成的 F_visual 存進相對應的資料夾
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b3_F_w_Mgt.jpg"  % current_ep, F_w_Mgt_visual)   ### 把 生成的 F_visual 存進相對應的資料夾
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b4_Cx_raw.jpg"   % current_ep, Cx_raw_visual)    ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b5_Cx_w_Mgt.jpg" % current_ep, Cx_w_Mgt_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b6_Cy_raw.jpg"   % current_ep, Cy_raw_visual)    ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b7_Cy_w_Mgt.jpg" % current_ep, Cy_w_Mgt_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~

    if(postprocess):
        current_see_name = used_sees[index].see_name.replace("/", "-")  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾

        bm, rec       = check_flow_quality_then_I_w_F_to_R(dis_img=dis_img, F=F)
        '''gt不能做bm_rec,因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!'''
        # gt_bm, gt_rec = check_F_quality_then_I_w_F_to_R(dis_img=dis_img, F=Fgt)
        cv2.imwrite(private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep, rec)
        # print("private_rec_write_dir:", private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep)

        single_row_imgs = Matplot_single_row_imgs(
                                imgs      =[ dis_img , Mgt_visual, I_w_M_visual,  F_raw_visual, F_w_Mgt_visual,  rec,       rec_hope],  ### 把要顯示的每張圖包成list
                                img_titles=["dis_img", "Mgt",     "I_with_M",    "F_raw",       "F_w_Mgt",      "pred_rec", "rec_hope"],  ### 把每張圖要顯示的字包成list
                                fig_title ="%s, epoch=%04i" % (current_see_name, int(current_ep)),              ### 圖上的大標題
                                add_loss  =add_loss,
                                bgr2rgb   = bgr2rgb)  ### 這裡是轉第2次的bgr2rgb, 剛好轉成plt 的 rgb
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(dst_dir=public_write_dir, name=current_see_name)  ### 如果沒有要接續畫loss,就可以存了喔!
        print("save to:", exp_obj.result_obj.test_write_dir)
def W_w_M_Gen_Cx_Cy_see(model_G, phase, index, in_WM, in_WM_pre, Fgt, Fgt_pre, rec_hope=None, exp_obj=None, training=True, see_reset_init=True, postprocess=False, add_loss=False, bgr2rgb=True):
    current_ep = exp_obj.current_ep
    current_time = exp_obj.current_time
    if  (phase == "see"):  used_sees = exp_obj.result_obj.sees
    elif(phase == "test"): used_sees = exp_obj.result_obj.tests
    private_write_dir    = used_sees[index].see_write_dir   ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_rec_write_dir = used_sees[index].rec_visual_write_dir   ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    public_write_dir     = "/".join(used_sees[index].see_write_dir.replace("\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    # print("private_rec_write_dir:", private_rec_write_dir)
    '''
    in_WM_pre[..., 3:4] 為 M (1, h, w, 1)
    in_WM_pre[..., 0:3] 為 W (1, h, w, 3) 先z 再y 再x

    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''
    # plt.imshow(in_img[0])
    # plt.show()
    rec_hope  = rec_hope[0].numpy()

    W_pre, Mgt_pre, W_pre_W_M_pre, Cx_pre, Cy_pre = use_model(model_G, in_WM_pre, training)

    ### visualize W_pre
    W_01 = Value_Range_Postprocess_to_01(W_pre)
    W_01 = W_01[0].numpy()
    W_visual, Wx_visual, Wy_visual, Wz_visual  = W_01_visual_op(W_01)

    ### visualize Mgt_pre
    Mgt_visual = (Mgt_pre[0].numpy() * 255).astype(np.uint8)

    ### visualize W_pre_W_M_pre
    W_w_M_01 = Value_Range_Postprocess_to_01(W_pre_W_M_pre)
    W_w_M_01 = W_w_M_01[0].numpy()
    W_w_M_visual, Wx_w_M_visual, Wy_w_M_visual, Wz_w_M_visual  = W_01_visual_op(W_w_M_01)

    ### Cx_pre, Cy_pre postprocess and visualize
    ### postprocess
    C_pre = np.concatenate([Cy_pre, Cx_pre], axis=-1)  ### tensor 會自動轉 numpy
    C = Value_Range_Postprocess_to_01(C_pre, exp_obj.use_gt_range)
    C = C[0]
    Cgt = Fgt[0, ..., 1:3].numpy()

    Mgt = Fgt[0, ..., 0:1].numpy()
    F,   F_visual,   Cx_visual,   Cy_visual   = C_concat_with_M_to_F_and_get_F_visual(C, Mgt)
    Fgt, Fgt_visual, Cxgt_visual, Cygt_visual = C_concat_with_M_to_F_and_get_F_visual(Cgt, Mgt)
    F_visual   = F_visual  [:, :, ::-1]  ### cv2 處理完 是 bgr, 但這裡都是用 tf2 rgb的角度來處理, 所以就模擬一下 轉乘 tf2 的rgb囉!
    Fgt_visual = Fgt_visual[:, :, ::-1]  ### cv2 處理完 是 bgr, 但這裡都是用 tf2 rgb的角度來處理, 所以就模擬一下 轉乘 tf2 的rgb囉!

    ### 這個是給後處理用的 dis_img
    dis_img = in_WM[1][0].numpy()  ### [0]第一個是 取 wc, [1] 是取 dis_img, 第二個[0]是取 batch

    ### 這裡是轉第1次的bgr2rgb, 轉成cv2 的 bgr
    if(bgr2rgb):
        rec_hope   = rec_hope  [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        F_visual   = F_visual  [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        Fgt_visual = Fgt_visual[:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        dis_img    = dis_img   [:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch

    if(current_ep == 0 or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)    ### 建立 放輔助檔案 的資料夾
        cv2.imwrite(private_write_dir + "/" + "0a_u1a0-dis_img.jpg",          dis_img)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-ord_W_01.jpg",         W_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-ord_Wx_01.jpg",        Wx_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-ord_Wy_01.jpg",        Wy_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-ord_Wz_01.jpg",        Wz_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a2-gt_mask.jpg",          Mgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a3-W_w_Mgt(in_img).jpg",  W_w_M_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a3-Wx_w_Mgt.jpg", Wx_w_M_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a3-Wy_w_Mgt.jpg", Wy_w_M_visual)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a3-Wz_w_Mgt.jpg", Wz_w_M_visual)

        np.save    (private_write_dir + "/" + "0b_u1b1-gt_b_gt_flow",     Fgt)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b2-gt_b_gt_flow.jpg", Fgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_b_gt_Cx.jpg",   Cxgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_b_gt_Cy.jpg",   Cygt_visual)
        cv2.imwrite(private_write_dir + "/" + "0c-rec_hope.jpg",          rec_hope)
    np.save(    private_write_dir + "/" + "epoch_%04i_u1b1_flow"     % current_ep, F)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b2_flow.jpg" % current_ep, F_visual)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b3_Cx.jpg"   % current_ep, Cx_visual)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b4_Cy.jpg"   % current_ep, Cy_visual)


    if(postprocess):
        current_see_name = used_sees[index].see_name.replace("/", "-")  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾
        bm, rec       = check_flow_quality_then_I_w_F_to_R(dis_img=dis_img, flow=F)
        '''gt不能做bm_rec,因為 real_photo 沒有 C! 所以雖然用 test_blender可以跑, 但 test_real_photo 會卡住, 因為 C 全黑!'''
        cv2.imwrite(private_rec_write_dir + "/" + "rec_epoch=%04i.jpg" % current_ep, rec)

        single_row_imgs = Matplot_single_row_imgs(
                                imgs      =[ W_visual ,   Mgt_visual , W_w_M_visual,  F_visual ,    rec,   rec_hope],    ### 把要顯示的每張圖包成list
                                img_titles=["W_01",        "Mgt",        "W_w_M",     "pred_F", "pred_rec", "rec_hope"], ### 把每張圖要顯示的字包成list
                                fig_title ="%s, current_ep=%04i" % (current_see_name, int(current_ep)),  ### 圖上的大標題
                                add_loss  =add_loss,
                                bgr2rgb   =bgr2rgb)  ### 這裡會轉第2次bgr2rgb, 剛好轉成plt 的 rgb
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(dst_dir=public_write_dir, name=current_see_name)  ### 這裡是轉第2次的bgr2rgb, 剛好轉成plt 的 rgb  ### 如果沒有要接續畫loss,就可以存了喔!
        print("save to:", exp_obj.result_obj.test_write_dir)