From 130120c8a7034e0cb7d22c5ebd1fcee54b5dbe6f Mon Sep 17 00:00:00 2001 From: saas-backend Date: Tue, 22 Sep 2026 12:53:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(GPU):=20=E4=BF=AE=E5=A4=8DGFPGAN?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=90=8E=E8=93=9D=E8=89=B2=E9=81=AE=E7=BD=A9?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:return_rgb=False 返回 BGR 格式,但后续 cvtColor 误用 RGB2BGR 导致 R/B 通道互换,人脸变蓝。 修复: - return_rgb 改为 True,输出为 RGB 格式 - 保持后续 RGB→BGR 转换正确 - 简化逻辑:去掉复杂的色彩校正(mean/std对齐), 避免引入额外的色偏风险 - 添加清晰的色彩通道注释,防止后续维护出错 --- deploy/gpu_worker/musetalk_server.py | 29 ++++++++++++---------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/deploy/gpu_worker/musetalk_server.py b/deploy/gpu_worker/musetalk_server.py index a3678b27b..fa1aa080e 100644 --- a/deploy/gpu_worker/musetalk_server.py +++ b/deploy/gpu_worker/musetalk_server.py @@ -919,35 +919,30 @@ def _run_inference( _ff_proc.stdin.write(ori_frame.tobytes()) continue - # GFPGAN 人脸超分增强(FP32 + 色彩校正,避免 FP16 色偏) + # GFPGAN 人脸超分增强(FP32 推理,避免 FP16 色偏) + # 色彩通道约定:ori_frame / res_frame / _face_up 均为 BGR(OpenCV 默认); + # GFPGAN 输出用 return_rgb=True 拿到 RGB,再转 BGR,与后续 face_parsing 融合保持一致。 if gfpgan_enhancer is not None: try: _fh, _fw = res_frame_resized.shape[:2] _face_up = cv2.resize(res_frame_resized, (512, 512), interpolation=cv2.INTER_LANCZOS4) - # 保存原始人脸区域用于色彩校正 - _face_original_bgr = _face_up.copy() _face_rgb = cv2.cvtColor(_face_up, cv2.COLOR_BGR2RGB).astype(np.float32) / 255.0 - _face_t = torch.from_numpy(_face_rgb.transpose(2,0,1)).unsqueeze(0) + _face_t = torch.from_numpy(_face_rgb.transpose(2, 0, 1)).unsqueeze(0) # GFPGAN 始终 FP32,避免 FP16 精度导致色偏;归一化到 [-1, 1] _face_t = ((_face_t - 0.5) / 0.5).to(device) with torch.no_grad(): - _out = gfpgan_enhancer(_face_t, return_rgb=False, weight=0.35)[0] - _out = _out.squeeze(0).float().cpu().clamp_(-1,1) - _out = ((_out + 1)/2*255).numpy().transpose(1,2,0) - _out_bgr = cv2.cvtColor(_out.astype(np.uint8), cv2.COLOR_RGB2BGR) - - # 色彩校正:将增强结果的均值/标准差对齐到原始人脸,消除色调偏移 - _orig_mean = _face_original_bgr.mean(axis=(0, 1)) - _orig_std = _face_original_bgr.std(axis=(0, 1)) + 1e-6 - _enh_mean = _out_bgr.mean(axis=(0, 1)) - _enh_std = _out_bgr.std(axis=(0, 1)) + 1e-6 - _out_bgr = ((_out_bgr.astype(np.float32) - _enh_mean) * (_orig_std / _enh_std) + _orig_mean) - _out_bgr = np.clip(_out_bgr, 0, 255).astype(np.uint8) + _out = gfpgan_enhancer(_face_t, return_rgb=True, weight=0.35)[0] + # 输出 tensor: RGB, [-1, 1] 范围 → clamp → 映射到 [0, 255] uint8 + _out = _out.squeeze(0).float().cpu().clamp_(-1.0, 1.0) + _out = ((_out + 1.0) / 2.0 * 255.0).numpy().transpose(1, 2, 0) + _out_rgb = _out.astype(np.uint8) + # RGB → BGR,与 ori_frame 保持一致,确保 face_parsing 融合时通道正确 + _out_bgr = cv2.cvtColor(_out_rgb, cv2.COLOR_RGB2BGR) res_frame_resized = cv2.resize(_out_bgr, (_fw, _fh), interpolation=cv2.INTER_LANCZOS4) - del _face_t, _out, _out_bgr, _face_original_bgr + del _face_t, _out, _out_rgb, _out_bgr except Exception as _gfpgan_err: logger.warning("GFPGAN 增强失败(帧 %d),使用原图: %s", i, _gfpgan_err) -- 2.54.0 From e7ea90798bc175c59e1efc5b1a45ab61654254bc Mon Sep 17 00:00:00 2001 From: saas-backend Date: Tue, 22 Sep 2026 13:03:57 +0800 Subject: [PATCH 2/3] chore(ci): retrigger CI - previous run had DNS resolution issues -- 2.54.0 From af7b2bb43618af799b2e83c4594b1a5791ff7749 Mon Sep 17 00:00:00 2001 From: saas-backend Date: Tue, 22 Sep 2026 13:17:22 +0800 Subject: [PATCH 3/3] chore(ci): retrigger CI - 3rd attempt -- 2.54.0