- Kinakailangan ang Mga Bahagi
- YOLO
- Pag-install ng OpenCV sa Raspberry Pi
- Pag-install ng iba pang Mga Kinakailangan na Packages sa Raspberry Pi
- Paliwanag sa Programa
- Pagsubok sa Proyekto ng Social Distance Detector
Sa oras ng Covid-19, ang Social-distancing ay isang mabisang paraan upang mabagal ang paghahatid ng nakahahawang virus. Pinayuhan ang mga tao na i-minimize ang kanilang pakikipag-ugnay sa bawat isa upang mabawasan ang peligro ng sakit na maihawa sa pamamagitan ng direktang pakikipag-ugnay. Ang pagpapanatili ng isang ligtas na distansya ay isang hamon para sa maraming mga lugar tulad ng mga pabrika, bangko, bus o istasyon ng riles, atbp.
Kaya't sa pagpapatuloy ng aming nakaraang mga proyekto sa kaligtasan ng Corona tulad ng Awtomatikong sanitizer machine at walang contact na pagsubaybay sa temperatura, dito magtatayo kami ng isang sistema ng Social Distancing Detector gamit ang OpenCV at Raspberry Pi. Gagamitin namin ang mga timbang ng YOLO v3 Object Detection Algorithm kasama ang module ng Deep Neural Network.
Ang Raspberry Pi ay palaging isang mahusay na pagpipilian para sa mga proyekto sa pagproseso ng Imahe dahil mayroon itong higit na memorya at bilis kaysa sa iba pang mga Controller. Ginamit namin dati ang Raspberry Pi para sa ilang mga kumplikadong proyekto sa pagproseso ng imahe tulad ng pagtuklas ng landmark ng mukha at application ng pagkilala sa Mukha.
Kinakailangan ang Mga Bahagi
- Raspberry Pi 4
Dito kailangan lang namin ng RPi 4 na naka-install ang OpenCV dito. Ginagamit ang OpenCV dito para sa pagproseso ng digital na imahe. Ang pinakakaraniwang mga application ng Digital Image Processing ay ang pagtuklas ng object, Pagkilala sa Mukha, at counter ng mga tao.
YOLO
Ang YOLO (Tumingin Ka Nang Minsan) ay isang matalinong Convolution neural network (CNN) para sa real-time na Pagtuklas ng Bagay. Ang YOLOv3, ang pinakabagong variant ng object ng pagtuklas ng algorithm, makikilala ng YOLO ang 80 magkakaibang mga bagay sa mga imahe at video, at napakabilis at may mahusay na kawastuhan. Ang algorithm ay naglalapat ng isang solong neural network sa buong imahe, pagkatapos ay pinaghihiwalay ang imahe sa mga rehiyon at kinakalkula ang mga kahon ng hangganan at mga posibilidad para sa bawat lugar. Ang modelo ng Base YOLO ay maaaring magproseso ng mga imahe nang real-time sa 45 mga frame bawat segundo. Daig ng modelo ng YOLO ang lahat ng iba pang mga pamamaraan ng pagtuklas tulad ng SSD at R-CNN.
Ang modelo ng YOLOV3 na gagamitin namin sa proyektong ito ay maaaring ma-download mula dito.
Pag-install ng OpenCV sa Raspberry Pi
Bago i-install ang OpenCV at iba pang mga dependency, ang Raspberry Pi ay kailangang ganap na ma-update. Gamitin ang mga utos sa ibaba upang i-update ang Raspberry Pi sa pinakabagong bersyon:
sudo apt-get update
Pagkatapos ay gamitin ang mga sumusunod na utos upang mai-install ang kinakailangang mga dependency para sa pag-install ng OpenCV sa iyong 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
Panghuli, i-install ang OpenCV sa Raspberry Pi gamit ang mga utos sa ibaba.
pip3 i-install ang opencv-contrib-python == 4.1.0.25
Kung bago ka sa OpenCV, suriin ang aming nakaraang mga tutorial sa OpenCV gamit ang Raspberry pi:
- Pag-install ng OpenCV sa Raspberry Pi gamit ang CMake
- Pagkilala sa Real-Time na Mukha kasama ang Raspberry Pi at OpenCV
- Pagkilala sa Plate ng Lisensya gamit ang Raspberry Pi at OpenCV
- Pagtatantya ng Laki ng Crowd Gamit ang OpenCV at Raspberry Pi
Lumikha din kami ng isang serye ng mga tutorial ng OpenCV na nagsisimula sa antas ng nagsisimula.
Pag-install ng iba pang Mga Kinakailangan na Packages sa Raspberry Pi
Bago i-program ang Raspberry Pi para sa detektor ng distansya sa Social, i-install natin ang iba pang kinakailangang mga pakete.
Pag-install ng mga imutil: ginagamit ang mga imutil upang gawing mas madali ang mga pagpapaandar sa pagproseso ng imahe tulad ng pagsasalin, pag-ikot, pagbabago ng laki, pagbubuo ng balangkas, at pagpapakita ng mga imahe ng Matplotlib na mas madali sa OpenCV. Gamitin ang utos sa ibaba upang mai-install ang mga imutil:
pip3 i-install ang mga imutil
Paliwanag sa Programa
Ang kumpletong code ay ibinibigay sa dulo ng pahina. Narito ipinapaliwanag namin ang mga mahahalagang seksyon ng code para sa isang mas mahusay na paliwanag.
Kaya't sa pagsisimula ng code, i-import ang lahat ng kinakailangang mga aklatan na gagamitin sa proyektong ito.
i-import ang numpy bilang np i-import ang cv2 na imutil ng pag-import ng os import na oras
Ang Suriin ang () function ay ginagamit upang kalkulahin ang distansya sa pagitan ng dalawang bagay o dalawang puntos sa isang frame ng video. Ang mga puntos na a at b ay tumutukoy sa dalawang bagay sa frame. Ang dalawang puntong ito ay ginagamit upang makalkula ang Euclidean Distance sa pagitan ng mga object.
def Check (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0.5 calibration = (a + b) / 2 kung 0 <dist <0.25 * pagkakalibrate: ibalik Totoo pa: ibalik ang Mali
Ginagamit ang pagpapaandar ng pag-setup upang maitakda ang mga landas para sa mga timbang ng YOLO, cfg file, mga file ng pangalan ng COCO. os.path module ay ginagamit para sa karaniwang pagmamanipula ng pathname. Ang os.path.join () module ay isang sub-module ng os.path at ginamit upang sumali sa isa o higit pang mga bahagi ng path nang buong kaalaman. Ang pamamaraan na cv2.dnn.readNetFromDarknet () ay ginagamit upang mai-load ang mga nai-save na timbang sa network. Matapos mai- load ang mga timbang, kunin ang listahan ng lahat ng mga layer na ginamit sa isang network gamit ang isang modelo ng net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS weights = 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, weights) ln = neural_net.getLayerNames () ln = - 1] para sa i sa neural_net.getUnconnectedOutLayers ()]
Sa loob ng pag-andar ng pagproseso ng imahe, kumukuha kami ng isang solong frame ng video at pagkatapos ay iproproseso ito para sa detalyeng pag-distansya ng pagkakita sa pagitan ng bawat tao sa karamihan ng tao. Sa unang dalawang linya ng pagpapaandar, itinakda namin ang mga sukat ng frame ng video (W, H) bilang (Wala, Wala) na una. Sa susunod na linya, gumamit kami ng cv2.dnn.blobFromImage () na paraan upang mai -load ang mga frame sa isang batch at patakbuhin ang mga ito sa pamamagitan ng network. Gumagawa ang pagpapaandar ng patak ng Kahulugan na pagbabawas, Pag- scale, at pagpapalit ng Channel sa isang frame.
(H, W) = (Wala, Wala) frame = image.copy () kung W ay Wala o H ay Wala: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = Mali) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Ang mga output ng layer mula sa YOLO ay binubuo ng isang hanay ng mga halaga. Ang mga halagang ito ay makakatulong sa amin na tukuyin kung aling bagay ang kabilang sa aling klase . Inikot namin ang bawat output sa layer ng Mga output at sa pagtuklas ng mga tao, itinakda namin ang tatak ng klase bilang "tao". Mula sa bawat pagtuklas, nakakakuha kami ng isang nakatali na kahon na nagbibigay sa amin ng X center, Y center, Lapad, at Taas ng kahon para sa pagtuklas sa output:
mga marka = detection maxi_class = np.argmax (mga marka) kumpiyansa = mga marka kung LABELS == "tao": kung kumpiyansa> 0.5: kahon = pagtuklas * np.array () (centerX, centerY, lapad, taas) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (taas / 2)) outline.append () confidences.append (float (kumpiyansa))
Pagkatapos nito, kalkulahin ang distansya sa pagitan ng gitna ng kasalukuyang kahon sa lahat ng iba pang mga natukoy na kahon. Kung malapit ang mga nagbubuklod na kahon, pagkatapos ay baguhin ang katayuan sa totoo.
para sa i saklaw (len (gitna)): para sa j sa saklaw (len (gitna)): malapit = Suriin (gitna, gitna) kung malapit: pares. magdagdag (, gitna]) katayuan = Tunay na katayuan = Tunay na index = 0
Sa mga susunod na linya, gumuhit ng isang rektanggulo sa paligid ng tao gamit ang mga sukat ng kahon na natanggap namin mula sa modelo, pagkatapos suriin kung ang kahon ay ligtas o hindi ligtas. Kung ang distansya sa pagitan ng mga kahon ay malapit, pagkatapos ang kulay ng kahon ay kulay pula pula kung ang kulay ay kulay na berde.
(x, y) = (balangkas, balangkas) (w, h) = (balangkas, balangkas) kung katayuan == Totoo: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) status ng elif == Mali: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Ngayon sa loob ng pag- andar ng loop , binabasa namin ang bawat frame ng video at pagkatapos ay pinoproseso ang bawat frame upang makalkula ang distansya sa pagitan ng mga tao.
ret, frame = cap.read () kung hindi ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 kung (frameno% 2 == 0 o frameno == 1): Pag-setup (yolo) ImageProcess (kasalukuyang_img) Frame = naprosesoImg
Sa mga susunod na linya, gamitin ang function na cv2.VideoWriter () upang maiimbak ang output video sa lokasyon na tinukoy ng opname na naitala namin kanina.
kung ang likha ay Wala: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) lumikha. magsulat (Frame)
Pagsubok sa Proyekto ng Social Distance Detector
Kapag handa na ang iyong code, buksan ang isang Pi terminal at mag-navigate sa direktoryo ng proyekto. Ang code, modelo ng Yolo, at ang demo na video ay dapat na nasa parehong folder tulad ng ipinakita sa ibaba.
Maaari mong i-download ang direktoryo ng YoloV3 mula dito, mga video mula sa Pexels at kopyahin ang Python code na ibinigay sa ibaba, at ilagay ang mga ito sa parehong direktoryo tulad ng ipinakita sa itaas.
Kapag nasa direktoryo ka na ng proyekto, isagawa ang sumusunod na utos upang simulan ang code:
detektor ng python3.py
Sinubukan ko ang code na ito sa isang halimbawa ng video na nakuha mula sa Pexels. Para sa akin, ang FPS ay napakabagal at tumagal ng humigit-kumulang 10 hanggang 11 minuto upang maproseso ang buong video.
Sa halip ng paggamit ng isang video, maaari mo ring subukan ang code na ito na may isang prambuwesas Lara Camera sa pamamagitan ng pagpapalit ng cv2.VideoCapture (input) na may cv2.VideoCapture (0) sa 98 th linya ng code. Matuto nang higit pa tungkol sa paggamit ng PiCamera sa Raspberry Pi sa pamamagitan ng pagsunod sa link.
Ito ay kung paano mo magagamit ang OpenCV kasama ang Raspberry Pi upang makita ang mga paglabag sa paglayo ng panlipunan. Ang output video at code ay ibinibigay sa ibaba: