Skip to content

Commit 6107b38

Browse files
CEQ151CEQ151
authored andcommitted
fix(mlwm-train): train decoder on encoder residuals
1 parent 6961aea commit 6107b38

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

blind_watermark/mlwm/train.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ def train_main(args) -> dict[str, Any]:
243243
for stage_name, stage_cfg in iter_enabled_stages(config, args.stage):
244244
freeze_encoder = bool(stage_cfg.get('freeze_encoder', False))
245245
freeze_decoder = bool(stage_cfg.get('freeze_decoder', False))
246+
use_fixed_residual = bool(stage_cfg.get('use_fixed_residual', freeze_encoder))
246247
stage_loss_cfg = deep_update(loss_cfg, stage_cfg.get('loss', {}))
247248
for parameter in encoder.parameters():
248249
parameter.requires_grad = not freeze_encoder
@@ -260,7 +261,7 @@ def train_main(args) -> dict[str, Any]:
260261
bits = batch['bits'].to(device)
261262

262263
with torch.cuda.amp.autocast(enabled=scaler.is_enabled()):
263-
if freeze_encoder:
264+
if use_fixed_residual:
264265
residual = fixed_residual_batch(
265266
torch,
266267
bits,
@@ -377,14 +378,14 @@ def train_main(args) -> dict[str, Any]:
377378
for batch in val_loader:
378379
clean = batch['image'].to(device)
379380
bits = batch['bits'].to(device)
380-
residual = encoder(clean, bits) if not freeze_encoder else fixed_residual_batch(
381+
residual = fixed_residual_batch(
381382
torch,
382383
bits,
383384
clean.shape[-2],
384385
clean.shape[-1],
385386
float(stage_cfg.get('fixed_residual_scale', 0.02)),
386387
device,
387-
)
388+
) if use_fixed_residual else encoder(clean, bits)
388389
watermarked = torch.clamp(clean + residual, 0.0, 1.0)
389390
attacked = attack_batch(torch, watermarked, attack_cfg, str(stage_cfg.get('attack_strength', 'medium'))).to(device)
390391
logits, confidence = decoder(attacked)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
extends: configs/mlwm/boost_5090.yaml
2+
optimizer:
3+
lr: 0.00004
4+
weight_decay: 0.00001
5+
stages:
6+
warmup:
7+
enabled: false
8+
main:
9+
enabled: false
10+
hard_negative:
11+
enabled: true
12+
epochs: 18
13+
freeze_encoder: true
14+
use_fixed_residual: false
15+
freeze_decoder: false
16+
attack_strength: medium
17+
loss:
18+
payload_weight: 14.0
19+
image_weight: 0.0
20+
tv_weight: 0.0
21+
residual_weight: 0.0
22+
finalize:
23+
enabled: true
24+
epochs: 8
25+
freeze_encoder: false
26+
freeze_decoder: false
27+
attack_strength: medium
28+
loss:
29+
payload_weight: 12.0
30+
image_weight: 0.65
31+
tv_weight: 0.018
32+
residual_weight: 0.025
33+
attack:
34+
enabled_ops:
35+
- crop
36+
- screenshot_sim
37+
- color_jitter
38+
ops_per_sample:
39+
min: 1
40+
max: 1
41+
crop_keep: [0.96, 1.0]
42+
resize_scale: [0.85, 1.15]
43+
jpeg_quality: [75, 95]
44+
webp_quality: [75, 95]
45+
gaussian_blur_sigma: [0.0, 0.35]
46+
gaussian_noise_std: [0.0, 0.004]

0 commit comments

Comments
 (0)