Haberler

aXeleRate – Kenar için AI Üzerine Keras Tabanlı Çerçeve

Google Colab’da makine öğrenimi modellerinizi eğitin ve donanım hızlandırmalı çıkarım için kolayca optimize edin!

Orijinal makale Dmitry Maslov tarafından yayınlandı Hackster.io

Bu, yaşadığınız dünyanın kısmına bağlı olarak birçokımız için çok zor zamanlar olabilir. Koronavirüs pandemisinin kötüleşmesi nedeniyle birçok ülke sıkı sokağa çıkma yasakları uyguladı. Ben de yakın zamanda 14 gün karantinada kalmak zorunda kaldım, günde 24 saat evde kaldım. Bu durumu en iyi şekilde değerlendirmeye karar verdim ve heyecan duyduğum konularda, yani robotik ve makine öğrenimi üzerinde çalışmaya devam ettim. Ve işte böylece aXeleRate doğdu.

aXeleRate, K210 çipinde çalıştırılmak üzere YOLOv2 tabanlı nesne tespit ağlarını eğitmek ve bunları .kmodel formatına aktarmak için kişisel bir projem olarak başladı. Ayrıca görüntü sınıflandırma ağlarını eğitmem gerekiyordu. Ve bazen Raspberry Pi üzerinde Tensorflow Lite ile çıkarım yapmam gerekiyordu. Sonuç olarak, işlevselliği biraz örtüşen bir dizi bağlantısız scriptim oldu. Bu nedenle, tüm öğeleri kullanımı kolay bir pakette birleştirerek ve bonus olarak – Google Colab ile tamamen uyumlu hale getirerek bunu düzeltmeye karar verdim.

aXeleRate, donanım hızlandırması ile kenar cihazlarda bilgisayarla görme uygulamalarını (görüntü sınıflandırma, nesne tespiti, anlamsal segmentasyon) çalıştırması gereken insanlar için tasarlanmıştır. Kolay bir yapılandırma süreci vardır; yapılandırma dosyası veya yapılandırma sözlüğü (Google Colab için) aracılığıyla ve eğitim oturumu için en iyi modelin otomatik olarak gerekli dosya formatına dönüştürülmesi sağlanır. Uygun formatta verileri giriyorsunuz, eğitim scriptini başlatıyorsunuz ve geri dönüp cihazınızda dağıtıma hazır bir dönüştürülmüş model görüyorsunuz!

İşte özelliklerin hızlı bir özeti:

Ana Özellikler

  • Birden fazla bilgisayarla görme modelini destekler: nesne tespiti (YOLOv2), görüntü sınıflandırma, anlamsal segmentasyon (SegNet-basic)
  • Yukarıdaki ağ türleriyle kullanılacak farklı özellik çıkarıcıları: Full Yolo, Tiny Yolo, MobileNet, SqueezeNet, VGG16, ResNet50 ve Inception3.
  • Eğitim oturumu için en iyi modelin otomatik dönüşümü. aXeleRate uygun dönüştürücüyü otomatik olarak indirecektir.
  • Şu anda eğitilmiş model dönüşümünü destekler:.kmodel (K210), .tflite formatları. Destek planlanmaktadır:.tflite (Edge TPU), .pb (TF-TRT optimize).
  • Model sürüm kontrolü daha kolay hale getirildi. Keras model dosyaları ve dönüştürülmüş modeller proje klasöründe, eğitim tarihine göre gruplandırılmış olarak kaydedilir. Eğitim geçmişi model klasöründe .png grafik olarak kaydedilir.
  • İki çalışma modu: yerel olarak, train.py scripti ve .json yapılandırma dosyası ile ve uzaktan, Google Colab için özel olarak, modül içe aktarma ve sözlük yapılandırması ile.

Bu makalede, K210 çipi ile kullanılmak üzere bir kişi tespit modeli eğiteceğiz, M.A.R.K. mobil platformuna kurulu cyberEye kartında. M.A.R.K. (metinde MARK olarak adlandıracağım) TinkerGen eğitimi tarafından geliştirilen bir eğitim robot platformudur ve Make a Robot Kit anlamına gelir. MARK’ın geliştirilmesinde yer alıyorum ve şu anda bir Kickstarter kampanyası başlatmaya hazırlanıyoruz. MARK’ın ana özelliklerinden biri, makine öğrenimi kavramlarını ve iş akışını öğretmenler ve öğrenciler için daha şeffaf ve anlaşılır hale getirmektir.

Daha önce belirtildiği gibi, aXeleRate yerel bilgisayarda veya Google Colab’da çalıştırılabilir. Hazırlık aşamasını basitleştirdiği için Google Colab’da çalıştırmayı tercih edeceğiz.

Hadi örnek not defterini açalım.

İş akışını anlamak için hücreleri birer birer geçin. Bu örnek, aXeleRate ile birlikte gelen küçük bir veri kümesinde bir tespit ağını eğitiyor. Bir sonraki adımımızda, gerçekten faydalı bir modeli eğitmek için daha büyük bir veri kümesine ihtiyacımız var.

Hazırladığım not defterini açın. Oradaki adımları takip edin ve sonunda, birkaç saatlik eğitimden sonra Google Drive’ınıza kaydedilmiş .h5, .tflite ve .kmodel dosyalarını alacaksınız. .kmodel dosyasını indirin ve bir SD karta kopyalayın ve SD kartı ana karta takın. Bizim durumumuzda M.A.R.K. ile bu, cyberEye adında değiştirilmiş bir Maixduino versiyonudur.

MARK, öğrencilere AI ve makine öğrenimi kavramlarını tanıtmak için bir eğitim robotudur. Şimdi, az önce oluşturduğunuz özel modeli çalıştırmanın iki yolu var: Micropython kodu kullanarak veya TinkerGen’in Codecraft adlı grafik programlama ortamını kullanarak. İlk yöntem, çıkarım parametrelerini ayarlamak açısından kesinlikle daha esnekken, ikincisi daha kullanıcı dostudur.

Grafik programlama ortamını tercih ederseniz, Codecraft web sitesine gidin, https://ide.tinkergen.com ve hedef platform olarak MARK (cyberEye) seçin.

Uzantı Ekle’ye tıklayın ve Özel modelleri seçin, ardından Nesne Tespiti modeline tıklayın.

Burada SD karttaki modelin dosya adını, Codecraft arayüzünde göreceğiniz modelin gerçek adını (herhangi bir şey olabilir, ‘Kişi tespiti’ yazalım), kategori adını (kişi) ve anchor’ları girmeniz gerekecek. Anchor parametrelerini değiştirmedik, bu yüzden varsayılan olanları kullanacağız.

Bundan sonra üç yeni bloğun belirdiğini göreceksiniz. Tespit edilen nesnenin X koordinatını veren bloğu seçelim ve bunu Display…’e bağlayalım. Bunu döngünün içine koyun ve kodu MARK’a yükleyin. Ekranın ilk satırında tespit edilen kişinin etrafındaki sınırlayıcı kutunun merkezinin X koordinatını görmelisiniz. Eğer hiçbir şey tespit edilmezse -1 gösterilecektir.

Bu, grafik programlama ortamında model çıkarımını uygulamamıza izin verdi. Şimdi Micropython’a geçelim ve daha gelişmiş bir çözüm uygulayalım. MaixPy IDE’yi buradan indirin ve kurun.

Makale ile birlikte eklediğim örnek kodu açın. Kod mantığı şu şekildedir:

1) find_center() fonksiyonunda insanlar tespit edilip edilmediğini kontrol ediyoruz. Eğer insanlar bulunursa, en büyük tespit edilen sınırlayıcı kutunun merkezinin x koordinatını döndürür. Eğer insan tespit edilmezse, fonksiyon -1 döndürür.

2) Eğer find_center() fonksiyonu x koordinatını döndürürse, görüntü merkezine daha yakın olup olmadığını kontrol ederiz, sola mı yoksa sağa mı, ardından motorları buna göre kontrol ederiz.

3) Eğer find_center() fonksiyonu -1 döndürürse, kamerayla insanları bulmak için 40 derece eğim taraması yapmak için servo kullanırız.

4) Eğilim taraması sırasında insan bulamazsak, robot 2 adet 180 derece pan taraması yapar.

5) Son olarak, pan taraması hiçbir insan tespit etmezse, robot yerinde saat yönünde dönerken hala kişi tespiti yapmaya devam eder.

İşte Micropython kodunun son sonucu! Daha hızlı/sağlam hale getirmek için hala geliştirilebilir.

aXeleRate hala geliştirilmekte olan bir projedir. Zaman zaman bazı değişiklikler yapacağım ve eğer bunu faydalı bulursanız ve katkıda bulunabiliyorsanız, PR’lar çok hoş karşılanır! Yakın gelecekte, Raspberry Pi 4 üzerinde donanım hızlandırması ile/veya olmadan çıkarım hakkında başka bir video yapacağım. Bunun için başka bir WIP donanım görünümü olacak. Hangi donanım? Söyleyemem, sessiz!

Daha fazla makale ve MARK Kickstarter kampanyası hakkında güncellemeler için takipte kalın.

Grove Zero serisi, Codecraft ve yapımcılar ile STEM eğitimcileri için diğer donanımlar hakkında daha fazla bilgi için web sitemizi ziyaret edin, https://tinkergen.com/.

Gelecek sefer görüşmek üzere ve koronavirüsten uzak durun!

Kod bölümü

import sensor,image,lcd, os, time, utime
from maix_motor import Maix_motor
import KPU as kpu

def find_center():
    img = sensor.snapshot()
    img = img.resize(224,224)
    img= img.rotation_corr(z_rotation=90.0)
    a = img.pix_to_ai()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            a=img.draw_rectangle(i.rect(),color = (0, 255, 0))
            a = img.draw_string(i.x(),i.y(), classes[i.classid()], color=(255,0,0), scale=3)
            x_center = i.x()+i.w()/2
            print(x_center)
        a = lcd.display(img)
        return x_center
    else:
        a = lcd.display(img)
        return -1


def scan_pan():
    Maix_motor.motor_run(0, 0, 0)
    Maix_motor.servo_angle(2, 110)
    for i in range(0, 180, 5):
        pos = find_center()
        if pos >= 100 and pos <= 124:
            Maix_motor.servo_angle(1, 90)
            if i >= 90:
                Maix_motor.motor_right(40, 0)
                Maix_motor.motor_left(-40, 0)
                utime.sleep_ms(((i - 90) * 12))
            if i < 90:
                Maix_motor.motor_right(-40, 0)
                Maix_motor.motor_left(40, 0)
                utime.sleep_ms(((90 - i) * 12))
            Maix_motor.motor_motion(1, 1, 0)
            time.sleep(0.3)
            return True
        else:
            Maix_motor.servo_angle(1, i)


def scan_tilt():
    #Maix_motor.motor_run(0, 0, 0)
    Maix_motor.servo_angle(1, 90)
    for i in range(100, 140, 2):
        pos = find_center()
        if pos > 0:
            return True
        else:
            Maix_motor.servo_angle(2, i)

def scan_rotate():
    Maix_motor.servo_angle(1, 90)
    Maix_motor.servo_angle(2, 110)
    Maix_motor.motor_motion(1, 3, 0)
    while True:
        pos = find_center()
        if pos > 0:
            break

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)
sensor.run(1)
Maix_motor.servo_angle(1, 90)
Maix_motor.servo_angle(2, 110)
DEBUG = 0
classes = ["person"]
task = kpu.load('/sd/model_people_end.kmodel')
anchor = (0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828)
a = kpu.init_yolo2(task, 0.3, 0.3, 5, anchor)
while(True):
    x_center = find_center()
    if not DEBUG:
        if x_center >= 100 and x_center <= 124: Maix_motor.motor_motion(1, 1, 0)
        if x_center < 100 and x_center > 0: Maix_motor.motor_motion(1, 4, 0)
        if x_center > 124: Maix_motor.motor_motion(1, 3, 0)
        if x_center < 0:
            if not scan_tilt():
                scan_pan()
                if not scan_pan():
                    scan_rotate()
a = kpu.deinit(task)

Leave a Reply

Your email address will not be published. Required fields are marked *