Переглянути джерело

fix: 移除UNet预处理的宽高缩放因子参数,优化坐标转换的调试信息记录

zhch158_admin 9 годин тому
батько
коміт
6be6c8c3bb

+ 15 - 43
ocr_tools/universal_doc_parser/models/adapters/wired_table/grid_recovery.py

@@ -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 = []