Raspberry Pi + Movidius NCS'de hedef algılamayı tamamlamak için YOLO ve Tiny-YOLO kullanın

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.

Raspberry Pi + Movidius NCS'de hedef algılamayı tamamlamak için YOLO ve Tiny-YOLO kullanın

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:

  • OpenVINO ortamımıza girin.
  • Videodaki kare görüntülerini okuyun.
  • Gerçek zamanlıya yakın hedef tespitini tamamlamak için Raspberry Pi, Movidius NCS ve Tiny-YOLO kullanın.
  • 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:

    • Bazı durumlarda projeniz için çok uygun olabilir;
    • Uygun değilse, diğer daha doğru dedektörleri deneyebilirsiniz (Daha Hızlı R-CNN, SSD'ler, RetinaNet, vb.)

    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.

    Raspberry Pi ve OpenVINO ortamınızı yapılandırın

    Ş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 kurulum kılavuzuna göre cv adlı bir ortam oluşturun.
  • OpenVINO'nun kurulum talimatlarına göre ikinci bir ortam oluşturun ve bunu openvino olarak adlandırın. Lütfen OpenVINO 4.1.1 sürümünü indirdiğinizden emin olun (4.1.2 sürümünde çözülmemiş sorunlar var)
  • 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ükle

    Bu 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:

    • Seçenek A: Önceden yapılandırılmış Raspbian .img komut dosyasını çalıştırı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 ...
    • Seçenek B: Kombinasyon yöntemi

    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ı:

    • OpenVINO'nun bazı sürümleri mp4 formatındaki videoyu okurken bazı sorunlarla karşılaşacaktır. Bu hata Intel ekibine bildirilmiştir. Sağladığımız önceden yapılandırılmış .img dosyası Abhishek Thanki tarafından düzenlenen bir kaynak kodu ve derlenmiş OpenVINO içerir. Bu sorunla karşılaşırsanız, sorunu çözmek için lütfen Intel'i destekleyin. İster A seçeneği ister B seçeneği olsun, önceden yapılandırılmış .img betiği gereklidir.
    • NCS1, bu eğitimde bahsedilen TinyYOLO modelini desteklemez. Bu biraz anormaldir çünkü NCS2 ve NCS1 genellikle uyumludur (NCS2 yalnızca daha hızlıdır).
    • Başka uyarılar bulduğumuzda onları bu listeye ekleyeceğiz.

    Proje yapısı

    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 dosya

    COCO 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:

    • TinyYOLOv3: TinyYOLO sonuçlarının IOU (Kesişim Oranı) değerini ayrıştırmak, ölçeklendirmek ve hesaplamak için bir sınıf.
    • TinyYOLOV3Params: Bir parametre nesnesi oluşturmak için kullanılan bir sınıf.

    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.

    Profilimiz

    Ş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.

    Movidius NCS'de YOLO ve Tiny-YOLO nesne algılama komut dosyalarını dağıtın

    Ş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:

    • Openvino: Movidius NCS'mizin mantık için TinyYOLOv3'ü kullanabilmesi için IENetwork ve IEPlugin ile tanışın.
    • intel: TinyYOLOv3 ve TinyYOLOV3Params, TinyYOLOv3 sonuçlarını dönüştürmemize yardımcı olabilecek iki sınıf, Intel tarafından sağlanmaktadır.
    • imutils: VideoStream sınıfı, hızlı bir kameranın kare görüntü yakalamasını eşleştirmek için kullanılır. FPS sınıfı, kare / saniye kıyaslamasını hesaplamak için bir çerçeve sağlamak için kullanılır.
    • Konf: Bu sınıf, JSON dosyalarının ek açıklamalarını dönüştürmek için kullanılır.
    • cv2: OpenVINO, Intel aygıtları için daha uygun olan değiştirilmiş bir OpenCV sürümüdür.

    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:

    • --conf: Önceki bölümde tanıtılan giriş yapılandırma dosyasının yolu.
    • --giriş: İsteğe bağlı bir giriş video dosyası. Herhangi bir girdi dosyası belirtilmezse, komut dosyası kamerayı kullanmayı seçecektir.

    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.shape

    OpenVINOnun 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:

    • İnputBlob'umuzu hazırlayın (42. satır);
    • Toplu iş boyutunu 1 olarak ayarlayın, çünkü her seferinde bir kare işliyoruz (satır 46);
    • Girilen hacim şekli boyutunu belirleyin (satır 47).

    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:

    • Listede yalnızca güveni 0'a eşit olmayan nesnelerin saklanmasına izin veriyoruz (satır 110 ve 111).
    • IoU eşiğini geçemeyen herhangi bir nesne için, güven düzeyini 0 olarak değiştirmemiz gerekir (satır 114-120).
    • Aslında, düşük IoU'ya sahip tüm nesneler göz ardı edilecektir.

    124 ve 125 satırları ikinci filtremiz içindir. Şu iki kod satırını iki kez kontrol edin:

    • Nesne listemizi yeniden yazın;
    • Aslında, algılama olasılığı eşiğine ulaşmayan nesneleri filtreliyoruz.

    Ş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.

    • Tespit edilen nesnenin yatay ve dikey koordinatlarının orijinal görüntünün boyutunu aşıp aşmadığını kontrol edin Eğer öyleyse, tanıma sonucunu (satır 134-136) iptal edeceğiz;
    • Sınırlayıcı kutu etiketimizi oluşturun, nesnenin class_id ve güvenini (güven) ekleyin;
    • Çıktı çerçevesi görüntüsündeki sınırlayıcı kutuları ve etiketleri etiketlemek için RENKLER (satır 31'den itibaren) kullanın (145 ila 152 satırları). Sınırlayıcı kutunun üst ucu çerçeve görüntüsünün üst ucuna çok yakınsa, etiketi 145 ve 146. satırlarda yazıldığı gibi 15 piksel aşağı hareket ettirin.

    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.

    Raspberry Pi ve Movidius NCS'de YOLO ve Tiny-YOLO'nun nesne algılama sonuçları

    Tiny-YOLO modelini Raspberry Pi ve Movidius NCS'de kullanmak için lütfen şunlardan emin olun:

    • Geliştirme ortamınızı "Raspberry Pi + OpenVINO ortamınızı yapılandırma" bölümündeki talimatlara göre yapılandırın;
    • Bu eğiticide sağlanan kaynak kodu ve önceden eğitilmiş model ağırlıkları.

    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,66

    Video 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.28

    Kamera 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'nun kusurları ve sınırlamaları

    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:

    • Daha büyük, daha doğru YOLO modelleri
    • Tek Atış Dedektörleri (SSD'ler)
    • Daha hızlı R-CNN'ler
    • RetinaNet

    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.

    sonuç olarak

    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.

    RPA çağını mümkün kılan Microsoft, eğitim öncesi modeli LayoutLM hakkında genel bir belge yayınladı
    önceki
    Aradaki fark 2,3 milyona ulaşacak! Büyük veri yeteneklerinin bunlara dikkat etmesi gerekiyor
    Sonraki
    Veri analizinizin çalışmasına yardımcı olacak 7 özel Python becerisi
    2019 NLP Ansiklopedisi: Makaleler, bloglar, eğitimler ve mühendislik ilerlemesinin tümü sıralandı (bağlantılar)
    17 yaşındaki bir lise öğrencisi bağımsız olarak dünyanın en sıcak salgın izleme web sitesini geliştirdi! İdolü Jobs
    IJCAI 2020 Thanos tarzı ret, AI incelemesi daha adil mi?
    TusStar, 62 kuruluşla birlikte "Yıldız Projesi" ni başlattı
    78 yaşındaki Li Mingbo mahkemeye çıktı ve bitkin görünüyordu.Savcı 23 yıl hapis istedi
    Dayan! Gözyaşlarını silip, arkalarına bakmadan kavgaya girdiler
    Xi Jinping'in Bahar Şenliği grup ziyaretindeki konuşmasındaki dört "kalp"
    Büyük veri çağında, "anti-salgın" daha bilimsel hale getirilmeli
    Amazon'un ilk "insansız süpermarket" sisteminde bir hata var mı? ! Muhabir kıyafetlerini değiştirdi ve kamerayı aldattı
    İdari büyük veri-yerli makalelerin açılması (bağlantı ile)
    Tsinghua Üniversitesi ekibi yeni koroner pnömoni akıllı tespit ve derecelendirme sistemi geliştiriyor
    To Top