Dasar pemrosesan gambar dengan web worker
Web worker menjalankan pekerjaan berat di luar thread UI. Dalam pemrosesan gambar, ini berarti potongan bisa berjalan sementara UI tetap responsif, dalam batas memori dan CPU perangkat.
Itu tidak mengubah ke mana piksel pergi — mengubah bagaimana browser mengatur pekerjaan lokal.
Thread utama memiliki tugas antarmuka pengguna
Halaman browser biasanya menjalankan JavaScript di thread utama. Thread itu juga mengoordinasikan tata letak, pengecatan, dan masukan. Jika dilakukan perhitungan yang panjang, klik mungkin terasa tertunda, animasi dapat berhenti, dan browser mungkin memperingatkan bahwa halaman tidak responsif.
Editor gambar memiliki banyak tanggung jawab thread utama sebelum inferensi dimulai:
- menerima pilihan file, tempel, atau jatuhkan;
- memecahkan kode dan menampilkan gambar;
- memperbarui kemajuan dan status kesalahan;
- menggambar kanvas pratinjau;
- menangani gerakan kuas Tambah dan Hapus;
- menyiapkan tindakan pengunduhan atau papan klip.
Menempatkan pekerjaan numerik model segmentasi pada thread yang sama akan membuat tugas-tugas tersebut bersaing secara langsung. Seorang pekerja menciptakan batasan yang lebih jelas.
Batasan berbasis pesan
Editor dan pekerja tidak berbagi variabel biasa. Mereka berkomunikasi dengan mengirimkan pesan. Alur yang disederhanakan terlihat seperti ini:
- Editor membuat atau menggunakan kembali pekerja.
- Ia meminta pekerja untuk menginisialisasi runtime dan model inferensi.
- Ia menyiapkan data gambar dan mengirimkan permintaan inferensi.
- Pekerja mengubah data menjadi masukan yang diharapkan model.
- Pekerja menjalankan model dan menghasilkan nilai mask.
- Ia mengirimkan kembali data mask atau hasil.
- Editor menggabungkan pratinjau dan mengaktifkan penyempurnaan atau ekspor.
Pesan harus menyertakan konteks yang cukup agar sesuai dengan respons terhadap permintaan yang benar. Hal ini penting jika pengguna memilih gambar lain sebelum pekerjaan sebelumnya selesai. Antarmuka harus menghindari menampilkan hasil lama pada sumber baru.
Menyalin dan mentransfer data gambar
Mengirim pesan teks kecil itu murah. Mengirim jutaan nilai piksel bisa jadi mahal jika browser harus menyalin seluruh buffer. API Web dapat mentransfer kepemilikan buffer biner tertentu. Buffer yang ditransfer menjadi tersedia bagi penerima tanpa menyimpan duplikat yang dapat digunakan di sisi pengirim.
Pengoptimalan tersebut disertai dengan batasan desain: setelah transfer, pengirim tidak dapat terus menggunakan buffer yang sama seolah-olah pengirim masih memiliki datanya. Editor dapat mempertahankan representasi tampilan terpisah, membuat buffer inferensi khusus, atau merekonstruksi apa yang diperlukan nanti.
Tidak semua implementasi menggunakan transfer di tempat yang persis sama. Pelajaran umumnya adalah pemisahan thread tidak membuat pergerakan data hilang. Dimensi gambar, ukuran buffer, dan jumlah konversi masih mempengaruhi latensi dan memori.
Apa yang Easy Background Remover masukkan ke dalam pekerja
Easy Background Remover menggunakan Web Worker dengan runtime inferensi browser untuk segmentasi pada perangkat. Langkah pemotongan otomatis yang berat menghasilkan masker. Editor kemudian menampilkan hasil gabungan dan mendukung penyempurnaan kuas kanvas CPU.
Pemisahan ini memberikan batasan yang lebih berguna bagi kegagalan. Jika pekerja tidak dapat melakukan inisialisasi atau mengalami crash selama inferensi, antarmuka dapat melaporkan kesalahan terkait pekerja alih-alih mengandalkan tab yang dibekukan secara permanen sebagai satu-satunya sinyal.
Hal ini juga membuat klaim pemrosesan lokal dapat dimengerti. Mengirim piksel dari laman ekstensi ke pekerjanya sendiri adalah komunikasi dalam lingkungan browser, bukan pengunggahan ke API pemotongan jarak jauh. Sesi pertama dapat mengunduh aset model yang dapat digunakan kembali secara terpisah; lihat Mengapa pertama kali menjalankan pengunduhan model.
Seorang pekerja tidak melakukan komputasi secara instan
Pekerja meningkatkan daya tanggap, bukan kemampuan perangkat mentah. Model tersebut masih menggunakan CPU, GPU, atau sumber daya runtime lainnya sesuai dengan apa yang dapat disediakan oleh browser. Input yang besar masih dapat memakan waktu lebih lama dan memerlukan lebih banyak memori dibandingkan input yang kecil.
Masih ada beberapa batasan:
- inisialisasi model memiliki biaya nyata;
- buffer piksel menempati memori di kedua sisi jika disalin;
- mengubah ukuran dan memformat konversi membutuhkan waktu;
- perangkat dengan memori rendah mungkin kesulitan dengan gambar besar;
- semakin banyak pekerja yang dapat meningkatkan perselisihan dibandingkan menguranginya;
- pembaruan ekspor dan kanvas masih dapat melibatkan thread utama.
Memulai lima pekerja inferensi untuk lima gambar tidak secara otomatis lima kali lebih cepat. Para pekerja berbagi mesin yang sama. Pekerjaan paralel dapat bersaing untuk mendapatkan bandwidth memori dan sumber daya eksekusi, sementara setiap contoh model mungkin memerlukan biaya memorinya sendiri.
Pelaporan kemajuan bersifat kooperatif
Seorang pekerja dapat mengirim pesan status, tetapi tidak secara otomatis mengetahui persentase kemajuan yang dirasa akurat. Pengunduhan model, inisialisasi runtime, persiapan input, inferensi, konversi mask, dan rendering pratinjau merupakan fase terpisah dengan waktu berbeda.
Beberapa fase memiliki jumlah byte yang dapat diukur. Eksekusi model tunggal hanya dapat menampilkan “mulai” dan “selesai”. Oleh karena itu, persentase halus yang meningkat secara seragam dapat bersifat kosmetik dan bukan pengukuran yang tepat.
Kemajuan yang berguna UI memberi nama fase jika memungkinkan: menyiapkan model, memproses gambar, atau membuat hasil. Ini juga menangani kegagalan dan pembatalan alih-alih meninggalkan pemintal tanpa penjelasan.
Pembatalan lebih dari sekadar menyembunyikan pemintal
Jika pengguna menutup gambar atau memulai kembali, antarmuka dapat mengabaikan respons akhir dari permintaan yang sudah ketinggalan zaman. Menghentikan komputasi yang mendasarinya dengan segera mungkin memerlukan dukungan tambahan dari runtime atau menghentikan dan membuat ulang pekerja.
Menghentikan seorang pekerja adalah hal yang menentukan, namun hal ini membuang status inisialisasinya. Pekerjaan selanjutnya mungkin perlu memuat dan menginisialisasi model lagi. Untuk operasi singkat, menandai hasil basi bisa lebih murah daripada menghancurkan semuanya.
Pilihan yang tepat bergantung pada tekanan memori, durasi operasi, dan kemampuan runtime. Dari sudut pandang pengguna, aturan pentingnya adalah pekerjaan yang sudah basi tidak boleh menimpa hasil edit saat ini.
Kesalahan juga harus melewati batas
Pengecualian di dalam pekerja tidak menjadi pengecualian thread utama normal. Pekerja harus melaporkan kesalahan yang dapat digunakan, dan editor harus mendengarkan kegagalan tingkat pekerja.
Penanganan error yang baik setidaknya membedakan:
- aset model tidak tersedia;
- inisialisasi model gagal;
- dekode gambar atau persiapan masukan gagal;
- inferensi gagal;
- pekerja berhenti tiba-tiba;
- hasilnya tidak lagi menjadi milik permintaan saat ini.
Hal ini lebih dapat ditindaklanjuti daripada “ada yang tidak beres” yang umum, terutama ketika pengaturan yang dijalankan pertama kali dan pemrosesan gambar normal memiliki solusi yang berbeda.
Keluaran pekerja masih berupa topeng pertama
Arsitektur thread tidak dengan sendirinya meningkatkan keunggulan ambigu. Pekerja dapat mengembalikan masker yang secara teknis valid namun masih tidak memiliki bulu, bahan transparan, tali pengikat sempit, atau bayangan yang diinginkan. Itu adalah pertanyaan segmentasi dan niat.
Pekerjaan editor dilanjutkan setelah inferensi: menskalakan topeng ke dalam sistem koordinat kerja, menggabungkan pratinjau, membiarkan pengguna menyempurnakannya, dan mengekspor keadaan saat ini. Resolusi topeng vs ukuran pratinjau menjelaskan mengapa sistem koordinat tersebut tidak perlu bingung.
Model mental yang ringkas
Bayangkan pekerja tersebut sebagai spesialis lokal di balik jendela pesan:
- editor memiliki interaksi;
- pekerja memiliki tugas inferensi yang berat;
- data gambar biner melintasi batas yang ditentukan;
- pekerja mengembalikan topeng, bukan penilaian akhir tentang setiap sisi;
- editor tetap bertanggung jawab atas keadaan saat ini, peninjauan, penyempurnaan, dan ekspor.
Untuk tampilan piksel itu sendiri oleh model, lanjutkan dengan Apa yang dilihat model potongan di perangkat. Untuk gambaran praktis menyeluruh, lihat Cara kerja penghapusan latar belakang lokal.