網絡工作者圖像處理基礎知識
Web Worker 係一個獨立嘅 JavaScript 執行上下文,可以執行昂貴嘅計算,而唔使令編輯器嘅主線程做所有工作。對於瀏覽器圖像處理嚟講,即係話模型設定同推斷可以離開負責掣、進度訊息、筆刷輸入同螢幕更新嘅索引。
結果唔係「免費嘅背景處理」。同一部裝置仍然會執行計算同埋使用記憶體。架構上嘅好處係分離:重型模型操作喺運行嗰陣唔太可能阻止每個介面响應。
主線程有個用戶介面工作
瀏覽器頁面通常會喺主索引上面執行 JavaScript 。 That thread also coordinates layout, painting, and input.如果一個長嘅計算占用咗佢,點擊可能會延遲,動畫可能會停止,而瀏覽器可能會警告頁面冇反應。
喺推斷開始之前,圖片編輯器已經有好多主線程嘅責任:
- 接收檔案選擇、貼上或放置;
- 解碼同顯示圖像;
- 更新進度同錯誤狀態;
- 畫預覽畫布;
- 處理新增同擦除筆刷動作;
- 準備下載或者剪貼簿動作。
將分割模型嘅數值工作放喺同一個線程上面,會令到呢啲任務直接競爭。工人會創造出更清晰嘅界線。
以訊息為基礎嘅界線
The editor and worker do not share ordinary variables.佢哋透過發送訊息嚟溝通。簡化咗嘅流程係噉樣嘅:
- 編輯器會建立或者重用一個工作者。
- 佢要求工作者初始化推斷跑時間同模型。
- 佢會準備圖像數據同埋發送推斷請求。
- 工人將數據轉換成模型嘅預期輸入。
- 工人執行模型並產生掩模值。
- 佢會將個掩模或者結果數據發送返去。
- 編輯器會合成預覽,並啟用細化或匯出。
訊息應該包含足夠嘅上下文,以便將回應同正確嘅要求相匹配。如果用戶喺上一個工作完成之前揀咗另一張圖片,呢個就重要。介面必須避免喺新來源上面顯示舊結果。
複製同轉移圖像資料
發個細短訊好平。如果瀏覽器要複製成個緩衝區,傳送幾百萬個像素值可能會好貴。 Web API 可以轉移某啲二進制緩衝區嘅擁有權。轉移嘅緩衝區可以畀接收者使用,而唔需要喺寄件者端保留可用嘅重複檔案。
呢個優化有一個設計限制:喺轉移之後,寄件者唔可以繼續使用同一個緩衝區,就好似佢仍然擁有數據噉。編輯器可以保留獨立嘅顯示表示,建立專用嘅推斷緩衝區,或者重建佢之後需要嘅嘢。
唔係每個實現都會喺完全相同嘅地方使用轉移。一般教訓係,索引分離唔會令數據移動消失。圖片尺寸、緩衝區大小同埋轉換次數仍然會影響延遲同記憶體。
Easy Background Remover 放入工人嘅嘢
Easy Background Remover 使用帶有瀏覽器推斷跑時間嘅 Web Worker 嚟進行裝置上嘅劃分。重型自動剪裁步驟會產生一個面具。然後編輯器會顯示合成結果,並且支援 CPU 畫布筆刷細化。
呢個分離畀失敗有一個更有用嘅界線。如果工作者喺推斷過程中初始化唔到或者崩潰,介面可以報告同工作者相關嘅錯誤,而唔係依賴永久凍結嘅標籤作為唯一嘅訊號。
佢亦都令到本地處理嘅聲明保持易於理解。將像素由擴充頁面傳送去佢自己嘅工作人員係瀏覽器環境入面嘅通訊,而唔係上載去遠端剪輯 API 。 The first session may separately download the reusable model asset;請參閱[點解第一次執行會下載模型]( _ _ MDLINK0 _ _ )。
工人唔會令計算即時
工人提升响應能力,而唔係原始裝置能力。呢個模型仍然會根據瀏覽器可以提供嘅嘢嚟消耗 CPU 、 GPU 或者其他跑時間資源。大輸入仍然可以比細輸入需要更長時間同埋需要更多記憶體。
仲有幾個限制:
- 模型初始化有實際成本;
- 如果複製,像素緩衝區會佔用兩邊嘅記憶體;
- 調整大細同格式轉換需要時間;
- 低記憶體裝置可能會喺大圖像上面遇到困難;
- 多啲工人可以增加爭執而唔係減少爭執;
- 匯出同畫布更新仍然可以涉及主線程。
為五張圖像啟動五個推斷工作者唔會自動快五倍。啲工人共用同一部機。並行作業可以競爭記憶體帶寬同執行資源,而每個模型實例可能會承擔自己嘅記憶體成本。
進度報告係合作嘅
工人可以發送狀態訊息,但係佢唔會自動知道幾多進度百分比會覺得準確。模型下載、跑時初始化、輸入準備、推斷、掩碼轉換同預覽渲染係唔同嘅階段,時間唔同。
有啲階段有可量度嘅字节數量。單一模型執行可能只會暴露「開始」同「完成」。所以,一個均勻噉進行嘅平滑百分比可以係整容而唔係精確嘅測量。
有用嘅進度用戶介面會喺可能嘅情況下命名階段:準備模型、處理圖像或者建立結果。佢亦都會處理失敗同取消,而唔係留低一個冇解釋嘅旋轉器。
取消唔單止係隱藏個旋轉器
如果用戶閂咗張圖片或者重新開始,個介面就可以忽略過時嘅請求嘅最終回應。立即停止底層計算可能需要執行時嘅額外支援,或者終止同重新創建工作人員。
終止一個工作者係決定性嘅,但係佢會棄置佢嘅初始化狀態。下一份工作可能需要再次載入同初始化模型。對於短時間嘅操作,標記結果已經過時可以比起拆晒所有嘢更平。
正確嘅選擇取決於記憶體壓力、操作持續時間同埋執行時間能力。從用戶嘅角度睇,重要嘅規則係,過時嘅工作唔可以覆寫當前嘅編輯。
錯誤亦都需要越過界線
工作者入面嘅例外唔會變成正常嘅主索引例外。工作人員必須報告可用嘅錯誤,而編輯器應該聆聽工作人員級別嘅故障。
好嘅錯誤處理至少可以分辨出:
- 模型資產唔可用;
- 模型初始化失敗;
- 圖像解碼或輸入準備失敗;
- 推斷失敗;
- 工人估唔到停咗;
- 結果唔再屬於當前嘅要求。
呢個比起一般嘅「有啲嘢出錯」更加可行,尤其係當首次執行設定同正常嘅圖像處理有唔同嘅補救方法嗰陣。
工人輸出仍然只係第一個面具
索引架構本身唔會改善一個曖昧嘅邊緣。工人可以退回一個技術上有效嘅口罩,但係仍然缺少毛皮、透明材料、窄帶或者所需嘅陰影。呢啲係劃分同意圖問題。
編輯嘅工作會喺推斷之後恢復:將蒙版縮放到工作座標系統,合成預覽,畀用戶細化佢,然後匯出當前狀態。 【遮罩解像度 vs 預覽大小】( _ _ MDLINK1 _ _ )解釋咗點解嗰啲座標系唔應該混淆。
一個簡潔嘅心理模型
將個工人當係訊息窗口後面嘅本地專家:
- 編輯擁有互動;
- 工人擁有重嘅推斷任務;
- 二進制圖像數據越過一個定義好嘅邊界;
- 工人返咗個面具,而唔係關於每個邊緣嘅完成判斷;
- 編輯仍然負責當前狀態、審查、改良同埋匯出。
對於模型對像素本身嘅睇法,繼續用[裝置上嘅剪裁模型睇到啲咩]( __ MDLINK2 __ )。有關端對端嘅實用概覽,請參閱[本地背景移除嘅運作方式]( __ MDLINK3 _ _ )。