Ubah ukuran jip video dengan cepat

Dalam aplikasi untuk bekerja dengan gambar, tugas mengubah ukuran jip (gambar dikompresi menggunakan algoritma JPEG) sangat umum. Dalam hal ini, Anda tidak dapat segera mengubah ukuran dan Anda harus terlebih dahulu memecahkan kode data asli. Tidak ada yang rumit dan baru dalam hal ini, tetapi jika Anda perlu melakukannya jutaan kali sehari, maka mengoptimalkan kinerja solusi semacam itu, yang seharusnya sangat cepat, adalah sangat penting.



Masalah ini sering dihadapi ketika mengatur hosting jarak jauh untuk repositori gambar, karena sebagian besar kamera dan ponsel merekam dalam format JPEG. Setiap hari, arsip foto dari layanan web terkemuka (jejaring sosial, forum, hosting foto dan banyak lainnya) diisi ulang dengan sejumlah besar gambar seperti itu, sehingga pertanyaan tentang bagaimana menyimpan gambar tersebut sangat penting. Untuk mengurangi ukuran lalu lintas keluar dan untuk meningkatkan waktu respons terhadap permintaan pengguna, banyak layanan web menyimpan lusinan file untuk satu gambar dalam resolusi berbeda. Kecepatan responsnya bagus, tetapi salinan ini memakan banyak ruang. Ini adalah masalah besar, meskipun ada kelemahan lain dari pendekatan ini.

Gagasan untuk menyelesaikan masalah ini bukan untuk menyimpan di server banyak pilihan untuk gambar asli dalam resolusi yang berbeda, tetapi untuk secara dinamis membuat gambar yang diinginkan dengan dimensi yang diberikan dari aslinya yang disiapkan sebelumnya, dan secepat mungkin. Dengan demikian, secara real time, Anda dapat membuat gambar dari resolusi yang diinginkan dan segera mengirimkannya kepada pengguna. Sangat penting bahwa resolusi gambar ini dapat segera dibuat sehingga perangkat pengguna tidak melakukan pengubahan ukuran layar, karena itu tidak akan diperlukan.

Menggunakan format selain JPEG sebagai dasar untuk mengatur repositori gambar seperti itu tampaknya tidak dibenarkan. Tentu saja, ada format standar, banyak digunakan yang memberikan kompresi lebih baik dengan kualitas yang sama (JPEG2000, WebP), tetapi kecepatan encoding dan decoding gambar tersebut sangat rendah dibandingkan dengan JPEG, sehingga masuk akal untuk memilih JPEG sebagai format dasar untuk menyimpan foto asli, yang, jika perlu, akan diskalakan secara real time setelah menerima permintaan dari pengguna.

Tentu saja, selain jip, setiap situs paling sering memiliki gambar PNG dan GIF, tetapi biasanya jumlahnya relatif kecil dan foto dalam format ini sangat jarang. Oleh karena itu, format ini tidak akan membuat dampak yang signifikan pada tugas yang dimaksud dalam kebanyakan kasus.

Deskripsi algoritma pengubahan ukuran dengan cepat


Jadi, data input adalah file JPEG, dan untuk mencapai decoding cepat (ini berlaku untuk CPU dan GPU), gambar yang dikompresi harus memiliki marker restart bawaan. Marker ini dijelaskan dalam standar JPEG dan bagian dari codec dapat bekerja dengannya, sisanya tahu cara untuk tidak melihatnya. Jika jip tidak memiliki spidol seperti itu, mereka dapat ditambahkan terlebih dahulu menggunakan utilitas jpegtran. Ketika marker ditambahkan, gambar tidak berubah, tetapi ukuran file menjadi sedikit lebih besar. Hasilnya, kami mendapatkan skema kerja berikut:

  1. Dapatkan data gambar dari memori CPU
  2. Jika ada profil warna, dapatkan dari bagian EXIF ​​dan simpan
  3. Salin gambar ke kartu video
  4. Dekode JPEG
  5. Kami melakukan pengubahan ukuran sesuai dengan algoritma Lanczos (berkurang)
  6. Ketajaman
  7. Kami menyandikan gambar menggunakan JPEG
  8. Salin gambar ke host
  9. Tambahkan profil warna asli ke file yang dihasilkan.

Anda dapat membuat keputusan yang lebih akurat ketika, sebelum mengubah ukuran, gamma terbalik ditumpangkan pada setiap komponen piksel sehingga ukurannya berada di ruang linear, dan kemudian menerapkan gamma lagi, tetapi setelah sharpe. Perbedaan sebenarnya untuk pengguna kecil, tetapi ada, dan biaya komputasi untuk modifikasi seperti itu minimal. Anda hanya perlu memasukkan superposisi gamma invers dan langsung ke dalam skema pemrosesan umum.

Ada juga solusi yang memungkinkan ketika decoding jip dilakukan pada CPU multi-core menggunakan libjpeg-turbo library. Dalam hal ini, setiap gambar diterjemahkan dalam aliran CPU yang terpisah, dan semua tindakan lain dilakukan pada kartu video. Dengan sejumlah besar core CPU, ini bisa terjadi lebih cepat, tetapi akan ada kerugian serius dalam latensi. Jika latensi saat mendekode jip pada satu inti CPU dapat diterima, maka opsi ini bisa sangat cepat, terutama untuk kasus ketika jip asli memiliki resolusi kecil. Ketika resolusi gambar asli meningkat, waktu decoding jip dalam satu aliran CPU akan meningkat, sehingga opsi ini hanya cocok untuk resolusi kecil.

Persyaratan dasar untuk tugas pengubahan ukuran web


  • Dianjurkan untuk tidak menyimpan lusinan salinan dari setiap gambar dalam resolusi yang berbeda di server, tetapi untuk dengan cepat membuat gambar yang diinginkan dengan resolusi yang benar segera setelah menerima permintaan. Ini penting untuk mengurangi ukuran penyimpanan, karena jika tidak, Anda harus menyimpan banyak salinan berbeda dari setiap gambar.
  • Masalahnya harus diselesaikan secepat mungkin. Ini adalah pertanyaan tentang kualitas layanan yang disediakan untuk mengurangi waktu respons terhadap permintaan pengguna.
  • Kualitas gambar yang dikirim harus tinggi.
  • Ukuran file untuk gambar yang dikirim harus sekecil mungkin, dan resolusinya harus sama persis dengan ukuran jendela di mana gambar itu muncul. Poin-poin berikut ini penting di sini:

a) Jika ukuran gambar tidak sesuai dengan ukuran jendela, maka perangkat pengguna (ponsel, tablet, laptop) akan melakukan pengubahan ukuran perangkat keras setelah decoding sebelum menampilkan gambar di layar. Dalam OpenGL, pengubahan ukuran perangkat keras ini dilakukan hanya berdasarkan algoritme bilinear, yang sering menyebabkan munculnya moire (noda) dan artefak lain dalam gambar yang berisi detail kecil.

b) Pengubahan ukuran layar juga menghabiskan energi perangkat.

c) Jika Anda menggunakan serangkaian gambar pra-skala untuk mengatasi masalah, itu tidak selalu mungkin untuk mendapatkan ukuran yang tepat, yang berarti bahwa Anda harus mengirim gambar dengan resolusi yang lebih tinggi. Ukuran gambar yang meningkat mengarah ke lebih banyak lalu lintas, yang juga ingin saya hindari.

Deskripsi skema kerja umum


  1. Kami menerima gambar dari pengguna dalam format apa pun dan dalam resolusi apa pun. Dokumen asli disimpan dalam database terpisah (jika perlu).
  2. Offline, menggunakan ImageMagick atau perangkat lunak sejenis, menyimpan profil warna, mengonversi gambar asli asli ke format BMP atau PPM standar, kemudian mengubah ukuran menjadi resolusi 1K atau 2K dan kompres ke JPEG, kemudian tambahkan penanda mulai ulang dengan interval tetap yang ditentukan menggunakan utilitas jpegtran.
  3. Kami menyusun basis data gambar 1K atau 2K tersebut.
  4. Setelah menerima permintaan dari pengguna, kami memperoleh informasi tentang gambar dan ukuran jendela tempat gambar ini akan ditampilkan.
  5. Kami menemukan gambar dalam database dan mengirimkannya ke pengubah ukuran.
  6. Pengubah menerima file gambar, menerjemahkan kode, mengubah ukuran, benda tajam, menyandikan dan memasukkan profil warna asli ke dalam jip yang dihasilkan. Setelah itu, gambar itu diberikan ke program eksternal.
  7. Di setiap kartu video, Anda dapat menjalankan banyak utas, dan Anda dapat memasang beberapa kartu video di komputer Anda - sehingga mencapai penskalaan kinerja.
  8. Semua ini dapat dilakukan berdasarkan kartu video NVIDIA Tesla (misalnya, P40 atau V100), karena kartu video NVIDIA GeForce tidak dirancang untuk operasi jangka panjang yang berkelanjutan, dan NVIDIA Quadro memiliki banyak output video yang tidak diperlukan dalam kasus ini. Untuk mengatasi masalah ini, persyaratan untuk ukuran memori GPU minimal.
  9. Selain itu, dari database dengan gambar yang disiapkan, Anda dapat secara dinamis mengalokasikan cache untuk file yang sering digunakan. Masuk akal untuk menyimpan gambar yang sering digunakan menurut statistik dari periode sebelumnya.



Parameter program


  1. Lebar dan tinggi gambar baru. Mereka dapat berupa apa saja dan lebih baik untuk mengaturnya secara eksplisit.
  2. Mode penipisan JPEG (subsampling). Ada tiga opsi: 4: 2: 0, 4: 2: 2 dan 4: 4: 4, tetapi mereka biasanya menggunakan 4: 4: 4 atau 4: 2: 0. Kualitas maksimum adalah 4: 4: 4, ukuran frame minimum adalah 4: 2: 0. Penjarangan dilakukan untuk komponen-komponen perbedaan warna, yang tidak dilihat oleh penglihatan seseorang seperti halnya pencahayaan. Setiap mode penipisan memiliki interval optimalnya sendiri untuk memulai kembali marker untuk mencapai kecepatan enkode atau decoding maksimum.
  3. Kualitas kompresi JPEG dan mode penipisan saat membuat basis data gambar.
  4. Tajam dilakukan dalam jendela 3x3, sigma (radius) dapat dikontrol.
  5. Kualitas kompresi JPEG dan mode penipisan ketika meng-encode gambar akhir. Biasanya, kualitas setidaknya 90% berarti bahwa kompresi ini "tanpa kehilangan visual", yaitu. pengguna yang tidak terlatih seharusnya tidak melihat artefak dari algoritma JPEG dalam kondisi tampilan standar. Diyakini bahwa untuk pengguna yang terlatih, 93-95% diperlukan. Semakin besar nilai ini, semakin besar ukuran frame yang dikirim ke pengguna, dan semakin lama waktu decoding dan encoding.

Keterbatasan penting


Mulai ulang spidol. Kami dapat dengan cepat mendekode gambar JPEG pada kartu video hanya jika ada tanda mulai ulang di dalamnya. Dalam standar JPEG resmi, penanda ini dijelaskan, ini adalah parameter standar. Jika tidak ada tanda mulai ulang, maka tidak mungkin untuk memparalelkan decoding gambar pada kartu video, yang akan mengarah pada kecepatan decoder yang sangat rendah. Oleh karena itu, kita memerlukan database gambar yang disiapkan di mana ada penanda ini.

Algoritma diperbaiki untuk codec gambar. Penguraian dan pengodean gambar menggunakan algoritma JPEG sejauh ini merupakan pilihan tercepat.

Resolusi gambar dalam database yang disiapkan dapat berupa apa saja, tetapi sebagai opsi, kami akan mempertimbangkan 1K dan 2K (Anda dapat mengambil 4K). Anda juga dapat membuat tidak hanya penurunan, tetapi juga peningkatan gambar saat mengubah ukuran.

Ubah Ukuran Kinerja Cepat


Kami menguji aplikasi pengubahan ukuran cepat dari Fastvideo SDK pada kartu video NVIDIA Tesla V100 (OS Windows Server 2016, 64-bit, driver 24.21.13.9826) pada gambar 24-bit 1k_wild.ppm dan 2k_wild.ppm dengan resolusi 1K dan 2K (1280x720 dan 1920x1080). Pengujian dilakukan untuk sejumlah thread yang berbeda yang berjalan pada kartu video yang sama. Ini membutuhkan tidak lebih dari 110 MB memori pada kartu video per streaming. 4 stream tidak lebih dari 440 MB.

Pertama, kami memampatkan gambar asli dalam format JPEG dengan kualitas 90%, dengan penipisan 4: 2: 0 atau 4: 4: 4. Kemudian kami mendekode dan mengubah ukuran 2 kali lebar dan tinggi, membuat tajam, kemudian lagi mengkodekan dengan kualitas 90% pada 4: 2: 0 atau 4: 4: 4. Sumber data dalam RAM, gambar terakhir ditempatkan di sana.

Waktu operasi dihitung dari mulai memuat gambar asli dari RAM untuk menyimpan gambar yang diproses ke RAM. Waktu inisialisasi program dan alokasi memori pada kartu video tidak termasuk dalam pengukuran.

Contoh baris perintah untuk gambar 1K 24-bit
PhotoHostingSample.exe -i 1k_wild.90.444.jpg -o 1k_wild.640.jpg -outputLebar 640 -q 90 -s 444 -sharp_after 0,95 -ulang 200

Benchmark untuk memproses satu gambar 1K dalam satu utas


Decoding (termasuk transfer data ke kartu video): 0,70 ms
Ubah ukuran dua kali (lebar dan tinggi): 0,27 ms
Tajam: 0,02 ms
Pengkodean JPEG (termasuk transfer data dari kartu video): 0,20 ms
Total waktu per frame: 1,2 ms

Performa untuk 1K


KualitasPenipisanUbah ukuranStreamingFrame rate (Hz)
190%4: 4: 4/4: 2: 02 kali1868/682
290%4: 4: 4/4: 2: 02 kali21039/790
390%4: 4: 4/4: 2: 02 kali3993/831
490%4: 4: 4/4: 2: 02 kali41003/740


Performa untuk 2K


KualitasPenipisanUbah ukuranStreamingFrame rate (Hz)
190%4: 4: 4/4: 2: 02 kali1732/643
290%4: 4: 4/4: 2: 02 kali2913/762
390%4: 4: 4/4: 2: 02 kali3891/742
490%4: 4: 4/4: 2: 02 kali4923/763


Penipisan 4: 2: 0 untuk gambar sumber mengurangi kecepatan, tetapi ukuran file sumber dan tujuan menjadi lebih kecil. Ketika beralih ke 4: 2: 0, tingkat paralelisme turun 4 kali, karena sekarang blok 16x16 dianggap sebagai satu unit, oleh karena itu dalam mode ini kecepatannya lebih rendah daripada untuk 4: 4: 4.

Kinerja terutama ditentukan oleh tahap decoding JPEG, karena pada tahap ini gambar memiliki resolusi maksimum, dan kompleksitas komputasi dari tahap pemrosesan ini lebih tinggi daripada yang lain.

Ringkasan


Hasil pengujian menunjukkan bahwa untuk kartu video NVIDIA Tesla V100, kecepatan pemrosesan gambar 1K dan 2K maksimum ketika 2-4 stream diluncurkan pada saat yang sama, dan berkisar dari 800 hingga 1000 frame per detik per kartu video. Memproses gambar 1K lebih cepat dari 2K, dan bekerja dengan gambar 4: 2: 0 selalu lebih lambat daripada dengan 4: 4: 4. Untuk mendapatkan hasil akhir pada kinerja, Anda perlu menentukan secara akurat semua parameter program dan mengoptimalkannya untuk model kartu video tertentu.

Latensi urutan satu milidetik adalah hasil yang bagus. Sejauh yang kami tahu, latensi semacam itu tidak dapat diperoleh untuk tugas pengubahan ukuran yang serupa pada CPU (bahkan jika tidak perlu menyandikan dan mendekode jip), jadi ini adalah argumen penting lain yang mendukung penggunaan kartu video dalam solusi pemrosesan gambar berkinerja tinggi.

Hingga 16 kartu grafis NVIDIA Tesla V100 mungkin diperlukan untuk memproses satu miliar jip per hari dengan resolusi 1K atau 2K. Beberapa pelanggan kami sudah menggunakan solusi ini, sementara yang lain mengujinya dalam tugas mereka.

Mengubah ukuran jip pada kartu video bisa sangat berguna tidak hanya untuk layanan web. Ada sejumlah besar aplikasi pemrosesan gambar berkinerja tinggi di mana fungsi seperti itu mungkin diminati. Misalnya, pengubahan ukuran cepat seringkali diperlukan untuk hampir semua skema pemrosesan untuk gambar yang diterima dari kamera sebelum menampilkan gambar pada monitor. Solusi ini dapat bekerja untuk Windows / Linux pada kartu grafis NVIDIA: Tegra K1 / X1 / X2 / Xavier, GeForce GT / GTX / RTX, Quadro, Tesla.

Keuntungan dari solusi pengubahan ukuran cepat pada kartu grafis


  • Pengurangan signifikan dalam ukuran penyimpanan untuk gambar sumber
  • Mengurangi biaya primer untuk biaya infrastruktur (perangkat keras dan perangkat lunak)
  • Meningkatkan kualitas layanan karena waktu respons yang singkat
  • Pengurangan lalu lintas keluar
  • Konsumsi daya yang lebih rendah pada perangkat pengguna
  • Keandalan dan kecepatan solusi yang disajikan, yang telah diuji pada set data yang sangat besar
  • Mengurangi waktu pengembangan untuk memasarkan aplikasi semacam itu untuk Linux dan Windows
  • Skalabilitas solusi yang dapat bekerja baik pada kartu video tunggal dan sebagai bagian dari sebuah cluster
  • Pengembalian investasi cepat untuk proyek-proyek tersebut

Siapa yang mungkin tertarik


Perpustakaan untuk mengubah ukuran jip secara cepat dapat digunakan dalam layanan web yang sarat muatan, toko online besar, jejaring sosial, sistem manajemen foto online, e-commerce, di hampir semua perangkat lunak manajemen perusahaan besar.

Pengembang perangkat lunak dapat menggunakan perpustakaan ini, yang menyediakan latensi urutan beberapa milidetik untuk mengubah ukuran jip dengan resolusi 1K, 2K dan 4K pada kartu video.

Rupanya, pendekatan ini mungkin ternyata lebih cepat daripada solusi NVIDIA DALI untuk decoding cepat jip, mengubah ukuran dan persiapan gambar selama tahap pelatihan jaringan saraf untuk Deep Learning.

Apa lagi yang bisa dilakukan


  • Selain mengubah ukuran dan berbagi, Anda dapat menambahkan memotong ke algoritma yang ada, memutar 90/180/270, menerapkan tanda air, kontrol kecerahan dan kontras.
  • Optimalisasi solusi untuk kartu video NVIDIA Tesla P40 dan V100.
  • Dekoder JPEG kinerja pengoptimalan tambahan.
  • Mode burst untuk memecahkan kode jip pada kartu video.

Source: https://habr.com/ru/post/id424575/


All Articles