
Dalam artikel ini saya akan memberikan, menurut pendapat saya, solusi yang menarik untuk masalah pengenalan komputer objek dalam gambar tanpa menggunakan pelatihan.
Tugas: memiliki foto gedung bertingkat, cobalah menentukan jumlah lantai di dalamnya.
Perkiraan yang baik untuk jumlah lantai dapat memberikan jumlah jendela di vertikal rumah. Jendela, balkon, dan benda-benda lain adalah karakteristik lantai yang baik (terutama di bangunan tempat tinggal). Saya akan mempertimbangkan bangunan tempat tinggal, gambar yang mudah ditemukan di jaringan. Satu batasan penting harus diperhatikan terlebih dahulu: rumah di dalam gambar harus diperlihatkan sepenuhnya secara vertikal, sehingga memungkinkan untuk secara visual mendeteksi semua lantai.
Tugas ini secara rasional dibagi menjadi dua tahap:
- Cari "strip" vertikal windows yang akan dihitung. Dua subtugas: pertama, Anda perlu mencari jendela di area gambar yang ditempati oleh rumah, dan kedua, ada banyak jendela di bangunan tempat tinggal, tidak masuk akal untuk menganalisis semuanya. Penting untuk menyoroti di antara mereka urutan vertikal yang paling cocok untuk analisis selanjutnya.
- Penentuan jumlah lantai (jendela, atau objek karakteristik lainnya) dengan area rumah yang dipilih.
Artikel ini terutama ditujukan untuk langkah pertama dari solusi. Langkah kedua masih dalam pengembangan, tetapi saya juga akan memberikan beberapa hasil dari solusinya.
Langkah 1. Cari area dengan windows
Ide dasarnya adalah bahwa serangkaian objek identik (seperti windows) yang dapat dibedakan dengan baik di sebuah rumah di deretan objek identik membuat urutan kecerahan piksel secara berkala. Inilah urutan yang harus ditemukan. Di bawah ini adalah tahapan utama dari algoritma.
Pertama kita menerjemahkan gambar dalam nuansa abu-abu dan skala (saya menggunakan gambar 400x600px)

Gbr. 1 Gambar asli b / w
Lebih lanjut dalam loop:
- Pilihan pada gambar strip (40px) yang relatif sempit untuk seluruh ketinggian (Gbr. 2, gambar lebih rendah tanpa titik)
- Rata-rata kecerahan di atas lebar strip. Ternyata garis w dari distribusi kecerahan rata-rata di atas ketinggian rumah (Gbr. 2 grafik atas). Ini memiliki karakteristik struktur periodik yang terlihat jelas dari area di mana ada jendela. Windows yang terletak di tempat teduh kurang dapat dibedakan, tetapi ini tidak akan merugikan.
- Perbedaan dw dari nilai w dan w digeser oleh jarak sh dihitung. Metode pencarian menggunakan nilai pergeseran sh untuk mencapai pengurangan maksimum dalam median perbedaan dw (Gbr. 2, grafik lebih rendah).


Fig.2 "Strip" dari windows
Namun, itu tidak cukup untuk menemukan band dari gambar di mana median paling sangat berkurang. Faktanya adalah bahwa area dengan penghijauan atau langit, dengan nilai geser kecil, dapat memberikan penurunan yang lebih besar daripada jendela. Tetapi jika kita memplot ketergantungan nilai median pada nilai shift untuk strip dengan dan tanpa windows, maka kita dapat melihat perbedaan utama: untuk nilai shift yang dekat dengan ketinggian lantai, grafik dengan windows memiliki ekstrem yang terlihat jelas. Dengan demikian, tidak perlu mengukur tingkat median absolut yang dapat dicapai, tetapi penurunan maksimum dari maksimum dalam proses meningkatkan pergeseran untuk setiap jendela. Ini adalah titik kunci.
tanpa jendela | dengan windows |
---|
 |  |
Gbr. 3 Ubah median kecerahan rata-rata dengan meningkatnya shift
Di bawah ini adalah kode python3 dengan komentar.
image = Image.open("raf_data/32.jpg").resize((600,400)) # . img = np.array(image.convert("L"), dtype=float)/255 SEARCH_WIDTH = 40 # x_opt = [0, 1] # : sh_range = range(1,100) # kmax = 0 # for x in range(0, img.shape[1]-SEARCH_WIDTH, int(SEARCH_WIDTH/2)): amax = 0 amin = 1 # for sh in sh_range: # w = img[:,x:x+SEARCH_WIDTH].mean(axis=1) aim = (pd.DataFrame(w)-pd.DataFrame(w).shift(sh))[sh:].abs().median().values[0] # aim sh if aim>amax: amax = aim amin = amax if aim<amin: amin = aim aim_k = amax/amin if aim_k>kmax: x_opt = [x, sh, w] kmax = aim_k print(' : {0}, : {1}'.format(x_opt[0], x_opt[1]))
Gbr. 2 menandai titik yang ditetapkan pada jarak shift yang ditemukan. Seperti yang Anda lihat, mereka menandai setiap jendela dengan baik. Yaitu kita sudah tahu ketinggian lantai!
Algoritma yang dipertimbangkan menemukan zona reguler yang baik pada fasad berbagai bangunan tempat tinggal (Gbr. 4).



Fig. 4 Contoh
Langkah 2. Menghitung jumlah lantai
Pada langkah ini, kesulitan utama dimulai. Tindakan lebih lanjut mungkin sebagai berikut:
- Perkirakan ketinggian rumah dengan menganalisis kurva perbedaan kecerahan rata-rata atau menggunakan pembelajaran mesin). Bagilah ketinggian rumah dengan ketinggian lantai dan dapatkan jumlah lantai.
- Di jendela yang ditemukan pada langkah pertama, cari objek yang mirip dengan windows dan hitung secara langsung, misalnya, pada titik-titik tertentu.
Tampaknya alami untuk mencoba metode pertama terlebih dahulu: begitu ketinggian lantai diketahui, tetap menentukan tinggi rumah. Namun, skema yang mirip dengan yang ditunjukkan pada langkah 1 ternyata kurang cocok untuk menentukan ketinggian rumah, dengan mempertimbangkan semua batas dan transisi yang mungkin. Dalam beberapa kasus, dimungkinkan untuk mendapatkan contoh pekerjaan yang baik, tetapi untuk hasil yang konsisten baik, diperlukan pendekatan dengan menggunakan pembelajaran mesin.

Gambar. 5 Menentukan ketinggian rumah menggunakan hutan acak