@pilio/gemini-watermark-remover 1.0.26 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -91
- package/README_zh.md +414 -414
- package/package.json +10 -1
- package/skills/gemini-watermark-remover/SKILL.md +32 -32
- package/skills/gemini-watermark-remover/references/usage.md +23 -23
- package/src/core/candidateEvaluation.js +182 -0
- package/src/core/candidateSelector.js +46 -28
- package/src/core/imageWatermarkPipeline.js +127 -0
- package/src/core/imageWatermarkPipelineRequest.js +39 -0
- package/src/core/pipelineAcceptedExecutor.js +299 -0
- package/src/core/pipelineAcceptedExecutorRequest.js +44 -0
- package/src/core/pipelineAcceptedFinalizationRequest.js +21 -0
- package/src/core/pipelineAlphaStageSpecs.js +573 -0
- package/src/core/pipelineAlphaTraceContract.js +56 -0
- package/src/core/pipelineAlphaTrial.js +223 -0
- package/src/core/pipelineDecisionPath.js +161 -0
- package/src/core/pipelineDetectionCandidate.js +128 -0
- package/src/core/pipelineFinalization.js +46 -0
- package/src/core/pipelineInitialContext.js +52 -0
- package/src/core/pipelineInitialSelection.js +61 -0
- package/src/core/pipelineLayerContracts.js +163 -0
- package/src/core/pipelineMeta.js +201 -0
- package/src/core/pipelineMetrics.js +88 -0
- package/src/core/pipelinePassState.js +36 -0
- package/src/core/pipelineRepairGates.js +124 -0
- package/src/core/pipelineRepairStageSpecs.js +491 -0
- package/src/core/pipelineRepairTrial.js +156 -0
- package/src/core/pipelineResult.js +128 -0
- package/src/core/pipelineRuntime.js +689 -0
- package/src/core/pipelineRuntimeBootstrap.js +78 -0
- package/src/core/pipelineState.js +134 -0
- package/src/core/pipelineTimings.js +36 -0
- package/src/core/pipelineTrace.js +28 -0
- package/src/core/watermarkProcessor.js +1188 -1297
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createAlphaRescueStageSequenceSpecs,
|
|
3
|
+
createFineAlphaTrialSequenceSpecs,
|
|
4
|
+
createLocatedAggressiveStageSpec,
|
|
5
|
+
createRecalibrationStageSpec,
|
|
6
|
+
createSmallAnchorAlphaStageSequenceSpecs,
|
|
7
|
+
createSubpixelOutlineAlphaStageSpecs
|
|
8
|
+
} from './pipelineAlphaStageSpecs.js';
|
|
9
|
+
import {
|
|
10
|
+
createAlphaRepairPipelineRuntime,
|
|
11
|
+
runCurrentAlphaStageSpecPhase,
|
|
12
|
+
runCurrentRepairStageSpecPhase,
|
|
13
|
+
runCurrentAlphaTrialSpecPhase,
|
|
14
|
+
runLocatedAggressiveStage,
|
|
15
|
+
runPreviewBackgroundCleanupStage,
|
|
16
|
+
runRecalibrationStage,
|
|
17
|
+
runRepairCleanupSpecPhase
|
|
18
|
+
} from './pipelineRuntime.js';
|
|
19
|
+
import {
|
|
20
|
+
createPostLocatedRepairStageSequenceSpecs,
|
|
21
|
+
createPreviewBackgroundCleanupStageSpec,
|
|
22
|
+
createRepairCleanupPhaseSpecs,
|
|
23
|
+
createTailRepairStageSequenceSpecs
|
|
24
|
+
} from './pipelineRepairStageSpecs.js';
|
|
25
|
+
|
|
26
|
+
export function runAcceptedAlphaRepairPipeline({
|
|
27
|
+
nowMs = Date.now,
|
|
28
|
+
totalStartedAt = null,
|
|
29
|
+
runtimeBootstrap,
|
|
30
|
+
pipelineTraceRecorder,
|
|
31
|
+
originalImageData,
|
|
32
|
+
alpha96,
|
|
33
|
+
getAlphaMap,
|
|
34
|
+
alpha96Variants = null,
|
|
35
|
+
locatedAggressiveRemoval,
|
|
36
|
+
debugTimings = null,
|
|
37
|
+
debugTimingsEnabled = false,
|
|
38
|
+
visualPostProcessingEnabled = false,
|
|
39
|
+
templateWarp = null,
|
|
40
|
+
passState,
|
|
41
|
+
subpixelShift = null,
|
|
42
|
+
metrics = {},
|
|
43
|
+
gates = {},
|
|
44
|
+
config = {},
|
|
45
|
+
refiners = {}
|
|
46
|
+
} = {}) {
|
|
47
|
+
const {
|
|
48
|
+
readPipelineState,
|
|
49
|
+
applyPipelineState,
|
|
50
|
+
cleanupFlags
|
|
51
|
+
} = runtimeBootstrap;
|
|
52
|
+
const {
|
|
53
|
+
usePreviewAnchorFastCleanup,
|
|
54
|
+
useKnown48EdgeCleanup,
|
|
55
|
+
useV2SmallEdgeCleanup
|
|
56
|
+
} = cleanupFlags;
|
|
57
|
+
const {
|
|
58
|
+
recordAlphaTrialEvent,
|
|
59
|
+
acceptCurrentAlphaTrialResult,
|
|
60
|
+
acceptCurrentAlphaStageResult,
|
|
61
|
+
acceptCurrentRepairTrialResult,
|
|
62
|
+
acceptRecalibrationStageResult,
|
|
63
|
+
acceptLocatedAggressiveResult,
|
|
64
|
+
acceptPreviewBackgroundCleanupResult,
|
|
65
|
+
assignTailDebugTimings
|
|
66
|
+
} = createAlphaRepairPipelineRuntime({
|
|
67
|
+
traceRecorder: pipelineTraceRecorder,
|
|
68
|
+
readState: readPipelineState,
|
|
69
|
+
applyState: applyPipelineState,
|
|
70
|
+
debugTimings
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
runRecalibrationStage(createRecalibrationStageSpec({
|
|
74
|
+
nowMs,
|
|
75
|
+
readState: readPipelineState,
|
|
76
|
+
shouldRecalibrateAlphaStrength: gates.shouldRecalibrateAlphaStrength,
|
|
77
|
+
calculateNearBlackRatio: metrics.calculateNearBlackRatio,
|
|
78
|
+
computeRegionGradientCorrelation: metrics.computeRegionGradientCorrelation,
|
|
79
|
+
acceptRecalibrationStageResult,
|
|
80
|
+
debugTimings,
|
|
81
|
+
debugTimingsEnabled,
|
|
82
|
+
refiners: {
|
|
83
|
+
recalibrateAlphaStrength: refiners.recalibrateAlphaStrength
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
runCurrentAlphaTrialSpecPhase({
|
|
88
|
+
createSpecs: () => {
|
|
89
|
+
const current = readPipelineState();
|
|
90
|
+
return createFineAlphaTrialSequenceSpecs({
|
|
91
|
+
nowMs,
|
|
92
|
+
readState: readPipelineState,
|
|
93
|
+
originalImageData,
|
|
94
|
+
originalSpatialScore: current.originalSpatialScore,
|
|
95
|
+
originalGradientScore: current.originalGradientScore,
|
|
96
|
+
calculateNearBlackRatio: metrics.calculateNearBlackRatio,
|
|
97
|
+
acceptCurrentAlphaTrialResult,
|
|
98
|
+
debugTimings,
|
|
99
|
+
debugTimingsEnabled,
|
|
100
|
+
refiners: {
|
|
101
|
+
recalibrateOverSubtractedAlpha: refiners.recalibrateOverSubtractedAlpha,
|
|
102
|
+
fineTuneDarkCatalogAlpha: refiners.fineTuneDarkCatalogAlpha,
|
|
103
|
+
fineTuneWeakPositiveResidualAlpha: refiners.fineTuneWeakPositiveResidualAlpha
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
runPreviewBackgroundCleanupStage(createPreviewBackgroundCleanupStageSpec({
|
|
110
|
+
nowMs,
|
|
111
|
+
readState: readPipelineState,
|
|
112
|
+
visualPostProcessingEnabled,
|
|
113
|
+
maxNearBlackRatioIncrease: config.maxNearBlackRatioIncrease,
|
|
114
|
+
measureOuterBorderLuminanceStd: metrics.measureOuterBorderLuminanceStd,
|
|
115
|
+
shouldApplyPreviewSmoothBackgroundCleanup: gates.shouldApplyPreviewSmoothBackgroundCleanup,
|
|
116
|
+
applyPreviewSmoothBackgroundCleanup: refiners.applyPreviewSmoothBackgroundCleanup,
|
|
117
|
+
createRegionCorrelationMetrics: metrics.createRegionCorrelationMetrics,
|
|
118
|
+
calculateNearBlackRatio: metrics.calculateNearBlackRatio,
|
|
119
|
+
acceptPreviewBackgroundCleanupResult,
|
|
120
|
+
debugTimings,
|
|
121
|
+
debugTimingsEnabled
|
|
122
|
+
}));
|
|
123
|
+
|
|
124
|
+
const subpixelStartedAt = nowMs();
|
|
125
|
+
const subpixelAlphaStageResults = runCurrentAlphaStageSpecPhase({
|
|
126
|
+
createSpecs: () => createSubpixelOutlineAlphaStageSpecs({
|
|
127
|
+
readState: readPipelineState,
|
|
128
|
+
calculateNearBlackRatio: metrics.calculateNearBlackRatio,
|
|
129
|
+
templateWarp,
|
|
130
|
+
visualPostProcessingEnabled,
|
|
131
|
+
usePreviewAnchorFastCleanup,
|
|
132
|
+
outlineConfig: config.outlineConfig,
|
|
133
|
+
acceptCurrentAlphaStageResult,
|
|
134
|
+
refiners: {
|
|
135
|
+
refineSubpixelOutline: refiners.refineSubpixelOutline
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
});
|
|
139
|
+
const subpixelRefined = subpixelAlphaStageResults[0];
|
|
140
|
+
if (subpixelRefined) {
|
|
141
|
+
subpixelShift = subpixelRefined.shift;
|
|
142
|
+
}
|
|
143
|
+
if (debugTimingsEnabled && debugTimings) {
|
|
144
|
+
debugTimings.subpixelRefinementMs = nowMs() - subpixelStartedAt;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const shouldRunEdgeCleanup = visualPostProcessingEnabled || useKnown48EdgeCleanup || useV2SmallEdgeCleanup;
|
|
148
|
+
const {
|
|
149
|
+
previewEdgeCleanupElapsedMs
|
|
150
|
+
} = runRepairCleanupSpecPhase({
|
|
151
|
+
createSpecs: () => createRepairCleanupPhaseSpecs({
|
|
152
|
+
nowMs,
|
|
153
|
+
readState: readPipelineState,
|
|
154
|
+
shouldRunEdgeCleanup,
|
|
155
|
+
useKnown48EdgeCleanup,
|
|
156
|
+
useV2SmallEdgeCleanup,
|
|
157
|
+
usePreviewAnchorFastCleanup,
|
|
158
|
+
cleanupConfig: config.repairCleanupConfig,
|
|
159
|
+
acceptCurrentRepairTrialResult,
|
|
160
|
+
refiners: {
|
|
161
|
+
refinePreviewResidualEdge: refiners.refinePreviewResidualEdge,
|
|
162
|
+
refineKnown48FlatBackgroundResidual: refiners.refineKnown48FlatBackgroundResidual,
|
|
163
|
+
refineKnown48LumaEdgeResidual: refiners.refineKnown48LumaEdgeResidual,
|
|
164
|
+
refineNewMargin96FlatBackgroundResidual: refiners.refineNewMargin96FlatBackgroundResidual
|
|
165
|
+
}
|
|
166
|
+
})
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const smallAnchorTimingAnchors = {};
|
|
170
|
+
const smallAnchorAlphaStageResults = runCurrentAlphaStageSpecPhase({
|
|
171
|
+
createSpecs: () => createSmallAnchorAlphaStageSequenceSpecs({
|
|
172
|
+
nowMs,
|
|
173
|
+
timingAnchors: smallAnchorTimingAnchors,
|
|
174
|
+
readState: readPipelineState,
|
|
175
|
+
originalImageData,
|
|
176
|
+
originalGradientScore: readPipelineState().originalGradientScore,
|
|
177
|
+
alpha96,
|
|
178
|
+
getAlphaMap,
|
|
179
|
+
visualPostProcessingEnabled,
|
|
180
|
+
assessWatermarkResidualVisibility: metrics.assessWatermarkResidualVisibility,
|
|
181
|
+
acceptCurrentAlphaStageResult,
|
|
182
|
+
refiners: {
|
|
183
|
+
refineSmallPreviewAnchorCandidate: refiners.refineSmallPreviewAnchorCandidate,
|
|
184
|
+
refineSmallFixedLocalAnchorGeometry: refiners.refineSmallFixedLocalAnchorGeometry
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
});
|
|
188
|
+
const smallFixedLocalRelocated = smallAnchorAlphaStageResults[1];
|
|
189
|
+
|
|
190
|
+
const locatedAggressiveStartedAt = nowMs();
|
|
191
|
+
const locatedAggressiveRun = runLocatedAggressiveStage(createLocatedAggressiveStageSpec({
|
|
192
|
+
readState: readPipelineState,
|
|
193
|
+
originalImageData,
|
|
194
|
+
originalSpatialScore: readPipelineState().originalSpatialScore,
|
|
195
|
+
originalGradientScore: readPipelineState().originalGradientScore,
|
|
196
|
+
smallFixedLocalRelocated,
|
|
197
|
+
locatedAggressiveRemovalEnabled: locatedAggressiveRemoval,
|
|
198
|
+
assessWatermarkResidualVisibility: metrics.assessWatermarkResidualVisibility,
|
|
199
|
+
shouldSkipLocatedAggressiveForCleanCanonical96: gates.shouldSkipLocatedAggressiveForCleanCanonical96,
|
|
200
|
+
recordAlphaTrialEvent,
|
|
201
|
+
acceptLocatedAggressiveResult,
|
|
202
|
+
currentPassState: passState,
|
|
203
|
+
refiners: {
|
|
204
|
+
refineLocatedAggressiveRemoval: refiners.refineLocatedAggressiveRemoval
|
|
205
|
+
}
|
|
206
|
+
}));
|
|
207
|
+
passState = locatedAggressiveRun.passState;
|
|
208
|
+
|
|
209
|
+
const postLocatedRepairTimingAnchors = {};
|
|
210
|
+
runCurrentRepairStageSpecPhase({
|
|
211
|
+
createSpecs: () => {
|
|
212
|
+
const current = readPipelineState();
|
|
213
|
+
return createPostLocatedRepairStageSequenceSpecs({
|
|
214
|
+
nowMs,
|
|
215
|
+
timingAnchors: postLocatedRepairTimingAnchors,
|
|
216
|
+
readState: readPipelineState,
|
|
217
|
+
originalImageData,
|
|
218
|
+
originalSpatialScore: current.originalSpatialScore,
|
|
219
|
+
originalGradientScore: current.originalGradientScore,
|
|
220
|
+
acceptCurrentRepairTrialResult,
|
|
221
|
+
refiners: {
|
|
222
|
+
refineCanonical96PositiveHaloResidual: refiners.refineCanonical96PositiveHaloResidual,
|
|
223
|
+
refineSmoothLocatedResidualWithEstimatedPrior: refiners.refineSmoothLocatedResidualWithEstimatedPrior
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const alphaRescueTimingAnchors = {};
|
|
230
|
+
runCurrentAlphaStageSpecPhase({
|
|
231
|
+
createSpecs: () => {
|
|
232
|
+
const current = readPipelineState();
|
|
233
|
+
return createAlphaRescueStageSequenceSpecs({
|
|
234
|
+
nowMs,
|
|
235
|
+
timingAnchors: alphaRescueTimingAnchors,
|
|
236
|
+
readState: readPipelineState,
|
|
237
|
+
originalImageData,
|
|
238
|
+
originalSpatialScore: current.originalSpatialScore,
|
|
239
|
+
originalGradientScore: current.originalGradientScore,
|
|
240
|
+
resolveVariantAlphaMap: () => (
|
|
241
|
+
alpha96Variants?.['20260520'] ??
|
|
242
|
+
(typeof getAlphaMap === 'function' ? getAlphaMap('96-20260520') : null)
|
|
243
|
+
),
|
|
244
|
+
acceptCurrentAlphaStageResult,
|
|
245
|
+
refiners: {
|
|
246
|
+
refineNewMargin96VariantResidual: refiners.refineNewMargin96VariantResidual,
|
|
247
|
+
refineKnown48AntiTemplateResidual: refiners.refineKnown48AntiTemplateResidual,
|
|
248
|
+
refineKnown48PowerProfileResidual: refiners.refineKnown48PowerProfileResidual,
|
|
249
|
+
refineKnown48PositiveResidualRebalance: refiners.refineKnown48PositiveResidualRebalance
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
const tailRepairTimingAnchors = {};
|
|
256
|
+
runCurrentRepairStageSpecPhase({
|
|
257
|
+
createSpecs: () => {
|
|
258
|
+
const current = readPipelineState();
|
|
259
|
+
return createTailRepairStageSequenceSpecs({
|
|
260
|
+
nowMs,
|
|
261
|
+
timingAnchors: tailRepairTimingAnchors,
|
|
262
|
+
readState: readPipelineState,
|
|
263
|
+
originalImageData,
|
|
264
|
+
originalSpatialScore: current.originalSpatialScore,
|
|
265
|
+
originalGradientScore: current.originalGradientScore,
|
|
266
|
+
alpha96,
|
|
267
|
+
getAlphaMap,
|
|
268
|
+
acceptCurrentRepairTrialResult,
|
|
269
|
+
refiners: {
|
|
270
|
+
refineKnown48SmallMarginPriorRepairResidual: refiners.refineKnown48SmallMarginPriorRepairResidual,
|
|
271
|
+
refineSmallLocatedPriorRepairResidual: refiners.refineSmallLocatedPriorRepairResidual,
|
|
272
|
+
refineKnown48BoundaryRepairResidual: refiners.refineKnown48BoundaryRepairResidual,
|
|
273
|
+
refineDarkHaloResidual: refiners.refineDarkHaloResidual,
|
|
274
|
+
refineQuantizedNegativeBodyResidual: refiners.refineQuantizedNegativeBodyResidual,
|
|
275
|
+
refineKnown48MidCoreBiasResidual: refiners.refineKnown48MidCoreBiasResidual
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
if (debugTimingsEnabled && debugTimings) {
|
|
282
|
+
assignTailDebugTimings({
|
|
283
|
+
nowMs,
|
|
284
|
+
totalStartedAt,
|
|
285
|
+
previewEdgeCleanupElapsedMs,
|
|
286
|
+
...smallAnchorTimingAnchors,
|
|
287
|
+
locatedAggressiveStartedAt,
|
|
288
|
+
...postLocatedRepairTimingAnchors,
|
|
289
|
+
...alphaRescueTimingAnchors,
|
|
290
|
+
...tailRepairTimingAnchors
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return {
|
|
295
|
+
passState,
|
|
296
|
+
subpixelShift,
|
|
297
|
+
readPipelineState
|
|
298
|
+
};
|
|
299
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function createAcceptedPipelineExecutorRequest({
|
|
2
|
+
nowMs,
|
|
3
|
+
options = {},
|
|
4
|
+
totalStartedAt,
|
|
5
|
+
runtimeBootstrap,
|
|
6
|
+
pipelineTraceRecorder,
|
|
7
|
+
originalImageData,
|
|
8
|
+
alpha96,
|
|
9
|
+
debugTimings,
|
|
10
|
+
debugTimingsEnabled,
|
|
11
|
+
visualPostProcessingEnabled,
|
|
12
|
+
templateWarp,
|
|
13
|
+
subpixelShift,
|
|
14
|
+
acceptedPipelineDependencies
|
|
15
|
+
} = {}) {
|
|
16
|
+
const {
|
|
17
|
+
metrics,
|
|
18
|
+
gates,
|
|
19
|
+
config: executorConfig,
|
|
20
|
+
refiners
|
|
21
|
+
} = acceptedPipelineDependencies;
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
nowMs,
|
|
25
|
+
totalStartedAt,
|
|
26
|
+
runtimeBootstrap,
|
|
27
|
+
pipelineTraceRecorder,
|
|
28
|
+
originalImageData,
|
|
29
|
+
alpha96,
|
|
30
|
+
getAlphaMap: options.getAlphaMap,
|
|
31
|
+
alpha96Variants: options.alpha96Variants ?? null,
|
|
32
|
+
locatedAggressiveRemoval: options.locatedAggressiveRemoval,
|
|
33
|
+
debugTimings,
|
|
34
|
+
debugTimingsEnabled,
|
|
35
|
+
visualPostProcessingEnabled,
|
|
36
|
+
templateWarp,
|
|
37
|
+
passState: runtimeBootstrap.passState,
|
|
38
|
+
subpixelShift,
|
|
39
|
+
metrics,
|
|
40
|
+
gates,
|
|
41
|
+
config: executorConfig,
|
|
42
|
+
refiners
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function createAcceptedPipelineFinalizationRequest({
|
|
2
|
+
acceptedPipelineRun,
|
|
3
|
+
pipelineTraceRecorder = {},
|
|
4
|
+
resultContext = {},
|
|
5
|
+
originalImageData = null,
|
|
6
|
+
initialSelection = null,
|
|
7
|
+
resolvedConfig = null
|
|
8
|
+
} = {}) {
|
|
9
|
+
return {
|
|
10
|
+
pipelineState: acceptedPipelineRun.readPipelineState(),
|
|
11
|
+
passState: acceptedPipelineRun.passState,
|
|
12
|
+
traceState: {
|
|
13
|
+
alphaAdjustmentStages: pipelineTraceRecorder.alphaAdjustmentStages,
|
|
14
|
+
alphaTrialEvents: pipelineTraceRecorder.alphaTrialEvents
|
|
15
|
+
},
|
|
16
|
+
resultContext,
|
|
17
|
+
originalImageData,
|
|
18
|
+
initialSelection,
|
|
19
|
+
resolvedConfig
|
|
20
|
+
};
|
|
21
|
+
}
|