feat: pHash阈值校准+颜色直方图融合 #1658 #1674

Merged
auto-approve-bot merged 1 commits from feat/phash-histogram-fusion-1658 into develop 2026-09-04 02:06:59 +08:00
Owner

Issue #1658: pHash 阈值校准 + 颜色直方图融合

改动摘要

  • PHASH_THRESHOLD 从 10 收紧到 8
  • 均值 → 中位数 抵抗黑帧/转场干扰 (statistics.median)
  • 新增帧匹配比例条件 MATCH_RATIO_THRESHOLD=0.7(至少70%帧匹配才继续)
  • Bhattacharyya 系数融合颜色直方图 (0.7×pHash + 0.3×hist)
  • 删除旧 _average_histogram_similarity()
  • 提取 _check_fusion_duplicate() 共用方法,三个方法复用
  • 改造 compute_duplicate_rate() 使用融合逻辑(PR#1657新增的方法)
  • reason 标记: phash_histogram_fusion / batch_phash_histogram_fusion
  • 向后兼容: 无直方图数据时 hist_similarity 回退到 0.5

新增常量

常量 说明
PHASH_THRESHOLD 8 从10收紧
MATCH_RATIO_THRESHOLD 0.7 至少70%帧匹配
DUPLICATE_THRESHOLD 0.70 融合后相似度阈值
PHASH_WEIGHT 0.7 pHash权重
HISTOGRAM_WEIGHT 0.3 直方图权重

改动文件

  • apps/worker/video_processing/dedup.py — 核心改造
  • tests/unit/test_dedup_v2.py — 新增34个测试
  • tests/unit/test_dedup_pure.py — 删除10个引用已删除方法的旧测试

测试结果

  • test_dedup_v2.py: 34/34 全绿
  • test_dedup_pure.py: 10/10 全绿
  • 总计 44 个测试全部通过
## Issue #1658: pHash 阈值校准 + 颜色直方图融合 ### 改动摘要 - **PHASH_THRESHOLD** 从 10 收紧到 8 - **均值 → 中位数** 抵抗黑帧/转场干扰 (statistics.median) - **新增帧匹配比例条件** MATCH_RATIO_THRESHOLD=0.7(至少70%帧匹配才继续) - **Bhattacharyya 系数融合颜色直方图** (0.7×pHash + 0.3×hist) - **删除旧** `_average_histogram_similarity()` - **提取** `_check_fusion_duplicate()` 共用方法,三个方法复用 - **改造 compute_duplicate_rate()** 使用融合逻辑(PR#1657新增的方法) - reason 标记: `phash_histogram_fusion` / `batch_phash_histogram_fusion` - 向后兼容: 无直方图数据时 hist_similarity 回退到 0.5 ### 新增常量 | 常量 | 值 | 说明 | |------|-----|------| | PHASH_THRESHOLD | 8 | 从10收紧 | | MATCH_RATIO_THRESHOLD | 0.7 | 至少70%帧匹配 | | DUPLICATE_THRESHOLD | 0.70 | 融合后相似度阈值 | | PHASH_WEIGHT | 0.7 | pHash权重 | | HISTOGRAM_WEIGHT | 0.3 | 直方图权重 | ### 改动文件 - `apps/worker/video_processing/dedup.py` — 核心改造 - `tests/unit/test_dedup_v2.py` — 新增34个测试 - `tests/unit/test_dedup_pure.py` — 删除10个引用已删除方法的旧测试 ### 测试结果 - test_dedup_v2.py: **34/34 全绿** ✅ - test_dedup_pure.py: **10/10 全绿** ✅ - 总计 **44 个测试全部通过**

🚀 预览环境已部署

项目 详情
PR号 #1674
预览链接 https://pr-1674.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1674 | | 预览链接 | [https://pr-1674.preview.xiaoxiajianji.com](https://pr-1674.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 5c5ccf4489 to a2a0b478a5 2026-09-03 23:25:37 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 8b8550c457 to 2c8337d71d 2026-09-03 23:42:02 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 0b9b697ecc to 6a6ad8b00f 2026-09-04 00:15:11 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from abdd123fcd to 7175395644 2026-09-04 00:23:05 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from f3e87f7873 to fece382c15 2026-09-04 00:27:30 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 739f5682a2 to 43e648a0f9 2026-09-04 00:34:15 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from ad76eaa56f to 35bebb2cd5 2026-09-04 00:50:44 +08:00 Compare
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 72111998ad to 5c48bb67c8 2026-09-04 01:01:26 +08:00 Compare
xiaoxia added 1 commit 2026-09-04 02:01:09 +08:00
feat(dedup): pHash 阈值校准 10→8 + 融合得分统一收口 #1658
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 36s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 37s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m39s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m4s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m4s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m30s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m59s
AI Code Review / AI Code Review (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m6s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m46s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 10s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
859e38eea5
develop 已由 #1659/#1675 合入融合权重常量、Bhattacharyya、中位数、
滑动窗口等大部分融合逻辑,本 PR 补齐 #1658 剩余增量:

1. PHASH_THRESHOLD 10→8:收紧 pHash 汉明距离阈值,距离 8~9 的帧不再
   计为匹配,降低不同视频误判率
2. 新增 VideoDeduplicator._compute_fusion_score() 统一融合得分计算,
   check_duplicate/check_batch_duplicate/compute_duplicate_rate 三处
   复用,权重统一走 PHASH_WEIGHT/HISTOGRAM_WEIGHT 常量(消除硬编码
   0.7/0.3),帧匹配门槛统一走 MATCH_RATIO_THRESHOLD
3. 防御加固:
   - color_histograms JSON NULL(None)显式回退空列表;全零直方图
     (全黑视频)作为有效数据参与 Bhattacharyya,不误走 0.5 中性回退
   - Bhattacharyya 系数改用标准库 math.sqrt + max(0.0, ai*bi),
     消除 numpy 依赖并防御异常负值的 sqrt domain error
4. 新增 test_phash_threshold_calibration_1658.py(17 用例),覆盖
   阈值校准、融合得分公式、None/全零直方图、负值防御
xiaoxia force-pushed feat/phash-histogram-fusion-1658 from 351de916e3 to 859e38eea5 2026-09-04 02:01:09 +08:00 Compare
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:0 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

良好实践

  1. 数值稳定性增强:在 _bhattacharyya_coefficient 方法中使用 max(0.0, ai * bi) 防御上游数据可能出现的负值,有效避免了 math.sqrt 的域错误,增强了鲁棒性。
  2. 依赖优化:将直方图计算从 numpy 迁移到标准库 math,减少了重型依赖,有利于降低环境复杂度。
  3. 逻辑语义清晰:在 _compute_fusion_score 和调用处,严格区分了 None(无数据/DB NULL)与 [](空列表)以及 [0,0,...](全黑视频)的语义,确保全黑视频作为有效数据参与计算,而非被错误回退,逻辑严谨。
  4. 测试覆盖全面:新增的单元测试覆盖了阈值校准、None 处理、全零直方图边界、负值防御等关键场景,Mock 设置规范,能有效保障重构质量。
  5. 代码可维护性:通过提取 _compute_fusion_score 方法并引入常量(如 PHASH_WEIGHT),消除了原有的魔法数字,提升了代码的可读性和可配置性。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 18:04:59 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:0 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 无 ### ✅ 良好实践 1. **数值稳定性增强**:在 `_bhattacharyya_coefficient` 方法中使用 `max(0.0, ai * bi)` 防御上游数据可能出现的负值,有效避免了 `math.sqrt` 的域错误,增强了鲁棒性。 2. **依赖优化**:将直方图计算从 `numpy` 迁移到标准库 `math`,减少了重型依赖,有利于降低环境复杂度。 3. **逻辑语义清晰**:在 `_compute_fusion_score` 和调用处,严格区分了 `None`(无数据/DB NULL)与 `[]`(空列表)以及 `[0,0,...]`(全黑视频)的语义,确保全黑视频作为有效数据参与计算,而非被错误回退,逻辑严谨。 4. **测试覆盖全面**:新增的单元测试覆盖了阈值校准、None 处理、全零直方图边界、负值防御等关键场景,Mock 设置规范,能有效保障重构质量。 5. **代码可维护性**:通过提取 `_compute_fusion_score` 方法并引入常量(如 `PHASH_WEIGHT`),消除了原有的魔法数字,提升了代码的可读性和可配置性。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 18:04:59 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit 2a2dfad137 into develop 2026-09-04 02:06:59 +08:00
auto-approve-bot deleted branch feat/phash-histogram-fusion-1658 2026-09-04 02:07:00 +08:00

🗑️ 预览环境已清理

PR #1674 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1674 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.