【免费下载链接】gemini-watermark-remover
A high-performance, 100% client-side tool for removing Gemini AI image & video watermarks. Built with pure JavaScript using mathematically precise Reverse Alpha Blending. / 基于 JavaScript 的纯浏览器端 Gemini AI 图像和视频无损去水印工具,使用数学精确的反向 Alpha 混合算法
本文以开源仓库 gemini-watermark-remover 的活文档 docs/image-watermark-pipeline-refactor-live.zh.md 为主体,完整还原该项目将"样本特例链"升级为"候选路径评估系统(detection → alpha → repair → evaluation)"的全过程。读者可以从中掌握一套可复用的行为等价重构方法论:如何在不改变像素输出与newlyFailing=0的前提下,把一个千行级单函数执行壳逐步拆成带契约、可测试、可归因的分层流水线,以及如何用 1000 张线上样本 benchmark 与质量监控体系守住每次重构的质量底线。
一、重构背景与基线冻结(Phase 0)
该文档定位为"图片水印去除分层重构活文档"(更新时间 2026-06-25),其前提是 Phase 0 完成的基线冻结:
- 线上样本集:
sample-files/gemini-watermark/online-sample-2026-06-23-to-2026-06-24-max500(本地可用GWR_ONLINE_SAMPLE_ROOT指向实际下载目录)。 - 固化基线:
978/1000 = 97.80%,相对更早基线newlyPassing=29、newlyFailing=0。 - 固化的门禁命令:
rtk pnpm benchmark:online-sample:gate -- --min-newly-passing 29该命令对应的 package script 是benchmark:online-sample:gate(见 package.json),由scripts/gate-online-gemini-watermark-sample-benchmark.js实现。文档反复强调一个关键判断:剩余 missed-detection 不应直接用于放宽检测阈值——skipped 专用审计显示productionEvidenceSafeTotal=0,即没有样本同时满足"原图生产级水印证据强"和"去除后安全",因此不能靠放大检测范围换取通过率。
重构的总目标在文档中表述得很明确:"这次重构值得做,但不做一次性推倒重写。目标是把当前'样本特例链'升级成'候选路径评估系统',先保持行为等价,再逐步迁移策略。"这奠定了后续所有 Phase 的基调:结构优先、行为等价、每刀验证。
二、目标架构:四层候选路径流水线
文档给出了重构后的目标流水线:
DetectionCandidate[] -> AlphaTrial[] -> RepairTrial[] -> CandidateEvaluation[] -> SelectedPlan | RejectedDecision -> executor并配套了分层职责表,这是理解整个重构的核心:
| 层 | 只回答的问题 | 不应该做的事 |
|---|---|---|
| 水印检测层 | 哪里可能有水印、规格是什么、原图证据强不强 | 不改图,不决定 alphaGain,不根据去除后结果反推水印存在 |
| Alpha 逼近层 | 哪个 alpha map / alphaGain / alpha shape 最能解释检测候选 | 不做纹理修复,不越过检测证据门槛 |
| 纹理重建/修复层 | 在可信 alpha 反解基础上,局部残留、边缘、halo、纹理断裂能否安全修复 | 不替代检测,不掩盖错误 alpha,不扩大到非 ROI |
| 评估仲裁层 | 哪条完整路径最优,或是否拒绝处理 | 不直接生成候选,不执行最终改图 |
| 执行壳 | 应用最终 plan,返回 imageData 和 meta | 不临时插入策略分支 |
这套职责划分最终在 Phase 5 被固化为可测试的代码契约:src/core/pipelineLayerContracts.js 中的PIPELINE_LAYER_ORDER固定了规范顺序detection -> alpha -> repair -> evaluation,每层 contract 记录owns / inputFields / outputFields / moduleAnchors / testAnchors。例如:
- detection 层
owns: 'candidate-localization-and-evidence',输出selectedTrial / source / decisionTier / adaptiveConfidence / standardSpatialScore / standardGradientScore; - alpha 层
owns: 'alpha-map-selection-and-alpha-fit',输出alphaTrialEvents / alphaAdjustmentStages / alphaGain / alphaMap / subpixelShift / pipelineState; - repair 层
owns: 'texture-repair-and-artifact-gated-cleanup',输出repairTrial / passState / passes / source / finalImageData; - evaluation 层
owns: 'decision-path-and-risk-gated-arbitration',输出decisionPath / evaluationDecision / blockedGate / riskFlags / selectionDebug / meta。
这些契约的输入输出字段与文档"核心对象草案"一一对应,并被 tests/core/pipelineLayerContracts.test.js 锁定(canonical layer order、contracts key 顺序、关键输出锚点selectedTrial / alphaTrialEvents / repairTrial / decisionPath存在、unknown layer 返回null、summary 只暴露 counts 与 anchors)。
三、核心对象草案与真实实现对应
文档给出了六个核心对象的 JS 草案,重构后这些对象全部在仓库中真实落地(从candidateEvaluation.js迁出为独立契约模块):
DetectionCandidate:id / source / config / position / alphaMapHint / polarityHint / evidence / provenance,对应 src/core/pipelineDetectionCandidate.js 的createDetectionCandidateFromSelectedTrial(...)与createRejectedDetectionCandidate(...)。
AlphaTrial:id / detectionId / source / alphaMap / alphaMapSource / alphaGain / alphaShape{variant,exponent,subpixelShift,scale} / imageData / scores / damage / gates / provenance,对应 src/core/pipelineAlphaTrial.js 的createAlphaTrialFromSelectedTrial(...)。
RepairTrial:id / alphaTrialId / source / repairType / params / imageData / scores / artifacts / gates / provenance,对应 src/core/pipelineRepairTrial.js 的createRepairTrialFromStages(...)。源码中用ALPHA_STAGE_PATTERNS(/alpha/、/recalibration/、/over-subtraction/、/subpixel/、/new-margin-96-variant/、/power-profile/、/residual-rebalance/、/anti-template/)与REPAIR_STAGE_PATTERNS(/cleanup/、/edge/、/repair/、/flat.*fill/、/prior/、/halo/、/boundary/、/quantized/、/mid-core/、/background/)做 stage 分类,并由inferRepairStrategy(stageName)完成 repairStrategy 推断(如known-48-flat-fill、dark-halo-repair、canonical-96-positive-halo-repair、boundary-repair、quantized-body-correction、mid-core-bias-correction等)。
CandidateEvaluation:pathId / detectionId / alphaTrialId / repairTrialId / eligible / decision / blockedGate / riskFlags / evidenceClass / residualClass / damageClass / rankingKey / explanation,落在 src/core/candidateEvaluation.js(保留 new-margin 风险 gate 与 default-alpha vs alpha-variant 仲裁)与 src/core/pipelineDecisionPath.js 的evaluation字段中。
SelectedPlan / RejectedDecision:对应createAcceptedDecisionPath(...)与createRejectedDecisionPath(...)(见 src/core/pipelineDecisionPath.js)。accepted 路径实际输出的 decisionPath 顶层形状为:
{ version: 1, decision: 'accept', detectionSource, alphaSource, repairSource, // 未应用 repair 时为 null evaluationDecision: 'accepted', blockedGate: null, riskFlags, detectionCandidate, alphaTrial, repairTrial, evaluation // 含 pathId: `${detectionId}->${alphaTrialId}->${repairTrialId}` }rejected 路径输出decision: 'reject'、evaluationDecision: 'rejected'、blockedGate: reason(默认no-watermark-detected),alphaTrial / repairTrial均为null。createDecisionPathContractSummary(...)进一步提供 version/decision/三源/blockedGate/各子对象存在性的摘要字段。
四、Phase 1:评估层中枢与类型外壳
Phase 1 状态为已完成,核心产出:
- 在 src/core/candidateEvaluation.js 中新增轻量候选路径结构与 adapter:
DetectionCandidate、AlphaTrial、RepairTrial、CandidateEvaluation、createAcceptedDecisionPath(...)、createRejectedDecisionPath(...)。 - 在 src/core/watermarkProcessor.js 的 meta 中新增
decisionPath。 - skipped 路径现在输出
decisionPath.decision = "reject",并记录blockedGate = "no-watermark-detected"。 - accepted 路径从现有
selectedTrial包装出 detection / alpha / repair / evaluation 结构。 - scripts/run-external-gemini-watermark-sample-benchmark.js 与 scripts/sample-benchmark.js 会把
meta.decisionPath写入 JSON report。
验证证据(文档记录):核心测试pass=93 / fail=0 / skipped=3、pnpm build通过、1000 张 online sample benchmark978/1000 = 97.80%、newlyPassing=29、newlyFailing=0、decisionPath覆盖1000/1000,gate 以--min-newly-passing 29通过。
Phase 1 之后新增的最低 report 字段被固化:
{ decisionPath: { detectionSource, alphaSource, repairSource, evaluationDecision, blockedGate, riskFlags } }五、Phase 2:Alpha trial 迁移(结构化记录先行,像素不变)
Phase 2 状态为"已完成主体迁移",核心理念是每步只改变结构化记录,不改变像素处理顺序。五步迁移逐一落地:
new-margin-96-variant标记为独立 AlphaTrial strategy:alphaTrial.strategy = "new-margin-96-variant"、migrationStage = "phase2-alpha-trial"、alphaShape.variant = "20260520",stages包含new-margin-96-variant-rescue。known-48-power-profile/known-48-positive-residual-rebalance标记为 Phase2 strategy,profileStages逐条记录stage / alphaStrategy / fromAlphaGain / toAlphaGain / beforeSpatialScore / beforeGradientScore / afterSpatialScore / afterGradientScore / suppressionGain / profileExponent / cost。线上样本2069367634989682688输出profileExponent = 0.88。located-aggressive-alpha从隐式后续强清理迁移为可解释 AlphaTrial event:接受事件写入acceptedStrategies、拒绝事件写入rejectedStrategies并记录blockedGate(如passable-spatial-drift、insufficient-balanced-gain),事件记录 alphaGain、repeatCount、edgeCleanup、before/after 分数、spatialDrift、cost。文档明确"这一步的重点不是让 located-aggressive 成为主策略,而是让评估层能看见它为什么被采用或被挡住"。over-subtraction-fine-alpha从宽泛fine-alpha归类中拆出,覆盖over-subtraction-recalibration与weak-positive-residual-fine-alpha;dark-catalog-fine-alpha先单独识别、下一步再迁移。dark-catalog-fine-alpha迁移为独立 Phase2 AlphaTrial strategy,暗底 catalog 样本src/assets/samples/20260608-4.png输出processedSpatialScore ≈ -0.0902、processedGradientScore ≈ 0.0535。
Phase 2 全量 benchmark 的 strategy 分布极具参考价值(反映真实生产中的策略使用频率):
selected-alpha=513、located-aggressive-alpha=326、over-subtraction-fine-alpha=107、alpha-variant=21、known-48-positive-residual-rebalance=9、known-48-power-profile=3、dark-catalog-fine-alpha=3、new-margin-96-variant=2。
其中alphaTrial的 accepted event504、rejected event26,decisionPath覆盖1000/1000,相对after-rebalance基线newlyPassing=0 / newlyFailing=0,gate 用--min-newly-passing 0通过(因为这是行为等价结构迁移,不以新增通过数为目标)。
六、Phase 3:Repair trial 迁移(纹理修复与评估层解耦)
Phase 3 同样保持"像素处理顺序不变、只增强结构化记录",五步把 repair 层逐步独立:
edge-cleanup/luma-edge进入decisionPath.repairTrial:known-48-edge-cleanup写入 repair stage,known-48-luma-edge-correction标记repairStrategy = "luma-edge"。repairTrial.params[*]记录stage / repairStrategy / fromAlphaGain / toAlphaGain / beforeSpatialScore / beforeGradientScore / afterSpatialScore / afterGradientScore / suppressionGain / cost,repairTrial.gates.stages记录参与 repair 的 stage 名单。这一步修复了一个观测缺口:普通 edge cleanup 以前只体现在source字符串里,没有独立 stage 记录。flat-fill拆为明确 strategy:known-48-flat-fill与new-margin-96-flat-fill。estimated-prior拆为三个明确 strategy:smooth-located-prior、small-margin-prior、small-located-prior。halo-repair/quantized-body-correction进一步结构化:dark-halo-low-logo-rescue→dark-halo-repair,canonical-96-positive-halo-rescue→canonical-96-positive-halo-repair,quantized-body-correction保持同名;fixture tests/fixtures/issue93-canonical96-positive-halo.png 验证了canonical-96-positive-halo-repair输出。- Phase 3 收口:
known-48-boundary-repair-rescue→boundary-repair、known-48-mid-core-bias-correction补显式repairStrategy,全量 report 中genericCount=0,未发现repair / halo-repair / estimated-prior / flat-fill / missing strategy泛化残留。
Phase 3 收口 benchmark 的 repair strategy 计数(全量 1000 样本,repairApplied=175):
edge-cleanup=132, luma-edge=70, known-48-flat-fill=19, quantized-body-correction=4, new-margin-96-flat-fill=4, small-located-prior=3, dark-halo-repair=3, small-margin-prior=2, mid-core-bias-correction=1值得注意的一个工程细节:文档记录了本机 pnpm 为11.7.0时不再读取package.json#pnpm.onlyBuiltDependencies,为恢复非交互 build scripts approval,本轮新增 pnpm-workspace.yaml,其中allowBuilds允许esbuild、protobufjs、sharp。
七、Phase 4:执行壳瘦身(行为等价迁移的方法论样板)
Phase 4 是文档中篇幅最大、步骤最细的部分(状态:进行中,至文档记录时已完成 66 步),核心目标是把processWatermarkImageData从"千行策略分支容器"瘦身为 thin adapter。其方法完全可复用:每刀只移动一种边界(trace / meta / state / timing / specs / runtime / executor),不做任何策略改动,每刀都跑node --check+ 单测 +pnpm build+ full benchmark + gate 五件套。
按照迁移顺序,Phase 4 逐层外提的模块如下(全部可在仓库中确认存在):
| 边界类型 | 模块 | 关键导出 |
|---|---|---|
| Trace 记录 | pipelineTrace.js | createPipelineTraceRecorder()、recordAlphaAdjustmentStage(...)、recordAlphaTrialEvent(...),统一管理alphaAdjustmentStages / alphaTrialEvents |
| Meta 汇总 | pipelineMeta.js | createWatermarkMeta(...)、createAcceptedWatermarkMeta(...)、createRejectedWatermarkMeta(...) |
| 初始选择 | pipelineInitialSelection.js | selectInitialWatermarkCandidate(...),仍复用candidateSelector.js#selectInitialCandidate(...) |
| 首轮指标 | pipelineMetrics.js | shouldStopAfterFirstPass(...)、createFirstPassMetrics(...)、createRegionCorrelationMetrics(...) |
| 状态提交 | pipelineState.js | createPipelineStateCommit(...)、createAcceptedPipelineState(...)、createInitialPipelineRuntimeState(...)、createPipelineStateAccessors(...) |
| Repair 门 | pipelineRepairGates.js | shouldUsePreviewAnchorFastCleanup(...)、shouldUseKnown48EdgeCleanup(...)、shouldUseV2SmallEdgeCleanup(...)、createRepairCleanupFlags(...) |
| 尾段计时 | pipelineTimings.js | createTailDebugTimings(...),覆盖 15 项*Mstiming |
| 结果封装 | pipelineResult.js | createAcceptedPipelineResult(...)、createRejectedPipelineResult(...)、createAcceptedPipelineResultFromState(...) |
| 运行时胶水 | pipelineRuntime.js | createAlphaRepairPipelineRuntime(...)、acceptAlphaTrialResult(...)、acceptRepairTrialResult(...)、acceptAlphaStageResult(...)、acceptLocatedAggressiveResult(...)、acceptPreviewBackgroundCleanupResult(...)、runCurrentAlphaTrialStage(...)、runCurrentAlphaStage(...)、runCurrentRepairStage(...)、runRepeatedCurrentRepairStage(...)、runCurrentAlphaTrialSequence(...)、runCurrentAlphaStageSequence(...)、runCurrentRepairStageSequence(...)、runCurrentAlphaTrialSpecPhase(...)等 |
| Pass 状态 | pipelinePassState.js | createEmptyPipelinePassState()、createFirstPassPipelinePassState(...)、applyPipelinePassOutcome(...) |
| Repair specs | pipelineRepairStageSpecs.js | createTailRepairStageSequenceSpecs(...)、createRepairCleanupPhaseSpecs(...)、createPostLocatedRepairStageSequenceSpecs(...)、createPreviewBackgroundCleanupStageSpec(...) |
| Alpha specs | pipelineAlphaStageSpecs.js | createFineAlphaTrialSequenceSpecs(...)、createAlphaRescueStageSequenceSpecs(...)、createSmallAnchorAlphaStageSequenceSpecs(...)、createSubpixelOutlineAlphaStageSpecs(...)、createLocatedAggressiveStageSpec(...)、createRecalibrationStageSpec(...) |
| Bootstrap | pipelineRuntimeBootstrap.js | createAcceptedPipelineRuntimeBootstrap(...) |
| Executor | pipelineAcceptedExecutor.js | runAcceptedAlphaRepairPipeline(...) |
| Request 层 | pipelineAcceptedExecutorRequest.js、pipelineAcceptedFinalizationRequest.js | createAcceptedPipelineExecutorRequest(...)、createAcceptedPipelineFinalizationRequest(...) |
| 初始上下文 | pipelineInitialContext.js | createInitialPipelineContext(...),归一adaptiveMode -> allowAdaptiveSearch、clone 输入、校验alpha48/alpha96、计算defaultConfig / resolvedConfig / position |
| 外层壳 | imageWatermarkPipeline.js | runImageWatermarkPipeline(...),串联 initial context → 候选收集 → hypothesis 执行 → ranking → meta → rejected/accepted 分支 |
| Request 壳 | imageWatermarkPipelineRequest.js | createImageWatermarkPipelineCleanupConfig(...)、createImageWatermarkPipelineRequest(...) |
| Finalization | pipelineFinalization.js | createAcceptedPipelineFinalResult(...) |
从 src/core/imageWatermarkPipeline.js 的源码可见,外层壳runImageWatermarkPipeline(...)以依赖注入方式暴露可替换的selectCandidate / collectCandidates / runCandidate / measureCandidate / rankCandidates / createSummaries / attachSelectionMeta / runAcceptedPipeline / createRejectedResult / createAcceptedFinalResult,这让 orchestration 可以被小单测覆盖而不是只依赖 full benchmark;而 src/core/watermarkProcessor.js 的processWatermarkImageData(imageData, options)最终退化为一行调用:runImageWatermarkPipeline(createImageWatermarkPipelineRequest({...}))。
文档在此阶段明确了一条"边界克制"原则:createAcceptedPipelineDependencies()当前仍绑定大量私有 refiner/gate,强行外移会迫使公开过多内部策略函数,收益低于风险,因此保留在 adapter 中——这提醒重构者:模块拆分应以真实边界收益为准,而非"文件越少代码越好"。
八、Phase 5:四层契约与接口矩阵(重构收口)
Phase 5 的目标是把"检测、alpha 逼近、修复、评估"的边界从文档意图变成可测试 contract,分六刀完成:
pipelineLayerContracts.js(前述):固定四层 order 与每层 input/output/module/test anchors。pipelineDetectionCandidate.js:detection 层候选对象构造迁出,candidateEvaluation.jsre-export 保持兼容;createRejectedDecisionPath(...)改为复用createRejectedDetectionCandidate(...),让 skipped/rejected 路径也进入 detection contract。pipelineAlphaTrial.js:decisionPath.alphaTrial构造迁出,同时清理candidateEvaluation.js中迁出后未再使用的 trial id / config / position helper。pipelineAlphaTraceContract.js:把 alpha trace 的记录格式抽出(normalizeAlphaTrialEventForTrace(...)、normalizeAlphaAdjustmentStageForTrace(...)、createAlphaTraceContractSummary(...))。其中normalizeAlphaAdjustmentStageForTrace保留关键 gate:缺少 stage/alpha gain 跳过、same-gain 默认跳过(allowSameAlphaGain时允许)、非有限数归一为null、空字符串 strategy 归一为null;pipelineTrace.js退化为只维护两个数组并调用 contract 归一化。pipelineRepairTrial.js:decisionPath.repairTrial构造迁出(前述的 stage 分类与 repairStrategy 推断)。pipelineDecisionPath.js:accepted/rejected decisionPath 顶层装配迁出,candidateEvaluation.js收敛为真正的 candidate scoring/arbitration 入口(保留 new-margin 风险 gate、default-alpha vs alpha-variant 仲裁)。
Phase 5 收尾审阅的结论值得记录:不建议继续为了"更细文件"机械拆分——当前继续拆candidateEvaluation.js的收益已低于回到真实失败样本,剩余问题不太可能靠继续搬文件解决,需要重新按样本归因;且每次触碰 decisionPath/meta 都要跑全量 benchmark,低收益重构会拖慢进入算法改进。最终四层 contract 与运行壳的边界全部落到代码与测试中,质量门禁保持稳定(978/1000、newlyFailing=0、decisionPath=1000/1000、accepted 984 / rejected 16、repairApplied=175)。
九、迁移原则、验收门槛与 Stop 条件(可复用的工程纪律)
文档沉淀的7 条迁移原则是整个重构的灵魂:
- 先加结构,不改行为。
- 每一步迁移都必须保留旧路径对照,直到 full benchmark 和 gate 通过。
- 单个 strategy 迁移独立完成,不跨多类样本混改。
- skipped 的安全候选必须同时满足生产级原图证据和去除安全,不能只看去除后指标。
- 纹理修复只能在可信 detection + alpha trial 后执行,不能用来制造水印存在证据。
- 每个拒绝都要可解释:
detection-rejected、alpha-no-safe-fit、repair-unsafe、evaluation-rejected。 - 每轮重构后更新此文档的状态和下一步。
验收门槛(每个阶段必须满足):核心测试通过、build 通过、线上样本 gate 通过、newlyFailing=0,且关键 report 能解释 selected path、rejected path、rejection reason、detection evidence、alpha fit scores、repair artifact scores。
Stop 条件(遇到即停下复核,而不是继续堆策略):
- full benchmark 出现
newlyFailing > 0; - skipped 样本只凭去除后指标变为通过,但原图生产级证据不足;
- 单例样本需要新增独有阈值才能通过;
- repair trial 在非 ROI 或低证据区域产生明显内容损伤;
- userscript / SDK / CLI meta 兼容性被破坏。
十、重构后的质量监控体系(评估口径升级)
重构收口后,文档转入"完美修复率 / 瑕疵率监控",新增诊断入口:
- scripts/create-online-sample-quality-monitor.js(
pnpm report:online-sample:quality-monitor); - scripts/create-online-quality-review-pack.js(
pnpm report:online-sample:quality-review); - scripts/create-online-quality-ablation-report.js(
pnpm report:online-sample:quality-ablation); - scripts/create-online-perfect-lost-github-compare.js(
pnpm report:online-sample:perfect-lost-github-compare)。
监控分三档:perfect strict(通过 benchmark 且 strict 阈值下无 residual / halo / damage / texture / near-black / clipping / weak suppression flag)、clean pass(clean 阈值下无瑕疵 flag)、severe defect(fail、可见残留或强 residual/halo/damage/texture/near-black 任一命中)。
Phase 5 当前质量基线(文档记录):
pass = 978/1000 = 97.80%perfect strict = 82/1000 = 8.20%clean pass = 247/1000 = 24.70%strict defect = 918/1000 = 91.80%clean defect = 753/1000 = 75.30%severe defect = 393/1000 = 39.30%visible residual = 292/1000 = 29.20%damage / texture metric coverage = 984/1000 = 98.40%
与最早线上基线对比呈现pass +29、visible residual -13、perfect strict -59的格局。文档的解读非常严谨:早期latest-report.json的 damage/texture 指标覆盖为 0,而 Phase 5 覆盖为 984/1000,所以perfect / strict defect / severe defect的跨 initial delta 只能当风险预警,不是同口径质量结论。59 个perfectLost的主要 flags 为damage-penalty = 56、texture-penalty = 45、near-black-increase = 6,anchor 集中在48/96/96 = 44、96/64/64 = 8、48/32/32 = 3。
质量消融报告给出关键诊断:固定生产检测位置/尺寸/alpha map、跳过后续修复、只对直接 alpha 反混合做 gain 网格搜索,总计检查 148 个重点样本后,全局只有bestPerfect = 1、bestClean = 12;诊断分布为no-direct-alpha-improvement = 64、selected-alpha-core-causes-quality-flag = 53、direct-alpha-improves-but-not-clean = 19、alpha-grid-has-clean-candidate = 9、alpha-stage-overfit-previous-gain-clean = 2。结论是"主因已经前移到 detection 后的 alpha/core inverse 候选选择",而不是单纯的后处理层把图搞坏。
视觉复核决策(文档明确的生产决策):本轮不增加窄范围conservative-alphaproduction gate、不增加新的tradeoffgate、不全局关闭fine-alpha / located-aggressive / repair——因为证据只证明"有少量样本在 clean 阈值下可接受",未证明切换 conservative-alpha 会稳定改善肉眼质量。守门验证(同基线零 delta 监控)显示perfect delta = 0 / strict defect delta = 0 / severe defect delta = 0 / pass delta = 0。
GitHub v1.0.27 对照复核进一步排除了"当前版本相对旧版退步":对 59 个perfectLost分别渲染 source / GitHub v1.0.27 after / current after / old-to-current diff x8,量化结果是old-current avg crop delta < 0.01的样本占 57/59、< 0.1占 58/59、< 0.5占 59/59,最大平均差仅0.161/255。最终判断:perfect strict -59主要不是真实视觉退步,而是评估口径升级暴露风险(新增了 damage/texture/near-black 严格指标)。
十一、剩余失败样本四层归因与后续能力提升路线
重构的终极价值体现在失败样本归因上。Phase 5 后对 22 个失败样本按主责层归因:detection = 16、repair = 4、alpha = 2。
关键结论(文档原文逻辑):
- 唯一值得优先做生产能力提升的重复簇是48/96/96 accepted residual / weak-suppression,共 3 个样本(
2026-06-23/2069426775582052352、2026-06-23/2069438837913817088、2026-06-24/2069602182474240000),应归到repair -> alpha而非 detection; - 16 个 skipped 样本仍不建议放宽检测(skipped audit 结论是无 production-evidence-safe candidate);
- issue 92 当前不是
48/96/96残留簇,而是 false-positive anchor-selection guard(当前选择96/64/64,未选弱证据96/192/192default-alpha),应留作 evaluation/detection 回归样本,不并入 P1 residual fixture set。
文档还沉淀了值得跟的样本簇:48/96/96 大边距残留(跟踪 alpha edge profile、luma edge cleanup、修复层安全门槛)、48/32/32 小边距近阈值残留(高纹理/高对比背景下轻量 edge cleanup,仅略高于阈值,优先等同簇样本而非单例特化)、需要人工真值确认(有部分模板证据但去除不安全,适合人工真值池)。
P1 小实验收尾给出了实证结论:纯 alpha profile sweep 没有安全、稳定、可推广候选(best safe profile improvements = 0);boundary/texture repair sweep 中找到best safe preset = edge-luma-r5-signed-mid(样本2069426775582052352的balancedCost从0.578219降到0.293285、gradient从0.312419降到0.216936、visible=false),但样本被归类为structured-edge-protected,当前 gate 不允许直接进生产。文档给出的后续路线非常克制:先人工视觉复核该 sheet,若确认优于生产输出,再从全量 1000 中找同类样本做离线 gate sweep,只有当离线 sweep 没有新增损伤才把例外 gate 写入生产,且例外准入 gate 至少需满足:原图证据强、修复后 visible 关闭、balanced cost 明显下降、artifact cost 不上升、newly clipped 不上升、在非 P1 / skipped / issue92 样本上无误伤。
十二、总结:这次重构留下了什么
从 docs/image-watermark-pipeline-refactor-live.zh.md 的完整记录看,这次重构的实际收益可以概括为三点:
- 边界可测:把"检测、alpha 逼近、修复、评估"从文档意图变成可测试 contract,后续新增 alpha 候选、纹理修复、评估择优时不必再塞进一个长函数。
- 问题可归因:对 issue 92 这类"水印去掉后仍有明显痕迹"的问题,已有地方分别承接——alpha profile 问题进 alpha 层、边缘/纹理残留进 repair 层、路径选择错误进 evaluation 层。
- 质量有防线:每个阶段都用"核心测试 + build + 1000 样本 benchmark + gate +
newlyFailing=0"守住底线,并在重构完成后升级出 perfect/clean/severe 三档质量监控与消融/复核体系,避免了"覆盖率提升但肉眼质量不稳"的隐性退化。
对任何想把单体图像处理函数改造成可维护流水线的开发者,这份文档与仓库源码(imageWatermarkPipeline.js、pipelineDecisionPath.js、pipelineLayerContracts.js 及其在 tests/core 下的配套测试)都是一份难得的实战标本:结构迁移可以完全行为等价,质量门禁必须始终在重构之前立起来。
【免费下载链接】gemini-watermark-remover
A high-performance, 100% client-side tool for removing Gemini AI image & video watermarks. Built with pure JavaScript using mathematically precise Reverse Alpha Blending. / 基于 JavaScript 的纯浏览器端 Gemini AI 图像和视频无损去水印工具,使用数学精确的反向 Alpha 混合算法
相关推荐
gemini-watermark-remover 全版本演进解析:从反向 Alpha 混合到图片/视频去水印的工程化路线
gemini watermark remover 全版本演进解析:从反向 Alpha 混合到图片/视频去水印的工程化路线 本文以开源仓库 CHANGELOG_z
gemini-watermark-remover 无损去水印实战指南:反向 Alpha 混合算法、分层检测与 CLI/SDK 集成
gemini watermark remover 无损去水印实战指南:反向 Alpha 混合算法、分层检测与 CLI/SDK 集成 本文以开源仓库 gemini
ok-ww:3 个简单技巧,让鸣潮自动战斗一键日常、后台托管
ok ww:3 个简单技巧,让鸣潮自动战斗一键日常、后台托管 每天下班要上线四十分钟:领日常委托、清周本、刷声骸,漏一步就浪费体力。ok ww 是基于图像识别的
GUI 自动化计算机视觉RPA人工智能
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考