Hidromek’de Ürün Tanıma Sistemi

Geçtiğimiz sene iş yoğunluğumuzdan dolayı blog’a çok yazı yazamadık. Bu süre içinde birçok proje ve uygulama yaptık. Önümüzdeki günlerde bu uygulamalarımızdan bahsetmeye çalışacağım.

Örneğin, sektöründe lider olan Hidromek firmasının Ankara’daki fabrikasında ürün tanıma sistemini devreye aldık.

Kepçe ve iş makineleri parçalarının boyahaneye gitmeden önce tanınması doğru parça olduğunun kontrolü sağlanıyor. Eğer boyahaneye yanlış parça giderse, boyama kafaları malzemeye çarpmakta ve hem kafa hem malzeme zarar görmektedir. Bu da ziyan olan zamanlar ve yüksek maliyetler anlamına geliyor. Taşıma konveyör sistemi ile gelen parçalar, tipleri (Alt Şase, Üst Şase, Arm, Bom, Kova) ve tonajları ile (14, 20, 22, 30, 37 ton) kombinasyonlu olarak farklı şekillerde gelebiliyor.

Sistem ise şunu yapıyor:

  1. Yazılım, gelen ürünün bilgisini PLC sisteminden alır.
  2. Operatör kontrol yaptırır ve yazılım kameralardan görüntü alır.
  3. Görüntüler işlenerek doğru parça olup olmadığı kontrol edilir.
  4. Doğru ise OK çıkışı, değil ise RET çıkışı PLC sistemine verilir.
  5. Buna göre PLC sistemi, ya hattı durduruyor ya da devam ettirir.

Bununla birlikte otomatik olarak OK ve RET olanların ayrı ayrı fotoğraflarını da kaydetmektedir ve parçaların takibi, incelenmesi, geçiş zamanları ve sayıları takip edilebilmektedir.

Sistem, birçok sektörde bu tarz ürün tanıma, seçme, yönlendirme işlemlerini yapabilmektedir.

program1-

hidromek-alt hidromek-arm

 

 

 

 

 

hidromek-bom hidromek-ust

Kameralı Hacim Ölçümü – 3

Mavis kamera ile hacim (en-boy-yükseklik) ölçen sistemin 3. versiyonunu geliştirdi.

Herhangi bir yere dayama gerektirmeyen, görüntü alanı içinde herhangi bir yere koyulabilen, 1.5 mt yüksekliğe kadar cisimlerin hacmini ölçen sistemi test kullanımına aldı.

Ölçüm sonuçları

2 adet kamera ile ve tamamen Mavis tarafından geliştirilmiş yeni bir teknoloji ile, görüş alanının herhangi bir yerine koyulan cisimlerin hacmi, hızlı ve doğru bir şekilde ölçülmektedir.
Kantardan gelen ağırlık bilgisi de eklenerek, en-boy-yükseklik (desi) bilgisi de eklenerek barkod oluşturulmakta, veritabanına kaydedilmekte ve ilgili sistemlerle entegrasyon sağlanmaktadır.

Kargo firmaları gibi pek çok yerde kullanılması muhtemel olan sistemin çalışması istenildiği takdirde görülebilir, demo kurulum yapılabilir.

Kirli İşler için Classifier Kullanın

Görüntü işleme uygulamalarında, bazen göze çok basit görünen işler, içinden çıkılmaz hale gelebilir. Threshold seçimi bunların başında gelir. Uygun bir threshold seçersiniz Diyelim ki var_threshold. 3-5 örnekte mükemmel çalışır, 1-2 örnekte teklemeye başlar, sonunda -öyle resimler çıkar ki- hiç çalışmaz 🙁 Neyse ki, HALCON var, moral bozmaya gerek yok. “Bir çok alternatif thresholding yöntemi sunuyor ne de olsa” özgüveniyle, hemen başka bir threshold seçilir. Mesela dynamic threshold. Sonuçlar baştan kontrol edilir. Eh, biraz daha iyi. Ama hala yakalanamayan örnekler var. İşin kötüsü, bazı resimlerde var_threshold iyi sonuç verirken, bazen de dyn_yhreshold iyi sonuç veriyor. Hangi durumda hangisini kullanalım? İkisinin sonucunu union yapıp denesek, bu kez de bazı istenmeyen durumlar çıkıyor. İstenmeyen durumları opening_circle vb. fonksiyonlarla elesek, sonra dilate etsek… derken bir bakmışsınız, yüzlerce satır HALCON kodu ile boğuşuyorsunuz.

Bu durum hemen hemen tüm görüntü işlemecilerin başına sık sık gelmektedir. Böyle bir durumla karşılaştıysanız, yanlış yoldasınız demektir, en iyisi önce bir mola verip şu klibi izleyin.

http://www.youtube.com/watch?v=y14_nLOi7YU

“Dirty deeds done dirt cheap”. Demek istediğimiz tam da bu. Kirli işler öyle kastırarak değil, (bizde) ucuz ve kolay yoldan halledilir.

Classifier Kullanımı :

Classifier belirgin 1 ya da 1 den fazla ortak özelliği bulunan nesneleri, bu ortak özelliklerine göre sınıflayarak seçmek için kullanılır. Örneğin bir resimdeki nesneleri, renklerine göre sınıflamak isteyebiliriz. HALCON a, bana bu resimdeki yeşilleri, mavileri, sarıları ver diyebilirim. Aksi halde, tek tek, farklı renklerin farklı threshold değerleri ile ilgilenmek zorunda kalacaktım. Ve bence işin en güzel yanı, bir örnek resim üzerinde, nesneleri tek tek göstrerek, mavi bu, yeşil bu, sarı bu, hadi bunları öğren, ve diğer resimleri verdiğimde, bana bu renkleri bu diyebilme kolaylığı.

Özetle, classifier yaygın olarak kullanılmalıdır. Çok düzgün ve güvenilir sonuçlar verir. Hızlı çalışır, iyi optimize edilmiştir. Sonuçlar kaydedilebilir / okunabilir vs.

 

Threshold seçimi ile uğraşıp 100 lerce satır HALCON kodunu silip, classifier kullanarak 3-5 satırla halledebileceğinizi görünce, ofisin içinde baştan sona Angus Young yürüyüşü yapacağınıza eminim. (yukarıdaki klibin ilk saniyelerinde. Angus Young yürüyüşü yapmayı bilmiyorsanız, buradan öğrenebilirsiniz. http://www.youtube.com/watch?v=MPBSKl9TpO8 (hayatımda böyle saçma video görmedim) )

Şimdi GMM classifier kullanan bir örnek verelim.

Bronz renkli metal plakanın üzerindeki kırmızı renkli çizgileri yakalayan bir görüntü işleme programı yazmamız isteniyor.
Klasik thresholding yöntemlerine göre elde ettiğimiz sonuçlar :

Yukarıdaki örnekte, yakalamak istediğimiz kırmızı çizgiler gayet başarıyla yakalanmış. (Etrafı yeşil ile çizilerek gösterilmiş). Fakat, kırmızı çizginin kalınlığı azaldıkça, kırmızı boyanın etkisi de azalmakta ve threshold kırmızıyı yakalamakta biraz zorlanmaktadır.

Yukarıdaki örnekte, uygulamamızın kırmızı çizgiyi kısmen yakaladığını ama tam istediğimiz gibi olmadığını görüyoruz.

Sonuçta, yukarıdaki gibi bazı örnekler için ise, kırmızı çizginin hiç yakalanamadığını görüyoruz. Kırmızı çizginin bazen yakalanıp, bazen yakalanamaması,

  • plaka yüzeyinde ışık şiddetinin değişken olması (sağ ve sol iyi aydınlanıyor, orta taraf iyi aydınlanmıyor)
  • Çizgi kalınlığının değişken olması (dolayısıyla ince çizgilerde kırmızı rengin belirsizleşmesi)
  • Zeminde lekeler açık koyu bölgeler olması
  • Bronz zeminin kendi içinde kırmızılık içermesi

gibi sebeplerden olabilir.

 

 

 

 

 

 

 

 

Yukarıdaki resim, yanlış threshold denemeleri ile boğuşurken, farketmeden hızlıca artmış HALCON kodlamasını gösteriyor.

GMM classifier kullanılarak yazılan aşağıdaki kod ise, tüm durumlarda %100 çalışarak istenen sonucu almamızı sağlamıştır.

 

set_display_font (3600, 16, 'mono', 'true', 'false')

list_files ('C:/Projects/Bronz/R', ['files','follow_links'], ImageFiles)
* list_files ('C:/Projects/SahinMotor/deneme 2/çapraz ışık/nok', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)

* Red Region seçimi
read_image (Image, 'Reddic.jpg')
gen_rectangle1 (ROI_0, 198.172, 226.049, 485.801, 901.164)
reduce_domain(Image, ROI_0, ImageReduced)
decompose3(ImageReduced, R, G, B)
bin_threshold(G, RedRegion)
*

create_class_gmm (3, 1, 1, 'full', 'none', 3, 42, GMMHandle)
add_samples_image_class_gmm (Image, RedRegion, GMMHandle, 0)
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.001, Centers, Iter)
create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
clear_class_gmm (GMMHandle)

dev_set_color('blue')
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    reduce_domain(Image, ROI_0, ImageReduced)
    classify_image_class_lut (ImageReduced, ClassRegions, ClassLUTHandle)
    closing_circle(ClassRegions, RegionClosing, 3.5)
    area_center(RegionClosing, Area, Row, Column)
    if (Area > 500)
        disp_message(3600, 'KIRMIZI', 'image', 12, 12, 'red', 'true')
    endif
    stop()
endfor

Yazılımımız artık MODBUS uyumlu

Kameralı kontrol yazılımımız VYP, artık %100 Seri ve TCP modbus uyumlu.

Hem ModBus Slave, hem de ModBus TCP protokollerini tam destekleyen arabirimimiz ile, ModBUS protokolü üzerinden her tür çevre birim ile hızlı ve güvenli haberleşmek mümkün.

ModBus, Robot haberleşmesi, SCADA sistemleri, HMI, PLC, OPC vb. üniteler ile haberleşmek için geliştirilmiş bir endüstri standardıdır ve Mavis tarafından artık tam olarak desteklenmektedir.

Plastik Üzerinde Klips Kontrolü

Aracın iç dizaynında kullanılmak üzere üretilen parçaların kontrolü yapılmak isteniyor. Bu siyah parçalar üzerinde yine siyah renkli klipsler takılıyor. Ancak bu klipslerin takılmaması problemine karşı, kameralı kontrol sistemi kurulacak.

Siyah üzerinde siyah kontrolü zor olsa da, parçaya göre uygun bir kabin, aydınlatma ve tek kameralı bir sistem tasarladık. Parçanın birden fazla modeli var ve kullanıcı tarafından kontrolü yapılacak ürün program üzerinden seçtiriliyor.

Ardından konulan parça üzerindeki klipslerin kontrolü yapılıyor. Yazılım, parçanın yönü farklı gelse bile doğru çalışacak edecek şekilde ayarlandı. Farklı ürünler geldiğinde ise tabi ki uyarı veriliyor.

Parça kontrolleri “NOK” ise program kendini kilitliyor ve “bakım” şifresini bilen birinin gelip programı şifre ile açması gerekiyor.

Aşağıdan ekran görüntülerini görebilirsiniz..

Klips kontrolü

Klips kontrolü - hatalı parça

Klips kontrolü - hatalı parça

uEye SDK 4.22

iDS kameralar için, uEye SDK 4.22 çıktı. Yeni kameralar ve yeni özellikler sunan SDK da, en beğendiğim özellik sharpness (keskinlik) kotrolünü içermesi.

Araç çubuğunda yer alan, acı biber şeklindeki 🙂 buton yardımı ile, çizdiğimiz dörtgensel bölgenin keskinliği (sharpness) gösterilmektedir. Böylece, lens üzerinden fokus kontrolü yaparken, gözle gördüğümüze değil, programın bize gösterdiği değere göre karar vermek mümkün olmaktadır. Özellikle amatör ya da son kullanıcıların fokus ayarı yapması çok kolay bir hale gelmiştir.

Hemen aşağıda, (Out of Focus) iyi fokus edilmemiş lens ile alınan görüntüde, ekrana çizdiğim AOI kırmızı renk ile uyarıyor. (Halihazırdaki fokus değeri : 58, olması gereken : 142 ifadeleri ile)

 

Hemen aşağıda ise iyi fokus edilmiş lens ile alınan görüntü yer alıyor. (Halihazırdaki fokus değeri : 144, olması gereken : 145 ifadeleri ile)

 

Aynı fonksiyonalite, SDK tarafından sharpness sınıfı ile sağlanmaktadır. Yapay Görme uygulamamız, kameraları ilk yüklediğinde, fokus ayarlarının düzgün olup olmadığını kontrol edebilir. Eğer fokus değerimiz bozulmuş ise, kullanıcı uyarılabilir, istenen fokus değerine getirmesi sağlanabilir. (Mavis VYP arabirimi, kullanıcının focus yapabilmesine olanak tanıyan arayüz geliştirmiştir. Sola döndür, sağa hafif döndür gibi kullanıcı dostu ifadeler ile operatör yönlendirilmektedir.)

Plastik parçalar üzerindeki yüzüklerin kontrolü

Otomotiv sektöründe hizmet veren bir firma için yüzük kontrol sistemini devreye aldık. Sistemde 3 farklı ürün bulunmaktadır. Her bir üründe yüzüğün takılacağı yerler ve renkler farklılık göstermektedir. Bu ürünler modellenerek kontrol edilmesi istenen ürünlerin doğru veya hatalı olarak ayrıştırılması sağlanmıştır.

Operatör tarafından kullanıcı girişi yapılabilen, kontrol edilecek modelin listeden seçilebileceği ve sistemin çalıştırılması veya durdurulması gibi işlemleri içeren bir arayüz tasarlanmıştır.

Sistem, konveyör sistemi üzerinde bölmelere ayrılmış bir bandın ilerlerken mekanik sensör yardımıyla adım adım durdurulması, fotoğraf çekilmesi, bu fotoğrafın bilgisayar üzerindeki yazılım ile işlenerek ürünlerin doğru veya hatalı olarak tespit edilmesi, bu bilgilerin ekranda gösterilmesi ve farklı kovalara atılması işlemlerinden oluşmaktadır.

Kontrol edilecek ürünler farklı pozisyonlarda geleceği için bu ürünlerin ve yüzüklerin aranacağı bölgelerin modellenen ürünlere göre döndürülmesi gerekmektedir. Bu işlemi sağlayan HALCON kodu:

// Kontrol edilecek ürünün fotoğrafının okunması
read_image (Image, 'C:/Projects/M1_175740.bmp')
// Matching(Eşleştirme) için kullanılacak modelin okunması
read_shape_model ('C:/Projects/P1-N.shm', ModelId)
//  Matching(Eşleştirme) işlemi
find_shape_model (Image, ModelId, rad(0), rad(360), 0.5, 1, 0.5,['least_squares','max_deformation 2'], [7,1],0.75,ModelRow, ModelColumn, ModelAngle,ModelScore)
    if (ModelScore > 0.75)
        get_shape_model_contours (ModelContours, ModelId, 1)
        hom_mat2d_identity (HomMat)
        hom_mat2d_rotate (HomMat, ModelAngle, 0, 0, HomMat)
        hom_mat2d_translate (HomMat, ModelRow, ModelColumn, HomMat)
        affine_trans_contour_xld (ModelContours, TransContours, HomMat)
        gen_rectangle1 (ModelRegion, 396.643, 361.944, 816.643, 1134.52)
        area_center (ModelRegion, ModelRegionArea, RectificationRow, RectificationCol)
        hom_mat2d_identity (Rectification)
        hom_mat2d_translate (Rectification, RectificationRow-ModelRow, RectificationCol-ModelColumn, Rectification)
        // Ürünün döndürülmesi
        hom_mat2d_rotate (Rectification, -ModelAngle, RectificationRow, RectificationCol,Rectification)
        affine_trans_image (Image, RectifiedImage, Rectification, 'constant', 'false')
    endif

Doğru ve hatalı olarak tespit edilen ürünlerin ekran görüntüleri :

Delik-Perçin Boyutlarının ve Birbirleri Arasındaki Mesafelerin Kontrolü

Otomotiv sektöründe hizmet veren bir firmada bakır malzeme üzerindeki delik ve perçinlerin bulunup,boyutlarının ve birbirleri arasındaki mesafelerin kontrol edilmesi amaçlı bir sistem devreye aldık.

Geliştirdiğimiz arayüz sayesinde program farklı modellere uyarlanabiliyor. Modelin tanıtılması için operatör tarafından ürünün ölçümleri yapıldıktan sonra gerçek değerleri girilerek kaydedilmelidir. Tanıtılan modeldeki piksel-milimetre oranı kullanılarak ölçüm sonucunda bulunan piksel değerleri milimetre cinsinden ifade edilmektedir.

Deliğin bulunması :

var_threshold (ImageReduced, Region, 75, 75, 0.2, 2, 'dark')
closing_circle(Region, RegionClosing, 2.5)
opening_circle(RegionClosing, RegionOpening, 7)
connection(RegionOpening, ConnectedRegions)
select_shape_std(ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_circle (SelectedRegions, Row, Column, Radius)
gen_circle(Circle, Row, Column, Radius)
set_color(WinHandle, 'blue')
disp_region(Circle, WinHandle)

Perçinin bulunması :

var_threshold (ImageClosing, Region, 20, 20, 0.3, 3, 'light')
connection (Region, ConnectedRegions)
closing_rectangle1 (ConnectedRegions, RegionClosing, 10, 50)
opening_rectangle1 (RegionClosing, RegionOpening, 4, 120)
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions, ['area', 'height'], 'and', [1000, 180], [2800, 290])
count_obj (SelectedRegions, Number)
if (Number = 2)
    union1 (SelectedRegions, RegionUnion)
    smallest_rectangle1 (RegionUnion, Row1, Column1, Row2, Column2)
    gen_rectangle1 (Rectangle1, Row1, Column1, Row2, Column2)
    w := Column2 - Column1
    h := Row2 - Row1
    area_center(Rectangle1, Area5, Row5, Column5)
    set_color(WinHandle, 'blue')
    disp_region(Rectangle1, WinHandle)
endif

Delik çapı,perçin eni-boyu,merkezlerinin satır-sütun değerleri kullanılarak mesafeler bulunuyor. OK-NOK durumlarını gösteren örnek program görüntüleri :

Kale Oto Radyatör’de Yırtık, Patlak, Kesik vb. Kontrolleri

Kale Oto Radyatör’ün Gebze Çayırova’daki fabrikasındaki sistemimizi devreye aldık. Radyatörler kalıptan çıktıktan sonra parçada yırtık ve patlak benzeri durumlar kontrol ediliyor.

Radyatör üzerinde kontrol edilen nokta olan kenar kısmında, küçük büyük yırtıklar oluşabiliyor.

Genelde yukarıdaki gibi büyük patlaklar oluşuyor ancak sistemin çok küçükleri bile yakalayabilmesi açısından ancak elimizle hatalı parça oluşturabildik ve bunu da sistemin kontrolünden geçirdik. Aşağıdaki resimde görüldüğü gibi yazılımımız bunu da doğru bir şekilde hatalı parça olarak gördü. Buradaki patlak 1-1,5 mm civarındadır ve bu da müşterimizin istediği limitlerin çok altındadır.

E-Kart’da Kart Üzerinde Barkod ve Pin-Puk Numaralarının Kontrolü

Banka kartları, Gsm kartları vb. çeşitli kartların üretimini yapan Eczacıbaşı E-Kart Elektronik Kart Sistemleri A.Ş. firmasındaki projemizi devreye aldık. Kart üzerinde yapılması istenen kontroller:

  • Barkod’ların okunması
  • Barkod’ların sıralı şekilde devam etmesi kontrolü
  • Pin ve Puk numaralarının yazdığı alanın kapalı olması kontrolü.

Kart, kamera önüne geldiğinde kontrollere başlanır ve herhangi bir kontrol hatalı ise makine durdurulur. OK durumunda üretim devam eder.

Barkod Kontrolü:
Kart üzerinde barkodun yeri kullanıcı tarafından önceden girilmiştir. Kontrol esnasında barkod okunur ve hafızaya alınır. Bir sonraki kart geldiğinde okunan yeni barkodun numarası hafızadaki numara ile kontrol edilerek sırasının doğruluğu tespit edilir.

Kullanıcı Artan yada Azalan şekilde sırayı belirtebilir, barkodun Tipini seçebilir ve barkodda bulunan Son-Ek’in varlığını belirtebilir. Aynı şekilde 2. barkod kontrolü de eklenebilir.

 
Pin-Puk Numaralarının Kontrolü (scratch-off kontrolü):
Pin ve Puk numalarının üzeri scratch ile düzgün şekilde kapatılması gerekiyor. Scratch’in altından numaranın gözükmesi, kenarlarında yada ortasında oluşan bir bozulma istenmemektedir.

Aşağıda bazı hatalı durumları görmektesiniz.