Files
OCR/openspec/changes/archive/2025-12-11-cleanup-dead-code/proposal.md
egg cfe65158a3 feat: enable document orientation detection for scanned PDFs
- Enable PP-StructureV3's use_doc_orientation_classify feature
- Detect rotation angle from doc_preprocessor_res.angle
- Swap page dimensions (width <-> height) for 90°/270° rotations
- Output PDF now correctly displays landscape-scanned content

Also includes:
- Archive completed openspec proposals
- Add simplify-frontend-ocr-config proposal (pending)
- Code cleanup and frontend simplification

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 17:13:46 +08:00

176 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Change: Cleanup Dead Code and Improve Code Quality
## Why
深度代碼盤點發現專案中存在以下問題:
1. 已廢棄但未刪除的服務文件507行
2. 過時的配置項(已標記 deprecated 但未移除)
3. 重複的 bbox 處理邏輯散落在 4 個文件中
4. 未使用的 imports 和類型斷言問題
5. 多個 TODO 標記需要處理或移除
6. **Paddle/PP-Structure 相關的禁用功能和補丁代碼**
本提案旨在系統性清理這些垃圾代碼,提升代碼質量和可維護性。
## What Changes
### Phase 1: 刪除廢棄文件 (高優先級)
| 文件 | 行數 | 原因 |
|------|------|------|
| `backend/app/services/pdf_generator.py` | 507 | 已被 `pdf_generator_service.py` 完全替代,無任何引用 |
### Phase 2: 移除過時配置 (高優先級)
| 文件 | 配置項 | 原因 |
|------|--------|------|
| `backend/app/core/config.py` | `gap_filling_iou_threshold` | 已過時,應使用 IoA 閾值 |
| `backend/app/core/config.py` | `gap_filling_dedup_iou_threshold` | 已過時,應使用 `gap_filling_dedup_ioa_threshold` |
### Phase 3: 提取共用 bbox 工具函數 (中優先級)
創建 `backend/app/utils/bbox_utils.py`,統一以下位置的重複邏輯:
| 文件 | 函數 | 行號 |
|------|------|------|
| `gap_filling_service.py` | `normalized_bbox` property | L51 |
| `pdf_generator_service.py` | `_get_bbox_coords` | L1859 |
| `pp_structure_debug.py` | `_normalize_bbox` | L240 |
| `text_region_renderer.py` | `get_bbox_as_rect` | L162 |
### Phase 4: 前端代碼清理 (低優先級)
| 文件 | 問題 | 行號 |
|------|------|------|
| `ExportPage.tsx` | 未使用的 `CardDescription` import | L5 |
| `UploadPage.tsx` | `as any` 類型斷言 + TODO | L32-34 |
| `TaskHistoryPage.tsx` | `as any` 類型斷言 | L337 |
| `useTaskValidation.ts` | `as any` 類型斷言 | L61 |
### Phase 5: 清理禁用的表格補丁功能 (中優先級)
以下功能是針對 PP-Structure 輸出缺陷的「補丁行為」,已禁用且不應再使用:
| 服務文件 | 配置項 | 狀態 | 說明 | 建議 |
|----------|--------|------|------|------|
| `cell_validation_engine.py` | `cell_validation_enabled` | False | 過濾過度檢測的表格單元格 | **可刪除** - 應改進 PP-Structure 而非補丁 |
| `table_content_rebuilder.py` | `table_content_rebuilder_enabled` | False | 從 Raw OCR 重建表格 HTML | **可刪除** - 補丁行為 |
| - | `table_quality_check_enabled` | False | 單元格框質量檢查 | **移除配置** - 未完全實現 |
| - | `table_rendering_prefer_cellboxes` | False | 算法需改進 | **移除配置** - 算法有誤 |
### Phase 6: 評估 PP-Structure 模型使用 (需討論)
#### 當前使用的模型 (11個)
**必需模型 (3個) - 核心 OCR 功能**
| 模型 | 用途 | 狀態 |
|------|------|------|
| `PP-DocLayout_plus-L` | 佈局檢測 | **必需** |
| `PP-OCRv5_server_det` | 文本檢測 | **必需** |
| `PP-OCRv5_server_rec` | 文本識別 | **必需** |
**表格相關模型 (5個) - 可選但啟用**
| 模型 | 用途 | 狀態 | 記憶體 |
|------|------|------|--------|
| `SLANeXt_wired` | 有邊框表格結構識別 | 啟用 | ~350MB |
| `SLANeXt_wireless` | 無邊框表格結構識別 | **保守模式下禁用** | ~350MB |
| `PP-LCNet_x1_0_table_cls` | 表格分類 | 啟用 | ~50MB |
| `RT-DETR-L_wired_table_cell_det` | 有邊框單元格檢測 | 啟用 | 共享 |
| `RT-DETR-L_wireless_table_cell_det` | 無邊框單元格檢測 | **保守模式下禁用** | 共享 |
**增強功能模型 (2個) - 可選**
| 模型 | 用途 | 狀態 | 是否需要 |
|------|------|------|----------|
| `PP-FormulaNet_plus-L` | 公式轉 LaTeX | 啟用 | 視需求,可禁用節省 ~300MB |
| `PP-Chart2Table` | 圖表轉表格 | 啟用 | 視需求,可禁用節省 ~200MB |
**預處理模型 (3個)**
| 模型 | 用途 | 狀態 | 建議 |
|------|------|------|------|
| `PP-LCNet_x1_0_doc_ori` | 文檔方向檢測 | 啟用 | 保留 |
| `PP-LCNet_x1_0_textline_ori` | 文本行方向檢測 | 啟用 | 保留 |
| `UVDoc` | 文檔變形修正 | **禁用** | **可移除配置** - 會導致文檔失真 |
#### 禁用的 Gap Filling 功能
| 配置項 | 狀態 | 相關代碼 | 建議 |
|--------|------|----------|------|
| `gap_filling_enabled` | False | `gap_filling_service.py` | 保留代碼,作為可選增強 |
| `gap_filling_iou_threshold` | 過時 | config.py | **刪除** - 已被 IoA 閾值取代 |
| `gap_filling_dedup_iou_threshold` | 過時 | config.py | **刪除** - 已被 IoA 閾值取代 |
## Impact
- **Affected specs**: 無(純代碼清理,不改變系統行為)
- **Affected code**:
- Backend: 刪除 1-3 個文件,修改 config.py創建 bbox_utils.py
- Frontend: 修改 4 個文件(類型改進)
- **記憶體影響**: 如移除無邊框表格模型,可節省 ~700MB GPU 記憶體
## Benefits
- 減少約 **600-1,500 行**冗餘代碼(視 Phase 5-6 範圍)
- 統一 bbox 處理邏輯,減少重複代碼 **80-100 行**
- 提升 TypeScript 類型安全性
- 移除過時配置和補丁代碼,減少維護負擔
- 精簡 PP-Structure 模型配置,提升可讀性
## Risk Assessment
- **風險等級**: 低-中
- **Phase 1-2**: 無風險(刪除未使用的代碼)
- **Phase 3**: 低風險(重構,需要測試)
- **Phase 4**: 低風險(類型改進)
- **Phase 5**: 低風險(刪除禁用的補丁代碼)
- **Phase 6**: 中風險(需評估模型是否還需要)
- **回滾策略**: Git revert
## Paddle/PP-Structure 使用情況摘要
### 直接使用 Paddle 的文件 (僅 3 個)
| 文件 | 行數 | 功能 |
|------|------|------|
| `ocr_service.py` | ~2,590 | OCR 引擎管理、GPU 配置、模型卸載 |
| `pp_structure_enhanced.py` | ~1,324 | PP-StructureV3 結果解析、元素提取 |
| `memory_manager.py` | ~2,269 | GPU 記憶體監控、多後端支持 |
### 表格解析模式 (table_parsing_mode)
| 模式 | 說明 | 適用場景 |
|------|------|----------|
| `full` | 激進,完整表格檢測 | 表格密集的文檔 |
| `conservative` | **當前使用**,禁用無邊框表格 | 混合文檔 |
| `classification_only` | 僅識別表格區域,無結構解析 | 數據表/電子表格 |
| `disabled` | 完全禁用表格識別 | 純文本文檔 |
### 補丁 vs 核心功能分類
```
┌─────────────────────────────────────────────────────────────┐
│ 核心功能 (必須保留) │
├─────────────────────────────────────────────────────────────┤
│ • PaddleOCR 文本識別 │
│ • PP-DocLayout 佈局檢測 │
│ • SLANeXt 表格結構識別 │
│ • 記憶體管理和自動卸載 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 補丁功能 (建議移除) │
├─────────────────────────────────────────────────────────────┤
│ • cell_validation_engine.py - 過度檢測過濾 │
│ • table_content_rebuilder.py - 表格內容重建 │
│ • table_quality_check - 未完全實現 │
│ • table_rendering_prefer_cellboxes - 算法有誤 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 可選增強 (保留代碼,按需啟用) │
├─────────────────────────────────────────────────────────────┤
│ • gap_filling_service.py - OCR 補充遺漏區域 │
│ • PP-FormulaNet - 公式識別 │
│ • PP-Chart2Table - 圖表識別 │
└─────────────────────────────────────────────────────────────┘
```