Yazar: Adrian Rosebrock
Çeviri: Wu Zhendong
Redaksiyon: Zheng Zi
Bu makale hakkında 5000 kelime , Okumanız tavsiye edilir 10+ dakika
Bu makale, neredeyse gerçek zamanlı hedef tespitine ulaşmak için Tiny-YOLO'nun Raspberry Pi ve Movidius sinir hızlandırıcı üzerinde nasıl kullanılacağını öğretir.
Bu eğitimde, Raspberry Pi ve Movidius NCS'de neredeyse gerçek zamanlı bir hedef tespit görevini tamamlamak için YOLO ve Tiny-YOLO'nun nasıl kullanılacağını öğreneceksiniz.
YOLO hedef tespiti, yakın gelecekte insanlar tarafından sıklıkla dile getirilir.Bu, en hızlı derin öğrenme hedef tespit algoritmalarından biridir.Kaldığı FPS (saniyedeki kare sayısı) göstergesi, çok fazla bilgi işlem kaynağı tüketen iki aşamadan daha iyidir. Dedektör (örneğin: Daha Hızlı R-CNN) veya bazı tek aşamalı dedektörler (örneğin: RetinaNet veya bazı SSD çeşitleri) daha yüksektir. Öyle olsa bile, YOLO'nun yüksek hızı onu Raspberry Pi'de çalıştırmak için yeterli değildir ve Movidius NCS ile bile bariz bir gelişme olmayacaktır.
YOLO'yu daha hızlı hale getirmek için, YOLO yaratıcıları Redmon ve diğerleri, YOLO mimarisinin Tiny-YOLO adlı bir varyantını tanımladılar.
Tiny-YOLO'nun işlem hızı, ağabey YOLO'nun yaklaşık% 442'sidir ve tek bir GPU'da video işlemenin yenileme hızı saniyede 244 karedir.
Tiny-YOLO, küçük model (50MB'den az) ve hızlı çıkarım hızının avantajlarına sahiptir, bu da onu Raspberry Pi, Google Coral ve NVIDIA Jetson Nano'da hedef dedektör olarak nakil için çok uygun kılar.
Bu makalenin kod indirme bağlantısını almak için "Data Pie THU" sahne arkası yanıtını "200229" başlık numarasını takip edin
Bugün Tiny-YOLO'yu nasıl kullanacağınızı ve onu Raspberry Pi'ye nasıl yerleştireceğinizi öğreneceksiniz, Movidius NCS'nin rolü ile birleştiğinde neredeyse gerçek zamanlı bir hedef tespit projesi oluşturabilir.
Bu eğitimin ilk bölümünde, YOLO ve Tiny-YOLO hedef tespitine bir göz atalım.
Daha sonra, Tiny-YOLO'yu kullanabilmeniz için Raspberry Pi ve OpenVINO ortamınızı nasıl yapılandıracağınızı anlatacağım.
Ardından, OpenVINO ortamınıza doğru bir şekilde girmek için bir kabuk komut dosyası kullanmayı içeren bu projenin dizin yapısını inceleyin.
Tüm proje yapısını anladıktan sonra, aşağıdaki içeriğe sahip bir Python betiği yerleştirmemiz gerekir:
Son olarak, tüm öğreticiyi doğrulama komut dosyasının sonuçlarıyla sonlandırıyoruz.
YOLO ve Tiny-YOLO nedir?
Şekil 1: Tiny-YOLO, COCO veri kümesi için diğer nesne dedektörlerinden daha düşük bir mAP değerine sahiptir. Bu, Tiny-YOLO'nun Raspberry Pi + Movidius NCS'nizde kullanışlı bir nesne dedektörü olabileceğini gösterir.
Tiny-YOLO, Redmon ve diğerleri tarafından 2016 yılında yayınlanan "Yalnızca Bir Kez Bakarsınız: Birleştirilmiş, Gerçek Zamanlı Nesne Algılama" adlı makalede bahsedilen "Yalnızca Bir Kez Bakarsınız" (YOLO) nesne dedektörünün bir çeşididir.
"Yalnızca Bir Kez Bakarsınız: Birleşik, Gerçek Zamanlı Nesne Algılama":
https://arxiv.org/abs/1506.02640
YOLO'nun ortaya çıkışı, Daha Hızlı R-CNN gibi iki aşamalı nesne dedektörlerinin hızını artırmaktır.
R-CNN'ler son derece doğrudur, ancak GPU üzerinde çalışırken bile hızları hala çok yavaştır. Buna karşılık, YOLO gibi tek aşamalı dedektörler çok hızlıdır ve GPU'da çalışırken gerçek zamanlı algılama sağlayabilir.
YOLO'nun dezavantajı, doğruluk oranının özellikle yüksek olmamasıdır (ve tecrübelerime göre, YOLO'nun eğitilmesi SSD'lerden ve RetinaNet'ten daha zordur).
Ek olarak, Tiny-YOLO, YOLO'nun kompakt bir versiyonudur, bu da doğruluk oranının nispeten daha düşük olduğu anlamına gelir.
Referans için Redmon ve diğerlerinin raporunda, YOLO'nun COCO kıyaslama veri setindeki haritası yaklaşık% 51-57 iken, Tiny-YOLO'nun haritası sadece% 23,7'dir ve bu "ağabeyinin" yarısından daha düşüktür.
Aslında, mAP'nin% 23'ü bazı uygulamalar için hala makul bir aralıktadır.
Genel önerim YOLO'yu "ilk deneme" için kullanmaktır:
YOLO, Tiny-YOLO veya YOLO'nun diğer sürümleri hakkında bilgi edinmek istiyorsanız, lütfen Redmon ve diğerleri tarafından 2018'de yayınlanan makaleyi okuduğunuzdan emin olun.
Şekil 2: TinyYOLO kullanarak hedef algılama için Raspberry Pi ve Movidius NCS'de OpenVINO araç setini yapılandırın
Bu eğitimdeki sonuçları yeniden oluşturmak için Raspberry Pi 4B ve Movidius NCS2 (NCS1'i desteklemez) donanımına sahip olmanız gerekir.
Bilgisayarla Görme için Raspberry Pi'nin bir versiyonunu seçmenizi ve önceden yapılandırılmış.img'yi hafıza kartınıza kopyalamanızı öneririm Bu dosya çok önemlidir ve size saatlerce gereksiz çalışma tasarrufu sağlayabilir.
"Bilgisayarla Görme için Raspberry Pi":
https://www.pyimagesearch.com/raspberry-pi-for-computer-vision/
configure.img:
https://www.pyimagesearch.com/2016/11/21/raspbian-opencv-pre-configured-and-pre-installed/
Birisi inatla Raspberry Pi ve OpenVINO'yu kendi başına yapılandırmak isterse, işte basit bir kılavuz:
BusterOS:
https://pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/
OpenVINO:
https://www.pyimagesearch.com/2016/11/21/raspbian-opencv-pre-configured-and-pre-installed/
JSON yapısını ayrıştırmak için JSON-Minify paketini sanal ortamınıza kurmanız gerekir:
$ pip json_minify yükleBu noktada, Raspberry Pi'niz normal bir OpenCV ortamına ve bir OpenVINO-OpenCV ortamına sahip olacaktır. Bu eğitim için openvino ortamını kullanmanız gerekir.
Şimdi, NCS2'nizi mavi USB 3.0 bağlantı noktasına takın (Raspberry Pi 4B yüksek hızlı bir USB 3.0 bağlantı noktasına sahiptir) ve ardından ortamınızı açmak için aşağıdaki iki yoldan birini kullanın:
Önceden yapılandırılmış Raspbian .img:
https://pyimagesearch.com/2016/11/21/raspbian-opencv-pre-configured-and-pre-installed/
Ardından OpenVINO ortamınızı etkinleştirin ve ardından basit bir komut yazın:
$ source ~ / start_openvino.sh Python 3.7, OpenCV-OpenVINO 4.1.1 bağlamaları ile başlatılıyor ...Tek satırlı komut mu yoksa iki satırlı komut mu girmeniz sizin için sorun değilse, bir terminal açıp şunu girebilirsiniz:
$ workon openvino $ kaynak ~ / openvino / bin / setupvars.shİlk komut satırı OpenVINO sanal ortamımızı etkinleştirmek için kullanılır ve ikinci komut satırı Movidius NCS ile OpenVINO arasındaki bağlantıyı kurar. (Bu adım çok önemlidir, aksi takdirde senaryonuzda problemler olacaktır)
Bu yöntemlerin her ikisi de önceden yapılandırılmış Raspbian .img komut dizimi kullanmadığınızı veya OpenVINO kurulum kılavuzunu izlemediğinizi ve OpenVINO 4.1.1'i kendiniz yüklediğinizi varsayar.
Önceden yapılandırılmış Raspbian .img:
https://pyimagesearch.com/2016/11/21/raspbian-opencv-pre-configured-and-pre-installed/
OpenVINO kurulum talimat kılavuzu:
https://pyimagesearch.com/2019/04/08/openvino-opencv-and-movidius-ncs-on-the-raspberry-pi/
uyarı:
Konsoldaki projenin yapısını kontrol etmek için ağaç komutunu kullanın:
$ ağaç --dirsfirst. config config.json intel __init __. py tinyyolo.py yoloparams.py pyimagesearch utils __init __. py conf.py __init __. py videoları test_video.mp4 yolo coco.names frozen_darknet_tinyyolov3_model.bin frozen_darknet_tinyyolov3_model.mapping frozen_darknet_tinyyolov3_model.xml Detect_realtime_tinyyolo_ncs.py6 dizinler, 13 dosyaCOCO veri seti altında eğitilen TinyYOLO modeli yolo / klasörüne yerleştirilir.
İntel / klasörü, Intel Corporation tarafından sağlanan iki sınıf içerir:
Bugün Intel tarafından sağlanan iki komut dosyası hakkında yorum yapmayacağız ve bu dosyaları kendi başınıza kontrol etmenizi öneririz.
Pyimagesearch modülümüz config.json biçimini ayrıştırmak için kullanılan Conf sınıfını içerir.
TinyYOLO'nun hedef tespitinin performansını test etmek için halka açık bir yerde yürüyen yayaların test videosu (Oxford Üniversitesi'nin resmi web sitesinden taranmış) kullanılmıştır. Videolara / klasöre kendi videolarınızı eklemenizi teşvik edin.
Bu öğreticinin bugünkü özü, Detect_realtime_tinyyolo_ncs.py dosyasıyla ilgilidir. Bu komut dosyası, video akışının her karesini gerçek zamanlı olarak çıkarabilen TinyYOLOv3 modelini içerir. Bu komut dosyası ayrıca FPS değerlendirme kriterlerini hesaplayacak ve TinyYOLOv3'ün Raspberry Pi 4B artı NCS2'nizde neredeyse gerçek zamanlı çıkarım yapıp yapamayacağını değerlendirecektir.
Şekil 3: Intelin OpenVINO Araç Seti, Intel aygıtlarında (Movidius Neural Compute Stick gibi) derin öğrenme çıkarımını optimize etmek için OpenCV ekler. Raspberry Pi ve Movidius NCS'de TinyYOLO nesne algılaması yapmak için OpenVINO kullanacağız.
Konfigürasyon değişkenlerimiz config.json dosyasında özetlenmiştir, açtığınızda aşağıdaki içeriği bulacaksınız:
{// YOLO mimari tanımı XML dosyası "xml_path" yolu: "yolo / frozen_darknet_tinyyolov3_model.xml", // YOLO ağırlıklarının yolu "bin_path": "yolo / frozen_darknet_tinyyolov3_model.bin", // COCO etiketlerini içeren dosyanın yolu "tags_path": "yolo / coco.names",Satır 3, TinyYOLOv3 yapı tanımlama dosyamızın yolunu tanımlar ve satır 6, COCO eğitim setinde TinyYOLOv3 ön eğitimi tarafından oluşturulan ağırlık yolunu belirtir.
COCO veri seti etiket adının yolu 9. satırda verilmektedir.
Tespit edilen nesneleri filtrelerken kullanılan değişkenlere bir göz atalım:
// "prob_threshold" u filtreleyen algılamalar için olasılık eşiği: 0,2, // örtüşen algılamaları filtrelemek için birleşim eşiğinin üzerinde kesişim // "iou_threshold" algılamaları: 0,15}Satır 12-16, olasılık boyutunu ve IoU eşiğini tanımlar.Daha düşük olasılığa sahip algılama nesneleri, komut dosyamız tarafından filtrelenebilir. Çok fazla yanlış tanımlanmış nesne bulursanız, eşiği artırmanız gerekebilir. Genel kurallara göre, eşiği 0,5'e ayarlamaya alışkınım.
Şimdi Tiny-YOLO hedef tespiti için komut dosyasını uygulamaya hazırız!
Detect_realtime_tinyyolo_ncs.py dosyasını dosya dizininizde açın ve aşağıdaki kodu ekleyin:
# openvino.inference_engine'dan gerekli paketleri içe aktarın openvino.inference_engine ithal IENetwork'den intel.yoloparams'dan içe aktarma TinyYOLOV3Params, intel.tinyyolo'dan TinyYOLOv3'ü içe aktarın TinyYOLOv3'ten pyimagesearch.utils içeriğinden VideoStream'i içe aktarÖncelikle 2-14 satırlarını anlayalım, esas olarak gerekli paketleri tanıtalım; daha önemli paketleri açıklayalım:
Tüm referansları hazırladıktan sonra, konfigürasyon dosyasını yüklüyoruz:
# bağımsız değişken ayrıştırıcısını oluşturun ve argumentsap = argparse.ArgumentParser () ap.add_argument ("- c", "--conf", required = True, help = "Giriş yapılandırma dosyasının yolu") ap.add_argument (" -i "," --input ", help =" girdi video dosyasının yolu ") args = vars (ap.parse_args ()) # yapılandırma dosyasını yükleconf = Conf (değiştirgeler)Bu komutların parametreleri şunları içerir:
Belirlediğimiz konfigürasyon yoluna göre, 24 numaralı hat konfigürasyonumuzu sabit diskten yüklemek için kullanılır.
Yapılandırmamız belleğe yüklendiğine göre, bir sonraki adım COCO veri kümesinin kategori etiketlerini yüklemektir:
# YOLO modelimizin eğitildiği COCO sınıf etiketlerini yükleyin ve # olası her sınıfı temsil edecek bir renk listesi başlatın # labelLABELS = open (conf) .read (). strip (). split ("\ n") np.random .seed (42) RENKLER = np.random.uniform (0, 255, size = (len (ETİKETLER), 3))29-31. Satırlar, COCO veri seti kategori etiketlerimizi yükleyin ve her etiketi farklı bir renkle ilişkilendirin. Bu renkleri daha sonra sınırlayıcı kutuyu ve kategori etiketlerini işaretlemek için kullanacağız.
Sonra, TinyYOLOv3 modelimizi Movidius NCS'ye yüklemeliyiz:
# belirtilen cihaz için eklentiyi başlat = IEPlugin (device = "MYRIAD") # Model Optimizer (.xml ve .bin dosyaları) tarafından üretilen IR'yi okuyun print ("modeller yükleniyor ...") net = IENetwork (model = conf, ağırlıklar = conf) # inputsprint hazırlayın ("girişler hazırlanıyor ...") inputBlob = next (iter (net.inputs)) # varsayılan parti boyutunu 1 olarak ayarlayın ve giriş bloblarının sayısını, kanal sayısını alın, girdinin yüksekliği ve genişliği blobnet.batch_size = 1 (n, c, h, w) = net.inputs.shapeOpenVINOnun API'sini ilk olarak çağırdığımızda, NCSnin Myriad işlemcisini başlatmak ve TinyYOLOv3ün önceden eğitilmiş modelini sabit diskten (satır 34 ila 38) yüklemektir.
Yapılması gereken bir sonraki şey:
Kamera veya video dosyası akışını başlatın:
# bir video yolu sağlanmadıysa, web kamerasına bir referans alın: bağımsız değişkenler Yok ise: print ("video akışı başlatılıyor ...") # vs = VideoStream (src = 0) .start () vs = VideoStream (usePiCamera = True ) .start () time.sleep (2.0) # Aksi takdirde, video dosyasına bir referans alın: print ("video dosyası açılıyor ...") vs = cv2.VideoCapture (os.path.abspath (args)) # loading modelini eklentiye ekleyin ve saniyedeki kare sayısını başlatın # throughput estimatorprint ("eklentiye model yükleniyor ...") execNet = plugin.load (network = net, num_requests = 1) fps = FPS (). start ()Kameradan veya videodan kare alıp almadığımızı belirlemek ve bunu uygun bir video akışına (satır 50-59) ayarlamak için -input parametresine ihtiyacımız var.
Intel OpenCV-OpenVINO uygulamasındaki bir hata nedeniyle, cv2.VideoCapture işlevini kullanırken mutlak yolu belirtmeniz gerekir. Aksi takdirde bu dosyayı işleyemez.
Notlar: -İnput parametresi sağlanmazsa, kamera etkinleştirilecektir. Varsayılan olarak, PiCamera'nız kullanılır (satır 53). Bir USB kamera kullanmayı tercih ederseniz, sadece 53. satırı ve 52. satırı açıklamanız yeterlidir.
OpenVINO API ile bir sonraki etkileşim, TinyYOLOv3'ü Movidius NCS'ye (satır 64) yüklemek ve satır 65, FPS verimini ölçmeye başlamaktır.
Bu noktada kurulum adımlarını tamamladık ve kare görüntüsünü işlemeye başlayabilir ve TinyYOLOv3 algılaması gerçekleştirebiliriz:
# video akışındaki karelerin üzerinden döngü yapın, True: # sonraki kareyi alın ve # VideoCapture veya VideoStream'den okuyorsak işleyin orig = vs.read () orig = orig, eğer args değilse None else orig # görüntülüyorsak bir video ve bir kare yakalayamadık ve sonra, bağımsız değişkenler Yok değilse ve orijinal Yok ise # videonun sonuna ulaştık: break #, maksimum genişliği 500 piksel olacak şekilde orijinal çerçeveyi yeniden boyutlandır ve ağ boyutuna # input_frame orig = imutils.resize (orig, width = 500) frame = cv2.resize (orig, (w, h)) # veri düzenini HxWxC'den CxHxW frame = frame.transpose ((2, 0, 1)) frame = frame olarak değiştirin. yeniden şekillendirme ((n, c, h, w)) # nesne algılamayı toplamak için çıkarımı başlat ve listeyi başlat # sonuç output = execNet.infer ({inputBlob: çerçeve}) nesneleri =68. satırdan gerçek zamanlı TinyYOLOv3 nesne algılama döngümüzü başlatın.
İlk olarak, ilk görüntüyü elde ederiz ve keseriz (71-86 satırları).
Ardından, nesne algılama çıkarımı gerçekleştiriyoruz (satır 90).
Satır 91, daha sonra hareket edeceğimiz nesnelerin bir listesini başlatır.
# output.items () içindeki (layerName, outBlob) için çıktı öğeleri üzerinde döngü yapın: # gerekli tinyYOLOv3'ü içeren yeni bir nesne oluşturun # parameters layerParams = TinyYOLOV3Params (net.layers.params, outBlob.shape) # çıktı bölgesini ayrıştırın nesneler + = TinyYOLOv3.parse_yolo_region (outBlob, frame.shape, orig.shape, layerParams, conf)Nesnelerin bir listesini oluşturmak için, çıktıyı çaprazlamamız, layerParams'ımızı oluşturmamız ve çıktı aralığını (94-103 satırları) ayrıştırmamız gerekir. YOLO çıktısını ayrıştırmamıza yardımcı olması için Intel tarafından sağlanan kodu kullanacağımızı lütfen unutmayın.
Hem YOLO hem de TinyYOLO, bazı yanlış tanımlanmış nesneler üretme eğilimindedir. Bu fenomeni önlemek için, daha sonra iki zayıf algılama filtresi tasarlıyoruz:
# aralıktaki i için nesnelerin her birinin üzerinde döngü (len (nesneler)): # algılanan nesnenin güvenirliğinin sıfır olup olmadığını kontrol edin, eğer # ise, bu yinelemeyi atlayın, nesneler varsa # nesnenin yoksayılması gerektiğini belirtin == 0: devam et # aralıktaki j için kalan nesneler üzerinde döngü (i + 1, len (nesneler)): # Her iki nesnenin de IoU'sunun # eşiği aşıp aşmadığını kontrol edin, eğer aşıyorsa, sonra bunun güvenirliğini ayarlayın # TinyYOLOv3.intersection_over_union (nesneler , nesneler) > conf: objects = 0 # olasılık eşiğini kullanarak nesneleri filtreleyin - eğer bir # nesne eşiğin altındaysa, onu yoksayın nesneleri =106, analiz filtresindeki nesneler arasında geçiş yapmaya başlar:
124 ve 125 satırları ikinci filtremiz içindir. Şu iki kod satırını iki kez kontrol edin:
Şimdi, bu nesneler yalnızca bizim ilgilendiğimiz nesnelerdir. Çıktı çerçeve görüntüsünü etiketlemek için sınırlayıcı kutular ve kategori etiketleri kullanacağız:
# orijinal çerçevenin yüksekliğini ve genişliğini depolayın (endY, endX) = orig.shape # nesnelerdeki obj için kalan tüm nesneler arasında döngü yapın: # algılanan nesnenin sınırlayıcı kutusunu doğrulayın, # geçersiz olmadığından emin olun obj ise sınırlayıcı kutular > endX veya obj > endY veya obj \ < 0 veya obj < 0: devam # tahmin edilen sınıf ve # ilişkili olasılık etiketinden oluşan bir etiket oluşturun = "{}: {: .2f}%". Format (LABELS, obj * 100) # etiketi yazmak için kullanılan y koordinatını hesaplayın sınırlayıcı kutu koordinatına bağlı olarak # çerçeve y = obj-15 if obj-15 > 15 else \ obj + 15 # cv2.rectangle (orig, (obj, obj), (obj, obj), COLORS, 2) cv2.putText (orig, label, (obj, y), cv2.FONT_HERSHEY_SIMPLEX, 1, COLORS, 3)Satır 128, orijinal çerçeve görüntüsünün yüksekliğini ve genişliğini çıkarır. Etiketleme için bu bilgiye ihtiyacımız var.
Sonra, filtrelenmiş nesneleri çaprazlayın. Geçiş 131 satırından başlar.
Son olarak, çıktı çerçeve görüntüsünü görüntüleyeceğiz, istatistiksel sonuçları hesaplayacağız ve pencereyi temizleyeceğiz:
# geçerli kareyi ekrana görüntüleyin ve bir kullanıcı bir tuşa basarsa kaydedin cv2.imshow ("TinyYOLOv3", orig) key = cv2.waitKey (1) ve 0xFF # "q` tuşuna basıldıysa loop if key == ord ("q"): break # FPS sayacını güncelle fps.update () # zamanlayıcıyı durdur ve FPS bilgilerini görüntüle fps.stop () print ("geçen süre: {: .2f}". format ( fps.elapsed ())) print ("yaklaşık FPS: {: .2f}". format (fps.fps ())) # video akışını durdurun ve args None ise açık windows1vs.stop () 'u kapatın. .release () cv2.destroyAllWindows ()Özetlemek gerekirse, çıktı çerçeve görüntüsünü görüntüleyin ve ardından klavyedeki q tuşuna (156-161 satırları) bastığımızda döngüden çıkacağız.
164 satır FPS hesaplayıcımızı güncelliyor.
Video dosyasında işlenecek daha fazla kare bulunmasa da veya kullanıcı q tuşuna basarsa döngüden çıkılır. 167-169 satırları, terminalinizdeki FPS istatistiklerini yazdıracaktır. 172 ve 173 satırları video akışını durduracak ve tüm GUI pencerelerini temizleyecektir.
Tiny-YOLO modelini Raspberry Pi ve Movidius NCS'de kullanmak için lütfen şunlardan emin olun:
Kaynak kodunu ve model ağırlıklarını açtıktan sonra, terminali açabilir ve aşağıdaki komutları uygulayabilirsiniz:
$ python detect_realtime_tinyyolo_ncs.py --conf config / config.json \ --input videos / test_video.mp4 modeller yükleniyor ... girdiler hazırlanıyor ... video dosyası açılıyor ... modeli eklentiye yükleniyor ... geçen süre: 199.86 yaklaşık FPS: 2,66Video kaynağı: Oxford Üniversitesi
Burada giriş video dosyasına bir yol sağlıyoruz.
Raspberry Pi, Movidius NCS ve Tiny-YOLO kombinasyonunun nesne algılama oranı 2.66FPS'dir.
Şimdi video dosyasını yüklemek yerine kamerayı kullanmayı deneyelim, -input parametresini yok sayalım.
$ python detect_realtime_tinyyolo_ncs.py --conf config / config.json modelleri yüklüyor ... girdiler hazırlanıyor ... video akışını başlatıyor ... modeli eklentiye yükleniyor ... geçen süre: 804.18 yaklaşık FPS: 4.28Kamera ile elde edilen FPS'nin daha yüksek olduğunu fark edebiliriz (yaklaşık 4,28, önceki 2,66'dan daha yüksek):
Nesne algılama için bir kamera kullanmak videodan neden daha hızlıdır?
Nedeni basit: CPU'nun videodaki kare görüntülerin kodunu çözmesi kamera akışından kare görüntüleri elde etmekten daha fazla döngü gerektirir.
Video genellikle dosya boyutunu küçültmek için belirli bir derecede sıkıştırma kullanır.
Çıktı dosyasının boyutu küçültülse de, kare görüntüsünün okunduğunda yine de sıkıştırmasının açılması gerekir - CPU'nun bu işlemi tamamlaması gerekir.
Aksine, CPU, web kamerası formatı, USB kamera veya Raspberry Pi kamera modülü aracılığıyla çerçeve görüntüleri alırken daha az iş yapacaktır, böylece komut dosyanız daha hızlı çalışacaktır.
Raspberry Pi kamera modülünü kullanırsanız, hız daha hızlı olacaktır, ancak bu bir anlam ifade etmiyor. Raspberry Pi kamera modülünü görüntülemek ve GPU akış işlemeyi (GPU derin öğrenme değil) kullanmak için kullandığınızda, Raspberry Pi çerçeve görüntülerini okuyacak ve işleyecektir ve CPU dahil olmayacaktır.
USB kamera ile Raspberry Pi kamera modülünün hızını karşılaştırmaya gelince, denemeyi size bırakıyorum.
Not: Tüm FPS istatistikleri Raspberry Pi 4B 4GB, NCS2'ye (USB3.0 ile bağlı) dayalıdır ve Raspberry Pi masaüstüne ve OpenCV GUI penceresine VNC aracılığıyla bağlanır. Başsız bir algoritma çalıştırırsanız (örneğin, GUI yok), FPS sonucunuz 0,5'ten yüksek olabilir çünkü çerçeve görüntüsünü ekranda görüntülemek için birkaç CPU döngüsü gerekir. Sonuçları karşılaştırırken lütfen bunu aklınızda bulundurun.
Tiny-YOLO, Raspberry Pi'de çok hızlı çalışsa da, doğruluk konusunda hala büyük bir sorunu olduğunu göreceğiz. Daha küçük model, aynı zamanda yeterince doğru olmadığı anlamına gelir.
Referans için, Tiny-YOLO tarafından COCO veri setinde elde edilen mAP değeri yalnızca% 23,7 iken, daha büyük YOLO modeli% 51-57 değerine ulaşabilir.
Tiny-YOLO'yu test etmek için, sonuçların bazı videolar veya resimler için iyi olduğunu ve bazılarının tamamen kullanılamaz olduğunu buldum.
Tiny-YOLO'nun sonuçları beklentilerinizi karşılamıyorsa, lütfen cesaretiniz kırılmasın, ancak bu model özel uygulamanız için uygun değildir.
Bunun yerine, aşağıdakileri içeren daha doğru nesne algılamayı deneyebilirsiniz:
Raspberry Pi gibi cihazları implante etmek için her zaman MobileNet tabanlı Tek Atış Dedektörleri (SSD'ler) kullanmanızı tavsiye ederim. Bu modeller eğitimde zorluk çekecek (hiperparametrelerin optimize edilmesi gibi), ancak bir kez kararlı olduğunuzda Model, hız ve doğruluk arasındaki bu değiş tokuşun çok değerli olduğunu görecektir.
Bu eğitimde, Raspberry Pi ve Movidius NCS'de neredeyse gerçek zamanlı nesne algılama gerçekleştirmek için Tiny-YOLO'nun nasıl kullanılacağını öğrendiniz.
Tiny-YOLO'nun 50MB'den az olduğu ve çıkarım hızının çok hızlı olduğu (GPU'da yaklaşık 244 FPS) göz önüne alındığında, bu model Raspberry Pi, Google Coral ve NVIDIA Jetson Nano'da dağıtım için çok uygundur.
Raspberry Pi ve Movidius NCS'de sonucumuz neredeyse 4,28FPS'dir.
Bu makalenin kod indirme bağlantısını almak için "Data Pie THU" sahne arkası yanıtını "200229" başlık numarasını takip edin
Eğitimdeki kodu ve önceden eğitilmiş modeli kişisel projeniz için başlangıç noktası olarak kullanmanızı ve ardından bunları ihtiyaçlarınıza göre genişletmenizi öneririm.
Orjinal başlık:
Raspberry Pi ve Movidius NCS'de YOLO ve Tiny-YOLO nesne algılama
Orijinal bağlantı:
https://www.pyimagesearch.com/2020/01/27/yolo-and-tiny-yolo-object-detection-on-the-raspberry-pi-and-movidius-ncs/
Bizimle değişim ve tartışmaları sürdürmek ve veri bilimi alanında büyük veri teknolojisi, sektördeki en son uygulamalar, konferanslar, forumlar, etkinlik bilgileri ve çeşitli etkinlikler ve faydalar dahil olmak üzere ilgili dinamikleri elde etmeye devam etmek istiyorsanız, lütfen THU hayran değişim grubuna katılmak için kodu tarayın. , Kırmızı nokta sizi bekliyor.
Editör: Huang Jiyan
Redaksiyon: Lin Yilin
Çevirmen Profili
Wu Zhendong , Bilgisayar ve Karar Verme Yüksek Lisansı, Lorraine Üniversitesi, Fransa. Şimdi bir veri bilimcisi olma yaşam boyu hedefi ile yapay zeka ve büyük veri ile ilgili çalışmalarla uğraşıyor. Jinan, Shandong'danım Ekskavatör kullanamam ama Java, Python ve PPT yazabilirim.
-Bitiş-
Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.