小工具提案:截圖遮蔽加上自動臉部偵測
- Dominant language
- JavaScript
- Stars
- 47
- Forks
- 7
- Avg merge
- 2h 51m
- Merged PRs (30d)
- 288
Description
需求依據見 #512。六組角色調查裡有三組把「發布前遮掉不相關的人」列在前面。
## 結論先寫:整合進既有的截圖遮蔽,不另開一頁
`redact.js` 目前 687 行,難的部分都已經做完而且有測試守著:
- `normalizeBox` 方框正規化
- `verifyBoxes` 逐像素確認每個被碰到的像素都是純黑
- `exportImage` 重新編碼,原檔 metadata 與檔名都不帶過去
- `bindPointer` 手動拉框
自動偵測要做的只是「產生候選方框」,丟進同一個 `boxes` 陣列,後面的驗證與輸出完全不動,`tools/test_redact.mjs` 現有的保證原封不動繼續成立。另開一頁等於把上面四件事複製一份,還讓讀者多一個「我該用哪一個」的選擇題。
更重要的是**自動偵測不能是唯一路徑**。它會漏掉側臉、遮住的臉、人多的場合,而且認得出臉的人不只靠臉,名牌、刺青、車牌、特徵明顯的衣服都算。整合的做法是自動偵測提出候選框,讀者看得到、改得動、加得上,那需要手動編輯就在旁邊。
## 缺口是跨平台
教「發布抗議現場照片但不暴露入鏡者」的標準工具長年是 ObscuraCam(WITNESS 與 Guardian Project),但它只有 Android 版,用 iPhone 的學員要另外找替代品。瀏覽器版天生跨平台,這是它存在的理由。
## 套件與尺寸實測
查了三條路,數字是實際抓 npm registry 與 CDN 得到的:
| 方案 | 需要載入的東西 | 授權 |
|---|---|---|
| **TensorFlow.js + BlazeFace** | `tf-core.min.js` 287 KB、`tf-backend-webgl.min.js` 390 KB、`blazeface.min.esm.js` 10 KB,加模型權重 | Apache-2.0 |
| MediaPipe Tasks Vision | 整包解開 35 MB,WASM runtime 是所有視覺任務共用一份 | Apache-2.0 |
| face-api.js | `face-api.min.js` 648 KB 加模型,專案已多年沒有新版本 | MIT |
**取 TensorFlow.js 加 BlazeFace**,程式碼合計約 690 KB。MediaPipe 的 35 MB 比站上全部離線內容(41.6 MB)還接近同一個量級,不考慮。參考數字:MediaPipe 那顆 `blaze_face_short_range.tflite` 模型本身只有 224 KB,重的是 runtime 不是模型。
三個套件都是 Apache-2.0,可以照站上慣例原封不動放進 `utils/vendor/`。
## 兩個要先解掉的問題
**WebGL。** Tor Browser 提高安全等級會限制 WebGL,`tf-backend-webgl` 那條路會斷。要不要一併帶 `tf-backend-cpu`(慢很多但不需要 WebGL)需要實測,這是動工前的第一件事。
**載入時機。** 模型與 runtime 走動態載入,沿用 `stripmeta.js` 載 pdf-lib 的寫法。只想手動拉框的讀者不該被迫下載這 690 KB。
## 待辦
- [ ] 實測:Tor Browser 各安全等級下 WebGL 可用性,決定要不要帶 CPU backend
- [ ] 實測:BlazeFace 模型權重的實際位元組數
- [ ] `redact.js` 加一顆「自動找出人臉」,產生候選框丟進既有的 `boxes`
- [ ] 候選框要跟手動框在視覺上分得出來,讀者要知道哪些是機器猜的
- [ ] 文案寫明偵測會漏,而且認人不只靠臉
- [ ] `tools/test_redact.mjs` 補:自動框一樣走 `verifyBoxes`,原始碼仍然沒有任何送出或留存資料的手段
- [ ] `offline_assets` 與預快取清單,`tools/check_precache.mjs` 會擋
Contributor guide
Assessment
This issue has not been assessed yet.