方法
本筆記本的一切都能單憑這個資料夾重現。本頁列出每一項量測、產生它的程序、以及它被判定的閾值,讓任何一項主張都能被重跑或被推翻。
- 1
盤點
每個檔案的尺寸、位元組大小、像素模式與 SHA-256,另加一個 64 位元的差分雜湊,用來為整組檔案的視覺相似度排序。
- 2
容器鑑識
逐一走訪每個 PNG chunk 並驗證其 CRC;逐一解析每個 JPEG marker 區段。chunk 與 marker 的順序即是寫檔者的指紋,而文字、ICC、EXIF、XMP、C2PA 區塊無論存在與否都會被記錄。
- 3
內容量測
各通道的平均與標準差、亮度直方圖的 Shannon 熵、以邊緣濾波變異數作為細節指標、飽和度、高光與陰影削頂、精確的相異色彩數,以及整幅畫面的自適應色盤壓縮。
- 4
譜系
每一組有序配對都以「在搜尋比例下把其中一張定位於另一張之內」的方式測試:先在縮小的金字塔上用 FFT 正規化互相關求解,再於原始解析度下裁出預測區域、量測真實殘差以驗證。方向刻意不以尺寸設限 — 因為衍生物往往正是其上游的放大版。
- 5
修圖差異
能逐像素對齊的配對直接相減。除了改動像素數之外,遮罩會以 32×32 分塊,用以區分「只動了一個物件」(改動堆積在少數區塊)與「重新編碼」(改動稀薄地散佈於各處)。
- 6
語意判讀
這是獨立的一道,而且是**另一種性質**的主張。每張影像單獨送給視覺模型 —— 沒有檔名、沒有譜系、沒有修圖結果,沒有任何前幾道量測查到的東西 —— 只問它描繪什麼、承襲什麼傳統、對誰說話。正因為判讀是盲的,它與量測層的吻合才算佐證而非回音。它是判斷不是量測,因此在筆記本中以自成一格的樣式呈現,兩者絕不混淆。
生效中的閾值
| 一個像素算「被改動」的門檻(RGB 通道最大差) | 12/255 |
| 譜系關係成立的最低 PSNR | 16.0dB |
| 譜系關係成立的最低細節相關係數 | 0.80 |
| 標記為「已確認」而非「可能」的相關係數 | 0.90 |
重現方式
於專案根目錄執行:
npm run analyze # rewrites content/analysis.json + public/img/* (~11 min) npm run semantic # rewrites content/semantic.json (needs FSYNC_AIG_RUN_TOKEN) npm run dev # read the result at localhost:3000
分析腳本為 scripts/analyze-source.py(僅依賴 Pillow 與 NumPy)。它讀取 source、簡報實際出貨的素材、以及旁邊的 assets/,本身不寫入這三者中的任何檔案。
這套方法無法告訴你的事
單靠對齊無法判定同一畫面兩次重新取樣的先後 — 兩個方向的擬合一樣好。方向是由細節能量(重新取樣永遠不會增加細節)與容器結構推論而來,兩者都陳列在該主張旁邊。
沒有內容憑證,並不能證明一張影像是否由機器生成。它只代表這個檔案對自己的來歷未作任何聲明。
JPEG 的品質數字是對 IJG 參考尺標的最近擬合。當擬合誤差偏大,代表編碼器使用了自訂量化表,該數字應理解為「相近的族群」而非某個實際設定值。
比對範圍僅涵蓋三個目錄:原始資料夾、簡報實際出貨的素材、以及旁邊的 assets/ 資料夾。若上游存在於這三者之外,本分析看不見它 — 這也是為什麼「沒有親屬」的檔案只被記為沒有親屬,而不是被斷定為原創。