Apakah mungkin untuk memberikan gambar berukuran variabel sebagai input ke jaringan saraf convolutional?

17

Bisakah kita memberikan gambar dengan ukuran variabel sebagai input ke jaringan saraf convolutional untuk deteksi objek? Jika memungkinkan, bagaimana kita bisa melakukan itu?


Tetapi jika kita mencoba memotong gambar, kita akan kehilangan sebagian dari gambar dan jika kita mencoba untuk mengubah ukuran, maka, kejelasan gambar akan hilang. Apakah ini berarti bahwa menggunakan properti jaringan yang melekat adalah yang terbaik jika kejelasan gambar adalah pertimbangan utama?

Ashna Eldho
sumber

Jawaban:

9

Ada sejumlah cara untuk melakukannya. Sebagian besar sudah dibahas dalam sejumlah posting di atas StackOverflow, Quora, dan situs web konten lainnya.

Untuk meringkas, sebagian besar teknik yang terdaftar dapat dikelompokkan menjadi dua kelas solusi, yaitu,

  1. Transformasi
  2. Properti Jaringan Inherent

Dalam transformasi, seseorang dapat mencari teknik seperti

  • Ubah ukuran , yang paling sederhana dari semua teknik yang disebutkan
  • Pangkas , yang dapat dilakukan sebagai jendela geser atau pangkas satu kali dengan kehilangan informasi

Seseorang juga dapat melihat ke dalam jaringan yang memiliki sifat bawaan untuk kebal terhadap ukuran input berdasarkan perilaku lapisan yang membangun jaringan. Contoh ini dapat ditemukan dalam hal,

  • Fully convolutional networks (FCN) , yang tidak memiliki batasan pada ukuran input sama sekali karena sekali ukuran kernel dan langkah dijelaskan, konvolusi pada setiap lapisan dapat menghasilkan keluaran dimensi yang sesuai sesuai dengan input yang sesuai.

  • Spatial Pyramid Pooling (SPP) , FCN tidak memiliki lapisan padat yang terhubung penuh dan karenanya agnostik dengan ukuran gambar, tetapi mengatakan jika seseorang ingin menggunakan lapisan padat tanpa mempertimbangkan transformasi input, maka ada kertas menarik yang menjelaskan lapisan dalam jaringan pembelajaran yang mendalam.

Referensi:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS Saya mungkin telah melewatkan mengutip beberapa teknik. Tidak mengklaim ini sebagai daftar lengkap.

m1cro1ce
sumber
1
Secara teori ini kedengarannya ok, tetapi tidak berhasil pada Tensorflow. Adakah yang punya implementasi untuk itu?
Hossein
1
@Hossein Saya juga mengalami beberapa masalah dalam implementasi praktis, tetapi saya mendapat CNN ukuran variabel yang bekerja di Tensorflow Keras 2.x hari ini dengan beberapa keterbatasan. Saya telah memposting garis besar pendekatan dalam jawaban saya sehubungan dengan beberapa detail praktis. Semoga berhasil!
J Trana
4

Lapisan convolutional dan pooling layer sendiri tidak tergantung pada dimensi input. Namun, output dari lapisan konvolusional akan memiliki ukuran spasial yang berbeda untuk gambar dengan ukuran berbeda, dan ini akan menyebabkan masalah jika kita memiliki lapisan yang terhubung sepenuhnya sesudahnya (karena lapisan yang terhubung sepenuhnya memerlukan input ukuran tetap). Ada beberapa solusi untuk ini:

1. Global Pooling: Hindari lapisan yang sepenuhnya terhubung pada akhir layer convolutional, dan alih-alih gunakan pooling (seperti Global Average Pooling) untuk mengurangi peta fitur Anda dari bentuk (N, H, W, C) (sebelum pool global ) untuk membentuk (N, 1,1, C) (setelah kumpulan global), di mana:

N = Jumlah sampel minibatch
H = Tinggi spasial peta fitur
W = Lebar spasial peta fitur
C = Jumlah peta fitur (saluran)

As dapat dilihat, dimensi output (N * C) sekarang independen dari ukuran spasial (H, W) dari peta fitur. Dalam hal klasifikasi, Anda dapat melanjutkan menggunakan lapisan yang sepenuhnya terhubung di atas untuk mendapatkan log untuk kelas Anda.

2. Pooling berukuran variabel:Gunakan wilayah pengumpulan ukuran variabel untuk mendapatkan ukuran peta fitur yang sama untuk ukuran input yang berbeda.

3. Pangkas / Ubah ukuran gambar masukan: Anda dapat mencoba mengubah skala / memotong / memasukkan gambar masukan Anda agar semuanya memiliki bentuk yang sama.


Dalam konteks pembelajaran transfer, Anda mungkin ingin menggunakan input berukuran berbeda dari input asli yang dilatih dengan model. Berikut adalah beberapa opsi untuk melakukannya:

4. Buat layer baru yang sepenuhnya terhubung: Anda dapat membuang sepenuhnya layer asli yang terhubung sepenuhnya dan menginisialisasi layer baru yang sepenuhnya terhubung dengan dimensi yang Anda butuhkan, dan latih dari awal.

5. Perlakukan layer yang sepenuhnya terhubung sebagai konvolusi: Biasanya, kami membentuk kembali peta fitur dari (N, H, W, C) menjadi (N, H * W * C) sebelum memasukkannya ke lapisan yang terhubung sepenuhnya. Tetapi Anda juga dapat memperlakukan lapisan yang terhubung sepenuhnya sebagai konvolusi dengan bidang reseptif (H, W). Kemudian, Anda bisa membelit kernel ini dengan peta fitur Anda terlepas dari ukurannya (gunakan zero padding jika diperlukan) [http://cs231n.github.io/transfer-learning/ ].

Soroush
sumber
1

Saya harus mengatasi masalah ini hari ini jadi saya pikir saya akan membagikan apa yang menurut saya berhasil. Saya telah menemukan bahwa ada beberapa "ini bisa bekerja dalam teori" jawaban dan informasi di web tetapi kurang dari praktis "inilah cara Anda menerapkan ini secara konkret".

Untuk mengimplementasikan ini menggunakan Tensorflow Keras, saya harus melakukan hal berikut. Mungkin orang lain dapat menemukan beberapa di antaranya dapat dimodifikasi, santai, atau dijatuhkan.

  1. Setel input jaringan untuk memungkinkan input ukuran variabel menggunakan "Tidak Ada" sebagai dimensi placeholder pada input_shape. Lihat jawaban Francois Chollet di sini .
  2. Gunakan lapisan konvolusional hanya sampai operasi pengumpulan global telah terjadi (misalnya GlobalMaxPooling2D). Maka Dense layers dll dapat digunakan karena ukurannya sudah diperbaiki.
  3. Gunakan ukuran batch 1 saja. Ini menghindari berurusan dengan ukuran campuran dalam satu batch.
  4. Tulis Urutan khusus kecil yang membuat kumpulan ukuran 1 dari daftar input. Saya melakukan ini untuk menghindari berurusan dengan ukuran yang berbeda di dalam array Numpy tunggal.
  5. Gunakan Model.fit_generator pada Urutan khusus Anda untuk pelatihan dan validasi. (vs Model.fit)
  6. Untuk beberapa alasan, Model.predict_generator muncul bahkan ketika menggunakan Sequence seperti di atas. Saya harus menggunakan Model.predict pada input individual.

Perhatikan bahwa panggilan ke Model.predict memang mengeluhkan kinerja - yang tidak mengejutkan mengingat inefisiensi solusi - tetapi berhasil!

J Trana
sumber
-2

Ya, cukup pilih jaringan backbone yang sesuai yang tidak bergantung pada ukuran gambar input untuk menjadi nilai yang tepat - sebagian besar jaringan memenuhi kriteria ini.

shimao
sumber
3
Anda tidak salah, tetapi jawaban Anda tidak terlalu informatif - bagaimana dengan mengembangkannya untuk menjelaskan mengapa sebagian besar CNN modern dapat bekerja dengan gambar ukuran variabel? Juga, apa batasan untuk variabilitas ini (misalnya, jangan mencoba untuk mencampur gambar ukuran yang berbeda dalam batch mini yang sama ...)? Kebanyakan orang yang datang dari MLP kuno (panjang input ditetapkan) atau CNN kuno (AlexNet & VGG-1X), dengan Flattenlapisan sial mereka , tidak mengerti bagaimana CNN modern pada prinsipnya dapat mengambil gambar dari berbagai ukuran.
DeltaIV