Blur Studio - fotojockovic.com/blur =================================== Blurs faces and licence plates in photos and videos, or blurs the background of a photo like a real lens (depth-aware bokeh, tilt-shift, colour splash). Everything runs in the browser; no photo or video leaves the device. Our own work, written for this tool (MIT licence): - render.js: WebGL2 lens renderer. Background separated from the subject with a weighted pull-push pyramid (clean plate of colour and depth behind the subject), linear-light HDR with expanded highlights, a scatter-as-gather disc kernel (golden-angle spiral) per pyramid level with depth ordering, round / 6-blade / heart / star apertures, focus from depth (circle of confusion linear in inverse depth), tilt-shift band, colour splash, colour decontamination of semi-transparent edges, tiled drawing for large outputs. - ml/gf.js: colour guided filter and fast guided-filter coefficients (matte and depth refined on the full-resolution photo). - ml/faces.js: multi-scale YuNet face finding (each scale keeps only the face sizes it is reliable at; overlap + containment suppression), a head fallback from hair + face-skin regions, licence-plate finding as a size pyramid (640 / 1024 / 1600 / 2048 px) whose large passes run as overlapping 1024 px tiles. - ml/mlcore.js, ml/fworker.js, ml/bworker.js: model loading with the Cache API and byte progress, WebGPU / WebAssembly selection and fallback, input preparation, depth normalisation. - track.js: video face tracks (greedy matching with a constant-velocity guess, smoothing, gap bridging, interpolation). facefx.js: blur / pixelate / eye bar / emoji / cover effects on a 2D canvas. - vworker.js: video scan and re-encode on top of Mediabunny; app.js, index.html, i18n.js, the texts and the translations (lang/*.js). - zip.js: streaming ZIP writer, copied from our FotoJock tool (MIT). - Model conversions done by us: IS-Net made resolution-independent and its convolution weights stored as int8 (one scale per output channel, DequantizeLinear in the graph); the open-lpr plate detector stored the same way (opset 13; same detections as the original on our test set). Checked against the originals with onnxruntime (IS-Net: 0.01-0.2 % of mask pixels differ). Machine-learning models (downloaded only when needed, kept in the browser's Cache Storage): 1. YuNet face detector (model/yunet.onnx, 0.23 MB), Shiqi Yu et al., "YuNet: A Tiny Millisecond-level Face Detector", Machine Intelligence Research 2023. OpenCV Zoo, face_detection_yunet_2026may.onnx. MIT License, Copyright (c) 2020 Shiqi Yu. Licence: model/LICENSE-YuNet.txt https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet Note: like almost every face detector, it was trained on the WIDER FACE dataset, whose images are distributed for research; the trained weights are released under MIT. 2. Licence-plate detector: YOLOX-tiny trained by the open-lpr project (plate_yolox_tiny_640.onnx, 20.2 MB; here model/plates-yolox-q8.onnx, 5.2 MB, int8 weights by us). Apache License 2.0 for code and weights (model card: "YOLOX code and its same-repository release weights are both Apache-2.0"; Ultralytics not used). YOLOX architecture: Megvii-BaseDetection/YOLOX, Apache-2.0. Licence + upstream NOTICE: model/LICENSE-open-lpr-YOLOX.txt. https://huggingface.co/faisalthaheem/open-lpr-models Training data (per its NOTICE): an annotated plate corpus (github.com/faisalthaheem/open-lpr-dataset-plate- detection, Apache-2.0) plus unpublished community photos labelled by a Qwen3-VL teacher model. Downloaded only when "Blur licence plates" is on. On our test set of 70 Wikimedia Commons photos (115 plates, Serbian, EU, UK, US and others): 90 % of plates found at the default setting. Earlier versions used LPD-YuNet (OpenCV Zoo, Apache-2.0), which found about half of the European plates. 3. MediaPipe Selfie Multiclass Segmentation 256x256 (Google) - Apache License 2.0 (model card: "Licensed under Apache License, Version 2.0"). Converted by us from the TFLite file to ONNX (tf2onnx) with int8 weights: model/selfie-mc-q8.onnx (4.4 MB), licence: model/LICENSE-MediaPipe-Selfie-Multiclass.txt. Used only for its hair and face-skin classes, to find heads that the face finder cannot see as a face (extreme close-ups, profiles cut by the frame). https://ai.google.dev/edge/mediapipe/solutions/vision/image_segmenter 4. Depth Anything V2 Small (Lihe Yang, Bingyi Kang, Zilong Huang, Zhen Zhao, Xiaogang Xu, Jiashi Feng, Hengshuang Zhao; 2024). Apache License 2.0 - only the Small model is Apache-2.0 (Base/Large are CC-BY-NC-4.0 and are NOT used). ONNX exports by onnx-community (Hugging Face), unmodified: model/depth-anything-v2-small-q4f16.onnx (19.1 MB, WebGPU), model/depth-anything-v2-small-int8.onnx (27.3 MB, WebAssembly). Licence: model/LICENSE-Depth-Anything-V2-Small.txt https://huggingface.co/depth-anything/Depth-Anything-V2-Small-hf, https://huggingface.co/onnx-community/depth-anything-v2-small 5. Subject cut-out: the site's shared module /static/tools/segment/ (see its CREDITS.txt and README.md); the models are downloaded once per device and shared with the other fotojockovic.com tools: - BiRefNet (Peng Zheng, Dehong Gao, Deng-Ping Fan, Li Liu, Jorma Laaksonen, Wanli Ouyang, Nicu Sebe: "Bilateral Reference for High-Resolution Dichotomous Image Segmentation", CAAI AIR 2024). MIT License, Copyright (c) 2024 ZhengPeng. Licence: model/LICENSE-BiRefNet.txt. BiRefNet general (Swin-L, 270 MB) and BiRefNet lite (Swin-T, 70 MB, fallback), official ONNX exports with int8 weights by us (fp32 compute), on WebGPU. https://github.com/ZhengPeng7/BiRefNet - IS-Net "isnet-general-use" (Xuebin Qin, Hang Dai, Xiaobin Hu, Deng-Ping Fan, Ling Shao, Luc Van Gool: "Highly Accurate Dichotomous Image Segmentation", ECCV 2022). Apache License 2.0. Licence: model/LICENSE-IS-Net.txt. From the ONNX file distributed with rembg (MIT), int8 weights. Used without WebGPU. https://github.com/xuebinqin/DIS Not used: Ultralytics YOLO (AGPL-3.0), YOLOv9 plate models trained with the GPL-3.0 YOLOv9 code (open-image-models), DEIMv2 (non-commercial), InsightFace/SCRFD and RetinaFace weights from InsightFace (non-commercial), RMBG-1.4/2.0 (non-commercial), Robust Video Matting (GPL-3.0). Libraries: - ONNX Runtime Web 1.30.0 (npm onnxruntime-web), Microsoft - MIT License. https://github.com/microsoft/onnxruntime ort/ort.wasm.min.js + ort/ort-wasm-glue.js + ort/ort-wasm.wasm (WebAssembly build), ort/ort.webgpu.min.js + ort/ort-wasm-glue-asyncify.js + ort/ort-wasm-asyncify.wasm (WebGPU build). The *.mjs runtime scripts were renamed to .js and the .wasm files renamed; contents unchanged (source-map comments removed). Licence: ort/LICENSE.txt; notices of the components compiled into it: ort/ThirdPartyNotices.txt - Mediabunny 1.61.6 (Vanilagy and contributors) - Mozilla Public License 2.0, unmodified minified bundle: vendor/mediabunny/mediabunny.min.js. Licence: vendor/mediabunny/LICENSE. Source: https://github.com/Vanilagy/mediabunny - Shared helpers /static/tools/common/i18n.js, rail.js and sheets.js: our own (fotojockovic.com tools). Published methods the code builds on (ideas only; no code was copied): - K. He, J. Sun, X. Tang, "Guided Image Filtering", 2010/2013; K. He, J. Sun, "Fast Guided Filter", 2015. - D. Gustafsson, "Bokeh depth of field in a single pass", 2018 (scatter-as-gather spiral). - S. J. Gortler et al., "The Lumigraph", 1996 (pull-push hole filling). - H. Vogel, "A better way to construct the sunflower head", 1979 (golden-angle sampling). Sample images (demo/): - demo/faces.jpg, faces_a/b/c.jpg: "Street Crowd" by Yann Kemper, Wikimedia Commons, CC0 1.0. Faces blurred and covered with this tool. https://commons.wikimedia.org/wiki/File:Street_Crowd.jpg - demo/bokeh.jpg, bokeh_a/b.jpg: "Close portrait of a young woman wearing black sunglasses in Maracaibo, Venezuela" by Wilfredor, Wikimedia Commons, CC0 1.0. Resized; background blurred with this tool; the depth and subject maps (bokeh_depth.png, bokeh_matte.png) were computed with Depth Anything V2 Small and BiRefNet. https://commons.wikimedia.org/wiki/File:Close_portrait_of_a_young_woman_wearing_black_sunglasses_in_Maracaibo,_Venezuela.jpg - og.jpg: made from the same pictures with this tool. Fonts from Google Fonts (self-hosted), SIL Open Font License 1.1: Inter Tight, Instrument Serif. Emoji are drawn with the device's own emoji font. Self-hosted web fonts (2026-10-19): Inter Tight, Instrument Serif. SIL Open Font License 1.1. The woff2 files are the ones Google Fonts serves (latin, latin-ext, cyrillic, greek subsets where the family has them), stored on our own server under /static/tools/common/fonts// with each family's licence text (OFL.txt) next to them; stylesheet /static/tools/common/fonts/ui.css. No font request goes to Google.