|
|
@@ -19,8 +19,6 @@ class GridRecovery:
|
|
|
upscale: float = 1.0,
|
|
|
orig_h: Optional[int] = None,
|
|
|
orig_w: Optional[int] = None,
|
|
|
- unet_w_scale: Optional[float] = None,
|
|
|
- unet_h_scale: Optional[float] = None,
|
|
|
debug_dir: Optional[str] = None,
|
|
|
debug_prefix: str = "",
|
|
|
) -> List[List[float]]:
|
|
|
@@ -40,8 +38,6 @@ class GridRecovery:
|
|
|
upscale: 上采样比例(用于向后兼容,如果提供了 orig_h/orig_w 则会被覆盖)
|
|
|
orig_h: 原图的实际高度(用于计算真实的缩放比例)
|
|
|
orig_w: 原图的实际宽度(用于计算真实的缩放比例)
|
|
|
- unet_w_scale: UNet预处理时的宽度缩放因子(可选,用于更精确的坐标转换)
|
|
|
- unet_h_scale: UNet预处理时的高度缩放因子(可选,用于更精确的坐标转换)
|
|
|
debug_dir: 调试输出目录 (Optional)
|
|
|
debug_prefix: 调试文件名前缀 (Optional)
|
|
|
|
|
|
@@ -191,9 +187,9 @@ class GridRecovery:
|
|
|
_, v_bin = cv2.threshold(vpred_up, 127, 255, cv2.THRESH_BINARY)
|
|
|
|
|
|
# 1.1 自适应形态学修复
|
|
|
- hors_k = int(math.sqrt(w) * 1.2)
|
|
|
+ hors_k = int(math.sqrt(w) * 1.0) # 从 1.2 降到 1.0
|
|
|
vert_k = int(math.sqrt(h) * 1.2)
|
|
|
- hors_k = max(10, min(hors_k, 50))
|
|
|
+ hors_k = max(5, min(hors_k, 30)) # 从 50 降到 30
|
|
|
vert_k = max(10, min(vert_k, 50))
|
|
|
|
|
|
kernel_h = cv2.getStructuringElement(cv2.MORPH_RECT, (hors_k, 1))
|
|
|
@@ -262,7 +258,7 @@ class GridRecovery:
|
|
|
# 5. 重绘纯净Mask
|
|
|
line_mask = np.zeros((h, w), dtype=np.uint8)
|
|
|
# 线宽设为4,确保物理接触
|
|
|
- line_mask = draw_lines(line_mask, rowboxes + colboxes, color=255, lineW=4)
|
|
|
+ line_mask = draw_lines(line_mask, rowboxes + colboxes, color=255, lineW=2)
|
|
|
|
|
|
# Step 5a Debug (Before Dilation)
|
|
|
save_debug_image("step05a_rerasterized", line_mask)
|
|
|
@@ -289,57 +285,33 @@ class GridRecovery:
|
|
|
# 2. 上采样图像 = 原图 × upscale
|
|
|
# 3. 因此:scale = mask_size / orig_size = (orig_size × upscale) / orig_size = upscale
|
|
|
#
|
|
|
- # 实际计算时,我们使用实际的mask尺寸和原图尺寸来计算,这样可以:
|
|
|
+ # 实际计算时,使用实际的mask尺寸和原图尺寸来计算scale,可以:
|
|
|
# - 处理任何微小的舍入误差
|
|
|
# - 验证resize是否正确(scale应该≈upscale)
|
|
|
- #
|
|
|
- # 注意:unet_w_scale和unet_h_scale是UNet预处理时的缩放因子(上采样→UNet输入),
|
|
|
- # 它们不应该直接用于mask→原图的坐标转换,因为mask已经被resize回上采样尺寸。
|
|
|
- # 这些参数保留仅用于调试和验证。
|
|
|
|
|
|
if orig_h is not None and orig_w is not None and orig_h > 0 and orig_w > 0:
|
|
|
# 使用实际的mask尺寸和原图尺寸计算缩放比例
|
|
|
scale_h = h / orig_h
|
|
|
scale_w = w / orig_w
|
|
|
|
|
|
- # 验证:scale应该非常接近upscale(允许<0.1%的误差)
|
|
|
- scale_diff_h = abs(scale_h - upscale)
|
|
|
- scale_diff_w = abs(scale_w - upscale)
|
|
|
- scale_diff_ratio_h = scale_diff_h / upscale if upscale > 0 else 0
|
|
|
- scale_diff_ratio_w = scale_diff_w / upscale if upscale > 0 else 0
|
|
|
-
|
|
|
- logger.info(
|
|
|
- f"🔍 连通域坐标转换参数:\n"
|
|
|
- f" - Mask尺寸: [{h}, {w}]\n"
|
|
|
- f" - 原图尺寸: [{orig_h}, {orig_w}]\n"
|
|
|
- f" - 计算scale: h={scale_h:.6f}, w={scale_w:.6f}\n"
|
|
|
- f" - 理论upscale: {upscale:.6f}\n"
|
|
|
- f" - 差异: h={scale_diff_h:.6f} ({scale_diff_ratio_h*100:.3f}%), w={scale_diff_w:.6f} ({scale_diff_ratio_w*100:.3f}%)"
|
|
|
- )
|
|
|
+ # 在 debug 模式下记录详细信息
|
|
|
+ if debug_dir:
|
|
|
+ logger.debug(f"坐标转换: Mask[{h}, {w}], 原图[{orig_h}, {orig_w}], scale=[{scale_h:.3f}, {scale_w:.3f}]")
|
|
|
|
|
|
- # 如果差异过大,可能表明resize有问题
|
|
|
- if scale_diff_ratio_h > 0.01 or scale_diff_ratio_w > 0.01: # >1%差异
|
|
|
+ # 验证:scale应该接近upscale,仅在差异>1%时警告(生产环境排查)
|
|
|
+ scale_diff_ratio_h = abs(scale_h - upscale) / upscale if upscale > 0 else 0
|
|
|
+ scale_diff_ratio_w = abs(scale_w - upscale) / upscale if upscale > 0 else 0
|
|
|
+ if scale_diff_ratio_h > 0.01 or scale_diff_ratio_w > 0.01:
|
|
|
logger.warning(
|
|
|
- f"⚠️ 计算的scale ([{scale_h:.3f}, {scale_w:.3f}]) 与理论upscale ({upscale:.3f}) 差异超过1%!"
|
|
|
- f"这可能表明mask尺寸不正确或resize有问题。"
|
|
|
- )
|
|
|
-
|
|
|
- # 记录UNet缩放因子(仅用于调试,不参与坐标转换)
|
|
|
- if unet_w_scale is not None and unet_h_scale is not None:
|
|
|
- logger.debug(
|
|
|
- f" (调试信息) UNet预处理缩放因子: h_scale={unet_h_scale:.6f}, w_scale={unet_w_scale:.6f}, "
|
|
|
- f"upscale/unet_scale = [{upscale/unet_h_scale:.3f}, {upscale/unet_w_scale:.3f}]"
|
|
|
+ f"计算scale([{scale_h:.3f}, {scale_w:.3f}])与upscale({upscale:.3f})差异>1%, "
|
|
|
+ f"可能存在resize问题"
|
|
|
)
|
|
|
else:
|
|
|
# 如果没有提供原图尺寸,回退到使用upscale
|
|
|
scale_h = upscale
|
|
|
scale_w = upscale
|
|
|
- logger.info(
|
|
|
- f"🔍 连通域坐标转换参数:\n"
|
|
|
- f" - Mask尺寸: [{h}, {w}]\n"
|
|
|
- f" - 使用upscale: {upscale:.3f}\n"
|
|
|
- f" - 预期原图尺寸≈[{h/upscale:.1f}, {w/upscale:.1f}]"
|
|
|
- )
|
|
|
+ if debug_dir:
|
|
|
+ logger.debug(f"使用upscale={upscale:.3f}作为缩放因子, Mask尺寸[{h}, {w}]")
|
|
|
|
|
|
bboxes = []
|
|
|
|