Zorlu LEGO hayranları anlatıyor: İki ton tuğlayı otomatik olarak sınıflandırmak için algoritmaları nasıl kullandım

Jacques Mattheij blogundan derlenen Tang Xu

Qubit Üretildi | Genel Hesap QbitAI

Bu makalenin yazarı Jacques Mattheij, çocukluğundan beri Lego hayranıdır. Lego ile bağlantı kurma sürecinde böyle bir fenomeni keşfetti: farklı Lego türleri farklı fiyatlarla satılıyor. Örneğin, ciltli Lego'nun fiyatı kilogram başına yaklaşık 40 avro iken, Lego'nun büyük kısmı yalnızca 10 avroya mal oluyor; ve bazı sınırlı sürümler, nadir sürümler ve Lego mekanik setleri kilogram başına 100 avroya satılabilir.

Bu nedenle, bazı insanlar bu yeni Legoları toplu ve ciltli olarak bile satın alıyor ve daha yüksek bir değer elde etmek için onları yeniden sınıflandırıyor.

Ancak, tüm garip LEGO'ları manuel olarak kategorize etmek iyi bir fikir gibi görünmüyor. Bu yüzden Mattheij bir gün hevesle karşıladı ve bunu bir makineyle yapmaya karar verdi. Bu deneyi yapmak için çeşitli açık artırma alanlarındaki bir garajı doldurabilecek Lego'yu fotoğrafladı (ve dönüş yolunda bir kamyonu kaybetti).

Bu, Mattheij'in kişisel web sitesinde yaptığı ikinci gönderi ... Bu Lego grubunu sınıflandırmak için yazılım üzerinde denediği yöntemden bahsediyor; ilk gönderide, hazırlıkları ve donanımın karşılaştığı sorunları tanıttı. zor.

Bu sınıflandırma programını nasıl yazdığını görmek için birkaç Lego arabası satın alma, kamera, taşıma bandı vb. Kurma sürecini atlayalım. Donanım kısmıyla daha fazla ilgileniyorsanız, lütfen burayı ziyaret edin: https://jacquesmattheij.com/sorting-two-metric-tons-of-lego

Aşağıdakiler, Mattheij'in ikinci gönderisinden derlenmiştir:

Genel Bakış

Tüm yazılımlar Python ile yazılmıştır. Ben kendim bir Python uzmanı değilim, ama neyse ki, bunu doğru yapmak için bir ömür harcamak istemiyorum. Anaconda, kullanımı çok kolay bir Python dağıtım aracıdır. Başlangıçta, Python'un çeşitli alaka düzeyi ve sürüm sorunlarını çözmesi için sanal bir ortam kurmak bir kabustu. Benim için Anaconda çok yardımcı olabilir.

Lego sınıflandırma yazılımı ile ilgili bir ana bölüm var. Örneğin, bir kamera tarafından uygulanan bir görüntü elde etme sistemi:

Tarayıcı / "Görüntü Dikiş Makinesi"

Toplayıcı işini bitirdikten sonra, görüntüyü "görüntü dikiş makinesine" gönderecektir (iki resmi birbirine bağlayarak) İkincisinin ana görevi iki şeydir: Birincisi, son görüntüden bu yana bir Lego parçasının taşındığını belirlemektir. Konveyör bandının ne kadar hareket ettiği (videodaki dalgalı çizgilere bakın) ve ikincisi yeni taranmış bir hafıza görüntüsünü güncellemektir. İki Lego parçasını ayıran "dikiş makinesi" onu kesecek ve sonra taranan bir sonraki Lego görüntüsünü ekleyecektir.

Yukarıdakilerin tümü OpenCV'de yazılmıştır.

Tarayıcı ve "görüntü dikiş makinesi" çalışmalarını tamamladıktan sonra, sonuç şuna benzer:

sınıflandırma

Bu hikayenin gerçekten ilginç kısmı bu. Bunu birçok kez yaptım ve şimdi çok can sıkıcı.

OpenCV ilkelleri

İlk kez seçtiğim yöntem, OpenCV temel öğelerini, özellikle de kontur eşleştirme ve daire algılamayı kullanmaktı. Çok fazla Lego türü olmadığı sürece, bu şekilde nispeten iyi bir tanıma doğruluğu garanti edilebilir. Basit meta verilerin (uzunluk, genişlik ve bir Lego parçasından yükseklik) bir kısmını birleştirerek, tüm temel Lego blokları arasındaki farkı söyleyebilir, ancak daha fazlası olamaz.

Bayes

Başka bir deyişle, Bayesian'ı deneyelim. Bayesian sınıflandırıcısının anlaşılması oldukça kolaydır: önce birçok özellik tasarlarsınız, sonra bu özelliklere dayalı bir dedektör inşa edersiniz ve ardından dedektörünüzün size söyledikleri gibi çalıştığından emin olmak için bir test seti oluşturursunuz ve bitti Bundan sonra, sistemin bu özellikleri tanıma yeteneğini geliştirmek için elinizden gelenin en iyisini yaparsınız. Ayarladığınız özelliklerin önceliğini belirlemek için bu sisteme olabildiğince büyük bir dizi test görüntüsü atmanız ve ardından her özelliğin ağırlığını belirlemeniz gerekir - bir özellik görünürse, algılanacaktır. "Doğru" olarak, özellik görünmezse "hata" olarak algılanacaktır.

Bu yöntemi, aşağıdaki özelliklere göre bir sınıflandırıcı oluşturmak için kullandım:

  • Çapraz (iki çizgi ortada bir yerde kesişir)

  • Daire (blok, saplamadan daha büyük bir daire içerir)

  • Yan dikmeler (yandan görünen çiviler)

  • "Tam" (parça, dış çevresinin büyük bir bölümünü kaplar) (Not: Bu ifadeyi anlamıyorum kübit ( ) )

  • yükseklik

  • Delik (tuğlada bir yerde delik var)

  • Delin (bu blok kırıldı)

  • uzunluk

  • Levha (yapı taşları bir levhanın yüksekliği kadardır)

  • Dikdörtgen (yapı taşları kabaca dikdörtgendir)

  • Eğim (bloklarda eğim var)

  • "Skin and Bone" (parça, dış çevresinin küçük bir bölümünü kaplar) (Not: Lego'nun kübitlerini çalmadım ve hala anlamıyorum ( ) )

  • Kare (yapı taşları muhtemelen kare şeklindedir)

  • Çiviler (bloklarda görünür çiviler vardır)

  • "Şeffaf" (yapı taşları şeffaftır)

  • Hacim (milimetre küp olarak ifade edilir)

  • Kama şeklindeki (yapı taşları kama şeklindedir)

  • Genişlik

Başka özellikler de olabilir ... Bunlar üzerinde bir süre çalıştım. Bir "saplama detektörü" yapmak önemsiz görünebilir, ama aslında o kadar basit değil. Çivilerin herhangi bir yönde yerleştirilebileceğini ve saplama olarak algılanabilen ancak saplama olmayan bazı küçük parçalar olduğunu hatırlamanız gerekir Bloklar baş aşağı yerleştirilebilir veya kameradan uzağa bakabilirler. Hemen hemen her özellikte benzer sorunlar ortaya çıkar ve sonunda sistemin sizi tatmin edecek bir duruma gelmesi için çok fazla enerji harcamanız gerekir. Ancak yukarıdakilerin hepsini aldığınızda, birçok farklı yapı taşını algılayabilen ve iyi doğruluğu garanti eden bir sınıflandırıcı alacaksınız.

Öyle olsa bile, bu sistem mükemmel olmaktan uzaktır: çok yavaştır. Her yeni blok kategorisi eklediğinizde, bir bloğun hangi kategoriye ait olduğunu bulmak için daha fazla iş yapmanız gerekir. Bilgisayar, yapı taşı şekillerinin sürekli genişleyen bir kitaplığını oluşturmak için öğelerin toplanması için çok zaman harcadı ve en iyi eşleşen sonuç kitaplıktan elde edildi. Sistemin doğruluğu etkileyiciydi, ancak sonunda bu çözümden vazgeçtim çünkü çok yavaştı (konveyörün hızına ayak uyduramıyorum).

Eliminasyon

Eleme sistemi, önceki yöntemle aynı sınıflandırma koşullarını kullanır. Etkiyi azaltma kuralına göre sınıflandırma, düzensiz nesneleri hızla ortadan kaldırabilir ve kalan kısım verimli bir şekilde işlenebilir. Yazılım ilk kez tam hızda çalışan bir makineye ayak uydurabilir.

Bununla birlikte, bu planın birkaç sorunu da vardır: bir tuğla parçası reddedildiğinde, asla iade edilemez - ancak bu ret yanlış olabilir. Gerçek şu ki, bu "ikili" yaklaşım sistemin doğruluğunu sınırlıyor Sistemi çalıştırmak için çok büyük bir veri kümesine ihtiyacınız var ve bu, genel performansı büyük ölçüde azaltacaktır.

Bu sistem çoğu zaman işe yaramaması için her şeyden en sonunda kurtulur. Bu nedenle, doğruluğu düzeltmenin maliyeti, hızdaki avantajını muhtemelen dengeleyecektir.

Ağaç sınıflandırması

Bu bir Inbowstin fikridir. Ben sadece "Hayvanı Tahmin Et" adlı bir oyunda çizgilere göre küçük bir ağaç yaptım, ona her yeni bir şey eklediğimde, ağaç özelliğin farklı kısımlarını bulacak ve üzerine çatal yapacak. Yeni yapı taşlarını girin. Eliminasyon yöntemiyle karşılaştırıldığında, bu yöntemin çok önemli iki avantajı vardır: Birincisi, ağaç üzerinde bir yapı bloğunun birden fazla noktayla temsil edilebilmesi, bu da doğruluğun artırılmasına yardımcı olur; diğeri, önceki yönteme kıyasla bu sistemin hızıdır. Neredeyse yıldırım kadar hızlı.

Ancak bu yöntemin bariz dezavantajları da vardır: ilk önce tüm bu özellikleri manuel olarak oluşturmanız gerekir ve yeterince net özellikler bulabilseniz bile, yalnızca temel OpenCV ile bir özellik algılayıcı yazarsanız, bu süreç çok uzaktır. Uzun ve sıkıcı ... yakında bu konuyu ele almak daha zor hale gelecek, özellikle Python çok yavaş bir dil, probleminiz NumPy veya OpenCV kütüphane çağrılarıyla ifade edilemiyorsa, daha hızlı olacak Büyük bir kayıp.

Makine öğrenme

Nihayet bu kadar! Neredeyse altı ay boyunca yukarıdaki dağınık yöntemlerle işkence gördükten sonra, yeterince aldım. Her türden Lego tuğlasını tam olarak içerebilen ve gerçekten işe yarayabilecek bir sınıflandırıcı yazmanın imkansız olduğunu anladım. Tabii bu beni bir süre sinirlendirdi.

Dişlerimi gıcırdatmaya karar verdim. Gözlerimi makine öğrenimine diktim ve buna daha ciddi bir şekilde davrandım: Önümüzdeki birkaç haftayı kağıtları kemirerek ve sinir ağlarıyla ilgili her türlü ilginç şeyi öğrenerek geçirdim.

1980'lerde sinir ağlarıyla kısa bir görüşme yaptım ve şimdi bu alanın zamana göre çok değiştiğini görüyorum.

Çok fazla araştırmadan sonra, sonunda Google Brain ekibi tarafından geliştirilen TensorFlow'u seçmeye karar verdim. Ama bunu kullanmayı gerçekten öğrenmek bir süreç gerektiriyor.Başlangıçta bir süre buna bağlı kaldım ve en iyi nasıl idare edeceğimi bilemedim.

Yaklaşık iki ay önce, greenpizza13 adlı bir Hacker News kullanıcısı bana Keras'ı önerdi, böylece TensorFlow'u büyük bir çevreye gitmeden doğrudan kullanabiliyorum (Anaconda çok yardımcı olabilir) ve bu da oldukça basit Beni Jeremy Howard ve Rachel Thomas'ın hazırladığı harika makine öğrenimi giriş kursuna götürüyor (kurs bağlantısı:

Sonuç olarak, birkaç saat içinde (evet, doğru okudunuz), aldığım sonuçlar son birkaç ayda uyguladığım tüm çözümleri geride bıraktı ve birkaç gün içinde sınıflandırma sistemini uygulamaya koydum Sadece birkaç kategoriye ayrılmak yerine gerçek gerçek zamanlı çalışma. Bir darbe daha: İster eğitimde ister çıkarımda olsun, yaklaşık 2000 satır özellik algılama kodu ve başka bir 2000 satırlık test ve yapıştırıcı kodu 200 satırdan daha az Keras kodu ile değiştirilebilir.

Diğer manuel kodlama özellikleri yöntemleriyle karşılaştırıldığında, makine öğreniminin hız ve kodlama kolaylığı açısından avantajları gerçekten basittir. Ağaç mekanizması kadar hızlı olmasa da doğruluk oranı bilmediğinden daha yüksektir; aynı zamanda bu garip bloklar için kod yazmanıza gerek yoktur, sistem bunu otomatik olarak halledebilir.

Bir sonraki sorun, sistemin 1000'den fazla türü sınıflandırabilmesini sağlayacak kadar büyük bir eğitim veri kümesi bulmam gerekmesidir. İlk başta, bu imkansız bir görev gibi göründü. Yeterli sayıda görüntüyü nasıl elde edeceğimi ve bunları kabul edilebilir bir süre içinde manuel olarak nasıl etiketleyeceğimi bilmiyorum. En iyimser durumda bile, yeterince büyük bir görüntü oluşturmamız gerekiyor. Bu sistemi ideal bir durumda çalıştırmam 6 ayımı alacak.

Sonunda anladım: bu mesele önemli değil. Çoğu zaman, makine kendi görüntülerini işaretleyebilir ve tek yapmam gereken hataları düzeltmek. Sistem çalışırken, hatalar gittikçe azalır. Bu yöntem, eğitim görüntü setini çok hızlı bir şekilde genişletir. İlk gün manuel olarak 500 bloğu işaretledim, ikinci gün makine sayıyı 2000'e çıkardı. Tabii bunların yaklaşık yarısı yanlış işaretlendi - bu 2500 blok sonraki üç günlük eğitim oldu. Sonunda, makine 4000'den fazla Lego parçasını işaretledi, bunların% 90'ı doğruydu! Sadece 400 hatayı düzeltmem gerekiyor. Bu iki haftanın sonunda, hepsi doğru şekilde etiketlenmiş 20.000 görüntüden oluşan bir veri kümesine zaten sahiptim.

Bu yeterli değil. Bu kategorilerden bazıları hiç temsil edilemiyor, bu yüzden bu kategorilerdeki resimlerin sayısını artırmam gerekiyor.Belki de bu kısmı çıkarıp makinede tek başıma işlemeliyim - herhangi bir düzeltme yapmaya gerek yok. Aynı şekilde etiketlenecekler.

Geçen hafta ilk gönderiyi yayınladığımdan beri çok yardım aldım ve özellikle iki kişiye teşekkür etmek istiyorum. Birincisi, bilgideki boşluğu doldurmama yardım eden Jeremy Howard. Onun yardımı olmadan başlayamazdım. İkincisi, bana Xception modelinin kendi özelleştirilmiş versiyonunu sağlayan Keras'ın yazarı Francois Chollet. , Eğitim sürecini büyük ölçüde hızlandıran.

Şimdi eğitim hızda bir darboğazda Nvidia GPU'm yeterince hızlı olmasına rağmen hala yavaş çalıştığını düşünüyorum. Yeni bir ağ oluşturmak birkaç gün sürer 4 GPU'lu bir makinede bu hız gerçekten iyi değil ... Sabırsız bir insanım ama bunun olmasına izin verdim.

Bir noktada, bu yazılımlar ve veriler açık kaynaklı olacak, ancak ondan önce hala daha almam gereken çok yol var.

Yazılım gerçekten bu büyük yığın Lego yığınını sınıflandırma yeteneğine sahip olduğunda, geri dönüş günü gelecek. Dağ benzeri Lego'yu paketlemeyi bitirdiğimde, onları ucuza imha edeceğim.

Sonunda, bu, hepsi Lego ile ifade edilen orijinal fikrimi sunan kavramsal bir çizim:

İşe Alım

Qubit, editörleri, muhabirleri, operasyonları, ürünleri ve diğer pozisyonları işe alıyor ve çalışma yeri Pekin, Zhongguancun'da bulunuyor. İlgili ayrıntılar için lütfen şu yanıtı verin: resmi hesabın diyalog arayüzünde "İşe Alım".

Bir şey daha...

Bugün AI dünyasında dikkat etmeye değer başka ne var? Yapay zeka endüstrisini ve tüm ağımızdan toplanan araştırma eğilimlerini görmek için QbitAI genel hesap diyalog arayüzünde "bugün" yanıtını verin. Yeniden doldur ~

NetEasein harika MOBA oyunu, King of Glory'nin yapmaya cesaret edemeyeceği şeyi yaptı ve kahraman sadece kör oldu
önceki
6 kişinin geri döneceğini ispatlamak için 1 kişi kesildi, Nuggets en güçlü kadroyu başlattı, Warriors'ın gerçekten başı dertte!
Sonraki
Xuanlang test sürüşünün dört küçük duygusu, size gizlice onun ilk 8AT MPV olduğunu söylüyor
Chongqing Messi 1 pas 1 atış 3 puan kazanmak için! Tan, Long, Sui ve Weijie çarpıştı ve çatışmalara neden olarak üç karakterli klasiği patlattı!
Millet çatışması en çıldırtıcı savaş modu. Minyonlar tanklara meydan okumaya cesaret etmekle kalmayıp, Transformers ile de savaşabilirler mi?
SPA mimarisi, Guangzhou'daki ilk çıkışta XC60'ın yerini alıyor, ön satış 380.000'den başlıyor
2 yeni yardım 5 değişiklik getiriyor, Rockets manevra alanı kazanıyor, Morey sonunda büyük hamlesini durdurabilir!
Carlo, Dalian Yifang ile mi buluştu? Aşma ve aşma hayali ölümsüzdür! Shenzhen ve Şangay düellosu zinciri düşürmeyi reddetti
Pek çok oyun PlayerUnknown's Battlegrounds oyununu kopyaladı, Blue Hole neden sadece "Fortress Night" ı rapor etti?
Dongfeng Infiniti: Dalian fabrikası 2018'de yeni lüks SUV piyasaya sürüyor
Yaklaşık 500 milyar değerinde olan Uber'in insansız araçlar tarafından öldürülmemesi için bir şeyler yapmaya devam etmesi gerekiyor.
Harden sadece 47 maçta Curry'yi geçecek ve tek bir sezonda 4023 sayılık rekoru kıracak!
Tencent bir kez daha güç düzeyini düşürdü ve LOL yaklaşık 10.000 hesabı askıya aldı! Oyuncu: Sınıf arkadaşı numarasını ödünç almak iyi değil mi?
Yassı kafa neden Manchester United'ı Evergrande'ye oy vermeyi reddetti? AFC rakipleri titriyor! Arka arkaya on şampiyonluk mu? SIPG asla tamamlanmayacak
To Top