- Būtini komponentai
- TU GYVENI TIK KARTĄ
- „OpenCV“ diegimas „Raspberry Pi“
- Kitų reikalingų paketų diegimas „Raspberry Pi“
- Programos paaiškinimas
- Socialinio atstumo detektoriaus projekto testavimas
„Covid-19“ metu socialinis atstumas yra efektyvus būdas sulėtinti infekcinio viruso perdavimą. Žmonėms patariama kuo labiau sumažinti savo kontaktą, kad būtų sumažinta rizika, kad liga bus perduodama tiesioginio kontakto metu. Saugaus atstumo išlaikymas yra iššūkis daugelyje vietų, pavyzdžiui, gamyklose, bankuose, autobusų ar geležinkelio stotyse ir kt.
Taigi tęsdami ankstesnius „Corona“ saugos projektus, tokius kaip automatinis dezinfekavimo aparatas ir bekontaktis temperatūros stebėjimas, mes ketiname sukurti „ Social Distancing Detector“ sistemą naudodami „OpenCV“ ir „Raspberry Pi“. Mes naudosime „YOLO v3“ objektų aptikimo algoritmo svorius su „Deep Neural Network“ moduliu.
„Raspberry Pi“ visada yra geras pasirinkimas vaizdo apdorojimo projektams, nes jis turi daugiau atminties ir greičio nei kiti valdikliai. Anksčiau „Raspberry Pi“ naudojome kai kuriems sudėtingiems vaizdo apdorojimo projektams, pvz., Veido orientyrų aptikimui ir veido atpažinimo programoms.
Būtini komponentai
- Aviečių Pi 4
Čia mums reikia tik „RPi 4“ su jame įdiegtu „OpenCV“. „OpenCV“ čia naudojamas skaitmeniniam vaizdų apdorojimui. Dažniausios skaitmeninio vaizdo apdorojimo programos yra objektų aptikimas, veido atpažinimas ir žmonių skaitiklis.
TU GYVENI TIK KARTĄ
„YOLO“ (jūs žiūrite tik kartą) yra išmanusis „Convolution“ neuroninis tinklas (CNN), skirtas realiuoju laiku aptikti objektus. YOLOv3, naujausias objektų aptikimo algoritmo variantas, YOLO gali atpažinti 80 skirtingų objektų vaizduose ir vaizdo įrašuose, be to, jis yra labai greitas ir turi puikų tikslumą. Algoritmas pritaiko vieną neuroninį tinklą visam vaizdui, tada atskiria vaizdą į regionus ir apskaičiuoja kiekvienos srities ribų langelius ir tikimybes. Bazinis YOLO modelis gali apdoroti vaizdus realiu laiku 45 kadrų per sekundę greičiu. YOLO modelis pranoksta visus kitus aptikimo metodus, tokius kaip SSD ir R-CNN.
YOLOV3 modelį, kurį ketiname naudoti šiame projekte, galima atsisiųsti iš čia.
„OpenCV“ diegimas „Raspberry Pi“
Prieš diegiant „OpenCV“ ir kitas priklausomybes, „Raspberry Pi“ reikia visiškai atnaujinti. Norėdami atnaujinti „Raspberry Pi“ į naujausią versiją, naudokite šias komandas:
sudo apt-get atnaujinimas
Tada naudokite šias komandas, kad įdiegtumėte reikalingas „OpenCV“ diegimo „Raspberry Pi“ priklausomybes.
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
Galiausiai įdiekite „OpenCV“ į „Raspberry Pi“ naudodami toliau pateiktas komandas.
„pip3 install“ „opencv-contrib-python“ == 4.1.0.25
Jei dar nesinaudojote „OpenCV“, patikrinkite ankstesnes „OpenCV“ mokymo programas su „Raspberry pi“:
- „OpenCV“ įdiegimas į „Raspberry Pi“ naudojant „CMake“
- Veido atpažinimas realiuoju laiku naudojant „Raspberry Pi“ ir „OpenCV“
- Valstybinio numerio atpažinimas naudojant „Raspberry Pi“ ir „OpenCV“
- Minios dydžio įvertinimas naudojant „OpenCV“ ir „Raspberry Pi“
Mes taip pat sukūrėme keletą „OpenCV“ mokymo programų, pradedant pradedančiųjų lygiu.
Kitų reikalingų paketų diegimas „Raspberry Pi“
Prieš programuodami „Raspberry Pi“ socialinio atstumo detektoriui, įdiekime kitus reikalingus paketus.
„Imutils“ diegimas: „ imutils“ naudojamas norint atlikti pagrindines vaizdo apdorojimo funkcijas, tokias kaip vertimas, pasukimas, dydžio keitimas, skeletonizavimas ir „Matplotlib“ vaizdų pateikimas naudojant „OpenCV“. Norėdami įdiegti „imutils“, naudokite šią komandą:
pip3 įdiekite imutils
Programos paaiškinimas
Pilnas kodas pateikiamas puslapio pabaigoje. Čia mes paaiškiname svarbias kodo dalis, kad galėtume geriau paaiškinti.
Taigi pradėdami kodą, importuokite visas reikalingas bibliotekas, kurios bus naudojamos šiame projekte.
import numerį kaip np importuoti cv2 importuoti imutils importuoti OS importo laiką
Funkcija Check () naudojama norint apskaičiuoti atstumą tarp dviejų objektų arba dviejų taškų vaizdo kadre. Taškai a ir b žymi du rėmelio objektus. Šie du taškai naudojami apskaičiuojant Euklido atstumą tarp objektų.
def Patikrinkite (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibravimas = (a + b) / 2, jei 0 <dist <0,25 * kalibravimas: return True else: return False
Sąrankos funkcija naudojama norint nustatyti YOLO svorių, CFG failo, COCO pavadinimų failo kelius. os.path modulis naudojamas bendram kelio pavadinimo manipuliavimui. os.path.join () modulis yra os.path submodulis , naudojamas protingai sujungti vieną ar daugiau kelio komponentų. cv2.dnn.readNetFromDarknet () metodas naudojamas išsaugotiems svoriams įkelti į tinklą. Įkėlę svorius, ištraukite visų tinkle naudojamų sluoksnių sąrašą naudodami „ net.getLayerNames“ modelį.
def sąranka (yolo): visuotinis neural_net, ln, LABELS svoriai = 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, svoriai) ln = neural_net.getLayerNames () ln = - 1] i i neural_net.getUnconnectedOutLayers ()]
Vaizdo apdorojimo funkcijos viduje mes paimame vieną vaizdo įrašo kadrą ir apdorojame jį socialinio atstumo nustatymui tarp kiekvieno minios žmogaus. Pirmosiose dviejose funkcijos eilutėse vaizdo kadro matmenis (W, H) iš pradžių nustatėme kaip (None, None). Kitoje eilutėje mes naudojome metodą cv2.dnn.blobFromImage () , kad įkeltume rėmelius į paketą ir paleistume juos per tinklą. „Blob“ funkcija atlieka vidutinį atimties, mastelio keitimo ir kanalo keitimą rėmelyje.
(H, W) = (Nėra, Nėra) rėmelis = image.copy (), jei W yra Nėra arba H yra Nėra: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, apkarpyti = False)
YOLO sluoksnio išvestis susideda iš verčių rinkinio. Šios vertybės padeda mums apibrėžti, kuris objektas priklauso kuriai klasei . Mes peržengiame kiekvieną sluoksnio išvesties išvestį ir aptikdami žmones nustatome klasės etiketę kaip „asmuo“. Iš kiekvieno aptikimo gauname ribojamą langelį, kuris suteikia X langelio centrą, Y centrą, plotį ir aukštį langeliui aptikti išvestyje:
balai = aptikimo maxi_class = np.argmax (balai) pasitikėjimas = balai, jei LABELS == "asmuo": jei pasitikėjimas> 0,5: langelis = aptikimas * np.array () (centerX, centreY, plotis, aukštis) = box.astype ("int") x = int (centrasX - (plotis / 2)) y = int (centrasY - (aukštis / 2)) kontūras.append () konfidencialumas.append (plūduriuojantis (pasitikėjimas))
Po to apskaičiuokite atstumą tarp esamo langelio centro su visais kitais aptiktais langeliais. Jei ribojimo langeliai yra uždaryti, pakeiskite būseną į true.
i diapazone (len (centre)): j diapazone (len (centre)): uždaryti = patikrinti (centre, centre), jei uždaryti: pora.append (, centre]) būsena = tikroji būsena = tikrasis indeksas = 0
Kitose eilutėse aplink asmenį nupieškite stačiakampį, naudodami dėžutės matmenis, kuriuos gavome iš modelio, tada patikrinkite, ar langelis yra saugus, ar nesaugus. Jei atstumas tarp langelių yra nedidelis, dėžutės spalva bus raudona, o kita dėžutė bus žalia.
(x, y) = (kontūras, kontūras) (w, h) = (kontūras, kontūras), jei būsena == Tiesa: cv2.statočiakampis (rėmelis, (x, y), (x + w, y + h), (0, 0, 150), 2) elif statusas == Klaidingas: cv2.statiakampis (rėmelis, (x, y), (x + w, y + h), (0, 255, 0), 2)
Dabar ciklo funkcijos viduje skaitome kiekvieną vaizdo įrašo kadrą, tada apdorojame kiekvieną kadrą, kad apskaičiuotume atstumą tarp asmenų.
ret, frame = cap.read () jei ne ret: break current_img = frame.copy () current_img = imutils.resize (current_img, plotis = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 arba „frameno“ == 1): sąranka („yolo“) „ImageProcess“ (dabartinis_img) „Frame“ = apdorotas „mg“
Kitose eilutėse naudokite funkciją „ cv2.VideoWriter ()“, kad išsaugotumėte išvesties vaizdo įrašą toje vietoje, kurią nurodėme anksčiau.
jei sukūrimas yra Nėra: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Socialinio atstumo detektoriaus projekto testavimas
Kai jūsų kodas bus paruoštas, atidarykite „Pi“ terminalą ir eikite į projekto katalogą. Kodas, „Yolo“ modelis ir demonstracinis vaizdo įrašas turėtų būti tame pačiame aplanke, kaip parodyta žemiau.
Galite atsisiųsti „YoloV3“ katalogą iš čia, vaizdo įrašus iš „Pexels“ ir nukopijuoti žemiau pateiktą „Python“ kodą ir įdėti juos į tą patį katalogą, kaip parodyta aukščiau.
Kai būsite projekto kataloge, vykdydami šią komandą paleiskite kodą:
python3 detector.py
Išbandžiau šį kodą vaizdo įrašo pavyzdyje, gautame iš „Pexels“. Man FPS buvo labai lėtas, o apdoroti visą vaizdo įrašą užtruko maždaug 10–11 minučių.
Užuot naudoję vaizdo įrašą, šį kodą galite išbandyti net naudodami „Raspberry Pi“ kamerą, pakeisdami „ cv2.VideoCapture“ (įvestį) į „ cv2.VideoCapture“ (0) 98 -oje kodo eilutėje. Sužinokite daugiau apie „PiCamera“ naudojimą su „Raspberry Pi“, spustelėdami nuorodą.
Štai kaip galite naudoti „OpenCV“ su „Raspberry Pi“, kad nustatytumėte socialinius atstumo pažeidimus. Išvesties vaizdo įrašas ir kodas pateikiami žemiau: