Bugünkü eğitimde, yalnızca bir Raspberry Pi 4 ve bir kamera kullanarak derin öğrenme ile güçlendirilmiş nesne tespiti kullanarak akıllı bir envanter izleyici nasıl oluşturacağınızı göstereceğim. Özel nesneleri tanımlamak için YOLOv4 tiny modelinde transfer öğrenme uygulayacağız, ardından modelin çıktısını ayrıştırmak için basit bir python betiği kullanarak her nesnenin sayısını üreteceğiz. Son olarak, envanterimizi uzaktan ve kolayca izleyebilmemiz için uygulamayı Azure IoT Central ile entegre edeceğiz.
Proje Genel Bakış
Hiç bir bakkaldan geçerken o ekstra süt kartonunu alıp almayacağınızdan emin olamadığınız oldu mu? Peki, bu bilgiyi güncellemek için buzdolabımızın içini görebilmenin bir yolu olsaydı? Bugün, makine öğrenimi ve IoT altyapıları ile bu kolaylığı gerçeğe dönüştüreceğiz.
Kısaca özetlemek gerekirse, projemizde iki ana özellik oluşturmak istiyoruz. İlk olarak, buzdolabımızdaki eşyaları otomatik olarak saymak. İkincisi, ihtiyaç duyduğumuzda verilere uzaktan erişebilmek. Başlamadan önce, aşağıdaki kısa video gösterimine bir göz atalım.

Makine Öğrenimi: Görüntü Sınıflandırma ve Nesne Tespiti
Görüntü sınıflandırma ve nesne tespiti gibi nesne tanıma görevleri derin sinir ağları ile gerçekleştirilir, ancak ikisi arasında ayrım yapmak anlamlıdır. Görüntü sınıflandırmada, girdi olarak tek bir sınıf içeren bir görüntü alırız. Örneğin, modelin tek bir çıktı olarak sınıflandırmasını istediğimiz bir kedi veya köpek fotoğrafımız olabilir.
Ancak nesne tespitinde, modelin yalnızca birden fazla nesneyi tanımlamasını değil, aynı zamanda bir fotoğrafta bulunan her sınıfın tüm örneklerini de yerini belirlemesini istiyoruz. Gerçekten de, sınıflandırmanın aksine, artık çerçevede bulunan her tür nesnenin sayısını sayabileceğiz – işte bu proje için ihtiyacımız olan şey!
Daha fazla bilgi için, Jason Brownlee’nin makalesi farklı bilgisayarla görme görevlerine harika bir giriş niteliğindedir.
Transfer Öğrenme Nedir?
Bilgisayarla görme görevleri genel olarak karmaşık görevler olarak kabul edildiğinden, işlevsel bir modeli eğitmek günler alabilir, hatta güçlü bir GPU üzerinde bile. Neyse ki, hem mimariye hem de ağırlıklara sahip olduğumuz sürece, daha önce eğitilmiş mevcut modelleri kolayca uygulayabiliriz.
Peki, modeli başka şeyleri tanımak için eğitmek istersek ne olur? Sonuçta, bu modellerin evimizin özel bakkaliye ürünlerini doğal olarak tanımalarını beklemek oldukça abartılı olurdu. Bu durumda, yeni bir modeli sıfırdan eğitmemize gerek yok. Bunun yerine, transfer öğrenme uygulayabiliriz.
Transfer öğrenme, önceden eğitilmiş bir modeli kullanarak yeni bir veri seti ile benzer bir görevi başarmak amacıyla eğitme tekniğidir. Bu, daha az veri ile modellerimizde daha yüksek performans elde etmemizi sağlarken, eğitim için gereken zaman ve kaynak miktarını da önemli ölçüde azaltır. Bugün, YOLOv4 Tiny ile transfer öğrenme gerçekleştireceğiz.
YOLO Nedir?
YOLO, “You Only Look Once” (Sadece Bir Kez Bakarsınız) anlamına gelen, nesne tespiti için son teknoloji bir sinir ağı makine öğrenimi çerçevesidir. İlk makalesi 2015 yılında yayımlandığında, çıkarım hızında diğer modelleri geride bıraktı ve bazı doğruluk kayıplarıyla gerçek zamanlı nesne tespiti sağladı. Bugün, YOLO üzerindeki çalışmalar farklı taraflarca devam etmekte ve doğruluğu artırırken düşük gecikmeyi korumaktadır.
Bugünkü projede, 4. versiyonu kullanıyoruz, YOLOv4. Daha spesifik olarak, daha küçük bir ağ boyutuna sahip olan YOLOv4’ün tiny versiyonunu kullanacağız. Daha küçük bir modelle bazı doğruluk kayıpları yaşasak da, bu, hesaplama gücü gereksinimlerini azaltarak modelin Raspberry Pi gibi bir kenar cihazında makul bir performansla çalıştırılmasını sağlar.
Özel Veri Setinizi Hazırlayın
Özel modelimizi eğitmek için ilk adım olarak, tespit etmek istediğimiz nesnelerin fotoğraflarını toplayarak veri setimizi oluşturmalıyız. Her sınıf için en az 50 görüntü almak isteyeceksiniz. Projemde süt kartonları, yumurtalar ve yoğurt paketlerinin sayısını saymayı kararlaştırdım, bu nedenle veri setim toplamda en az 150 görüntü içermelidir.
Veri setinizi toplarken bazı ipuçları:
- Genel olarak, çeşitli aydınlatma koşulları ve kamera açılarıyla görüntüler yakalayın ve nesneleri farklı yönlerde çekerek daha sağlam bir veri seti oluşturun.
- Genellikle birden fazla bulunan nesneler için, bireysel görüntülerin yanı sıra gruplar halinde olanları da dahil edin.
- Eğer bazı nesneleri, örneğin süt kartonlarını, sık sık üst üste koyuyorsanız, modelimizin buna göre öğrenebilmesi için üst üste konulmuş birkaç görüntü dahil etmelisiniz.
labelImg ile Veri Setini Etiketleyin
Bilgisayarla görme projeleri için görüntü etiketleme konusunda birçok açık kaynak aracı bulunmaktadır. Ben labelImg‘yi seçtim. Ücretsiz, açık kaynaklıdır ve aşağıdaki iki komutla kolayca kurulup çalıştırılabilir.
pip3 install labelImg
labelImg
GUI (grafik kullanıcı arayüzü) açılmalı ve görüntülerinizi etiketlemeye başlayabilirsiniz! Sol paneldeki Aç Dizin seçeneğini kullanarak görüntülerinizin bulunduğu klasörü seçin. Yüklendikten sonra, W tuşuna basarak tıklayıp sürükleyerek nesnelerinizin etrafında sınırlayıcı kutular çizmeye başlayın.
Her dosyayı kaydetmeden önce, dışa aktarma formatının Pascal VOC olduğundan emin olun; bu, görüntü ile aynı adı taşıyan bir xml dosyasına yazılmalıdır. İşiniz bittiğinde, aşağıda gördüğüm gibi birçok görüntü ve xml dosyası içeren bir klasör elde etmelisiniz.
Etiketlenmiş Verileri RoboFlow ile İşleyin
Öncelikle Roboflow’un platformunu görüntülerimizi artırmak için kullanacağız. Bunu programatik olarak kendimiz de yapabilirdik, ancak Roboflow, ileride bazı kolaylıklar sunuyor. Artırma, bilgisayarla görme veri işleme alanında, görüntülerimize döndürme, döndürme, eğme, yeniden renklendirme vb. dönüşümler uyguladığımız bir tekniktir.
Bu çok güçlüdür, çünkü her dönüşüm esasen bir yeni fotoğraf üretir. Eğer her eğitim örneğinin üç artırılmış versiyonunu oluşturursak, toplam örnek sayımız 4 katına çıkacaktır! Ayrıca, kim 200 fotoğrafı elle etiketlemek için sabırlı olabilir ki?
Başlamak için önce bir Roboflow hesabı oluşturun buradan. Ücretsiz hesap bazı sınırlamalara sahip, ancak bugünkü projemiz için yeterli olacaktır. Giriş yaptıktan sonra, Nesne Tespiti (Bounding Box) için yeni bir veri seti oluşturun. İstediğiniz gibi adlandırabilirsiniz. Benimki “Groceries” olarak adlandırdım, çünkü bu veri setini gelecekte genelleştirmenin faydalı olabileceğini düşünüyorum.
Sonra, resim ve xml dosyalarınızı yüklemek için sürükleyip bırakın. İşlemi tamamladığınızda “Yüklemeyi Tamamla” seçeneğini seçin ve Roboflow’un verileri sizin için ayırmasına izin verin. Artırma Seçenekleri altında, Yatay ve Dikey Çevirme ile birlikte -15, +15 Döndürme ekleyin. Ön işleme altında, Otomatik Yönlendirme ve Yeniden Boyutlandırma otomatik olarak yapılmış olmalıdır. Eğer değilse, aşağıda verdiğim ekran görüntüsüne bakabilirsiniz.
Sağ üst köşede, Üret’e tıklayın. İşlem tamamlandığında “YOLO Darknet” formatını ve “indirme kodunu göster” seçeneğini seçin. Ardından, bir !curl komutu ile karşılaşacaksınız. Bunu, eğitimimizin ilerleyen kısmında kullanmak üzere kaydedin.
Google Colab’da Transfer Öğrenme
Artık transfer öğrenme yapma zamanı! Bu bölüm, Roboflow’un eğitimi ve bir kan hücresi veri seti ile transfer öğrenme gerçekleştiren eşlik eden Colab defteri üzerine kuruludur.
Bu proje için, Roboflow’un defterinde bazı küçük değişiklikler yaptım, böylece kod, ücretsiz Colab kullanıcılarına varsayılan olarak sağlanan GPU ile çalışacaktır. Öncelikle defterimi Google Drive’ınıza kaydedin, böylece düzenlemeler yapabilirsiniz.
Kopyanızda, Düzenle > Defter Ayarları’na gidin ve donanım hızlandırıcı için GPU’nun seçili olduğundan emin olun. GPU mimarinizin farklı olmaması durumunda, yapmanız gereken tek diğer değişiklik “YOLOv4 için Özel Veri Seti Kurulumu” bölümündeki ilk hücre olacaktır. Son satırı önceki bölümdeki curl komutuyla değiştirin.
# Linkinizi buraya yapıştırın
%cd /content/darknet
!curl -L <YOUR LINK> > roboflow.zip; unzip roboflow.zip; rm roboflow.zip
Merak edenler için, bu defter esasen veri setimize göre YOLOv4 Tiny mimarisinde yapmamız gereken değişiklikleri otomatikleştirir. Orijinal adım adım talimatlar burada bulunabilir, ancak uzun ve yeni başlayanlar için kafa karıştırıcı olabilir.
Şimdi, hücreleri birer birer çalıştırmaya devam edin. Eğitim bir süre alacaktır, ancak bir mola vermeden önce, Google Colab çalışma zamanının sıfırlanmasının oturumdan oluşturulan tüm dosyaları sileceğini unutmayın. Evet – bu, modelin ağırlıklarını da içerir!
Önemli! Eğitim bloğu tamamlandığında, çalışma zamanı zaman aşımına uğramadan önce aşağıdakileri almayı unutmayın.
- content/darknet/backup/custom-yolov4-tiny-detector_best.weights dosyasındaki en iyi ağırlıkları kaydedin
- content/darknet/cfg içindeki custom-yolov4-tiny-detector.cfg dosyasını çıkarın
Kalan üç hücre, modelimizi test verilerimiz üzerinde test etmek için kullanılabilir. Modelin çıkarım yapması için farklı rastgele bir fotoğraf çekmek üzere son hücreyi tekrar tekrar çalıştırabilirsiniz.
Raspberry Pi ile Kenarda ML Çıkarımı
Artık özel YOLOv4 tiny modelimizi elde ettiğimize göre, bunu Raspberry Pi’mizde test etmeye geçebiliriz. Bunu yapmak için önce ortamımızı kurmamız gerekiyor. Not: Bu eğitim Raspberry Pi OS kullanmaktadır.
Adım 1: Raspberry Pi’nizde AlexeyAB’nin darknet deposunu klonlayın ve make ile derleyin.
git clone https://github.com/AlexeyAB/darknet
cd darknet
make
Adım 2: ./darknet/data/coco.names altında bulunan coco.names dosyasını düzenleyin. Herhangi bir metin düzenleyici kullanarak, bu dosyanın içindeki sınıfları özel sınıflarınızla değiştirin. Benim durumumda, aşağıdaki gibidir.
Yumurta
Süt
Yoğurt
Adım 3: Colab defterinden kaydettiğiniz ağırlıkları darknet/backup klasörüne ve custom-yolov4-tiny-detector.cfg dosyasını darknet/cfg klasörüne yerleştirin.
Adım 4: Seçtiğiniz bir test görüntüsünü “test.jpg” olarak darknet klasörüne yerleştirin ve modeli test etmek için aşağıdaki komutu çalıştırın.
./darknet detect cfg/custom-yolov4-tiny-detector.cfg backup/custom-yolov4-tiny-detector_best.weights test.jpg -dont-show
Sonuçlar komut satırı arayüzünde gösterilecektir. Harika! Çıkarım yapmanın süresinin oldukça uzun olduğunu – 7 saniyeden fazla – fark edeceksiniz. Neyse ki, buzdolabının envanterini bu kadar sık güncellemek gerekmediğinden, bu bir sorun olmayacaktır.
Ayrıca, her bir öğenin etrafında oluşturulan sınırlayıcı kutuları görebilmeniz için darknet klasöründe predictions.png dosyası da oluşturulmalıdır.
Microsoft Azure IoT Central’da Dağıtım
Elbette, şimdiye kadar yaptıklarımız uzaktan bu verilere erişemiyorsak pek faydalı olmayacaktır. Projemizin bir sonraki adımı, envanter durumumuzu periyodik olarak göndereceğimiz bir Azure IoT Central Uygulaması oluşturmaktır, böylece uzaktan izleyebiliriz. Devam etmeden önce, ücretsiz bir Microsoft Azure hesabı oluşturun buradan.
Adım 1: Azure IoT Central uygulaması oluşturun
Azure IoT Central‘a gidin. Aşağı kaydırın ve Özel bir uygulama oluştur seçeneğini seçin. Giriş yapmanız istendiğinde, aşağıdaki ekranı göreceksiniz. Bir uygulama adı ve URL seçin ve Uygulama şablonunu Özel uygulama olarak bırakın. Fiyatlandırma planı altında, şimdilik ücretsiz seçeneğini seçin. Ardından, uygulamanızı oluşturmak için devam edin.
Adım 2: Bir Cihaz Şablonu Ekleyin
Yan çubuğu kullanarak Cihaz şablonu kısmına gidin, ardından +Yeni seçeneğine tıklayın. Oradan, IoT cihazı seçin ve ardından Sonraki: Özelleştir seçeneğine tıklayın. Buradan, bir cihaz şablonu adı seçin – ben “RaspberryPi” ile devam ettim. Ardından, şablonu oluşturmak için devam edin.
Adım 3: Cihaz Şablonuna Arayüz ve Yetenekler Ekleyin
Önceki adıma göre, otomatik olarak yeni cihaz şablonunuza yönlendirilmiş olmalısınız. Özel model seçin, ardından miras alınan bir arayüz ekleyin seçeneğine tıklayın. Bir kez daha, özel seçeneğini seçin.
Bundan sonra, takip ettiğiniz öğelere göre arayüzünüze yetenekler eklemeniz gerekecek. Bunların doğru parametreler olduğundan emin olun, çünkü cihaz şablonumuzu yayımladıktan sonra değiştirilemezler. Kaydet’e tıklayın, ancak şimdilik yayımlamayın.
“`html
Adım 4: Cihaz Görünümünü Ayarlayın
Verilerimizi Azure IoT Central uygulamamızda güzel bir şekilde görselleştirmek için cihaz görünümümüzü ayarlamamız gerekiyor. Cihaz panelinde Görünümler’e gidin ve Cihazı Görselleştirme‘yi seçin.
Bunun ardından, Düzenle görünüm panelinin altında Telemetry Seç‘e tıklayın. İlk öğenizi seçin ve Karoları ekle‘ye tıklayın. Karolar sağdaki gösterge paneli önizlemenizde görünmelidir. Her bir karonun görüntü değerini “son bilinen değer” olarak değiştirin.
Toplam üç öğe için üç karo ekledim ve aşağıda gösterilen gösterge paneline ulaştım. Ayarlarınızdan memnun kaldığınızda, sayfanın üst kısmındaki Yayınla‘ya tıklayın.
Adım 5: Bir Cihaz Oluşturun
Şimdi, bir cihaz oluşturmamız gerekiyor. Cihazlar’a gidin ve + Yeni’ye tıklayın. Seçtiğiniz bir cihaz adı girin ve daha önce oluşturduğunuz cihaz şablonunu seçmeyi unutmayın. Ben “Rpi” ile devam ettim.
Yeni oluşturduğunuz cihaza tıklayın. Daha önce ayarladığınız gösterge panelini görmelisiniz, ancak herhangi bir veri gösterilmiyor. Bunu, Raspberry Pi’mizin Azure IoT Central uygulamamıza veri göndermesini sağlayarak düzelteceğiz. Ekranın sağ üst köşesindeki “Bağlan” butonuna tıklayın ve bir pencere açılmalıdır.
Adım 6: Bağlantı Anahtarını Oluşturun
Bu Azure IoT Central Bağlantı Dizesi Üretici‘yi yeni bir tarayıcı penceresinde açın. Yukarıdaki pencereden karşılık gelen verilerle boşlukları doldurun. “Cihaz Anahtarı”nın birincil anahtarı ifade ettiğini unutmayın. Son olarak, oluşturulan bağlantı dizesini daha sonra kullanmak üzere kaydedin.
Adım 7: Raspberry Pi’yi Azure IoT için Ayarlayın
Son bir adım olarak, Raspberry Pi CLI’nizde Azure IoT ile ilgili paketleri kurmak için aşağıdaki komutu çalıştırın.
sudo pip3 install azure-iot-device azure-iot-hub azure-iothub-service-client azure-iothub-device-client
Tam İş Akışını Çalıştırma
Şu ana kadar parçalarla çalışıyorduk, ama nihayet hepsini bir araya getirip makine öğrenimi destekli Akıllı Buzdolabı Envanter Takip Cihazımızı oluşturma zamanı geldi. Bu adımlara devam etmeden önce, önce Github deposuna buradan gidin ve dosyaları ZIP olarak indirin. img.txt ve parseSendData.py‘yi darknet klasörünüze yerleştirin.
1. Fotoğraf Çek
Öncelikle, Raspberry Pi’ye bağlı kamerayla bir fotoğraf çekiyoruz. Dosya, darknet klasörüne img.jpg olarak kaydedilir.
Raspberry Pi Kamera modülü için aşağıdakini kullanın. Kameranın önce raspi-config > Arayüz üzerinden etkinleştirildiğinden emin olun.
raspistill -o /darknet/img.jpg
Eğer benim gibi bir USB web kamerası kullanıyorsanız, önce fswebcam paketini kurun, ardından benzer bir şekilde fotoğraf çekebiliriz. İkinci komut, belirli bir gecikme, çerçeve atlama ve çözünürlük ile fotoğraf çeker ve darknet klasörüne img.jpg olarak yazar. Bunları tercihlerinize göre ayarlayabilirsiniz.
sudo apt-get install fswebcam
fswebcam -D 2 -S 20 -r 1920x1080 --no-banner darknet/img.jpg
2. Çalıştır ve Çıktı Sonuçlarını Kaydet
Verileri ayrıştırmak ve Azure IoT Central’a göndermek için modelin çıktısını bir metin dosyasında almamız gerekecek. Aşağıdaki komutu kullanarak img.txt’de listelenen dosyaları (sadece img.jpg) okuyacağız, nesne tespiti yapacağız ve çıktıyı result.txt’ye yazacağız.
./darknet detector test cfg/coco.data cfg/custom-yolov4-tiny-detector.cfg backup/custom-yolov4-tiny-detector_best.weights -dont_show -ext_output < img.txt > result.txt
3. Verileri Azure IoT Central’a Ayrıştır ve Gönder
Şimdi, parseSendData.py’yi açın. Bu, result.txt dosyasını ayrıştıracak, her sınıfın örneklerini sayacak ve ardından Azure IoT Central’a gönderecek basit bir Python betiğidir. Öncelikle, CONNECTION_STRING’i önceki bölümde elde ettiğiniz ile değiştirin.
CONNECTION_STRING = <Kendi dize ile değiştirin>
Ardından, anahtarları öğe sınıflarınızla değiştirerek sözlüğü güncelleyin. Lütfen, her sınıf için daha önce coco.data dosyasına yazdığınız dizeyi eşleştirmeniz gerektiğini unutmayın. Aksi takdirde, bir anahtar hatası ile karşılaşacaksınız.
Şimdi, komut satırınızdan aşağıdaki komutla Python betiğini çalıştırın:
python3 <yourpath>/parseSendData.py
Her şey yolunda giderse, aşağıdaki çıktıya benzer bir şey görmelisiniz ve betik hatasız tamamlanacaktır.
Azure IoT'a Mesaj Göndermeye Çalışılıyor
Mesaj gönderiliyor: {'Yumurta': 6, 'Süt': 1, 'Yoğurt': 2}
Mesaj Gönderildi
Azure IoT Central’daki cihaz görünümünüze geri dönün. Sayılar birkaç dakika içinde görünmelidir!
İş Akışını Otomatikleştir
Yapmamız gereken son adım, önceki bölümdeki tüm süreci bir bash betiği ile otomatikleştirmektir. Neyse ki, tüm süreci Raspberry Pi’mizde yarım saat aralıklarla otomatik olarak çalıştırmak için cron‘u kullanabiliriz.
Öncelikle, darknet klasörümüzde “workflow.sh” adında bir bash betiği oluşturuyoruz. Bir bash betiği, birlikte bir grup halinde çalıştırılabilen bir dizi konsol komutudur, böylece tek tek çalıştırılmaları gerekmez. Daha sonra, bu betiği otomatik olarak çalıştırmak için cron’u kullanacağız.
fswebcam -D 2 -S 20 -r 1920x1080 --no-banner img.jpg
./darknet detector test cfg/coco.data cfg/custom-yolov4-tiny-detector.cfg backup/custom-yolov4-tiny-detector_best.weights -dont_show -ext_output < img.txt > result.txt
python3 parseSendData.py
Ardından, betiği çalıştırılabilir hale getirmek için aşağıdaki komutu çalıştırıyoruz. Mevcut çalışma dizininizin betiğin bulunduğu darknet klasörü olduğundan emin olun.
chmod +x workflow.sh
Artık betiği çalıştırdığınızda, terminal çıktınızda tüm iş akışının otomatik ve ardışık olarak gerçekleştiğini görmelisiniz. Programımız fotoğraf çekecek, modeli çalıştıracak, verileri ayrıştıracak ve sadece bir yürütme ile Azure IoT Central’a yükleyecektir. Harika!
Bu betiğin cron ile yürütülmesini planlamak için, önce aşağıdaki komutu çalıştırarak crontab düzenleyicisini açın. Cron, Raspberry Pi OS ile önceden yüklenmiştir.
“`
crontab -e
Bir editör seçmeniz istenecek. Hangi editörü seçeceğinizi bilmiyorsanız, basit nano editörünü (ilk seçenek) seçin. Ardından, komut satırınızda bir dosya açılacak. Bu dosyaya, otomatik olarak çalışması için planlanmış komutumuzu eklememiz gerekiyor. Dosyanın en altına aşağıdakini ekleyin.
*/30 * * * * /home/pi/darknet/workflow.sh
Ve hepsi bu kadar! Raspberry Pi’nizi ve kameranızı konumlandırın, bir sonraki yarım saat işaretinde Azure IoT Central uygulamanıza veri akışını görmelisiniz.
Sonuç
Okuduğunuz için teşekkürler! Bu makalenin akıllı envanter takip projenizin oluşturulmasında yardımcı olmasını umuyorum. Kişisel kullanım için bir makine öğrenimi uygulaması oluşturmanın ne kadar erişilebilir hale geldiği gerçekten harika. IoT ve bulut entegrasyonu ile bu uygulamalar, pratik ihtiyaçları karşılamada daha da faydalı hale geliyor.
Kenarda makine öğrenimi ile ilgili daha fazla proje için aşağıdakilere göz atabilirsiniz:
- Wio Terminal ve Arduino IDE ile TinyML Öğrenin #1 Giriş
- Wio Terminal ve Arduino IDE ile TinyML Öğrenin #2 Ses Sahnesi Tanıma ve Mobil Bildirimler
- Wio Terminal ile TinyML #3 İnsan Sayma ve Azure IoT Central Entegrasyonu
- Wio Terminal ile Bir TinyML Akıllı Hava Durumu İstasyonu Oluşturun
- Wio Terminal & Edge Impulse ile El Yazısı Tanıma Oluşturun
