Sejas atpazīšanas sistēmas izveide, pamatojoties uz Golang un OpenCV

Sejas atpazīšanas sistēmas izveide, pamatojoties uz Golang un OpenCV
OpenCV ir bibliotēka, kas paredzēta datorredzes projektiem. Viņai jau ir kādi 20 gadi. Es to izmantoju koledžā un joprojām izmantoju savos C++ un Python projektos, jo tam ir labs atbalsts šīm valodām.

Bet, kad sāku mācīties un lietot Go, sāku interesēties, vai OpenCV var izmantot darbam ar šo valodu. Toreiz jau bija piemēri un pamācības par integrāciju, bet man šķita, ka tās ir pārāk sarežģītas. Nedaudz vēlāk uzgāju The Hybrid Group komandas radīto iesaiņojumu. Šajā rakstā es jums parādīšu, kā sākt darbu ar GoCV, izstrādājot vienkāršu sejas atpazīšanas sistēmu ar Haar Cascades.

Skillbox iesaka: Praktiskais kurss "Python izstrādātājs no nulles".

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Kas būs nepieciešams:

  • Iet;
  • OpenCV (instalēšanas saites zemāk);
  • tīmekļa vai parastā videokamera.

Uzstādīšana

piemērs 1

Pirmajā piemērā mēs mēģināsim izveidot lietojumprogrammu, kas atver logu, kurā redzama kameras video straume.

Vispirms jāimportē darbam nepieciešamās bibliotēkas.

importēt (
"baļķis"
“gocv.io/x/gocv”
)

Pēc tam jums ir jāizveido VideoCapture objekts, izmantojot funkciju VideoCaptureDevice. Pēdējais ļauj uzņemt video straumi, izmantojot kameru. Funkcija kā parametru izmanto veselu skaitli (tas apzīmē ierīces ID).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()

Tagad mums ir jāizveido n-dimensiju matrica. Tas saglabās no kameras nolasītos attēlus.

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

Lai parādītu video straumi, ir jāizveido logs – to var izdarīt, izmantojot funkciju NewWindow.

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

Tagad pāriesim pie interesantākās daļas.

Tā kā video ir nepārtraukta attēlu kadru straume, mums būs jāizveido bezgalīga cilpa, lai bezgalīgi lasītu kameras video straumi. Lai to izdarītu, ir nepieciešama VideoCapture tipa lasīšanas metode. Tas sagaida Mat tipu (matricu, ko izveidojām iepriekš), atgriežot Būla vērtību, kas norāda, vai VideoCapture kadrs tika nolasīts veiksmīgi vai nē.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(“Unable to read from the webcam”)    continue
     }
.
.
.
}

Tagad jums ir jāparāda rāmis izveidotajā logā. Pauze, lai pārietu uz nākamo kadru, ir 50 ms.

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

Pēc lietojumprogrammas palaišanas tiks atvērts logs ar video straumi no kameras.

Sejas atpazīšanas sistēmas izveide, pamatojoties uz Golang un 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)
}
}

piemērs 2

Šajā piemērā izmantosim iepriekšējo piemēru un izveidosim sejas atpazīšanas sistēmu, kuras pamatā ir Haar Cascades.

Haar kaskādes ir kaskādes klasifikatori, kas tiek apmācīti, izmantojot Haar viļņu tehniku. Viņi analizē attēla pikseļus, lai noteiktu noteiktas funkcijas. Lai uzzinātu vairāk par Haar Cascades, lūdzu, sekojiet tālāk esošajām saitēm.

Viola-Jones objektu noteikšanas sistēma
Kaskādes klasifikatori
Hāram līdzīga iezīme

Lejupielādējiet jau apmācītus kaskādes var būt šeit. Pašreizējā piemērā, lai identificētu personas seju no priekšpuses, tiks izmantotas kaskādes.

Lai to izdarītu, jums ir jāizveido klasifikators un jāievada tam jau apmācīts fails (saite ir norādīta iepriekš). Es jau esmu augšupielādējis failu pencv_haarcascade_frontalface_default.xml direktorijā, kurā atrodas mūsu programma.

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

Lai attēlā noteiktu sejas, ir jāizmanto šī metode DetectMultiScale. Šī funkcija ņem kadru (tipa Mat), kas tikko nolasīts no kameras video straumes, un atgriež taisnstūra tipa masīvu. Masīva lielums norāda seju skaitu, ko klasifikators varēja noteikt kadrā. Pēc tam, lai pārliecinātos, ka mēs redzam, ko tā atrada, atkārtosim taisnstūru sarakstu un izdrukāsim objektu Taisnstūris konsolē, izveidojot apmali ap konstatēto taisnstūri. To var izdarīt, izmantojot funkciju Taisnstūris. Tas pieņems kameras nolasīto paklājiņu, taisnstūra objektu, kas tika atgriezts ar DetectMultiScale metodi, apmales krāsu un biezumu.

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

Sejas atpazīšanas sistēmas izveide, pamatojoties uz Golang un OpenCV

Sejas atpazīšanas sistēmas izveide, pamatojoties uz Golang un 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)
}
}

Un... jā, viss izdevās! Tagad mums ir vienkārša sejas atpazīšanas sistēma, kas rakstīta Go. Drīzumā plānoju turpināt šos eksperimentus un radīt jaunas foršas lietas, apvienojot Go un OpenCV.

Ja jūs interesē, lūdzu, novērtējiet gRPC tīmekļa serveris, ko rakstīju Python un OpenCV. Tas straumē datus brīdī, kad tiek noteikta seja. Tas ir pamats dažādu klientu veidošanai dažādās programmēšanas valodās. Viņi varēs izveidot savienojumu ar serveri un nolasīt datus no tā.

Paldies, ka izlasījāt rakstu!

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru