Diberi gambar kambing, program Anda sebaiknya mencoba mengidentifikasi apakah kambing itu terbalik, atau tidak.
Contohnya
Ini adalah contoh input apa yang mungkin. Bukan input aktual
Memasukkan:
Keluaran:
Downgoat
Spec
Program Anda harus paling banyak 30.000 byte
- Input akan berisi kambing lengkap
- Gambar akan selalu berisi seekor kambing
- Jika kambing terbalik, hasilkan
Downgoat
sebaliknyaUpgoat
Input akan tetapi Anda dapat mengambil gambar sebagai input (nama file, base64 gambar, dll.)
Jangan mengandalkan nama gambar atau metadata lain untuk mengandung "Upgoat" atau "Downgoat" karena nama file inti hanya untuk referensi.
Tolong jangan hardcode . Membosankan, saya tidak bisa menegakkannya sepenuhnya tetapi saya bisa bertanya dengan baik.
Uji Kasus
Intinya dengan gambar . gambar yang diawali dengan downgoat
memiliki Downgoat
keluaran dan gambar yang dimulai dengan upgoat
memiliki Upgoat
keluaran.
Gelombang Kedua Kasus Uji
Pastikan untuk menguji gambar Anda pada semua kasus uji. Gambar-gambar ini adalah jpg
s. Ukuran gambar memang bervariasi tetapi tidak terlalu banyak.
Catatan: Beberapa kasus uji dapat ditambahkan sebelum menerima jawaban untuk menghindari jawaban hardcode mana dan untuk memeriksa kinerja umum program.
Poin bonus untuk mendapatkan avatar saya yang benar: P
Mencetak gol
Skor adalah persen yang dapat dihitung dengan: (number_correct / total) * 100
sumber
Jawaban:
Mathematica, 100%, 141 byte
Yah, ini terasa lebih dari sedikit seperti curang. Ini juga sangat lambat dan juga sangat konyol. Fungsi
f
melihat kira-kira seberapa tinggi Anda dapat mengatur ambang Pengakuan di salah satu builtin visi komputer Mathematica, dan masih mengenali gambar sebagai hewan Caprine.Kita kemudian melihat apakah gambar atau gambar yang dibalik itu lebih konyol. Bekerja pada gambar profil Anda hanya karena dasi rusak karena downgoat. Mungkin ada banyak cara ini dapat diperbaiki termasuk menanyakan apakah gambar tersebut mewakili Bovids atau generalisasi lain dari jenis entitas hewan Caprine.
Jawaban sebagai skor tertulis 100% untuk set pengujian pertama dan 94% untuk set pengujian kedua, karena algoritma menghasilkan hasil yang tidak meyakinkan untuk kambing 1. Ini dapat dinaikkan kembali hingga 100% dengan mengorbankan waktu komputasi yang lebih lama oleh menguji lebih banyak nilai
RecognitionThreshold
. Budidaya dari100
ke1000
sufficies; untuk beberapa alasan, Mathematica menganggap itu gambar yang sangat tidak sopan! Mengubah entitas pengenalan dari hewan Caprine ke Hoofed Mammal juga tampaknya berhasil.Tidak Terkumpul:
Solusi alternatif, 100% + bonus
Yang ini menggunakan strategi yang sama seperti sebelumnya, tetapi dengan pencarian biner di atas ambang batas. Ada dua fungsi yang terlibat di sini:
g[t]
mengembalikan apakah argumennya adalah gambar kambing dengan ambang batast
.f
mengambil tiga parameter: gambar, dan batas atas dan bawah pada ambang batas. Itu rekursif; ini bekerja dengan menguji ambang batasm
antara ambang atas dan bawah (bias ke arah bawah). Jika gambar dan gambar yang dipantulkan keduanya adalah kambing atau non-kambing, itu menghilangkan bagian bawah atau atas rentang yang sesuai dan menyebut dirinya lagi. Kalau tidak, jika satu gambar adalah kambing dan yang lain adalah non-kambing, ia mengembalikanUpgoat
jika gambar pertama adalah kambing danDowngoat
sebaliknya (jika yang kedua, gambar yang dipantulkan adalah kambing)Definisi fungsi perlu sedikit penjelasan. Pertama, aplikasi fungsi adalah asosiatif kiri. Ini berarti bahwa sesuatu seperti
g[x][y]
ditafsirkan sebagai(g[x])[y]
; "Hasilg[x]
diterapkan key
."Kedua, penugasan dalam Mathematica kira-kira setara dengan mendefinisikan aturan penggantian. Artinya,
f[x_] := x^2
tidak tidak berarti "mendeklarasikan fungsi bernamaf
dengan parameterx
yang mengembalikanx^2
;" artinya lebih dekat dengan, "setiap kali Anda melihat sesuatu sepertif[ ... ]
, panggil benda itu di dalamx
dan ganti semuanya denganx^2
."Menyatukan keduanya, kita dapat melihat bahwa definisi
g
memberi tahu Mathematica untuk mengganti ekspresi apa pun dari formulir(g[ ... ])[ ... ]
dengan sisi kanan penugasan.Ketika Mathematica menemukan ekspresi
g[m]
(di baris keduaf
), ia melihat bahwa ekspresi tidak cocok dengan aturan apa pun yang diketahuinya dan membiarkannya tidak berubah. Kemudian cocok denganMap
operator/@
, yang argumennyag[m]
dan daftar{i, ImageReflect@i}
. (/@
adalah notasi infiks; ungkapan ini persis sama denganMap[g[m], { ... }]
.)Map
Digantikan dengan menerapkan argumen pertama untuk setiap elemen argumen kedua, jadi kita dapatkan{(g[m])[i], (g[m])[ ... ]}
. Sekarang Mathematica melihat bahwa setiap elemen cocok dengan definisig
dan melakukan penggantian.Dengan cara ini kita harus
g
bertindak seperti fungsi yang mengembalikan fungsi lain; yaitu, ia bertindak kurang lebih seperti yang kami tulis:(Kecuali dalam hal ini
g[t]
sendiri mengevaluasi keFunction
, sedangkan sebelumnyag[t]
sendiri tidak berubah sama sekali.)Trik terakhir yang saya gunakan adalah pola opsional. Pola tersebut
l_ : 0
berarti "cocok dengan ungkapan apa pun dan menjadikannya tersedial
, atau tidak cocok dengan apa pun dan menjadikannya0
tersedial
." Jadi, jika Anda meneleponf[i]
dengan satu argumen (gambar untuk diuji) itu seperti Anda meneleponf[i, 0, 1]
.Berikut ini adalah test harness yang saya gunakan:
sumber
JavaScript, 93,9%
Penjelasan
Implementasi sederhana dari gagasan @BlackCap untuk memeriksa dari mana cahaya itu berasal.
Sebagian besar kambing berada di tengah-tengah gambar mereka, dan perut mereka selalu lebih gelap daripada punggung mereka karena sinar matahari. Program dimulai di tengah gambar dan membuat catatan warna. Ia kemudian mendapat cahaya rata-rata piksel di atas dan di bawah tengah hingga di mana warna berbeda dengan warna di tengah (ketika tubuh kambing berakhir dan latar belakang dimulai). Sisi mana pun yang lebih terang menentukan apakah itu upgoat atau downgoat.
Gagal untuk downgoat 9 dan upgoats 7 dan 9 pada test case kedua.
sumber
Python, 100%, 225 byte
Gunakan pencarian gambar terbalik pada kambing. Jika halaman mengembalikan jumlah hasil yang memuaskan, itu mungkin kambing ke atas. Solusi ini mungkin tidak akan berfungsi pada kambing yang digambar tangan atau jika Bing pernah rusak.
sumber
Jawa,
93,9%100%Ini berfungsi dengan menentukan kontras baris di bagian atas dan bawah gambar. Saya berasumsi bahwa kontras di bagian bawah gambar lebih besar karena 2 alasan:
Saya menentukan kontras untuk setiap baris dengan menghitung perbedaan nilai piksel tetangga, mengkuadratkan perbedaan, dan menjumlahkan semua kotak.
Memperbarui
Beberapa gambar dari batch kedua menyebabkan masalah dengan algoritma asli.
upgoat3.jpg
Gambar ini menggunakan transparansi yang diabaikan sebelumnya. Ada beberapa kemungkinan untuk mengatasi masalah ini, tetapi saya hanya memilih untuk membuat semua gambar pada latar belakang hitam 400x400. Ini memiliki keuntungan sebagai berikut:
downgoat8.jpg / upgoat8.jpg
Gambar-gambar ini memiliki detail berlebihan di tubuh kambing. Solusi di sini adalah untuk mengaburkan gambar dalam arah vertikal saja. Namun, ini menimbulkan masalah dengan gambar dari batch pertama, yang memiliki struktur vertikal di latar belakang. Solusi di sini adalah hanya menghitung perbedaan yang melebihi ambang tertentu, dan mengabaikan nilai aktual perbedaan tersebut.
Singkat kata, algoritma yang diperbarui mencari area dengan banyak perbedaan dalam gambar yang setelah preprocessing terlihat seperti ini:
sumber
Python 3, 91,6%
Diedit dengan kasus uji baru
atur nama file ke gambar kambing yang ingin Anda uji. Ia menggunakan kernel untuk membuat gambar asimetris atas / bawah. Saya mencoba operator sobel, tetapi ini lebih baik.
sumber
pip install Pillow
OpenCV dengan Hough Transform, 100%
Ide awal saya adalah untuk mendeteksi garis vertikal kaki kambing dan menentukan posisi vertikal relatif terhadap tubuh dan cakrawala.
Ternyata, di semua gambar, tanah sangat bising, membuat banyak output deteksi tepi Canny dan garis terdeteksi yang sesuai dari transformasi Hough. Strategi saya adalah untuk menentukan apakah garis horizontal terletak di bagian atas atau bawah gambar, yang cukup untuk menyelesaikan masalah.
Inilah keseluruhan fungsi tanpa menghasilkan gambar:
Downgoat1 ujung:
Downgoat1 baris:
Upgoat2 tepi dan garis:
Metode ini bahkan bekerja dengan baik pada gambar yang sangat bising. Inilah ujung dan garis downgoat3:
Tambahan
Ternyata blur median dan threshold Gaussian adaptif sebelum Hough Transform bekerja jauh lebih baik daripada deteksi tepi Canny, sebagian besar karena blur median baik di daerah yang bising. Namun masalah dari pendekatan asli saya segera jelas: garis latar belakang yang menonjol terdeteksi, serta wajah kambing di beberapa gambar.
Inilah downgoat8:
Kontur (kode tidak diperlihatkan) mendeteksi tepi atas kambing (tulang belakang) dengan cukup baik tetapi gagal mendapatkan seluruh bentuk.
Penelitian lebih lanjut: OpenCV memiliki deteksi objek berbasis fitur Haar yang biasanya digunakan untuk hal-hal seperti mobil dan wajah, tetapi mungkin juga dapat bekerja untuk kambing, mengingat bentuknya yang khas.
Pengenalan Fitur 2D terlihat menjanjikan (pencocokan templat tidak akan berfungsi karena penskalaan dan rotasi) tapi saya terlalu malas untuk mencari tahu OpenCV untuk C ++.
sumber
Python 3, numpy, scikit, 100%
Kode ini menjalankan penggolong gambar yang dilatih oleh kambing terhadap satu nama file, mencetak 'Upgoat' atau 'Downgoat'. Kode itu sendiri adalah satu baris python3, didahului oleh string raksasa tunggal, dan baris impor. String raksasa sebenarnya adalah classifier terlatih kambing, yang tidak dikekang saat runtime dan diberi gambar input untuk klasifikasi.
Pengklasifikasi dibuat dengan menggunakan sistem TPOT, dari Randal Olson dan tim di University of Pennsylvania. TPOT membantu untuk mengembangkan saluran pemisah klasifikasi gambar pembelajaran mesin menggunakan pemrograman genetik. Pada dasarnya ini menggunakan seleksi buatan untuk memilih berbagai parameter dan jenis klasifikasi untuk bekerja terbaik dengan data input yang Anda berikan, sehingga Anda tidak perlu tahu banyak tentang pembelajaran mesin untuk mendapatkan pengaturan pipa yang cukup bagus. https://github.com/EpistasisLab/tpot . TPOT berjalan di atas scikit-belajar, dari INRIA et al, http://scikit-learn.org/stable/
Saya memberi TPOT sekitar seratus gambar kambing yang saya temukan di internet. Saya memilih yang terlihat relatif mirip dengan kambing dalam Tes, yaitu "di lapangan", dari samping, tanpa banyak hal lain yang terjadi dalam gambar. Output dari proses TPOT ini pada dasarnya adalah objek ExtraTreesClassifier scikit-belajar. Pengelompokan gambar ini, setelah dilatih (atau 'pas') pada kambing saya, diangkat ke string besar. String, kemudian, tidak hanya berisi kode classifier, tetapi "jejak" dari pelatihan semua gambar kambing yang dilatih.
Saya sedikit curang selama pelatihan, dengan memasukkan gambar uji 'kambing berdiri di atas log' dalam gambar pelatihan, tetapi masih bekerja cukup baik pada gambar generik kambing di lapangan. Tampaknya ada tradeoff - semakin lama saya membiarkan TPOT berjalan, semakin baik klasifikasi yang dibuatnya. Namun, pengklasifikasi yang lebih baik juga tampaknya 'lebih besar' dan akhirnya berjalan melawan batas 30.000 byte yang diberikan oleh @Downgoat dalam permainan golf. Program ini berdiri saat ini sekitar 27kbytes. Harap perhatikan bahwa 'grup kedua' gambar uji terputus, seperti 'tautan cadangan', jadi saya tidak yakin bagaimana hal itu akan terjadi pada mereka. Jika mereka akan diperbaiki, saya mungkin akan memulai dari awal, jalankan kembali TPOT dan beri makan banyak gambar baru, dan lihat apakah saya dapat membuat classifier baru di bawah 30k byte.
Terima kasih
pembaruan: per permintaan di sini adalah data pelatihan, diubah ukurannya menjadi 24x12 dan digabungkan menjadi satu gambar untuk kemudahan pengunggahan / presentasi. ini lebih dari seratus gambar. http://deeplearning.net/datasets/ , http://www.vision.caltech.edu/Image_Datasets/Caltech256/ , pencarian gambar duckduckgo, pencarian gambar google, dll
sumber
Scikit-belajar dengan Hutan Acak, 100%
Pendekatan yang dicoba-dan-benar adalah convnets, tetapi hutan acak dapat berkinerja sangat baik di luar kotak (beberapa parameter yang perlu diperhatikan). Di sini saya menunjukkan beberapa teknik umum dalam tugas klasifikasi gambar.
Saya mulai dengan 100 gambar kambing untuk pelatihan yang saya temukan melalui Gambar Google (AFAIK tidak ada dalam data pelatihan yang cocok dengan data tes). Setiap gambar diubah skala menjadi 20x16 dalam skala abu-abu, kemudian array diratakan untuk menghasilkan satu baris dalam array 2D. Versi gambar terbalik juga ditambahkan sebagai baris untuk data pelatihan. Saya tidak perlu menggunakan teknik augmentasi data .
Lalu saya memasukkan array 2D ke dalam classifier hutan acak dan panggilan memprediksi untuk menghasilkan 50 pohon keputusan. Berikut adalah kode (berantakan):
Ini adalah pohon keputusan pertama (meskipun karena model berada dalam ansambel, itu tidak terlalu berguna )
sumber