Watermarks and Fingerprints as Soft Bindings for Content Provenance: An Open-Licence Benchmark for Images, Audio and Video
Organizations: Original Pictures Technologies, Inc., Delaware, USA
Abstract
Content-provenance standards such as C2PA let a platform recover a stripped manifest through a soft binding: an invisible watermark read from the content, or a fingerprint looked up in a registry. We benchmarked both families under one protocol, restricted to openly available models whose licences we audited, on public media, with false-match rates calibrated on held-out negatives and source-level bootstrap intervals for performance estimates. For watermarking we evaluated 25 image, 7 audio and 7 video configurations from 12 methods on perceptual quality, robustness, false positives and cost; for fingerprinting, 35 methods on registries of up to 98,985 images, partial edits and adversarial attacks. PixelSeal gave the best balance for image and video watermarks and AudioSeal for audio, but the error-correcting detector of every TrustMark variant fired on 5.9 to 15.3% of unmarked images, so a verifier should test the expected payload. Among fingerprints, copy detectors trained on non-commercial data detected up to 75.5% of transformed images at a pair-level false-match rate of and DINOv2, the best permissively licensed method, 65.0%; near-copies in a product catalogue dominated the false matches, and no detection improvement from geometric verification was observed under a matched calibration false-binding constraint in the evaluated image pipelines. On the same attacked copies the two families failed differently: the union of watermark and fingerprint successes covered 69% of image copies; fingerprints covered more audio queries, whereas expected-key watermark verification covered more video queries. Embedding a watermark moved the ISCC code of 62.0% of images past its match threshold, and platform-dependent colour conversion changed watermark bits between x86 and ARM hosts.
Figures & tables
| Modality | Method | Bits | Code | Weights |
|---|---|---|---|---|
| Image | TrustMark B, C, P, Q [ 4 ] | 100 | MIT | MIT |
| Image | PixelSeal [ 6 ] | 256 | MIT | MIT |
| Image, video | Video Seal 1.0 [ 35 ] | 256 | MIT | MIT |
| Image, video | ChunkySeal [ 31 ] | 1024 | MIT | MIT |
| Image | WAM [ 30 ] | 32 | MIT | MIT a |
| Image | DWT-DCT, DWT-DCT-SVD [ 24 ] | 64 | MIT | n/a |
| Modality | Method | Class | Code licence | Weights / data | Bits | Time (ms) |
|---|---|---|---|---|---|---|
| Image | PDQ | Perceptual hash | BSD (ThreatExchange); pdqhash binding | n/a | 256 | 31 CPU |
| PDQ (dihedral) | Perceptual hash | BSD (ThreatExchange); pdqhash binding | n/a | 256 | 31 CPU | |
| aHash | Perceptual hash | BSD-2-Clause (imagehash) | n/a | 64.0 | 4.3 CPU | |
| dHash | Perceptual hash | BSD-2-Clause (imagehash) | n/a | 64.0 | 4.4 CPU | |
| pHash | Perceptual hash | BSD-2-Clause (imagehash) | n/a | 64.0 | 5.2 CPU | |
| pHash-256 | Perceptual hash | BSD-2-Clause (imagehash) | n/a | 256 | 5.6 CPU |
| Configuration | Q | PSNR | SSIM | LPIPS | FLIP | CVVDP | JPEG 75 bit acc. | Blind | GPU | Cost | Comb. | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (dB) | pooled | worst set | FPR | (ms/MP) | ($/k MP) | |||||||
| PixelSeal (0.15) | ✓ | 48.3 | 0.9969 | 0.0012 | 0.024 | 9.93 | 0.988 | 0.980 | n/a | 9.13 | 0.0026 | 0.95 |
| PixelSeal (0.2) | ✓ | 45.9 | 0.9952 | 0.0020 | 0.030 | 9.88 | 0.998 | 0.996 | n/a | 9.13 | 0.0026 | 0.90 |
| Video Seal (0.2) | ✓ | 44.8 | 0.9953 | 0.0021 | 0.034 | 9.82 | 0.997 | 0.996 | n/a | 8.79 | 0.0025 | 0.90 |
| PixelSeal (0.4) | ✓ | 40.1 | 0.9863 | 0.0077 | 0.051 | 9.57 | 0.999 | 0.999 | n/a | 9.13 | 0.0026 | 0.79 |
| Video Seal (0.4) | ✓ | 38.9 | 0.9856 | 0.0082 | 0.058 | 9.39 | 1.000 | 0.999 | n/a | 8.79 | 0.0025 | 0.79 |
| Modality | Configuration | Bits | ECC | Bit acc. | (gate) | Exact (gate) | Exact (mean) |
|---|---|---|---|---|---|---|---|
| Image | PixelSeal (0.15) | 256 | none | 0.988 | 1.000 | 0.318 | 0.254 |
| Image | PixelSeal (0.2) | 256 | none | 0.998 | 1.000 | 0.765 | 0.590 |
| Image | Video Seal (0.2) | 256 | none | 0.997 | 1.000 | 0.659 | 0.506 |
| Image | PixelSeal (0.4) | 256 | none | 0.999 | 1.000 | 0.871 | 0.771 |
| Image | Video Seal (0.4) | 256 | none | 1.000 | 1.000 | 0.906 | 0.745 |
| Image | WAM (1) | 32 | none | 0.994 | 0.976 | 0.918 | 0.828 |
| Configuration | Q | SNR | SI-SNR | PESQ | STOI | LUFS | MP3 128k bit acc. | Blind | GPU | Cost | Comb. | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (dB) | (dB) | speech | music | pooled | worst set | FPR | (ms/s) | ($/kh) | |||||
| AudioSeal base (1) | ✓ | 27.3 | 27.0 | 4.44 | 4.23 | 0.9967 | 0.013 | 0.997 | 0.979 | 0.000 | 4.90 | 4.9 | 0.98 |
| AudioSeal streaming (0.5) | ✓ | 32.9 | 32.7 | 4.55 | 4.56 | 0.9999 | 0.004 | 0.996 | 0.988 | 0.000 | 5.83 | 5.9 | 0.91 |
| AudioSeal streaming (1) | ✓ | 26.9 | 26.6 | 4.39 | 4.45 | 0.9998 | 0.018 | 0.997 | 0.989 | 0.000 | 5.83 | 5.9 | 0.90 |
| AudioSeal streaming (1.1) | ✓ | 26.0 | 25.8 | 4.36 | 4.43 | 0.9997 | 0.025 | 0.996 | 0.988 | 0.000 | 5.83 | 5.9 | 0.90 |
| WavMark | ✓ | 36.3 | 35.9 | 4.15 | 4.36 | 0.9932 | 0.008 | 1.000 | 1.000 | 0.000 | 33.5 | 34 | 0.37 |
| MP3 128k bit acc. | AAC 64k bit acc. | All codecs bit acc. | All codecs exact | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Configuration | Pub. | Al. | Un. | Pub. | Al. | Un. | Al. | Un. | Al. | Un. |
| AudioSeal base (1) | 0.997 | 0.997 | 0.999 | 0.998 | 0.998 | 0.999 | 0.997 | 0.999 | 0.978 | 0.986 |
| AudioSeal streaming (0.5) | 0.996 | 0.996 | 1.000 | 0.996 | 0.995 | 0.998 | 0.996 | 0.999 | 0.983 | 0.990 |
| AudioSeal streaming (1.1) | 0.996 | 0.997 | 1.000 | 0.997 | 0.996 | 1.000 | 0.997 | 1.000 | 0.993 | 1.000 |
| AudioSeal streaming (1) | 0.997 | 0.997 | 1.000 | 0.995 | 0.995 | 1.000 | 0.997 | 1.000 | 0.993 | 1.000 |
| WavMark | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 |
| Configuration | Q | PSNR | SSIM | LPIPS | FLIP | VMAF | H.264 CRF 23 bit acc. | GPU | fps | Cost | Comb. | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (dB) | pooled | worst clip | (ms/MP) | 1080p | ($/k MP) | |||||||
| PixelSeal (0.4) | ✓ | 40.1 | 0.9674 | 0.0130 | 0.054 | 86.0 | 0.999 | 0.992 | 15.4 | 31.3 | 0.0043 | 1.00 |
| Video Seal (0.4) | ✓ | 40.3 | 0.9886 | 0.0131 | 0.055 | 82.1 | 1.000 | 1.000 | 16.3 | 29.7 | 0.0045 | 0.96 |
| Video Seal (0.7) | ✓ | 35.5 | 0.9710 | 0.0361 | 0.083 | 66.6 | 0.997 | 0.992 | 16.3 | 29.7 | 0.0045 | 0.91 |
| ChunkySeal (0.2) | – | 44.5 | 0.9734 | 0.0151 | 0.048 | 96.4 | 0.891 | 0.652 | 23.7 | 20.4 | 0.0066 | – |
| PixelSeal (0.2) | – | 46.0 | 0.9869 | 0.0035 | 0.031 | 95.5 | 0.984 | 0.949 | 15.4 | 31.3 | 0.0043 | – |
| Network | Theoretical | Own payload | Random payloads | Blind detector | Evidence | ||||||
| trials | sources | 95% upper | trials | max | trials | sources | 95% upper | ||||
| Image | |||||||||||
| ChunkySeal | 589/1024 | 0/340 | 0/85 | 0.042 | 0/17000 | 566 | none | analytic | |||
| InvisMark † | 74/100 | 0/340 | 0/85 | 0.042 | 0/17000 | 70 | none | analytic | |||
| PixelSeal | 167/256 | 0/340 | 0/85 | 0.042 | 0/17000 | 158 | none | analytic | |||
| RivaGAN † | 30/32 | 0/240 | 0/60 | 0.060 | 0/12000 | 26 | none | analytic | |||
| Modality | Network | Configs | Any Q | GPU (ms/unit) | CPU (ms/unit) | GPU $ | CPU $ | Cheaper |
| Image | InvisMark † | 1 | no | 8.73 | – | 0.0024 | – | GPU |
| Image | Video Seal | 3 | yes | 8.79 | 544 | 0.0025 | 0.026 | GPU |
| Image | PixelSeal | 5 | yes | 9.13 | 1104 | 0.0026 | 0.053 | GPU |
| Image | WAM | 2 | yes | 19.1 | 361 | 0.0053 | 0.017 | GPU |
| Image | TrustMark-P | 3 | yes | 45.1 | 273 | 0.013 | 0.013 | GPU |
| Image | TrustMark-B | 1 | yes | 55.7 | 278 | 0.016 | 0.013 | CPU |
| Decoded file | Same host | x86-64 vs arm64 | Bit flips | Bit strings | YUV equal | RGB equal |
|---|---|---|---|---|---|---|
| max | max | distinct | ||||
| aspen, strength 0.4, CRF 18 | 0.00096 | 0.459 | 0 | 1 | yes | no |
| aspen, strength 0.4, CRF 22 | 0.00090 | 0.889 | 0 | 1 | yes | no |
| aspen, strength 1.1, CRF 18 | 0.00068 | 0.346 | 2 | 2 | yes | no |
| aspen, strength 1.1, CRF 22 | 0.00076 | 0.440 | 0 | 1 | yes | no |
| controlled burn, strength 0.4, CRF 18 | 0.0016 | 0.306 | 0 | 1 | yes | no |
| Modality | A | B | Metric | median(A B) | ||
|---|---|---|---|---|---|---|
| Image | PixelSeal (0.15) | TrustMark-P (0.8) | FLIP | 60 | 0.0019 | 0.062 |
| Image | PixelSeal (0.15) | Video Seal (0.2) | FLIP | 60 | -0.0099 | 0.001 |
| Image | PixelSeal (0.15) | TrustMark-Q (1.2) | FLIP | 60 | -0.0212 | 0.001 |
| Audio | AudioSeal base (1) | AudioSeal streaming (0.5) | PESQ (speech) | 40 | -0.1072 | 0.001 |
| Video | PixelSeal (0.4) | Video Seal (0.4) | VMAF | 6 | 3.6629 | 0.062 |
| Method | R@1 | AP | TPR q,1% | TPR | Hard FB | DISC21 AP |
|---|---|---|---|---|---|---|
| PDQ | 0.579 | 0.520 | 0.495 | 0.495 [0.48, 0.50] | 0.000 | 0.295 |
| PDQ (dihedral) | 0.623 | 0.569 | 0.549 | 0.546 [0.54, 0.55] | 0.000 | 0.367 |
| aHash | 0.503 | 0.189 | 0.000 | 0.000 [0.00, 0.00] | 0.000 | 0.027 |
| dHash | 0.560 | 0.356 | 0.313 | 0.000 [0.00, 0.00] | 0.000 | 0.195 |
| pHash | 0.563 | 0.469 | 0.373 | 0.373 [0.00, 0.38] | 0.000 | 0.240 |
| pHash-256 | 0.589 | 0.520 | 0.494 | 0.492 [0.48, 0.50] | 0.001 | 0.302 |
| A | B | TPR A | TPR B | A B [95% CI] | sources | |
|---|---|---|---|---|---|---|
| SSCD R50 | DINOv2-S | 0.712 | 0.612 | 0.100 [0.084, 0.115] | 2,000 | |
| DINOv2-S | DINOv2-S LSH-256 | 0.612 | 0.519 | 0.093 [0.066, 0.106] | 2,000 | |
| PDQ | ISCC Image-64 | 0.495 | 0.427 | 0.068 [0.058, 0.175] | 2,000 | |
| PDQ | PDQ (dihedral) | 0.495 | 0.546 | -0.051 [-0.055, -0.050] | 2,000 | |
| ISCC Image-64 | ISCC Image-256 | 0.427 | 0.458 | -0.032 [-0.136, -0.020] | 2,000 | |
| SSCD R50 | ISC21 1st | 0.712 | 0.755 | -0.043 [-0.056, -0.029] | 2,000 |
| Any (primary) | Two of three | None | ||||
|---|---|---|---|---|---|---|
| Method | TPR q,1% | TPR | TPR q,1% | TPR | TPR q,1% | TPR |
| PDQ | 0.495 | 0.495 | 0.476 | 0.471 | 0.214 | 0.214 |
| PDQ (dihedral) | 0.549 | 0.546 | 0.523 | 0.523 | 0.223 | 0.223 |
| pHash-256 | 0.494 | 0.492 | 0.476 | 0.472 | 0.000 | 0.000 |
| ISCC Image-256 | 0.466 | 0.458 | 0.448 | 0.448 | 0.211 | 0.000 |
| DINOv2-S | 0.625 | 0.612 | 0.546 | 0.544 | 0.194 | 0.192 |
| Method | Retrieval threshold | TPR | FB | FB rate | |
|---|---|---|---|---|---|
| DINOv2-S | pair | – | 0.612 | 180 | 0.0067 |
| query 1% | 9 (matched) | 0.609 [0.60, 0.61] | 124 | 0.0046 | |
| query 1% | 12 ( ) | 0.604 [0.60, 0.61] | 104 | 0.0039 | |
| query 1% | 278 (zero cal.) | 0.206 [0.20, 0.22] | 0 | 0.0000 | |
| pair | 266 (matched) | 0.268 [0.25, 0.28] | 146 | 0.0054 | |
| pair | 12 ( ) | 0.793 [0.79, 0.80] | 4,390 | 0.1637 |
| Method | R@1 | AP | TPR q,1% | FPR q (test) | TPR | Music 10 s exc. | Speech 10 s exc. | Pitch +2 | Re-record |
|---|---|---|---|---|---|---|---|---|---|
| Chromaprint | 0.805 | 0.817 | 0.704 [0.68, 0.72] | 0.016 [0.00, 0.04] | 0.688 [0.66, 0.71] | 1.000 | 1.000 | 0.006 | 0.451 |
| audfprint | 0.851 | 0.851 | 0.660 [0.53, 0.74] | 0.008 [0.00, 0.03] | 0.599 [0.46, 0.72] | 0.982 | 1.000 | 0.071 | 0.852 |
| ISCC Audio-64 | 0.662 | 0.581 | 0.409 [0.21, 0.41] | 0.017 [0.00, 0.03] | 0.212 [0.00, 0.41] | 0.247 | 0.657 | 0.004 | 0.183 |
| ISCC Audio-256 | 0.749 | 0.658 | 0.454 [0.31, 0.51] | 0.019 [0.00, 0.04] | 0.321 [0.24, 0.47] | 0.555 | 0.882 | 0.006 | 0.342 |
| CLAP | 0.707 | 0.446 | 0.386 [0.33, 0.45] | 0.017 [0.01, 0.04] | 0.328 [0.27, 0.41] | 0.957 | 0.725 | 0.910 | 0.228 |
| NMFP † | 0.905 | 0.937 | 0.862 [0.82, 0.88] | 0.018 [0.00, 0.04] | 0.846 [0.79, 0.88] | 1.000 | 1.000 | 0.057 | 1.000 |
| Method | R@1 | AP | TPR q,1% | FPR q (test) | TPR | Crop 50% | PiP | Inserted | Screen rec. |
|---|---|---|---|---|---|---|---|---|---|
| vPDQ | 0.628 | 0.617 | 0.577 [0.56, 0.59] | 0.032 [0.00, 0.08] | 0.609 [0.57, 0.62] | 0.000 | 0.000 | 0.342 | 0.000 |
| TMK+PDQF | 0.778 | 0.723 | 0.631 [0.61, 0.66] | 0.066 [0.00, 0.16] | 0.635 [0.63, 0.70] | 0.017 | 0.000 | 0.583 | 0.992 |
| ISCC Video-64 | 0.731 | 0.700 | 0.620 [0.61, 0.65] | 0.062 [0.00, 0.16] | 0.634 [0.62, 0.66] | 0.025 | 0.000 | 0.333 | 0.817 |
| ISCC Video-256 | 0.801 | 0.749 | 0.652 [0.63, 0.67] | 0.068 [0.00, 0.17] | 0.664 [0.66, 0.69] | 0.108 | 0.008 | 0.575 | 0.958 |
| DINOv2-S frames | 0.872 | 0.691 | 0.437 [0.41, 0.58] | 0.062 [0.01, 0.15] | 0.523 [0.45, 0.63] | 0.592 | 0.125 | 0.525 | 0.817 |
| DINOv2-S mean | 0.947 | 0.831 | 0.547 [0.51, 0.73] | 0.032 [0.00, 0.16] | 0.653 [0.56, 0.77] | 0.917 | 0.200 | 0.958 | 0.950 |
| SIFT + RANSAC | DISK + LightGlue | |||||
|---|---|---|---|---|---|---|
| Map | AUC | F1 | best F1 | AUC | F1 | best F1 |
| Pixel difference | 0.944 | 0.75 | 0.83 | 0.942 | 0.72 | 0.82 |
| SSIM | 0.927 | 0.57 | 0.74 | 0.924 | 0.59 | 0.71 |
| LPIPS | 0.975 | 0.64 | 0.79 | 0.973 | 0.61 | 0.78 |
| DINOv2 patches | 0.958 | 0.53 | 0.70 | 0.952 | 0.52 | 0.69 |
| PDQ tiles | 0.866 | 0.04 | 0.50 | 0.866 | 0.02 | 0.49 |
| Watermark | Fingerprint | WM | FP | Both | Either | Drift |
|---|---|---|---|---|---|---|
| TrustMark-Q | DINOv2-S | 0.62 | 0.61 | 0.55 | 0.69 | 0.06 |
| DINOv2-S LSH-256 | 0.62 | 0.51 | 0.47 | 0.66 | 0.21 | |
| ISC21 1st † | 0.62 | 0.76 | 0.60 | 0.78 | 0.09 | |
| ISCC Image-64 | 0.62 | 0.47 | 0.43 | 0.66 | 0.62 | |
| PDQ | 0.62 | 0.49 | 0.47 | 0.64 | 0.00 | |
| SSCD R50 † | 0.62 | 0.68 | 0.58 | 0.72 | 0.18 |
Appendix figures & tables2 assets
Supplementary material from the paper’s appendix.
Appendix
| Modality | Configuration | Metric 1 | Metric 2 | Metric 3 | |
|---|---|---|---|---|---|
| Image | PixelSeal (0.1) | 85 | 51.6 [51.1, 52.1] | 0.0006 [0.0005, 0.0007] | 0.0158 [0.0146, 0.0171] ( =60) |
| Image | Video Seal (0.1) | 85 | 50.5 [50.1, 51.0] | 0.0006 [0.0006, 0.0007] | 0.0184 [0.0170, 0.0199] ( =60) |
| Image | PixelSeal (0.125) | 85 | 49.8 [49.3, 50.2] | 0.0009 [0.0008, 0.0010] | 0.0200 [0.0186, 0.0214] ( =60) |
| Image | InvisMark | 85 | 50.1 [49.6, 50.6] | 0.0017 [0.0015, 0.0019] | 0.0219 [0.0202, 0.0237] ( =60) |
| Image | PixelSeal (0.15) | 85 | 48.3 [47.8, 48.7] | 0.0012 [0.0011, 0.0014] | 0.0238 [0.0223, 0.0253] ( =60) |
| Image | TrustMark-P (0.8) | 85 | 50.5 [50.3, 50.8] | 0.0017 [0.0014, 0.0020] | 0.0220 [0.0215, 0.0226] ( =60) |
| Mod. | Method | R@1 | TPR q,1% | FPR q,1% (test) | TPR | (sources) | (sources) |
|---|---|---|---|---|---|---|---|
| image | PDQ | 0.579 [0.58, 0.58] | 0.495 [0.49, 0.50] | 0.010 [0.01, 0.02] | 0.495 [0.48, 0.50] | 72,000 (2,000) | 26,820 (745) |
| image | PDQ (dihedral) | 0.623 [0.62, 0.63] | 0.549 [0.54, 0.55] | 0.011 [0.00, 0.02] | 0.546 [0.54, 0.55] | 72,000 (2,000) | 26,820 (745) |
| image | aHash | 0.503 [0.50, 0.51] | 0.000 [0.00, 0.00] | 0.000 [0.00, 0.00] | 0.000 [0.00, 0.00] | 72,000 (2,000) | 26,820 (745) |
| image | dHash | 0.560 [0.56, 0.56] | 0.313 [0.00, 0.32] | 0.011 [0.00, 0.01] | 0.000 [0.00, 0.00] | 72,000 (2,000) | 26,820 (745) |
| image | pHash | 0.563 [0.56, 0.57] | 0.373 [0.37, 0.38] | 0.003 [0.00, 0.01] | 0.373 [0.00, 0.38] | 72,000 (2,000) | 26,820 (745) |
| image | pHash-256 | 0.589 [0.59, 0.59] | 0.494 [0.49, 0.50] | 0.013 [0.01, 0.02] | 0.492 [0.48, 0.50] | 72,000 (2,000) | 26,820 (745) |