Durum Park alanlarını otomatik olarak bulmak için Python ve Mask R-CNN nasıl kullanılır (kaynak koduyla)

Yazar, küçük bir sorunu çözmek için derin öğrenmeyi kullanmak istedi, bu yüzden Python ve Mask R-CNN ile bir model tasarladı. Model, park yerlerini otomatik olarak algılayabilir ve müsait park yerlerini bulduktan sonra ona bir metin mesajı gönderebilir. Bu ne tür bir sao operasyonu?

Ben büyük bir şehirde yaşıyorum. Ancak birçok büyük şehirde olduğu gibi park yeri bulmak o kadar kolay değil. Park yeri hızla doluyor Kendinize ait özel bir park yeriniz olsa bile, arkadaşlarınızın park yerini bulamadıkları için uğramaları zordur.

Çözümüm, bir kamerayı pencereden dışarı çıkarmak ve ardından bir park yeri müsait olduğunda bilgisayarımın bana kısa mesaj göndermesini sağlamak için derin öğrenmeyi kullanmak:

Bu karmaşık gelebilir, ancak derin öğrenme ile pratik bir sürüm oluşturmak aslında basit ve hızlıdır. Tüm araçlar mevcuttur - sadece aletleri nerede bulacağınızı ve bir araya getireceğinizi bilmeniz gerekir.

Öyleyse, python ve derin öğrenmeyi kullanarak oldukça hassas bir park yeri bildirim sistemi oluşturmak için biraz zaman ayıralım!

Problem dökümü

Makine öğrenimi ile çözmek istediğimiz karmaşık bir sorunla karşılaştığımızda ilk adım, sorunu birkaç basit soruna ayırmaktır. Ardından, ayrıntılı ayrıştırmayı bir kılavuz olarak kullanarak, bu küçük sorunları çözmek için makine öğrenimi araç kutusundaki farklı araçları kullanabiliriz. Birkaç farklı çözümü tek bir sürece bağlayarak, bazı karmaşık şeyleri yapabilen bir sistemimiz var.

Aşağıda boş park yeri tespit süreciyle ilgili dökümüm var:

Makine öğrenimi sürecinin girdisi, sıradan bir web kamerasından gelen ve pencereden dışarı çıkan bir video akışıdır:

Kameradan alınan örnek video

Her bir video karesini iş akışı aracılığıyla, her seferinde bir kare olacak şekilde teslim edeceğiz.

Bu sürecin ilk adımı, bir video çerçevesinde olası tüm park alanlarını tespit etmektir. Açıktır ki, hangi park yerlerinin dolu olmadığını tespit etmeden önce, görüntünün hangi bölümlerinin park yeri olduğunu bilmemiz gerekiyor.

İkinci adım, videonun her karesindeki tüm araçları tespit etmektir. Bu şekilde her bir arabanın hareketini kare kare takip edebiliriz.

Üçüncü adım, şu anda hangi park yerlerinin dolu olduğunu ve hangilerinin bulunmadığını belirlemektir. Bu, ilk iki adımın sonuçlarının birleştirilmesini gerektirir.

Son adım, yeni bir park yeri göründüğünde beni bilgilendirmek. Bu, videodaki iki kare arasındaki araç pozisyonundaki değişikliğe dayanmalıdır.

Buradaki her adımda, birçok şekilde başarmak için çeşitli teknolojileri kullanabiliriz. Bu süreci inşa etmenin tek bir doğru veya yanlış yolu yoktur, ancak farklı yöntemlerin avantajları ve dezavantajları vardır.

1. Adım: Bir görüntüdeki park alanlarını tespit edin

Kameranın görüş alanı şu şekildedir:

Bu resmi taramamız ve ardından aşağıdaki gibi geçerli park alanlarının bir listesini döndürmemiz gerekiyor:

Bu şehrin sokaklarında mevcut park yerleri.

Tembel bir yol, park alanını otomatik olarak tespit etmek yerine, her bir park alanının konumunu programa manuel olarak kodlamaktır. Ancak kamerayı hareket ettirirsek veya başka bir sokakta park yeri tespit etmek istersek, park alanının konumunu tekrar manuel olarak kodlamalıyız. Bu çok zahmetli, bu yüzden park alanlarını otomatik olarak algılamanın bir yolunu bulalım.

Bir fikir, parkmetreleri aramak ve her metrenin yanında bir park yeri olduğunu varsaymaktır:

Her görüntüdeki park sayacını kontrol edin.

Ancak bu yöntem biraz karmaşıktır. Her şeyden önce, her park yerinin bir parkmetresi yoktur - aslında bizim favorimiz ücret ödemeden park yeri bulmaktır! İkinci olarak, sadece parkmetrenin yerini bilmek bize park alanının tam olarak nerede olduğunu söylemez. Bizi park alanına yaklaştırıyor.

Diğer bir fikir, yol üzerinde çizilen park işaretlerini bulmak için bir hedef tespit modeli oluşturmaktır, örneğin:

Lütfen bu küçük sarı işaretlere dikkat edin - bunlar, yolda çizilen her park alanının sınırlarıdır.

Ancak bu yöntem de çok acı vericidir. Öncelikle benim şehrimdeki park alanları o kadar küçük ki bu kadar mesafeden görmek zor, bu yüzden bilgisayarla tespit etmek zor. İkincisi, yolda birbiriyle ilgisiz çeşitli çizgiler ve işaretler var. Hangi hatların park yeri işaretleri ve hangilerinin şerit ayırma çizgileri veya kaldırım çizgileri olduğunu ayırt etmek zordur.

Zor görünen bir sorunla karşılaştığınızda, bazı teknik zorluklardan kaçınarak sorunu çözmek için farklı yöntemler kullanıp kullanamayacağınızı düşünmek için birkaç dakikanızı ayırın. Park yeri tam olarak nedir? Park yeri, araçların uzun süre park edilebileceği bir yer değil mi? Yani, belki de park yerlerini hiç kontrol etmemize gerek yok. Neden uzun süredir hareket etmeyen araçları tespit edip park alanlarına park ettiklerini varsaymıyoruz?

Yani etkili bir park alanı, hareketsiz araçların bulunduğu bir yerdir.

Burada, her arabanın sınırlayıcı kutusu aslında bir park alanıdır! Statik araçları tespit edebilirsek, park yerlerini tespit etmeye gerek yoktur.

Bu nedenle, araçları tespit edip video çerçevesinde hangi araçların hareket etmediğini belirleyebilirsek, o zaman park alanının yerini çıkarabiliriz. Yeterince basit - aracı kontrol edelim!

Araçları görüntülerde tespit edin

Bir aracı video karesinde tespit etmek, hedef tespitinde pratik bir problemdir. Görüntülerdeki nesneleri tespit etmek için birçok makine öğrenimi yöntemini kullanabiliriz. Listelediğim en yaygın kullanılan hedef tespit algoritmaları şunlardır:

  • Bir HOG (Oryantasyon Gradyanı Histogramı) nesne dedektörü eğitin ve tüm araçları bulmak için resmimizde kaydırmak için kullanın. Bu eski derin olmayan öğrenme yöntemi oldukça hızlı çalışır, ancak farklı yönlerde hareket eden araçları iyi idare etmez.
  • Bir CNN (Convolutional Neural Network) nesne dedektörü eğitin ve tüm araçlar bulunana kadar resmimizde kaydırmak için kullanın. Bu yöntem doğrudur, ancak çok verimli değildir, çünkü tüm araçları bulmak için aynı görüntüyü birçok kez taramamız gerekir. Ve farklı yönlerde hareket eden araçları kolaylıkla bulabilmesine rağmen, HOG nesne algılayıcısından çok daha fazla eğitim verisi gerektirir.
  • Mask R-CNN, Faster R-CNN veya YOLO gibi daha yeni derin öğrenme yöntemlerini kullanın. Esnek tasarım ve verimli teknikleri CNN'nin doğruluğu ile birleştirerek algılama sürecini büyük ölçüde hızlandırabilir. Modeli eğitmek için yeterli veriye sahip olduğumuz sürece, GPU üzerinde nispeten hızlı çalışabilir.

Genellikle sorunu çözmek için en basit yöntemi seçmek, en az eğitim verisini kullanmak istiyoruz ve en yeni ve en popüler algoritmalara ihtiyacımız olduğunu düşünmüyoruz. Ancak bu özel durumda, * Mask R-CNN *, nispeten yeni ve popüler bir algoritma olmasına rağmen daha makul bir seçimdir.

Mask R-CNN mimarisi, kayan bir pencere kullanmadan verimli bir hesaplama yöntemiyle görüntünün tamamındaki hedefleri tespit eder. Diğer bir deyişle, oldukça hızlı çalışır. Daha gelişmiş bir GPU ile, saniyede birkaç kare hızında yüksek çözünürlüklü videolarda hedefleri tespit edebilmeliyiz. Bu yüzden bu proje için daha uygun olmalı.

Ek olarak, Mask R-CNN, tespit edilen her nesne hakkında bize birçok bilgi sağlar. Çoğu nesne algılama algoritması yalnızca her nesnenin sınırlayıcı kutusunu döndürür. Ancak Mask R-CNN bize yalnızca her nesnenin konumunu sağlamakla kalmaz, aynı zamanda bize her nesnenin konturunu (maskesini) verir, örneğin:

Mask R-CNN'i eğitmek için tespit edilecek hedefle ilgili çok sayıda görüntüye ihtiyacımız var. Araçların bazı fotoğraflarını çekip bu resimlerde arabaları işaretleyebiliriz, ancak bu birkaç günlük çalışma alabilir. Neyse ki, arabalar çok yaygın bir tespit hedefi ve birçok kişi tespit etmek istiyor, bu yüzden birkaç kamuya açık araç veri seti var.

COCO adında çok popüler bir veri seti var ve içindeki görüntüler hedef maskelerle işaretleniyor. Bu veri setinde 12.000'den fazla araba resmi konturlanmıştır. Aşağıda, COCO veri setinden bir görüntü bulunmaktadır.

COCO veri kümesindeki konturlu görüntüler.

Bu veri seti, Mask R-CNN modelinin eğitimi için çok uygundur.

Bir hedef tespit veri kümesi oluşturmak için COCO veri kümesini kullanmak çok yaygındır, bu nedenle birçok kişi bunu yaptı ve sonuçlarını paylaştı. Dolayısıyla kendi modelimizi sıfırdan eğitmek yerine eğitilmiş bir modelle başlayabiliriz. Bu proje için, Matterport tarafından uygulanan harika açık kaynaklı Mask R-CNN'yi kullanabiliriz ve aynı zamanda eğitimli bir model sağlar.

Adres: https://github.com/matterport/Mask_RCNN

Yan not: Özelleştirilmiş Maske R-CNN'yi eğitme konusunda endişelenmenize gerek yok! Verilere açıklama eklemek zaman alıcıdır, ancak zor değildir. Mask R-CNN modelini tamamen kendi verilerinizle eğitmek istiyorsanız, bu kitaba başvurabilirsiniz:

https://www.machinelearningisfun.com/get-the-book

Önceden eğitilmiş modeli kendi kamera resmim üzerinde çalıştırırsam, aşağıdakiler algılama sonuçlarıdır:

COCO'nun varsayılan hedef tanımasından geçen görüntüler - araçlar, insanlar, trafik ışıkları ve ağaçlar.

Sadece araçları değil, trafik ışıklarını ve insanları da tanıdık. Daha komik olan ise ağaçlardan birini "saksı bitkisi" olarak tanımlaması.

Görüntüde tespit edilen her hedef için, Mask R-CNN modelinden aşağıdaki dört sonucu elde ettik:

  • Tespit edilen hedefin türü (bir tam sayı olarak). Önceden eğitilmiş COCO modeli, arabalar ve kamyonlar gibi 80 farklı ortak hedefi nasıl tespit edeceğini bilir.
  • Hedef tespiti için güven puanı. Sayı ne kadar büyükse, model hedefi o kadar doğru bir şekilde tanımlamıştır.
  • Orta hedefin sınırlayıcı kutusu X / Y piksel konumları şeklinde verilmiştir.
  • Bitmap "maskesi", sınırlayıcı kutudaki hangi piksellerin hedefin parçası olduğunu ve hangilerinin olmadığını ayırt edebilir. Maske verisi ile hedefin ana hatlarını da işaretleyebiliriz.
  • Aşağıdakiler, Matterport'un Mask R-CNN uygulamasına ve önceden eğitilmiş OpneCV modeline dayalı olarak arabanın sınırlayıcı kutusunu algılamak için python kodudur:

    işletim sistemini içe aktar numpy'yi np olarak içe aktar cv2 içe aktar mrcnn.config dosyasını içe aktar mrcnn.utils'i içe aktar mrcnn.model'den MaskRCNN içe aktarma pathlib içe aktarma yolundan # Mask-RCNN kitaplığı tarafından kullanılacak yapılandırma sınıf MaskRCNNConfig (mrcnn.config.Config): NAME = "coco_pretrained_model_config" IMAGES_PER_GPU = 1 GPU_COUNT = 1 NUM_CLASSES = 1 + 80 # COCO veri kümesinde 80 sınıf + bir arka plan sınıfı vardır DETECTION_MIN_CONFIDENCE = 0.6 # Yalnızca algılanan arabaları / kamyonları almak için Maske R-CNN algılama sonuçlarının bir listesini filtreleyin def get_car_boxes (kutular, sınıf_kutuları): car_boxes = i için numaralandırmadaki kutu (kutular): # Tespit edilen nesne bir araba / kamyon değilse, atlayın eğer class_ids içinde: car_boxes.append (kutu) dönüş np.array (car_boxes) # Projenin kök dizini ROOT_DIR = Yol (".") # Günlükleri ve eğitimli modeli kaydetmek için dizin MODEL_DIR = os.path.join (ROOT_DIR, "günlükler") # Eğitimli ağırlıklar dosyasının yerel yolu COCO_MODEL_PATH = os.path.join (ROOT_DIR, "mask_rcnn_coco.h5") # Gerekirse Sürümlerden COCO tarafından eğitilmiş ağırlıkları indirin os.path.exists değilse (COCO_MODEL_PATH): mrcnn.utils.download_trained_weights (COCO_MODEL_PATH) # Algılamanın çalıştırılacağı görüntü dizini IMAGE_DIR = os.path.join (ROOT_DIR, "resimler") # İşlemek için video dosyası veya kamera - bunu bir video dosyası yerine web kameranızı kullanmak için 0 olarak ayarlayın VIDEO_SOURCE = "test_images / parking.mp4" # Çıkarım modunda bir Maske-RCNN modeli oluşturun model = MaskRCNN (mode = "çıkarım", model_dir = MODEL_DIR, config = MaskRCNNConfig ()) # Önceden eğitilmiş modeli yükle model.load_weights (COCO_MODEL_PATH, by_name = True) # Park yerlerinin konumu parked_car_boxes = Yok # Üzerinde algılamayı çalıştırmak istediğimiz video dosyasını yükleyin video_capture = cv2.VideoCapture (VIDEO_SOURCE) # Videonun her karesi üzerinde döngü yapın video_capture.isOpened () ise: başarı, çerçeve = video_capture.read () başarı değilse: kırmak # Görüntüyü BGR renginden (OpenCV'nin kullandığı) RGB rengine dönüştürün rgb_image = çerçeve # Sonuç almak için görüntüyü Maske R-CNN modelinde çalıştırın. sonuçlar = model.detect (, ayrıntılı = 0) # Mask R-CNN, birden fazla görüntü üzerinde algılama yaptığımızı varsayar. # Algılamak için yalnızca bir görüntüyü geçtik, bu nedenle yalnızca ilk sonucu alın. r = sonuçlar # R değişkeni artık algılama sonuçlarına sahip olacaktır: # -r , algılanan her nesnenin sınırlayıcı kutusudur # -r , algılanan her nesnenin sınıf kimliğidir (türü) # -r her algılama için güven puanlarıdır # -r , algılanan her nesne için nesne maskeleridir (bu size nesnenin ana hatlarını verir) # Sonuçları yalnızca araba / kamyon sınırlayıcı kutularını alacak şekilde filtreleyin car_boxes = get_car_boxes (r , r ) print ("Video çerçevesinde bulunan arabalar:") # Çerçevedeki her kutuyu çizin car_boxes içindeki kutu için: print ("Araba:", kutu) y1, x1, y2, x2 = kutu # Kutuyu çizin cv2.rectangle (çerçeve, (x1, y1), (x2, y2), (0, 255, 0), 1) # Ekranda video karesini gösterin cv2.imshow (Video, çerçeve) # Çıkmak için q'ya basın cv2.waitKey (1) ve 0xFF == ord (q) ise: kırmak # Bittiğinde her şeyi temizle video_capture.release () cv2.destroyAllWindows ()
    Bu komut dosyasını çalıştırdığınızda, ekranda bir resim göreceksiniz. Algılanan her arabanın aşağıdaki gibi bir sınırlayıcı kutusu vardır:

    Tespit edilen her arabanın yeşil bir sınırlama kutusu vardır.

    Ayrıca algılanan araba koordinatlarının aşağıdaki gibi konsolda yazdırıldığını göreceksiniz:

    Video çerçevesinde bulunan arabalar: Araba: Araba: Araba:

    Bu adımlardan sonra görseldeki arabayı başarıyla tespit ettik.

    Boş park yerlerini tespit edin

    Her bir görüntüdeki her arabanın piksel konumunu biliyoruz. Videoda sırayla görünen birden çok çerçeveye bakarak, hangi arabaların hareket etmediğini kolayca anlayabilir ve konumlarının park yeri olduğunu varsayabiliriz. Ama bir arabanın park alanından çıktığını nasıl tespit edebiliriz?

    Sorun, resmimizdeki sınırlayıcı kutuların kısmen örtüşmesidir.

    Farklı park alanlarındaki araçlar için bile, her aracın sınırlayıcı kutuları küçük bir örtüşmeye sahip olacaktır.

    Bu nedenle, her sınırlayıcı kutunun bir park alanını temsil ettiğini varsayarsak, park alanı boş olsa bile kısmen dolu gibi görünebilir. "Çoğunlukla boş" sınırlayıcı kutuyu kontrol etmek için iki nesnenin örtüşmesini ölçmenin bir yoluna ihtiyacımız var.

    Kullanacağımız ölçüm yöntemi kesişim ve oran (IoU). IoU, iki nesne tarafından üst üste binen piksel sayısının iki nesnenin kapladığı piksel sayısına bölünmesiyle hesaplanır. bunun gibi:

    Bu bize arabanın sınırlayıcı kutusunun park boşluğunun sınırlayıcı kutusuyla ne kadar örtüştüğünü verecektir. Bununla aracın park alanında olup olmadığını kolayca belirleyebiliyoruz. IoU ölçümü 0.15 gibi çok düşükse bu, aracın park yerlerinin çoğunu gerçekten işgal etmediği anlamına gelir. Ancak endeks 0,6 gibi yüksekse, bu, arabanın park alanı alanının çoğunu kapladığı anlamına gelir, bu nedenle boşluğun dolu olduğundan emin olabiliriz.

    IoU, bilgisayarla görmede yaygın bir ölçüm yöntemi olduğundan, kullandığınız kütüphane genellikle hesaplamalarını zaten uygulamıştır. Aslında, Matterport Mask R-CNN kitaplığı onu mrcnn.utils.compute_overlaps () adında bir işlev olarak içerir, böylece bu işlevi doğrudan kullanabiliriz.

    Resimdeki park alanını temsil eden bir sınırlayıcı kutu listemiz olduğunu varsayalım. Algılanan aracın bu sınırlayıcı kutular içinde olup olmadığını kontrol etmek, bir veya iki satır kod eklemek kadar kolaydır:

    # Sonuçları yalnızca araba / kamyon sınırlayıcı kutularını alacak şekilde filtreleyin car_boxes = get_car_boxes (r , r ) # Bilinen park alanlarıyla ne kadar arabanın çakıştığını görün overlaps = mrcnn.utils.compute_overlaps (car_boxes, parking_areas) baskı (örtüşmeler)

    Sonuç şu şekildedir:

    Bu 2B dizide, her biri

    Bu iki boyutlu dizide, her satır bir park alanının sınırlayıcı kutusunu temsil eder. Benzer şekilde, her sütun, park alanının tespit edilen araçlar tarafından ne kadar işgal edildiğini temsil eder. 1,0 puanı, tamamen dolu anlamına gelir; 0,02 gibi daha düşük bir puan, aracın park boşluğuna dokunduğu, ancak alanın çoğunu kaplamadığı anlamına gelir.

    Boş park yerlerini bulmak için sadece bu dizideki her satırı kontrol etmemiz gerekiyor. Tüm sayılar sıfırsa veya çok küçükse, bu hiçbir şeyin o alanı kaplamadığı ve boş olduğu anlamına gelir!

    Ancak nesne algılamanın gerçek zamanlı videoda her zaman mükemmel şekilde çalışmadığını unutmayın. Mask R-CNN çok doğru olmasına rağmen, bazen tek bir video karesinde bir veya iki arabayı gözden kaçırır. Bu nedenle, bir park alanını boş olarak işaretlemeden önce, bir süre, belki de 5 veya 10 ardışık video karesi boyunca boş kalmasını sağlamalıyız. Bu, hedef tespit çerçevesinde kısa bir duraklama olduğu için sistemin yanlışlıkla boş bir park yeri tespit etmesini önleyecektir. Ancak, arka arkaya birkaç video karesinde en az bir ücretsiz park yerinin göründüğünü gördüğümüz sürece, metin mesajları gönderebiliriz!

    mesaj yolla

    Bu projenin son adımı, videonun ardışık karelerinde boş bir park yeri göründüğünü algıladığında bir metin mesajı hatırlatıcısı göndermektir.

    Twilio kullanarak Python'dan SMS göndermek kolaydır. Twilio, herhangi bir programlama dilinde sadece birkaç satır kodla metin mesajları göndermenize izin veren çok popüler bir API'dir. Elbette, diğer SMS servis sağlayıcılarını kullanmayı tercih ederseniz, yapabilirsiniz. Twilio ile ilgilenmiyorum. Bu sadece aklıma gelen ilk araçtı.

    Twilio'yu kullanmak için, bir deneme hesabına kaydolmanız, iki Twilio telefon numarası oluşturmanız ve ardından hesabı doğrulamanız gerekir. Ardından Twilio Python istemcisini kurmanız gerekir.

    pip3 twilio yüklemek

    Kurulum tamamlandıktan sonra, Python'da SMS göndermek için tam kod budur (bu değerleri kendi hesap ayrıntılarınızla değiştirin):

    twilio.rest import İstemcisinden # Twilio hesap ayrıntıları twilio_account_sid = Twilio SID'niz burada twilio_auth_token = Twilio Auth Simgeniz burada twilio_source_phone_number = Twilio telefon numaranız burada # Bir Twilio istemci nesnesi örneği oluşturun client = Client (twilio_account_sid, twilio_auth_token) # SMS gönder message = client.messages.create ( body = "Bu benim SMS mesajım!", from_ = twilio_source_phone_number, to = "Hedef telefon numarası buraya" )

    Betiğe SMS gönderme fonksiyonu eklemek için bu kodları içine atabiliriz. Ancak ücretsiz park yeri olan her yeni video karesinde SMS göndermemize gerek olmadığı unutulmamalıdır. Bu nedenle, metin mesajının gönderilip gönderilmediğini izlemek için bir işarete ihtiyacımız var.Bu, kısa vadede veya yeni park yeri müsait olmadan önce tekrar gönderilmemesini sağlamak içindir.

    sonuç olarak

    Bağımsız bir Python betiği oluşturmak için yukarıdaki süreçteki tüm adımları entegre edin. Kodun tamamı aşağıdaki gibidir:

    işletim sistemini içe aktar numpy'yi np olarak içe aktar cv2 içe aktar mrcnn.config dosyasını içe aktar mrcnn.utils'i içe aktar mrcnn.model'den MaskRCNN içe aktarma pathlib içe aktarma yolundan twilio.rest import İstemcisinden # Mask-RCNN kitaplığı tarafından kullanılacak yapılandırma sınıf MaskRCNNConfig (mrcnn.config.Config): NAME = "coco_pretrained_model_config" IMAGES_PER_GPU = 1 GPU_COUNT = 1 NUM_CLASSES = 1 + 80 # COCO veri kümesinde 80 sınıf + bir arka plan sınıfı vardır DETECTION_MIN_CONFIDENCE = 0.6 # Yalnızca algılanan arabaları / kamyonları almak için Maske R-CNN algılama sonuçlarının bir listesini filtreleyin def get_car_boxes (kutular, sınıf_kutuları): car_boxes = i için numaralandırmadaki kutu (kutular): # Tespit edilen nesne bir araba / kamyon değilse, atlayın eğer class_ids içinde: car_boxes.append (kutu) dönüş np.array (car_boxes) # Twilio yapılandırması twilio_account_sid = YOUR_TWILIO_SID twilio_auth_token = YOUR_TWILIO_AUTH_TOKEN twilio_phone_number = YOUR_TWILIO_SOURCE_PHONE_NUMBER destination_phone_number = THE_PHONE_NUMBER_TO_TEXT client = Client (twilio_account_sid, twilio_auth_token) # Projenin kök dizini ROOT_DIR = Yol (".") # Günlükleri ve eğitimli modeli kaydetmek için dizin MODEL_DIR = os.path.join (ROOT_DIR, "günlükler") # Eğitimli ağırlıklar dosyasının yerel yolu COCO_MODEL_PATH = os.path.join (ROOT_DIR, "mask_rcnn_coco.h5") # Gerekirse Sürümlerden COCO tarafından eğitilmiş ağırlıkları indirin os.path.exists değilse (COCO_MODEL_PATH): mrcnn.utils.download_trained_weights (COCO_MODEL_PATH) # Algılamanın çalıştırılacağı görüntü dizini IMAGE_DIR = os.path.join (ROOT_DIR, "resimler") # İşlemek için video dosyası veya kamera - bunu bir video dosyası yerine web kameranızı kullanmak için 0'a ayarlayın VIDEO_SOURCE = "test_images / parking.mp4" # Çıkarım modunda bir Maske-RCNN modeli oluşturun model = MaskRCNN (mode = "çıkarım", model_dir = MODEL_DIR, config = MaskRCNNConfig ()) # Önceden eğitilmiş modeli yükle model.load_weights (COCO_MODEL_PATH, by_name = True) # Park yerlerinin konumu parked_car_boxes = Yok # Üzerinde algılamayı çalıştırmak istediğimiz video dosyasını yükleyin video_capture = cv2.VideoCapture (VIDEO_SOURCE) # Açık bir park yeri ile arka arkaya kaç tane video karesi gördük free_space_frames = 0 # Henüz bir SMS uyarısı gönderdik mi? sms_sent = Yanlış # Videonun her karesi üzerinde döngü yapın video_capture.isOpened () ise: başarı, çerçeve = video_capture.read () başarı değilse: kırmak # Görüntüyü BGR renginden (OpenCV'nin kullandığı) RGB rengine dönüştürün rgb_image = çerçeve # Sonuç almak için görüntüyü Maske R-CNN modelinde çalıştırın. sonuçlar = model.detect (, ayrıntılı = 0) # Mask R-CNN, birden fazla görüntü üzerinde algılama yaptığımızı varsayar. # Algılamak için yalnızca bir görüntüyü geçtik, bu nedenle yalnızca ilk sonucu alın. r = sonuçlar # R değişkeni artık algılama sonuçlarına sahip olacaktır: # -r , algılanan her nesnenin sınırlayıcı kutusudur # -r , algılanan her nesnenin sınıf kimliğidir (türü) # -r her algılama için güven puanlarıdır # -r , algılanan her nesne için nesne maskeleridir (bu size nesnenin ana hatlarını verir) parked_car_boxes None ise: # Bu, videonun ilk karesidir - algılanan tüm arabaların park alanlarında olduğunu varsayalım. # Her arabanın konumunu bir park yeri kutusu olarak kaydedin ve sonraki video karesine gidin. parked_car_boxes = get_car_boxes (r , r ) Başka: # Park yerlerinin nerede olduğunu zaten biliyoruz. Şu anda boş olup olmadığını kontrol edin. # Arabaların şu anda çerçevede nerede olduğunu öğrenin car_boxes = get_car_boxes (r , r ) # Bu arabaların bilinen park alanlarıyla ne kadar örtüştüğünü görün overlaps = mrcnn.utils.compute_overlaps (parked_car_boxes, car_boxes) # Boş olanı bulana kadar hiçbir alanın boş olmadığını varsayın free_space = Yanlış # Bilinen her bir park yeri kutusu arasında döngü yapın parking_area için, zip içinde örtüşme_areleri (parked_car_boxes, örtüşmeler): # Bu park yeri için, herhangi bir araç tarafından kapsanan maksimum miktarı bulun. Resmimizde tespit edilen # araba (hangi arabanın olduğu gerçekten önemli değil) max_IoU_overlap = np.max (overlap_areas) # Park alanının sol üst ve sağ alt koordinatlarını alın y1, x1, y2, x2 = park_area # Herhangi bir arabanın üst üste gelip gelmediğini görerek park yerinin dolu olup olmadığını kontrol edin # IoU kullanarak 0,15'ten fazla max_IoU_overlap ise < 0.15: # Park alanı dolu değil! Etrafına yeşil bir kutu çizin cv2.rectangle (çerçeve, (x1, y1), (x2, y2), (0, 255, 0), 3) # En az bir açık alan gördüğümüzü işaretleyin free_space = Doğru Başka: # Park yeri hala dolu - etrafına kırmızı bir kutu çiz cv2.rectangle (çerçeve, (x1, y1), (x2, y2), (0, 0, 255), 1) # Kutunun içine IoU ölçümünü yazın font = cv2.FONT_HERSHEY_DUPLEX cv2.putText (çerçeve, f "{max_IoU_overlap: 0.2}", (x1 + 6, y2-6), yazı tipi, 0.3, (255, 255, 255)) # En az bir boşluk boşsa, kareleri saymaya başlayın # Bu, açık olan bir spotun tek bir çerçevesine bağlı olarak uyarı vermemek içindir. # Bu, komut dosyasının bir hatalı algılamada tetiklenmesini önlemeye yardımcı olur. free_space ise: free_space_frames + = 1 Başka: # Boş yer yoksa, sayımı sıfırlayın free_space_frames = 0 # Bir alan birkaç kare için boşsa, gerçekten ücretsiz olduğundan eminiz! free_space_frames ise > 10: # KULLANILABİLİR ALANI yazın !! font = cv2.FONT_HERSHEY_DUPLEX cv2.putText (çerçeve, f "MEVCUT ALAN!", (10, 150), yazı tipi, 3.0, (0, 255, 0), 2, cv2.FILLED) # Henüz bir SMS göndermediysek, gönderelim! sms_sent değilse: yazdır ("SMS GÖNDERİYOR !!!") message = client.messages.create ( body = "Park alanı aç-git git!", from_ = twilio_phone_number, to = destination_phone_number ) sms_sent = Doğru # Ekranda video karesini gösterin cv2.imshow (Video, çerçeve) # Çıkmak için q'ya basın cv2.waitKey (1) ve 0xFF == ord (q) ise: kırmak # Bittiğinde her şeyi temizle video_capture.release () cv2.destroyAllWindows ()

    Bu kodu çalıştırmak için önce python 3.6+, Matterport Mask R-CNN ve OpenCV'yi kurmanız gerekir.

    Kasıtlı olarak nispeten basit kodu sakladım. Örneğin, videonun ilk karesinde görünen herhangi bir aracın park edilmiş bir araba olduğunu varsayar. Deneyin ve kullanılabilirliğini iyileştirip iyileştiremeyeceğinizi görün.

    Diğer senaryolarda kullanmak için kodu değiştirme konusunda endişelenmeyin. Sadece modelin aradığı hedef kimliğini değiştirerek, bu kodu tamamen başka bir şeye dönüştürebilirsiniz. Örneğin, bir kayak merkezinde çalıştığınızı varsayalım. Bazı ayarlamalardan sonra, bu komut dosyasını bir eğimden snowboard atlamasını otomatik olarak algılayabilen ve harika snowboard atlama rotaları oluşturabilen bir sisteme dönüştürebilirsiniz. Veya bir vahşi yaşam sığınağında çalışıyorsanız, bu kodu vahşi zebraların sayısını saymak için bir sisteme dönüştürebilirsiniz. Tek sınır hayal gücünüzdür. Umarım eğlenirsiniz!

    Kaynak: Heart of the Machine

    Bu "taranmış" fentanil nedir?
    önceki
    Paket servisi olan kişi adresi birçok kez bulamadı
    Sonraki
    Kaynaklar En son 10 derin öğrenme algoritmasının temel noktaları ve kod analizi
    Hawaii, Asya, Çin'e en yakın deniz manzarası cenneti, ada ülkesi "Santorini" ye gitmek ister misiniz?
    Tek nefeste ağrısız iletimi anlayın
    İnsan vücudu ülkeye kaçırılan uyuşturucuları gizledi ve Ulanhot'a 4000 kilometre yol kat etti, ancak polis onu bekliyordu ...
    Bir fincan çay için sakin ol, ruhu bekle
    2018'de Asya'da seyahat edilebilecek en iyi 10 yer seçildi, Çin listede sorun değil!
    Bu hayatta görülmesi gereken bir şeftali çiçeği tarlası! Eşsiz bir özel kasaba olan Chongqing çok güzel!
    Hoşça kalın sevgili birliklerim!
    Derinlik Zarf analizine dayalı ekipman sistemi katkısının değerlendirme yöntemi
    Güneş terimlerini tek nefeste anlayın
    2500 yıldan sonra Wuzhen, Zhouzhuang'dan daha güzel ve daha sessiz. Bu Xinghua Chunyu Jiangnan'ın hayali
    Yayalar yoldan geçerlerse trafik kazalarına mahkum olabilir mi? !
    To Top