def I_Generate_W_see(model_G, phase, index, in_img, in_img_pre, _3, Wgt_w_Mgt_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 之類的 輔助檔案 ,先定出位置
    public_write_dir     = "/".join(used_sees[index].see_write_dir.replace("\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    gt_mask_coord[0] 為 mask  (1, h, w, 1)
    gt_mask_coord[1] 為 coord (1, h, w, 2) 先y 在x

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

    W_01, Wgt_01    = I_Generate_W(model_G, None, in_img_pre, None, Wgt_w_Mgt_pre, exp_obj.use_gt_range, training=training)

    W_visual,   Wx_visual,   Wy_visual,   Wz_visual   = W_01_visual_op(W_01)
    Wgt_visual, Wxgt_visual, Wygt_visual, Wzgt_visual = W_01_visual_op(Wgt_01)
    # print("wc.shape:          ", wc.shape)
    # print("wc_visual.shape:   ", wc_visual.shape)
    # print("gt_wc.shape:       ", gt_wc.shape)
    # print("gt_wc_visual.shape:", gt_wc_visual.shape)

    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(in_img).jpg", in_img)             ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張

        np.save    (private_write_dir + "/" + "0b_u1b1-gt_wc",      Wgt_01)                                   ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_Wx.jpg",  Wxgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_Wy.jpg",  Wygt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b5-gt_Wz.jpg",  Wzgt_visual)       
        cv2.imwrite(private_write_dir + "/" + "0c-rec_hope.jpg",   rec_hope)           ### 寫一張 rec_hope圖進去,hope 我 rec可以做到這麼好ˊ口ˋ,0c是為了保證自動排序會放在第三張
    np.save(    private_write_dir + "/" + "epoch_%04i_u1b1-W"             % current_ep, W_01)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b2-W_visual.jpg"  % current_ep, W_visual)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b3-Wx_visual.jpg" % current_ep, Wx_visual)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b4-Wy_visual.jpg" % current_ep, Wy_visual)
    cv2.imwrite(private_write_dir + "/" + "epoch_%04i_u1b5-Wz_visual.jpg" % current_ep, Wz_visual)

    if(postprocess):
        current_see_name = used_sees[index].see_name.replace("/", "-")  ### 因為 test 會有多一層 "test_db_name"/test_001, 所以把 / 改成 - ,下面 Save_fig 才不會多一層資料夾
        from matplot_fig_ax_util import Matplot_single_row_imgs
        imgs = [ in_img ,   W_visual , Wgt_visual]
        img_titles = ["in_img", "Wpred",   "Wgt"]

        single_row_imgs = Matplot_single_row_imgs(
                                imgs      =imgs,         ### 把要顯示的每張圖包成list
                                img_titles=img_titles,               ### 把每張圖要顯示的字包成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)
Exemple #2
0
 def _Draw_matplot_visual(self, epoch, add_loss=False, bgr2rgb=False):
     in_img = cv2.imread(self.in_img_path)  ### 要記得see的第一張存的是 輸入的in影像
     gt_img = cv2.imread(self.gt_flow_jpg_path)  ### 要記得see的第二張存的是 輸出的gt影像
     img = cv2.imread(self.flow_ep_jpg_read_paths[epoch]
                      )  ### see資料夾 內的影像 該epoch產生的影像 讀出來
     single_row_imgs = Matplot_single_row_imgs(
         imgs=[in_img, img, gt_img],  ### 把要顯示的每張圖包成list
         img_titles=["in_img", "out_img", "gt_img"],  ### 把每張圖要顯示的字包成list
         fig_title="flow_epoch=%04i" % epoch,  ### 圖上的大標題
         add_loss=add_loss,
         bgr2rgb=bgr2rgb)
     single_row_imgs.Draw_img()
     return single_row_imgs
    def _Draw_bm_rec_matplot_visual(self,
                                    epoch,
                                    add_loss=False,
                                    bgr2rgb=False,
                                    jump_to=0):
        in_img = cv2.imread(self.dis_img_path)  ### 要記得see的jpg第一張存的是 輸入的in影像
        flow_v = cv2.imread(self.flow_ep_jpg_read_paths[epoch]
                            )  ### see資料夾 內的影像 該epoch產生的影像 讀出來
        gt_flow_v = cv2.imread(
            self.gt_flow_jpg_path)  ### 要記得see0的jpg第二張存的是 輸出的gt影像

        # print("2. see use_gt_range=", self.use_gt_range)
        # start_time = time.time()
        bm, rec, gt_bm, gt_rec = self._get_bm_rec_and_gt_bm_gt_rec(
            epoch=epoch, dis_img=in_img)  ### 做一次 大約 1~2 秒
        # print("self._get_bm_rec_and_gt_bm_gt_rec cost time:", time.time() - start_time)

        # bm_visual  = method1(bm[...,0], bm[...,1]*-1)
        # gt_bm_visual = method1(gt_bm[...,0], gt_bm[...,1]*-1)
        single_row_imgs = Matplot_single_row_imgs(
            imgs=[in_img, flow_v, gt_flow_v, rec, gt_rec],  ### 把要顯示的每張圖包成list
            img_titles=[
                "in_img", "pred_flow_v", "gt_flow_v", "pred_rec", "gt_rec"
            ],  ### 把每張圖要顯示的字包成list
            fig_title="epoch=%04i" % epoch,  ### 圖上的大標題
            add_loss=add_loss,
            bgr2rgb=bgr2rgb)
        single_row_imgs.Draw_img()

        ### 單獨存大張 bm,有空再弄
        ### 單獨存大張 rec:
        if (epoch <= jump_to):
            cv2.imwrite(
                self.rec_visual_write_dir + "/" + "rec_gt.jpg", gt_rec
            )  ### 存大張gt,gt只要存一次即可,所以加個if這樣子,<=3是因為 bm_rec 懶的寫防呆 是從 第四個epoch才開始做~~,要不然epoch==2 就行囉!,所以目前gt會存兩次拉但時間應該多一咪咪而以先這樣吧~~
        # cv2.imwrite(self.rec_visual_write_dir + "/" + "rec_gt.jpg", gt_rec)                  ### 存大張gt,雖然只要 gt只要存一次即可 同上可以寫個if只存一次, 但也沒省多少時間, 都存算了! 以防 哪天從中途的epoch開始跑結果沒存到 rec_gt
        cv2.imwrite(self.rec_visual_write_dir + "/" +
                    "rec_epoch=%04i.jpg" % epoch, rec)  ### 存大張rec

        return single_row_imgs
Exemple #4
0
def I_w_Mgt_to_Cx_see(model_G,
                      phase,
                      index,
                      in_img,
                      in_img_pre,
                      gt_mask_coord,
                      gt_mask_coord_pre,
                      rec_hope=None,
                      exp_obj=None,
                      training=True,
                      see_reset_init=True,
                      postprocess=False,
                      add_loss=False,
                      bgr2rgb=True):
    '''
    這邊model 生成的是 ch2 的 coord, 要再跟 mask concate 後才會變成 ch3 的 flow 喔!
    '''
    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 之類的 輔助檔案 ,先定出位置
    public_write_dir = "/".join(used_sees[index].see_write_dir.replace(
        "\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    gt_mask_coord[0] 為 mask  (1, h, w, 1)
    gt_mask_coord[1] 為 coord (1, h, w, 2) 先y 在x
    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''

    in_img = in_img[0].numpy()

    gt_mask_pre = gt_mask_coord_pre[..., 0:1]
    I_pre_w_M = in_img_pre * gt_mask_pre

    cx_pre = model_G(I_pre_w_M, training=training)
    cx_pre = cx_pre[0].numpy()
    cx = Value_Range_Postprocess_to_01(cx_pre, exp_obj.use_gt_range)

    I_w_M_visual = (I_pre_w_M[0].numpy() * 255.).astype(np.uint8)

    gt_mask = gt_mask_coord[0, ..., 0:1]
    gt_cx = gt_mask_coord[0, ..., 2:3]

    gt_mask_visual = (gt_mask.numpy() * 255).astype(np.uint8)
    gt_cx_visual = (gt_cx.numpy() * 255).astype(np.uint8)
    Cx_visual = (cx * 255).astype(np.uint8)
    Cx_w_Mgt_visual = (cx * gt_mask_pre[0].numpy() * 255).astype(np.uint8)

    rec_hope = rec_hope[0].numpy()
    if (bgr2rgb):
        in_img = in_img[:, :, ::-1]  ### tf2 讀出來是 rgb, 但cv2存圖是bgr, 所以記得要轉一下ch
        I_w_M_visual = I_w_M_visual[:, :, ::-1]
        rec_hope = rec_hope[:, :, ::-1]

    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", in_img)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a1-gt_mask.jpg",
                    gt_mask_visual)  ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張
        cv2.imwrite(private_write_dir + "/" +
                    "0a_u1a2-dis_img_w_Mgt(in_img).jpg",
                    I_w_M_visual)  ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張
        ''' 覺得 u1b 不用寫 mask, 因為 unet1 又沒有 output mask! '''
        cv2.imwrite(private_write_dir + "/" + "0b_u1b1-gt_a_gt_Cx.jpg",
                    gt_cx_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(
            private_write_dir + "/" + "0c-rec_hope.jpg", rec_hope
        )  ### 寫一張 rec_hope圖進去,hope 我 rec可以做到這麼好ˊ口ˋ,0c是為了保證自動排序會放在第三張
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b1-Cx.jpg" % current_ep,
        Cx_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~
    cv2.imwrite(private_write_dir + "/" +
                "epoch_%04i_u1b2-Cx_w_Mgt.jpg" % current_ep, Cx_w_Mgt_visual
                )  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~

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

        single_row_imgs = Matplot_single_row_imgs(
            imgs=[
                in_img,
                gt_mask_visual,
                I_w_M_visual,
                gt_cx_visual,
                Cx_visual,
            ],  ### 把要顯示的每張圖包成list
            img_titles=["in_img", "gt_mask", "I_w_M", "gt_cx",
                        "pred_cx"],  ### 把每張圖要顯示的字包成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_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)
Exemple #8
0
def generate_sees(model_G,
                  see_index,
                  in_img_pre,
                  gt_move_map,
                  max_train_move,
                  min_train_move,
                  max_db_move_x,
                  max_db_move_y,
                  epoch=0,
                  result_obj=None,
                  see_reset_init=False):
    move_map_back, in_img_back = generate_results(model_G, in_img_pre,
                                                  max_train_move,
                                                  min_train_move)
    ### 我們不要存move_map_back.npy,存move_map_visual.jpg
    move_map_back_visual = method2(move_map_back[..., 0], move_map_back[...,
                                                                        1], 1)
    gt_move_map_visual = method2(gt_move_map[..., 0], gt_move_map[..., 1], 1)
    in_rec_img = apply_move_to_rec2(in_img_back, move_map_back, max_train_move,
                                    min_train_move)
    gt_rec_img = apply_move_to_rec2(in_img_back, gt_move_map, max_train_move,
                                    min_train_move)

    see_write_dir = result_obj.sees[
        see_index].see_write_dir  ### 每個 see 都有自己的資料夾 存 model生成的結果,先定出位置
    plot_dir = see_write_dir + "/" + "matplot_visual"  ### 每個 see資料夾 內都有一個matplot_visual 存 in_img, rect, gt_img 併起來好看的結果

    if (epoch == 0 or see_reset_init):  ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(see_write_dir)  ### 建立 see資料夾
        Check_dir_exist_and_build(plot_dir)  ### 建立 see資料夾/matplot_visual資料夾
        cv2.imwrite(see_write_dir + "/" + "0a-in_img.jpg",
                    in_img_back)  ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張
        cv2.imwrite(
            see_write_dir + "/" + "0b-gt_a_gt_move_map.jpg",
            gt_move_map_visual)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
        cv2.imwrite(see_write_dir + "/" + "0b-gt_b_gt_rec_img.jpg",
                    gt_rec_img)  ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
    cv2.imwrite(see_write_dir + "/" +
                "epoch_%04i_a_move_map_visual.jpg" % epoch,
                move_map_back_visual
                )  ### 把 生成影像存進相對應的資料夾,因為 tf訓練時是rgb,生成也是rgb,所以用cv2操作要轉bgr存才對!
    cv2.imwrite(
        see_write_dir + "/" + "epoch_%04i_b_in_rec_img.jpg" % epoch,
        in_rec_img)  ### 把 生成影像存進相對應的資料夾,因為 tf訓練時是rgb,生成也是rgb,所以用cv2操作要轉bgr存才對!

    imgs = [
        in_img_back, move_map_back_visual, gt_move_map_visual, in_rec_img,
        gt_rec_img
    ]  ### 把 in_img_back, rect_back, gt_img 包成list
    titles = [
        'Input Image', 'gen_move_map', 'gt_move_map', 'gen_rec_img',
        'gt_rec_img', 'Ground Truth'
    ]  ### 設定 title要顯示的字

    ### 改完但還沒有測試喔~~
    single_row_imgs = Matplot_single_row_imgs(imgs=imgs,
                                              img_titles=titles,
                                              fig_title="epoch_%04i" % epoch,
                                              bgr2rgb=False,
                                              add_loss=False)
    single_row_imgs.Save_fig(dst_dir=plot_dir, name="epoch", epoch=epoch)
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)
    def _visual_SSIM_LD(self,
                        start_epoch,
                        epoch_amount,
                        SSIMs,
                        LDs,
                        add_loss=False,
                        bgr2rgb=False):
        for go_epoch in tqdm(range(start_epoch, start_epoch + epoch_amount)):
            path1 = self.rec_read_paths[
                go_epoch]  ### bm_rec_matplot_visual/rec_visual/rec_epoch=0000.jpg
            path2 = self.rec_hope_path  ### 0c-rec_hope.jpg
            SSIM = SSIMs[go_epoch]
            LD = LDs[go_epoch]

            in_img = cv2.imread(self.in_img_path)
            rec_img = cv2.imread(path1)
            rec_gt_img = cv2.imread(path2)
            ld_visual = cv2.imread(self.ld_color_visual_read_path[go_epoch])
            single_row_imgs = Matplot_single_row_imgs(
                imgs=[in_img, rec_img, rec_gt_img],  ### 把要顯示的每張圖包成list
                img_titles=["in_img", "rec", "gt_rec"],  ### 把每張圖要顯示的字包成list
                fig_title="epoch=%04i, SSIM=%.2f, LD=%.2f" %
                (go_epoch, SSIM, LD),  ### 圖上的大標題
                add_loss=False,
                bgr2rgb=bgr2rgb)
            if (add_loss):
                ld_visual = ld_visual[..., ::-1]  ### opencv -> matplot
                ### step1 先架構好 整張圖的骨架
                single_row_imgs.step1_add_row_col(add_where="add_row",
                                                  merge=True)
                single_row_imgs.step1_add_row_col(add_where="add_col",
                                                  merge=True,
                                                  grid_ratio=1.9)

                ### step2 把圖都畫上去
                single_row_imgs.Draw_img()
                single_row_imgs.Draw_ax_loss_after_train(
                    single_row_imgs.merged_ax_list[0],
                    self.metrec_read_dir,
                    go_epoch,
                    min_epochs=self.see_rec_amount,
                    ylim=25)
                single_row_imgs.merged_ax_list[1].imshow(ld_visual)

                ### step3 重新規劃一下 各個圖 要顯示的 大小比例
                gs_bass = GridSpec(single_row_imgs.fig_row_amount,
                                   single_row_imgs.fig_col_amount,
                                   width_ratios=[1, 1, 1, 2],
                                   height_ratios=[1, 1])
                for go_r, r_ax in enumerate(single_row_imgs.ax):
                    for go_c, r_c_ax in enumerate(r_ax):
                        # print(f"gs_bass[{go_c}].get_position(single_row_imgs.fig)", gs_bass[go_r, go_c].get_position(single_row_imgs.fig))  ### 可以看到 目前使用的規格的範圍 和 其 對應到 single_row_imgs.fig 上 框出的box是在哪裡
                        r_c_ax.set_position(
                            gs_bass[go_c].get_position(single_row_imgs.fig)
                        )  ### 根據目前的圖(single_row_imgs.fig), 重新規劃一下 各個圖 要顯示的 大小比例

                # print("gs_bass[1, :3]", gs_bass[1, :3].get_position(single_row_imgs.fig))  ### 可以看到 目前使用的規格的範圍 和 其 對應到 single_row_imgs.fig 上 框出的box是在哪裡
                # print("gs_bass[:, 3 ]", gs_bass[:, 3 ].get_position(single_row_imgs.fig))  ### 可以看到 目前使用的規格的範圍 和 其 對應到 single_row_imgs.fig 上 框出的box是在哪裡
                single_row_imgs.merged_ax_list[0].set_position(
                    gs_bass[1, :3].get_position(single_row_imgs.fig)
                )  ### 根據目前的圖(single_row_imgs.fig), 重新規劃一下 各個圖 要顯示的 大小比例
                single_row_imgs.merged_ax_list[1].set_position(
                    gs_bass[:, 3].get_position(single_row_imgs.fig)
                )  ### 根據目前的圖(single_row_imgs.fig), 重新規劃一下 各個圖 要顯示的 大小比例

            # plt.show()
            single_row_imgs.Save_fig(
                dst_dir=self.matplot_metric_visual_write_dir,
                name="metric_epoch",
                epoch=go_epoch)  ### 話完圖就可以存了喔!
    def _do_matlab_SSIM_LD(self, start_epoch, epoch_amount, SSIMs, LDs):
        from kong_use_evalUnwarp_sucess import use_DewarpNet_eval

        for go_epoch in tqdm(range(start_epoch, start_epoch + epoch_amount)):
            ### rec_GT 要怎麼轉成 rec_pred
            path1 = self.rec_read_paths[
                go_epoch]  ### bm_rec_matplot_visual/rec_visual/rec_epoch=0000.jpg
            path2 = self.rec_hope_path  ### 0c-rec_hope.jpg
            # path2 = self.rec_read_paths[-1]        ### bm_rec_matplot_visual/rec_visual/rec_gt.jpg

            ### rec_pred 要怎麼轉成 rec_GT
            # path1 = self.rec_hope_path     ### 0c-rec_hope.jpg
            # path2 = self.rec_read_paths[go_epoch]  ### bm_rec_matplot_visual/rec_visual/rec_epoch=0000.jpg

            # print("path1~~~~~~~~~~~~", path1)
            # print("path2~~~~~~~~~~~~", path2)

            ord_dir = os.getcwd()  ### step1 紀錄 目前的主程式資料夾
            os.chdir("SIFT_dev/SIFTflow")  ### step2 跳到 SIFTflow資料夾裡面
            [SSIM, LD, vx, vy, d, im1, im2] = use_DewarpNet_eval(
                path1, path2
            )  ### step3 執行 SIFTflow資料夾裡面 的 kong_use_evalUnwarp_sucess.use_DewarpNet_eval 來執行 kong_evalUnwarp_sucess.m
            os.chdir(ord_dir)  ### step4 跳回 主程式資料夾

            # fig, ax = plt.subplots(nrows=1, ncols=2)
            # rec_img    = cv2.imread(path1)
            # rec_gt_img = cv2.imread(path2)
            # ax[0].imshow(rec_img)
            # ax[1].imshow(rec_gt_img)
            # plt.show()
            # plt.close()

            single_row_imgs = Matplot_single_row_imgs(
                imgs=[d],  ### 把要顯示的每張圖包成list
                img_titles=[],
                fig_title="",  ### 圖上的大標題
                pure_img=True,
                add_loss=False,
                bgr2rgb=False)
            single_row_imgs.Draw_img()
            single_row_imgs.Save_fig(self.metric_ld_matplot_write_dir,
                                     name="ld_epoch",
                                     epoch=go_epoch)
            # print("d.max()~~~~~~~~~~", d.max())  ### 目前手動看 大概就是 epoch=0000 會很大 剩下epoch都很小, 然後epoch=0000 大概都40幾, 所以我設50囉!
            # plt.show()

            ld_visual = method2(
                vx, vy, color_shift=3)  ### 因為等等是 直接用 cv2 直接寫,所以不用 bgr2rgb喔!

            cv2.imwrite(
                self.metric_ld_color_write_dir +
                "/ld_epoch=%04i.jpg" % go_epoch, ld_visual)
            cv2.imwrite(
                self.metric_ld_gray_write_dir +
                "/ld_epoch=%04i.jpg" % go_epoch, d.astype(np.uint8))
            cv2.imwrite(
                self.metric_im1_write_dir + "/im1_epoch=%04i.jpg" % go_epoch,
                (im1 * 255).astype(np.uint8))
            cv2.imwrite(
                self.metric_im2_write_dir + "/im1_epoch=%04i.jpg" % go_epoch,
                (im2 * 255).astype(np.uint8))

            # print(go_epoch, SSIM, LD)
            SSIMs.append((go_epoch, SSIM))
            LDs.append((go_epoch, LD))
Exemple #13
0
def I_w_M_Gen_Wx_Wy_Wz_to_W_see(model_G,
                                phase,
                                index,
                                in_img,
                                in_img_pre,
                                _3,
                                Wgt_w_Mgt_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 之類的 輔助檔案 ,先定出位置
    public_write_dir = "/".join(used_sees[index].see_write_dir.replace(
        "\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    '''
    gt_mask_coord[0] 為 mask  (1, h, w, 1)
    gt_mask_coord[1] 為 coord (1, h, w, 2) 先y 在x

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

    W_01, I_w_M_01, Wgt_01, Mgt_pre = use_model(model_G,
                                                None,
                                                in_img_pre,
                                                None,
                                                Wgt_w_Mgt_pre,
                                                exp_obj.use_gt_range,
                                                training=training)

    W_visual, Wx_visual, Wy_visual, Wz_visual = W_01_visual_op(W_01)
    Wgt_visual, Wxgt_visual, Wygt_visual, Wzgt_visual = W_01_visual_op(Wgt_01)
    # print("Wgt_visual", Wgt_visual.max())
    # print("Wgt_visual", Wgt_visual.min())
    Mgt_visual = (Mgt_pre * 255).astype(np.uint8)
    I_w_M_visual = (I_w_M_01 * 255).astype(np.uint8)
    ### 這裡是轉第1次的bgr2rgb, 轉成cv2 的 bgr
    if (bgr2rgb):
        in_img = in_img[:, :, ::-1]
        rec_hope = rec_hope[:, :, ::-1]
        I_w_M_visual = I_w_M_visual[:, :, ::-1]
    # print("W_01.shape:          ", W_01.shape)
    # print("W_visual.shape:   ", W_visual.shape)
    # print("Wgt.shape:       ", Wgt.shape)
    # print("Wgt_visual.shape:", Wgt_visual.shape)

    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", in_img)
        cv2.imwrite(private_write_dir + "/" + "0a_u1a2-gt_mask.jpg",
                    Mgt_visual)
        cv2.imwrite(
            private_write_dir + "/" + "0a_u1a3-dis_img_w_Mgt(in_img).jpg",
            I_w_M_visual)

        np.save(private_write_dir + "/" + "0b_u1b1-gt_W", Wgt_01)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b2-gt_W.jpg", Wgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b3-gt_Wx.jpg", Wxgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b4-gt_Wy.jpg", Wygt_visual)
        cv2.imwrite(private_write_dir + "/" + "0b_u1b5-gt_Wz.jpg", Wzgt_visual)
        cv2.imwrite(private_write_dir + "/" + "0c-rec_hope.jpg", rec_hope)
    np.save(private_write_dir + "/" + "epoch_%04i_u1b1-W" % current_ep, W_01)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b2-W_visual.jpg" % current_ep,
        W_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b3-Wx_visual.jpg" % current_ep,
        Wx_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b4-Wy_visual.jpg" % current_ep,
        Wy_visual)
    cv2.imwrite(
        private_write_dir + "/" + "epoch_%04i_u1b5-Wz_visual.jpg" % current_ep,
        Wz_visual)

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

        single_row_imgs = Matplot_single_row_imgs(
            imgs=imgs,  ### 把要顯示的每張圖包成list
            img_titles=img_titles,  ### 把每張圖要顯示的字包成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)

        ### W_01 back to W then + M
        gt_min = exp_obj.db_obj.db_gt_range.min
        gt_max = exp_obj.db_obj.db_gt_range.max
        W = W_01 * (gt_max - gt_min) + gt_min
        if (exp_obj.db_obj.get_method.value == "in_dis_gt_wc_try_mul_M"):
            W = W * Mgt_pre
        WM = np.concatenate([W, Mgt_pre], axis=-1)
        ### 確認寫得對不對
        # fig, ax = plt.subplots(1, 2)
        # ax[0].imshow(W_01)
        # ax[1].imshow(W - gt_min)
        # print(W.max())
        # print(W.min())
        # plt.show()

        gather_WM_npy_dir = f"{public_write_dir}/pred_WM_{phase}-{current_time}/WM_npy"
        gather_WM_knpy_dir = f"{public_write_dir}/pred_WM_{phase}-{current_time}/WM_knpy"
        Check_dir_exist_and_build(gather_WM_npy_dir)
        Check_dir_exist_and_build(gather_WM_knpy_dir)

        WM_npy_path = f"{gather_WM_npy_dir}/{current_see_name}_pred.npy"
        WM_knpy_path = f"{gather_WM_knpy_dir}/{current_see_name}_pred.knpy"
        np.save(WM_npy_path, WM)
        Save_npy_path_as_knpy(WM_npy_path, WM_knpy_path)
Exemple #14
0
def I_Generate_M_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=False):
    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
    '''
    bgr2rgb: tf2 讀出來是 rgb, 但 cv2 存圖是bgr, 所以此狀況記得要轉一下ch 把 bgr2rgb設True!
    '''
    in_img, pred_mask, pred_mask_visual, gt_mask = I_Generate_M_basic_data(model_G, in_img, in_img_pre, gt_mask_coord, exp_obj, training, bgr2rgb=True)
    private_write_dir      = used_sees[index].see_write_dir   ### 每個 see 都有自己的資料夾 存 in/gt 之類的 輔助檔案 ,先定出位置
    private_mask_write_dir = used_sees[index].mask_write_dir  ### 每個 see 都有自己的資料夾 存 model生成的結果,先定出位置
    public_write_dir       = "/".join(used_sees[index].see_write_dir.replace("\\", "/").split("/")[:-1])  ### private 的上一層資料夾
    # print('public_write_dir:', public_write_dir)

    if(current_ep == 0 or see_reset_init):                                              ### 第一次執行的時候,建立資料夾 和 寫一些 進去資料夾比較好看的東西
        Check_dir_exist_and_build(private_write_dir)                                   ### 建立 放輔助檔案 的資料夾
        Check_dir_exist_and_build(private_mask_write_dir)                                  ### 建立 model生成的結果 的資料夾
        cv2.imwrite(private_write_dir  + "/" + "0a_u1a0-dis_img(in_img).jpg", in_img)                ### 寫一張 in圖進去,進去資料夾時比較好看,0a是為了保證自動排序會放在第一張
        cv2.imwrite(private_write_dir  + "/" + "0b_u1b1-gt_mask.bmp", gt_mask)            ### 寫一張 gt圖進去,進去資料夾時比較好看,0b是為了保證自動排序會放在第二張
    cv2.imwrite(    private_mask_write_dir + "/" + "epoch_%04i_u1b1_mask.bmp" % current_ep, pred_mask_visual)  ### 我覺得不可以直接存npy,因為太大了!但最後為了省麻煩還是存了,相對就減少see的數量來讓總大小變小囉~

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

        single_row_imgs = Matplot_single_row_imgs(
                                imgs      =imgs,         ### 把要顯示的每張圖包成list
                                img_titles=img_titles,               ### 把每張圖要顯示的字包成list
                                fig_title ="%s, epoch=%04i" % (current_see_name, int(current_ep)),  ### 圖上的大標題
                                add_loss  =add_loss,
                                bgr2rgb   =bgr2rgb)
        single_row_imgs.Draw_img()
        single_row_imgs.Save_fig(dst_dir=public_write_dir, name=current_see_name)  ### 如果沒有要接續畫loss,就可以存了喔!

        '''
        Fake_F 的部分
        '''
        gather_mask_dir   = public_write_dir + "/pred_mask"
        Check_dir_exist_and_build(gather_mask_dir)
        cv2.imwrite(f"{gather_mask_dir}/{current_see_name}.bmp", pred_mask_visual)

        h, w = pred_mask.shape[:2]
        fake_name = current_see_name.split(".")[0]
        print("")
        ###############################################################################
        gather_fake_F_dir = public_write_dir + "/pred_mask/fake_F"
        Check_dir_exist_and_build(gather_fake_F_dir)
        fake_C = np.zeros(shape=(h, w, 2), dtype=np.float32)
        fake_F = np.concatenate((pred_mask, fake_C), axis=-1)
        fake_F = fake_F.astype(np.float32)

        gather_fake_F_npy_dir  = gather_fake_F_dir + "/1 npy"
        gather_fake_F_knpy_dir = gather_fake_F_dir + "/2 knpy"
        Check_dir_exist_and_build(gather_fake_F_npy_dir)
        Check_dir_exist_and_build(gather_fake_F_knpy_dir)
        fake_F_npy_path  = f"{gather_fake_F_npy_dir}/{fake_name}.npy"
        fake_F_knpy_path = f"{gather_fake_F_knpy_dir}/{fake_name}.knpy"
        np.save(fake_F_npy_path, fake_F)
        Save_npy_path_as_knpy(fake_F_npy_path, fake_F_knpy_path)
        print("fake_F_npy_path :", fake_F_npy_path)
        print("fake_F_knpy_path:", fake_F_knpy_path)
        ###############################################################################
        gather_fake_W_dir = public_write_dir + "/pred_mask/fake_W"
        Check_dir_exist_and_build(gather_fake_W_dir)
        fake_W = np.zeros(shape=(h, w, 3), dtype=np.float32)
        fake_W = np.concatenate((fake_W, pred_mask), axis=-1)
        fake_W = fake_W.astype(np.float32)

        gather_fake_W_npy_dir  = gather_fake_W_dir + "/1 npy"
        gather_fake_W_knpy_dir = gather_fake_W_dir + "/2 knpy"
        Check_dir_exist_and_build(gather_fake_W_npy_dir)
        Check_dir_exist_and_build(gather_fake_W_knpy_dir)
        fake_W_npy_path  = f"{gather_fake_W_npy_dir}/{fake_name}.npy"
        fake_W_knpy_path = f"{gather_fake_W_knpy_dir}/{fake_name}.knpy"
        np.save(fake_W_npy_path, fake_W)
        Save_npy_path_as_knpy(fake_W_npy_path, fake_W_knpy_path)
        print("fake_W_npy_path :", fake_W_npy_path)
        print("fake_W_knpy_path:", fake_W_knpy_path)