Jaringan saraf - Temukan sebagian besar gambar yang serupa


11

Saya bekerja dengan Python, scikit-belajar dan keras. Saya memiliki 3.000 ribu gambar arloji berwajah depan seperti yang berikut: Watch_1 , Watch_2 , Watch_3 .

Saya ingin menulis sebuah program yang menerima input foto jam tangan nyata yang mungkin diambil dalam kondisi yang kurang ideal daripada foto-foto di atas (warna latar yang berbeda, petir yang lebih gelap, dll.) Dan menemukan jam tangan yang paling mirip di antara 3000 yang ada di dalamnya. Dengan kemiripan yang saya maksudkan adalah bahwa jika saya memberikan sebagai input foto jam tangan cokelat bulat dengan renda tipis maka saya berharap sebagai jam tangan keluaran berbentuk bulat, warna gelap dan dengan renda tipis.

Apa algoritma pembelajaran mesin paling efisien untuk melakukan ini?

Misalnya, dengan mengikuti tautan ini, saya memiliki dua solusi berbeda di pikiran saya:

1) Menggunakan CNN sebagai ekstraktor fitur dan membandingkan jarak antara fitur-fitur ini untuk setiap pasangan gambar dengan mengacu pada gambar input.

2) Menggunakan dua CNN dalam Jaringan Saraf Siam untuk membandingkan gambar.

Apakah kedua opsi ini yang terbaik untuk tugas ini atau akankah Anda menyarankan sesuatu yang lain?

Apakah Anda tahu jaringan saraf pra-terlatih (dengan hiperparameter yang ditentukan sebelumnya) untuk tugas ini?

Saya telah menemukan beberapa posting menarik tentang StackOverflow tentang ini tetapi mereka cukup tua: Post_1 , Post_2 , Post_3 .


Selamat datang di situs ini! Pelajari embedding (saya sarankan hash biner untuk pengambilan cepat pada urutan seribu bit) kemudian lakukan pencarian kesamaan.
Emre

Dengan senang hati berada di sini ... haha! ... Ya, ini ide yang bagus dan saya sudah membaca makalah ini ...
Diasingkan

Jawaban:


4

Saya tidak berpikir bahwa arsitektur tingkat tinggi adalah yang paling cocok tetapi lebih tergantung pada banyak faktor dan detail. Dari apa yang saya sadari pendekatan pertama menjanjikan terutama ketika diperluas dengan langkah-langkah tambahan seperti yang dilakukan dalam TiefVision :

  1. Jaringan kotak pembatas tambahan digunakan untuk membedakan bagian yang relevan dari gambar dari yang lain
  2. Vektor fitur tidak hanya dibandingkan secara langsung tetapi digunakan untuk melatih jaringan perbandingan menggunakan triplet (mempelajari kesamaan berdasarkan vektor fitur dan contoh-contoh untuk contoh yang kurang lebih mirip).

Karya ini jauh lebih baru (2016/17) dari yang Anda posting dan dilengkapi dengan seperangkat alat yang bagus dan makalah yang lebih rinci .

Mengapa menggunakan kembar tiga alias Deep Ranking?

Seperti yang dinyatakan dalam komentar: Mengapa kita harus menggunakan kembar tiga untuk kesamaan gambar daripada belajar vektor fitur dan menghitung jaraknya? Kembar tiga adalah cara merumuskan pertanyaan kesamaan sebagai masalah belajar, bukan belajar fitur vektor yang pada dasarnya tidak peduli untuk kesamaan. Pendekatan ini sangat masuk akal dalam kasus-kasus di mana kesamaan yang dirasakan manusia penting, yang mungkin berbeda dari persepsi mesin.

Kembar tiga bekerja seperti ini: Anda memberikan 3 gambar. Satu untuk membandingkan, satu mirip (dekat) dan satu gambar tidak begitu mirip (jauh). Ini adalah data pelatihan / ujian / validasi Anda. Melatih jaringan Anda pada sampel tersebut dan memprediksi urutan yang benar (mengklasifikasikan yang sama dari gambar yang tidak serupa) secara keseluruhan memungkinkan jaringan belajar cara memesan gambar berdasarkan kesamaan mereka.

Secara keseluruhan, pendekatan ini relatif kompleks. Mungkin overengineered tetapi Anda juga meminta cara terbaik untuk melakukan ini dan Deep Ranking mencapai nilai presisi yang sangat tinggi.


Terima kasih atas tanggapan Anda. Ini yang menarik (saya membukanya). Gagasan tentang triplet baik meskipun saya tidak yakin mengapa menggunakan kembar tiga gambar tentu lebih baik daripada menggunakan pasangan gambar untuk tugas saya. Jika mau, Anda bisa menjelaskannya lebih lanjut di pos Anda. Saya juga akan melihat TiefVision.
Diasingkan

@Universalis terima kasih atas petunjuknya (dan upvote). Saya memperbarui jawaban saya dengan beberapa detail lebih lanjut tentang kembar tiga dan alasannya. Makalah ini juga ditulis dengan sangat baik sehingga mencari semua detail. Mungkin ada cara mewah baru untuk melakukan ini sejak TiefVision dan DeepRanking muncul.
Gegenwind

Sekali lagi terima kasih atas tanggapan Anda. Ya, saya telah melihat kertas dan cukup jelas tentang apa yang Anda tambahkan ke jawaban Anda. Dalam hal ini, saya sudah mengerti apa yang Anda tambahkan jawaban Anda dan pertanyaan saya lebih jelas adalah sebagai berikut: mengapa tidak menggunakan 2 gambar (sepasang) bukannya 3 gambar (triplet) untuk memberi peringkat gambar sesuai dengan kesamaan mereka? Apa manfaat tambahan menggunakan kembar tiga daripada pasangan?
Diasingkan

Hmm mungkin saya salah mengerti pendekatan Anda. Triplet memberikan informasi komparatif bahwa gambar 1 lebih dekat dengan gambar 2 daripada gambar 3. Hanya memiliki 2 gambar dan menyatakan "2 ini serupa" tidak memiliki faktor komparatif "serupa dalam hal apa" karena dalam pendekatan ini Anda menganggap bahwa jarak yang jelas vektor fitur tidak cukup memberi tahu Anda. dengan kata lain: Anda mempelajari kesamaan berdasarkan pesanan dan Anda kekurangannya tanpa harus memesan setidaknya 2 item.
Gegenwind

Sekali lagi terima kasih atas tanggapan Anda. Namun, bahkan sekarang dan setelah membaca sedikit lebih teliti kertasnya, tidak jelas bagi saya mengapa Anda perlu kembar tiga dan bukan pasangan gambar untuk pendekatan tanpa pengawasan ini. Saat menggunakan label, jelas bahwa dengan menggunakan kembar tiga Anda akan mendapatkan peringkat kesamaan penuh dari gambar yang tidak bisa Anda dapatkan dengan pasangan. Tetapi dalam pendekatan (semacam) tanpa pengawasan ini yang Anda usulkan lalu mengapa tidak membandingkan nilai-nilai fungsi kerugian untuk setiap pasangan gambar (selalu satu gambar pasangan adalah gambar input) untuk menemukan misalnya 5 yang paling mirip dengan masukan gambar?
Diasingkan

2

Saya akan memilih classifier, seperti VGG-16, yang bekerja dengan baik pada kelas imagenet. Kemudian, jalankan gambar arloji Anda melewatinya. Yang pasti, Anda dapat mengharapkan sebagian besar output "menonton" dengan probabilitas tinggi.

Namun, Anda kemudian mendapatkan fitur tambahan: tingkat aktivasi semua kategori lainnya. Itu memberi Anda vektor seribu nilai antara 0 dan 1.

Anda juga dapat mengekstrak aktivasi di berbagai titik di jaringan. Kemudian, kesamaan aktivasi dan output tersebut harus serupa antara dua kasus hanya jika gambarnya serupa.


Terima kasih atas tanggapan Anda (upvote). Ya, saya memiliki ini di pikiran saya dan dalam beberapa hal ini terkait dengan opsi pertama yang saya berikan di posting saya. Jadi saya juga berpikir tentang menggunakan detektor lain seperti SURF ... Saya akan melihat apakah ini cukup berhasil ...
Diasingkan

2

Saya akan fokus pada augmentasi data terlebih dahulu. Karena gambar Anda memiliki latar belakang putih, Anda membuatnya sedikit lebih mudah. Ubah latar belakang putih menjadi latar belakang transparan, turunkan gambar, putar dan letakkan di latar yang mirip dengan data target Anda.

Lakukan ini beberapa kali dengan kombinasi berbeda dan miliki label untuk setiap jam. Maka saya akan menyarankan Anda menggunakan jaringan saraf convolutional reguler untuk klasifikasi. Setiap label akan memiliki skor, pilih satu dengan kepercayaan diri tertinggi dan yang harus paling mirip .

Misalnya katakanlah Anda menjalankan penggolong dengan gambar dan mendapatkan hasil ini:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

CNN mengatakan bahwa ia memiliki keyakinan 51% bahwa Watch1 adalah arloji di gambar input. Tetapi juga yang benar adalah bahwa yang dianggap lebih mirip, Watch2 akan menjadi yang berikutnya lebih mirip dan seterusnya.

Jika Anda tidak mendapatkan hasil yang baik, lakukan seperti biasa. Lakukan percobaan dengan parameter dan / atau tambahkan lebih banyak lapisan. Coba cari tahu di mana itu gagal. Setelah memiliki wawasan itu, Anda dapat menggunakannya untuk memilih jenis jaringan konvolusional yang lebih terspesialisasi untuk masalah khusus Anda. Mencari itu tanpa pengetahuan sebelumnya tentang bagaimana itu akan melakukan bukan pendekatan yang tepat. Saya sarankan Anda mulai dengan model konvolusional dasar dan kemudian bekerja dari sana.


1
Terima kasih atas tanggapan Anda (upvote). Ya, saya sudah menambah data dalam pikiran saya. Namun, respons Anda cukup tidak jelas. Apa yang Anda maksud dengan "memiliki label untuk setiap jam"? Apakah maksud Anda memberi label pada masing-masing arloji secara terpisah atau memberi label sebagai pasangan dengan arloji lainnya, tergantung apakah keduanya serupa atau tidak? (Jika yang pertama maka jelaskan mengapa ini efisien silakan)
Diasingkan

Ini adalah saran sebelumnya, saya berasumsi Anda sudah memiliki cara praktis untuk memberi label pada mereka semua. Ini pada dasarnya adalah solusi paling dasar sehingga tidak akan efisien. Saran saya adalah bahwa model dasar mungkin dapat memberi Anda informasi yang cukup bagi Anda untuk mengejar model yang lebih khusus. Melihat peringkat yang dalam tampaknya sangat menjanjikan seperti yang dikatakan @Gegenwind. Saya telah memperbarui jawaban saya untuk membuatnya sedikit lebih jelas.
zimio

Hm, ya sekarang lebih jelas apa yang Anda maksudkan .... Ini tentu saja merupakan saran umum yang baik: mulailah dengan dasar-dasarnya dan lanjutkan langkah demi langkah ke hal-hal yang lebih kompleks ... Terima kasih dalam hal apa pun ...
Diasingkan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.