Gradimo sistem prepoznavanja lica zasnovan na Golangu i OpenCV

Gradimo sistem prepoznavanja lica zasnovan na Golangu i OpenCV
OpenCV je knjižnica, razvita za projekte računalnega vida. Obstaja že približno 20 let. Uporabljal sem jo že v fakulteti in jo še vedno uporabljam za svoje projekte v C++ in Pythonu, saj ima dobro podporo za ta jezika.

Ko sem začel raziskovati in uporabljati Go, me je zanimalo, ali lahko uporabim OpenCV s tem jezikom. Takrat so že obstajali primeri in tutoriali za integracijo, vendar se mi je zdelo, da so preveč zapleteni. Malo kasneje sem naletel na wrapper, ki ga je ustvarila ekipa The Hybrid Group. V tem članku bom pokazal, kako začeti z GoCV in razviti preprost sistem prepoznavanja obrazov s Haarovimi kaskadami.

Skillbox priporoča: Praktični tečaj »Python razvijalec od začetka«.

Opominjamo: za vse bralce »Habra« — popust 10 000 rubljev ob vpisu na kateri koli tečaj Skillbox s promo kodo »Habr«.

Kaj boste potrebovali:

  • Go;
  • OpenCV (povezave do namestitvenega programa so spodaj);
  • spletno ali navadno video kamero.

Namestitev

Primer 1

V prvem primeru bomo poskusili ustvariti aplikacijo, ki odpre okno z prikazom video toka kamere.

Najprej je treba uvoziti knjižnice, potrebne za delo.

import (
“log”
“gocv.io/x/gocv”
)

Nato je treba ustvariti objekt VideoCapture z uporabo funkcije VideoCaptureDevice. Ta omogoča zajem video toka s pomočjo kamere. Funkcija uporablja celo število kot parameter (ki predstavlja ID naprave).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“napaka pri odpiranju spletne kamere: %v”, err)
}
defer webcam.Close()

Zdaj je treba ustvariti n-dimenzionalno matriko. Ta bo hranila slike, prebrane s kamere.

img := gocv.NewMat()
defer img.Close()

Za prikaz video toka je treba ustvariti okno — to lahko storimo s funkcijo NewWindow.

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

Sedaj preidimo na najbolj zanimiv del.

Ker video predstavlja neprekinjen tok slikovnih sličic, bomo morali ustvariti neskončno zanko za nenehno prebiranje video toka kamere. Za to potrebujemo metodo Read vrste VideoCapture. Ta bo pričakoval tip Mat (matrika, ki smo jo ustvarili zgoraj), ki bo vrnila logično vrednost, ki kaže, ali je bila sličica iz VideoCapture uspešno prebrana ali ne.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println(“Ni mogoče prebrati iz spletne kamere”)    continue
     }
.
.
.
}

Zdaj je treba prikazati sličico v ustvarjenem oknu. Pavza za prehod na naslednjo sličico — 50 ms.

window.IMShow(img)
window.WaitKey(50)

Po zagonu aplikacije se bo odprlo okno z video tokom s kamere.

Gradimo sistem prepoznavanja lica zasnovan na Golangu i OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Primer 2

V tem primere dajte vospol'zuyemsya predydushchim primerym i postroim sistemy po raspoznavaniyu lits na osnove Haar Cascades (kaskady Khaara).

Kaskady Khaara — eto kaskadnye klassifikatory, kotorye obuchayutsya na osnove tekhniki veivet Khaara. Oni analiziruyut pikseli v izobrazhenii, chtoby obnaruzhit' opredelennye prizniki. Chtoby uznat' bol'she o Haar Cascades, mozhno proyti po ssylkam nishche.

Ramka ob'ektnogo obnaruzheniya Viola-Jones
Kaskadnye klassifikatory
Haar-podobnaya osobennost'

Skachat' uzhe obuchennye kaskady možete ovde. V tekushchem primere kaskady budut ispol'zovat'sya dlya identifikatsii litsa cheloveka v fas.

Dlya togo chtoby sdelat' eto, nuzhno sozdati klassifikator i skormit' emu uzhe obuchennyy fayl (vyше dana ssylka). Ya uzhe zagruzil fayl opencv_haarcascade_frontalface_default.xml v direktoriyu, gde raspolozhena nasha programa.

harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Dlya obnaruzheniya lits na izobrazhenii nuzhno vospol'zovat'sya metodom DetectMultiScale. Eta funksziya prinimaet kadр (tip Mat), kotoryi byl tol'ko chto schitan s videopotoka kamery, i vozvrashchaet massiv tipa Rectangle. Razmer massiva predstavlyaet kolichestvo lits, kotorye klassifikator smog obnaruzhit' v kadre. Zatem, chtoby ubezhditsya, chto my vidim to, chto on nashol, daвайте proydemsya po spisku pryamoougol'nikov i vyvedem ob'ekt Rectangle na konsol', sozdav granitsu vokrug obnaruzhennogo pryamoougol'nika. Eto mozhno sdelat' pri pomoshchi funkszii Rectangle. Ona budet prinimat' Mat, schitannyy kameroy, ob'ekt Rectangle, kotoryi byl vozvrashchyon metodom DetectMultiScale, tsvet i toshchinu dlya granitsy.

for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 2)
}

Gradimo sistem prepoznavanja lica zasnovan na Golangu i OpenCV

Gradimo sistem prepoznavanja lica zasnovan na Golangu i OpenCV

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
 
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

И да, у нас все получилось! Теперь у нас есть простая система распознавания лиц, написанная на Go. В скором времени я планирую продолжить эти эксперименты и создать новые интересные вещи, сочетая Go и OpenCV.

Если вам интересно, оцените. gRPC веб-сервер, который я написал на Python и OpenCV. Он передает данные в момент обнаружения лица. Это основа для создания различных клиентов на разных языках программирования. Они смогут подключаться к серверу и считывать с него данные.

Спасибо, что прочитали статью!

Skillbox priporoča:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster