anoni-net / anoni-net/docs

小工具提案:截圖遮蔽加上自動臉部偵測

Abierto
#514 2 comentarios 0 reacciones 0 asignados Ver en GitHub
enhancement
Lenguaje dominante
JavaScript
Estrellas
47
Forks
7
Merge medio
2 h 51 min
PR fusionados (30 d)
288

Descripción

需求依據見 #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` 會擋

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.