diff --git a/merger/MergeMasked.py b/merger/MergeMasked.py index e7c57df..47d117f 100644 --- a/merger/MergeMasked.py +++ b/merger/MergeMasked.py @@ -10,17 +10,14 @@ from core.cv2ex import * xseg_input_size = 256 -def MergeMaskedFace (predictor_func, predictor_input_shape, +def MergeMaskedFace (predictor_func, predictor_input_shape, face_enhancer_func, xseg_256_extract_func, cfg, frame_info, img_bgr_uint8, img_bgr, img_face_landmarks): + img_size = img_bgr.shape[1], img_bgr.shape[0] img_face_mask_a = LandmarksProcessor.get_image_hull_mask (img_bgr.shape, img_face_landmarks) - - out_img = img_bgr.copy() - out_merging_mask_a = None - input_size = predictor_input_shape[0] mask_subres_size = input_size*4 output_size = input_size @@ -43,7 +40,7 @@ def MergeMaskedFace (predictor_func, predictor_input_shape, predictor_input_bgr = cv2.resize (dst_face_bgr, (input_size,input_size) ) - predicted = predictor_func (predictor_input_bgr) + predicted = predictor_func (predictor_input_bgr) prd_face_bgr = np.clip (predicted[0], 0, 1.0) prd_face_mask_a_0 = np.clip (predicted[1], 0, 1.0) prd_face_dst_mask_a_0 = np.clip (predicted[2], 0, 1.0) @@ -68,14 +65,14 @@ def MergeMaskedFace (predictor_func, predictor_input_shape, wrk_face_mask_a_0 = prd_face_mask_a_0*prd_face_dst_mask_a_0 elif cfg.mask_mode == 5: #learned-prd+learned-dst wrk_face_mask_a_0 = np.clip( prd_face_mask_a_0+prd_face_dst_mask_a_0, 0, 1) - elif cfg.mask_mode >= 6 and cfg.mask_mode <= 9: #XSeg modes + elif cfg.mask_mode >= 6 and cfg.mask_mode <= 9: #XSeg modes if cfg.mask_mode == 6 or cfg.mask_mode == 8 or cfg.mask_mode == 9: # obtain XSeg-prd prd_face_xseg_bgr = cv2.resize (prd_face_bgr, (xseg_input_size,)*2, cv2.INTER_CUBIC) prd_face_xseg_mask = xseg_256_extract_func(prd_face_xseg_bgr) X_prd_face_mask_a_0 = cv2.resize ( prd_face_xseg_mask, (output_size, output_size), cv2.INTER_CUBIC) - if cfg.mask_mode >= 7 and cfg.mask_mode <= 9: + if cfg.mask_mode >= 7 and cfg.mask_mode <= 9: # obtain XSeg-dst xseg_mat = LandmarksProcessor.get_transform_mat (img_face_landmarks, xseg_input_size, face_type=cfg.face_type) dst_face_xseg_bgr = cv2.warpAffine(img_bgr, xseg_mat, (xseg_input_size,)*2, flags=cv2.INTER_CUBIC ) @@ -90,7 +87,7 @@ def MergeMaskedFace (predictor_func, predictor_input_shape, wrk_face_mask_a_0 = X_prd_face_mask_a_0 * X_dst_face_mask_a_0 elif cfg.mask_mode == 9: #learned-prd*learned-dst*XSeg-prd*XSeg-dst wrk_face_mask_a_0 = prd_face_mask_a_0 * prd_face_dst_mask_a_0 * X_prd_face_mask_a_0 * X_dst_face_mask_a_0 - + wrk_face_mask_a_0[ wrk_face_mask_a_0 < (1.0/255.0) ] = 0.0 # get rid of noise # resize to mask_subres_size @@ -129,193 +126,196 @@ def MergeMaskedFace (predictor_func, predictor_input_shape, img_face_mask_a = cv2.warpAffine( wrk_face_mask_a_0, face_mask_output_mat, img_size, np.zeros(img_bgr.shape[0:2], dtype=np.float32), flags=cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC )[...,None] img_face_mask_a = np.clip (img_face_mask_a, 0.0, 1.0) - img_face_mask_a [ img_face_mask_a < (1.0/255.0) ] = 0.0 # get rid of noise if wrk_face_mask_a_0.shape[0] != output_size: wrk_face_mask_a_0 = cv2.resize (wrk_face_mask_a_0, (output_size,output_size), cv2.INTER_CUBIC) wrk_face_mask_a = wrk_face_mask_a_0[...,None] - wrk_face_mask_area_a = wrk_face_mask_a.copy() - wrk_face_mask_area_a[wrk_face_mask_area_a>0] = 1.0 + out_merging_mask_a = None if cfg.mode == 'original': return img_bgr, img_face_mask_a - + elif 'raw' in cfg.mode: if cfg.mode == 'raw-rgb': - out_img = cv2.warpAffine( prd_face_bgr, face_output_mat, img_size, out_img, cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) + out_img = cv2.warpAffine( prd_face_bgr, face_output_mat, img_size, img_bgr.copy(), cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) out_merging_mask_a = img_face_mask_a - elif cfg.mode == 'raw-predict': - out_img = prd_face_bgr - out_merging_mask_a = wrk_face_mask_a - + out_img = prd_face_bgr + out_merging_mask_a = wrk_face_mask_a + else: + raise ValueError(f"undefined raw type {cfg.mode}") + out_img = np.clip (out_img, 0.0, 1.0 ) else: - #averaging [lenx, leny, maskx, masky] by grayscale gradients of upscaled mask - ar = [] - for i in range(1, 10): - maxregion = np.argwhere( img_face_mask_a > i / 10.0 ) - if maxregion.size != 0: - miny,minx = maxregion.min(axis=0)[:2] - maxy,maxx = maxregion.max(axis=0)[:2] - lenx = maxx - minx - leny = maxy - miny - if min(lenx,leny) >= 4: - ar += [ [ lenx, leny] ] + + # Process if the mask meets minimum size + maxregion = np.argwhere( img_face_mask_a >= 0.1 ) + if maxregion.size != 0: + miny,minx = maxregion.min(axis=0)[:2] + maxy,maxx = maxregion.max(axis=0)[:2] + lenx = maxx - minx + leny = maxy - miny + if min(lenx,leny) >= 4: + wrk_face_mask_area_a = wrk_face_mask_a.copy() + wrk_face_mask_area_a[wrk_face_mask_area_a>0] = 1.0 + + if 'seamless' not in cfg.mode and cfg.color_transfer_mode != 0: + if cfg.color_transfer_mode == 1: #rct + prd_face_bgr = imagelib.reinhard_color_transfer ( np.clip( prd_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), + np.clip( dst_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), ) - if len(ar) > 0: + prd_face_bgr = np.clip( prd_face_bgr.astype(np.float32) / 255.0, 0.0, 1.0) + elif cfg.color_transfer_mode == 2: #lct + prd_face_bgr = imagelib.linear_color_transfer (prd_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 3: #mkl + prd_face_bgr = imagelib.color_transfer_mkl (prd_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 4: #mkl-m + prd_face_bgr = imagelib.color_transfer_mkl (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + elif cfg.color_transfer_mode == 5: #idt + prd_face_bgr = imagelib.color_transfer_idt (prd_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 6: #idt-m + prd_face_bgr = imagelib.color_transfer_idt (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + elif cfg.color_transfer_mode == 7: #sot-m + prd_face_bgr = imagelib.color_transfer_sot (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a, steps=10, batch_size=30) + prd_face_bgr = np.clip (prd_face_bgr, 0.0, 1.0) + elif cfg.color_transfer_mode == 8: #mix-m + prd_face_bgr = imagelib.color_transfer_mix (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - if 'seamless' not in cfg.mode and cfg.color_transfer_mode != 0: - if cfg.color_transfer_mode == 1: #rct - prd_face_bgr = imagelib.reinhard_color_transfer ( np.clip( prd_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), - np.clip( dst_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), ) - - prd_face_bgr = np.clip( prd_face_bgr.astype(np.float32) / 255.0, 0.0, 1.0) - elif cfg.color_transfer_mode == 2: #lct - prd_face_bgr = imagelib.linear_color_transfer (prd_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 3: #mkl - prd_face_bgr = imagelib.color_transfer_mkl (prd_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 4: #mkl-m - prd_face_bgr = imagelib.color_transfer_mkl (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - elif cfg.color_transfer_mode == 5: #idt - prd_face_bgr = imagelib.color_transfer_idt (prd_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 6: #idt-m - prd_face_bgr = imagelib.color_transfer_idt (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - elif cfg.color_transfer_mode == 7: #sot-m - prd_face_bgr = imagelib.color_transfer_sot (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a, steps=10, batch_size=30) - prd_face_bgr = np.clip (prd_face_bgr, 0.0, 1.0) - elif cfg.color_transfer_mode == 8: #mix-m - prd_face_bgr = imagelib.color_transfer_mix (prd_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + if cfg.mode == 'hist-match': + hist_mask_a = np.ones ( prd_face_bgr.shape[:2] + (1,) , dtype=np.float32) - if cfg.mode == 'hist-match': - hist_mask_a = np.ones ( prd_face_bgr.shape[:2] + (1,) , dtype=np.float32) + if cfg.masked_hist_match: + hist_mask_a *= wrk_face_mask_area_a - if cfg.masked_hist_match: - hist_mask_a *= wrk_face_mask_area_a + white = (1.0-hist_mask_a)* np.ones ( prd_face_bgr.shape[:2] + (1,) , dtype=np.float32) - white = (1.0-hist_mask_a)* np.ones ( prd_face_bgr.shape[:2] + (1,) , dtype=np.float32) + hist_match_1 = prd_face_bgr*hist_mask_a + white + hist_match_1[ hist_match_1 > 1.0 ] = 1.0 - hist_match_1 = prd_face_bgr*hist_mask_a + white - hist_match_1[ hist_match_1 > 1.0 ] = 1.0 + hist_match_2 = dst_face_bgr*hist_mask_a + white + hist_match_2[ hist_match_1 > 1.0 ] = 1.0 - hist_match_2 = dst_face_bgr*hist_mask_a + white - hist_match_2[ hist_match_1 > 1.0 ] = 1.0 + prd_face_bgr = imagelib.color_hist_match(hist_match_1, hist_match_2, cfg.hist_match_threshold ).astype(dtype=np.float32) - prd_face_bgr = imagelib.color_hist_match(hist_match_1, hist_match_2, cfg.hist_match_threshold ).astype(dtype=np.float32) + if 'seamless' in cfg.mode: + #mask used for cv2.seamlessClone + img_face_seamless_mask_a = None + for i in range(1,10): + a = img_face_mask_a > i / 10.0 + if len(np.argwhere(a)) == 0: + continue + img_face_seamless_mask_a = img_face_mask_a.copy() + img_face_seamless_mask_a[a] = 1.0 + img_face_seamless_mask_a[img_face_seamless_mask_a <= i / 10.0] = 0.0 + break - if 'seamless' in cfg.mode: - #mask used for cv2.seamlessClone - img_face_seamless_mask_a = None - for i in range(1,10): - a = img_face_mask_a > i / 10.0 - if len(np.argwhere(a)) == 0: - continue - img_face_seamless_mask_a = img_face_mask_a.copy() - img_face_seamless_mask_a[a] = 1.0 - img_face_seamless_mask_a[img_face_seamless_mask_a <= i / 10.0] = 0.0 - break + out_img = cv2.warpAffine( prd_face_bgr, face_output_mat, img_size, np.empty_like(img_bgr), cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) + out_img = np.clip(out_img, 0.0, 1.0) - out_img = cv2.warpAffine( prd_face_bgr, face_output_mat, img_size, out_img, cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) + if 'seamless' in cfg.mode: + try: + #calc same bounding rect and center point as in cv2.seamlessClone to prevent jittering (not flickering) + l,t,w,h = cv2.boundingRect( (img_face_seamless_mask_a*255).astype(np.uint8) ) + s_maskx, s_masky = int(l+w/2), int(t+h/2) + out_img = cv2.seamlessClone( (out_img*255).astype(np.uint8), img_bgr_uint8, (img_face_seamless_mask_a*255).astype(np.uint8), (s_maskx,s_masky) , cv2.NORMAL_CLONE ) + out_img = out_img.astype(dtype=np.float32) / 255.0 + except Exception as e: + #seamlessClone may fail in some cases + e_str = traceback.format_exc() - out_img = np.clip(out_img, 0.0, 1.0) + if 'MemoryError' in e_str: + raise Exception("Seamless fail: " + e_str) #reraise MemoryError in order to reprocess this data by other processes + else: + print ("Seamless fail: " + e_str) - if 'seamless' in cfg.mode: - try: - #calc same bounding rect and center point as in cv2.seamlessClone to prevent jittering (not flickering) - l,t,w,h = cv2.boundingRect( (img_face_seamless_mask_a*255).astype(np.uint8) ) - s_maskx, s_masky = int(l+w/2), int(t+h/2) - out_img = cv2.seamlessClone( (out_img*255).astype(np.uint8), img_bgr_uint8, (img_face_seamless_mask_a*255).astype(np.uint8), (s_maskx,s_masky) , cv2.NORMAL_CLONE ) - out_img = out_img.astype(dtype=np.float32) / 255.0 - except Exception as e: - #seamlessClone may fail in some cases - e_str = traceback.format_exc() + cfg_mp = cfg.motion_blur_power / 100.0 - if 'MemoryError' in e_str: - raise Exception("Seamless fail: " + e_str) #reraise MemoryError in order to reprocess this data by other processes + out_img = img_bgr*(1-img_face_mask_a) + (out_img*img_face_mask_a) + + if ('seamless' in cfg.mode and cfg.color_transfer_mode != 0) or \ + cfg.mode == 'seamless-hist-match' or \ + cfg_mp != 0 or \ + cfg.blursharpen_amount != 0 or \ + cfg.image_denoise_power != 0 or \ + cfg.bicubic_degrade_power != 0: + + out_face_bgr = cv2.warpAffine( out_img, face_mat, (output_size, output_size), flags=cv2.INTER_CUBIC ) + + if 'seamless' in cfg.mode and cfg.color_transfer_mode != 0: + if cfg.color_transfer_mode == 1: + out_face_bgr = imagelib.reinhard_color_transfer ( np.clip(out_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), + np.clip(dst_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8) ) + out_face_bgr = np.clip( out_face_bgr.astype(np.float32) / 255.0, 0.0, 1.0) + elif cfg.color_transfer_mode == 2: #lct + out_face_bgr = imagelib.linear_color_transfer (out_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 3: #mkl + out_face_bgr = imagelib.color_transfer_mkl (out_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 4: #mkl-m + out_face_bgr = imagelib.color_transfer_mkl (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + elif cfg.color_transfer_mode == 5: #idt + out_face_bgr = imagelib.color_transfer_idt (out_face_bgr, dst_face_bgr) + elif cfg.color_transfer_mode == 6: #idt-m + out_face_bgr = imagelib.color_transfer_idt (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + elif cfg.color_transfer_mode == 7: #sot-m + out_face_bgr = imagelib.color_transfer_sot (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a, steps=10, batch_size=30) + out_face_bgr = np.clip (out_face_bgr, 0.0, 1.0) + elif cfg.color_transfer_mode == 8: #mix-m + out_face_bgr = imagelib.color_transfer_mix (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) + + if cfg.mode == 'seamless-hist-match': + out_face_bgr = imagelib.color_hist_match(out_face_bgr, dst_face_bgr, cfg.hist_match_threshold) + + if cfg_mp != 0: + k_size = int(frame_info.motion_power*cfg_mp) + if k_size >= 1: + k_size = np.clip (k_size+1, 2, 50) + if cfg.super_resolution_power != 0: + k_size *= 2 + out_face_bgr = imagelib.LinearMotionBlur (out_face_bgr, k_size , frame_info.motion_deg) + + if cfg.blursharpen_amount != 0: + out_face_bgr = imagelib.blursharpen ( out_face_bgr, cfg.sharpen_mode, 3, cfg.blursharpen_amount) + + if cfg.image_denoise_power != 0: + n = cfg.image_denoise_power + while n > 0: + img_bgr_denoised = cv2.medianBlur(img_bgr, 5) + if int(n / 100) != 0: + img_bgr = img_bgr_denoised + else: + pass_power = (n % 100) / 100.0 + img_bgr = img_bgr*(1.0-pass_power)+img_bgr_denoised*pass_power + n = max(n-10,0) + + if cfg.bicubic_degrade_power != 0: + p = 1.0 - cfg.bicubic_degrade_power / 101.0 + img_bgr_downscaled = cv2.resize (img_bgr, ( int(img_size[0]*p), int(img_size[1]*p ) ), cv2.INTER_CUBIC) + img_bgr = cv2.resize (img_bgr_downscaled, img_size, cv2.INTER_CUBIC) + + new_out = cv2.warpAffine( out_face_bgr, face_mat, img_size, np.empty_like(img_bgr), cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) + + out_img = np.clip( img_bgr*(1-img_face_mask_a) + (new_out*img_face_mask_a) , 0, 1.0 ) + + if cfg.color_degrade_power != 0: + out_img_reduced = imagelib.reduce_colors(out_img, 256) + if cfg.color_degrade_power == 100: + out_img = out_img_reduced else: - print ("Seamless fail: " + e_str) - - - out_img = img_bgr*(1-img_face_mask_a) + (out_img*img_face_mask_a) - - out_face_bgr = cv2.warpAffine( out_img, face_mat, (output_size, output_size), flags=cv2.INTER_CUBIC ) - - if 'seamless' in cfg.mode and cfg.color_transfer_mode != 0: - if cfg.color_transfer_mode == 1: - out_face_bgr = imagelib.reinhard_color_transfer ( np.clip(out_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8), - np.clip(dst_face_bgr*wrk_face_mask_area_a*255, 0, 255).astype(np.uint8) ) - out_face_bgr = np.clip( out_face_bgr.astype(np.float32) / 255.0, 0.0, 1.0) - elif cfg.color_transfer_mode == 2: #lct - out_face_bgr = imagelib.linear_color_transfer (out_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 3: #mkl - out_face_bgr = imagelib.color_transfer_mkl (out_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 4: #mkl-m - out_face_bgr = imagelib.color_transfer_mkl (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - elif cfg.color_transfer_mode == 5: #idt - out_face_bgr = imagelib.color_transfer_idt (out_face_bgr, dst_face_bgr) - elif cfg.color_transfer_mode == 6: #idt-m - out_face_bgr = imagelib.color_transfer_idt (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - elif cfg.color_transfer_mode == 7: #sot-m - out_face_bgr = imagelib.color_transfer_sot (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a, steps=10, batch_size=30) - out_face_bgr = np.clip (out_face_bgr, 0.0, 1.0) - elif cfg.color_transfer_mode == 8: #mix-m - out_face_bgr = imagelib.color_transfer_mix (out_face_bgr*wrk_face_mask_area_a, dst_face_bgr*wrk_face_mask_area_a) - - if cfg.mode == 'seamless-hist-match': - out_face_bgr = imagelib.color_hist_match(out_face_bgr, dst_face_bgr, cfg.hist_match_threshold) - - cfg_mp = cfg.motion_blur_power / 100.0 - if cfg_mp != 0: - k_size = int(frame_info.motion_power*cfg_mp) - if k_size >= 1: - k_size = np.clip (k_size+1, 2, 50) - if cfg.super_resolution_power != 0: - k_size *= 2 - out_face_bgr = imagelib.LinearMotionBlur (out_face_bgr, k_size , frame_info.motion_deg) - - if cfg.blursharpen_amount != 0: - out_face_bgr = imagelib.blursharpen ( out_face_bgr, cfg.sharpen_mode, 3, cfg.blursharpen_amount) - - - if cfg.image_denoise_power != 0: - n = cfg.image_denoise_power - while n > 0: - img_bgr_denoised = cv2.medianBlur(img_bgr, 5) - if int(n / 100) != 0: - img_bgr = img_bgr_denoised - else: - pass_power = (n % 100) / 100.0 - img_bgr = img_bgr*(1.0-pass_power)+img_bgr_denoised*pass_power - n = max(n-10,0) - - if cfg.bicubic_degrade_power != 0: - p = 1.0 - cfg.bicubic_degrade_power / 101.0 - img_bgr_downscaled = cv2.resize (img_bgr, ( int(img_size[0]*p), int(img_size[1]*p ) ), cv2.INTER_CUBIC) - img_bgr = cv2.resize (img_bgr_downscaled, img_size, cv2.INTER_CUBIC) - - new_out = cv2.warpAffine( out_face_bgr, face_mat, img_size, img_bgr.copy(), cv2.WARP_INVERSE_MAP | cv2.INTER_CUBIC, cv2.BORDER_TRANSPARENT ) - out_img = np.clip( img_bgr*(1-img_face_mask_a) + (new_out*img_face_mask_a) , 0, 1.0 ) - - if cfg.color_degrade_power != 0: - out_img_reduced = imagelib.reduce_colors(out_img, 256) - if cfg.color_degrade_power == 100: - out_img = out_img_reduced - else: - alpha = cfg.color_degrade_power / 100.0 - out_img = (out_img*(1.0-alpha) + out_img_reduced*alpha) + alpha = cfg.color_degrade_power / 100.0 + out_img = (out_img*(1.0-alpha) + out_img_reduced*alpha) out_merging_mask_a = img_face_mask_a return out_img, out_merging_mask_a -def MergeMasked (predictor_func, +def MergeMasked (predictor_func, predictor_input_shape, face_enhancer_func, - xseg_256_extract_func, - cfg, + xseg_256_extract_func, + cfg, frame_info): img_bgr_uint8 = cv2_imread(frame_info.filepath) img_bgr_uint8 = imagelib.normalize_channels (img_bgr_uint8, 3)