- Nepieciešamās sastāvdaļas
- JOLO
- OpenCV instalēšana Raspberry Pi
- Citu nepieciešamo pakotņu instalēšana Raspberry Pi
- Programmas skaidrojums
- Sociālā attāluma detektora projekta pārbaude
Covid-19 laikā sociālā distancēšanās ir efektīvs veids, kā palēnināt infekcijas vīrusa pārnešanu. Cilvēkiem ieteicams pēc iespējas samazināt kontaktu ar otru, lai samazinātu slimības pārnešanas risku tiešā kontaktā. Droša attāluma uzturēšana ir izaicinājums daudzās vietās, piemēram, rūpnīcās, bankās, autobusu vai dzelzceļa stacijās utt.
Tātad, turpinot mūsu iepriekšējos Corona drošības projektus, piemēram, automātisko sanitizer mašīnu un bezkontakta temperatūras uzraudzību, šeit mēs izveidosim Sociālās attālināšanas detektoru sistēmu, izmantojot OpenCV un Raspberry Pi. Mēs izmantosim YOLO v3 objektu noteikšanas algoritma svaru ar moduli Deep Neural Network.
Aveņu Pi vienmēr ir laba izvēle attēlu apstrādes projektiem, jo tai ir vairāk atmiņas un ātruma nekā citiem kontrolleriem. Iepriekš mēs izmantojām Raspberry Pi dažiem sarežģītiem attēlu apstrādes projektiem, piemēram, sejas orientieru noteikšanai un sejas atpazīšanas lietojumprogrammai.
Nepieciešamās sastāvdaļas
- Aveņu Pi 4
Šeit mums ir nepieciešams tikai RPi 4 ar tajā instalētu OpenCV. Digitālo attēlu apstrādei šeit tiek izmantots OpenCV. Visizplatītākās digitālās attēlu apstrādes programmas ir objektu noteikšana, sejas atpazīšana un cilvēku skaitītājs.
JOLO
YOLO (jūs skatāties tikai vienreiz) ir vieds Convolution neironu tīkls (CNN) reāllaika objektu noteikšanai. YOLOv3, objektu noteikšanas algoritma jaunākais variants, YOLO var atpazīt 80 dažādus objektus attēlos un videoklipos, turklāt tas ir ļoti ātrs un ar izcilu precizitāti. Algoritms visam attēlam piemēro vienu neironu tīklu, pēc tam atdala attēlu reģionos un aprēķina robežu rūtiņas un varbūtības katram apgabalam. Bāzes YOLO modelis var apstrādāt attēlus reāllaikā ar ātrumu 45 kadri sekundē. YOLO modelis pārspēj visas citas noteikšanas metodes, piemēram, SSD un R-CNN.
YOLOV3 modeli, kuru izmantosim šajā projektā, var lejupielādēt šeit.
OpenCV instalēšana Raspberry Pi
Pirms OpenCV un citu atkarību instalēšanas Raspberry Pi ir pilnībā jāatjaunina. Izmantojiet šīs komandas, lai atjauninātu Raspberry Pi uz jaunāko versiju:
sudo apt-get atjauninājums
Pēc tam izmantojiet šīs komandas, lai instalētu nepieciešamās atkarības OpenCV instalēšanai jūsu Raspberry Pi.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Visbeidzot, instalējiet OpenCV uz Raspberry Pi, izmantojot tālāk norādītās komandas.
pip3 instalēt opencv-contrib-python == 4.1.0.25
Ja esat jauns OpenCV lietotājs, pārbaudiet mūsu iepriekšējās OpenCV apmācības ar Raspberry pi:
- OpenCV instalēšana Raspberry Pi, izmantojot CMake
- Reāllaika sejas atpazīšana ar Raspberry Pi un OpenCV
- Valsts numura pazīšana, izmantojot Raspberry Pi un OpenCV
- Pūļa lieluma novērtēšana, izmantojot OpenCV un Raspberry Pi
Mēs esam izveidojuši arī virkni OpenCV apmācību, sākot no iesācēju līmeņa.
Citu nepieciešamo pakotņu instalēšana Raspberry Pi
Pirms Raspberry Pi programmēšanas sociālajam attāluma detektoram instalēsim citas nepieciešamās pakotnes.
Imutilu instalēšana: imutils tiek izmantots, lai ar OpenCV atvieglotu būtiskas attēlu apstrādes funkcijas, piemēram, tulkošanu, pagriešanu, izmēru maiņu, skeletonizāciju un Matplotlib attēlu parādīšanu. Lai instalētu imutils, izmantojiet zemāk esošo komandu:
instalējiet imutils
Programmas skaidrojums
Pilns kods ir norādīts lapas beigās. Šeit mēs izskaidrojam svarīgās koda sadaļas, lai iegūtu labāku skaidrojumu.
Tātad koda sākumā importējiet visas nepieciešamās bibliotēkas, kuras tiks izmantotas šajā projektā.
importēt numpy kā np importēt cv2 importēt imutils importēt os importēšanas laiku
Funkcija Pārbaudīt () tiek izmantota, lai aprēķinātu attālumu starp diviem objektiem vai diviem punktiem video kadrā. Punkti a un b apzīmē divus objektus rāmī. Šie divi punkti tiek izmantoti, lai aprēķinātu Eiklida attālumu starp objektiem.
def Pārbaudiet (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrēšana = (a + b) / 2, ja 0 <dist <0,25 * kalibrēšana: atgriešanās Patiesais cits: atgriešanās Nepatiesais
Iestatīšanas funkciju izmanto, lai iestatītu YOLO svaru, cfg faila, COCO nosaukuma ceļu ceļus. os.path modulis tiek izmantots kopīgai ceļa nosaukuma manipulācijai. os.path.join () modulis ir os.path apakšmodulis, ko izmanto, lai saprātīgi savienotu vienu vai vairākus ceļa komponentus. Lai ielādētu saglabātos svarus tīklā, tiek izmantota metode cv2.dnn.readNetFromDarknet () . Pēc svaru ielādes iegūstiet visu tīklā izmantoto slāņu sarakstu, izmantojot modeli net.getLayerNames .
def iestatīšana (yolo): globālais neironu tīkls, ln, LABELS svari = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath). read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, svari) ln = neural_net.getLayerNames () ln = - 1] i i neural_net.getUnconnectedOutLayers ()]
Attēlu apstrādes funkcijas ietvaros mēs uzņemam vienu video kadru un pēc tam apstrādājam to, lai noteiktu sociālo distancēšanos starp katru cilvēku pūlī. Funkcijas pirmajās divās rindiņās sākotnēji video kadra izmērus (W, H) iestatījām kā (None, None). Nākamajā rindā mēs izmantojām metodi cv2.dnn.blobFromImage (), lai ielādētu rāmjus sērijā un palaistu tos caur tīklu. Blob funkcija veic vidējo atņemšanu, mērogošanu un kanāla maiņu uz rāmja.
(H, W) = (Neviens, Nav) rāmis = image.copy (), ja W nav Neviens vai H nav None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (lāse) starttime = time.time () layerOutputs = neural_net.forward (ln)
Slāņa izvade no YOLO sastāv no vērtību kopas. Šīs vērtības palīdz mums noteikt, kurš objekts pieder kādai klasei . Mēs turpinām pār katru izeju slānī Output un, atklājot cilvēkus, klases etiķeti iestatām kā “persona”. No katras noteikšanas mēs iegūstam norobežojošo lodziņu, kas dod mums X lodziņa centru, Y centru, platumu un lodziņa augstumu atklāšanai:
rādītāji = noteikšanas maxi_class = np.argmax (rādītāji) pārliecība = rādītāji, ja LABELS == "persona": ja pārliecība> 0,5: lodziņš = noteikšana * np.array () (centerX, centerY, platums, augstums) = box.astype "int") x = int (centrsX - (platums / 2)) y = int (centrsY - (augstums / 2)) kontūra.append () konfidenciāla informācija. pievienojiet (pludiņš (pārliecība))
Pēc tam aprēķiniet attālumu starp pašreizējās lodziņa centru ar visām pārējām atklātajām rūtiņām. Ja ierobežojošās rūtiņas ir tuvu, nomainiet statusu uz true.
i diapazonā (len (centrs)): j diapazonā (len (centrs)): aizvērt = pārbaudīt (centrs, centrs), ja tuvs: pāri. append (, centrs]) statuss = patiess statuss = patiess indekss = 0
Nākamajās rindiņās zīmējiet taisnstūri ap personu, izmantojot kastes izmērus, ko saņēmām no modeļa, pēc tam pārbaudiet, vai rūtiņa ir droša vai nedroša. Ja attālums starp lodziņiem ir tuvu, lodziņa krāsa būs sarkanā krāsā, pretējā gadījumā lodziņš būs zaļš.
(x, y) = (kontūra, kontūra) (w, h) = (kontūra, kontūra), ja statuss == True: cv2. taisnstūris (rāmis, (x, y), (x + w, y + h), (0, 0, 150), 2) elif statuss == Nepatiesa: cv2. taisnstūris (rāmis, (x, y), (x + w, y + h), (0, 255, 0), 2)
Tagad cilpa funkcijas iekšpusē mēs lasām katru video kadru un pēc tam apstrādājam katru kadru, lai aprēķinātu attālumu starp personām.
ret, frame = cap.read () ja nav ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 vai frameno == 1): iestatīšana (yolo) ImageProcess (current_img) rāmis = processingImg
Nākamajās rindās izmantojiet funkciju cv2.VideoWriter (), lai saglabātu izvades video vietā, kuru norādījām iepriekš nosauktajā opname.
ja izveidot nav None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Sociālā attāluma detektora projekta pārbaude
Kad kods ir gatavs, atveriet Pi termināli un dodieties uz projekta direktoriju. Kodam, Yolo modelim un demonstrācijas videoklipam jābūt tajā pašā mapē, kā parādīts zemāk.
Šeit varat lejupielādēt YoloV3 direktoriju, video no Pexels un nokopēt zemāk norādīto Python kodu un ievietot tos tajā pašā direktorijā, kā parādīts iepriekš.
Kad esat projekta direktorijā, izpildiet šo komandu, lai sāktu kodu:
python3 detector.py
Es izmēģināju šo kodu video piemērā, kas tika iegūts no Pexels. Man FPS bija ļoti lēns, un visa videoklipa apstrāde aizņēma apmēram 10 līdz 11 minūtes.
Tā vietā, izmantojot video, jūs pat varat pārbaudīt šo kodu ar Raspberry Pi Camera aizstājot cv2.VideoCapture (ievade) ar cv2.VideoCapture (0) in 98 th rindiņu kodu. Uzziniet vairāk par PiCamera lietošanu ar Raspberry Pi, sekojot saitei.
Tas ir veids, kā jūs varat izmantot OpenCV ar Raspberry Pi, lai atklātu sociālās distancēšanas pārkāpumus. Izejas video un kods ir norādīts zemāk: