Будуємо систему розпізнавання осіб на основі Golang та OpenCV

Будуємо систему розпізнавання осіб на основі Golang та OpenCV
OpenCV - бібліотека, розроблена для проектів з комп'ютерного зору. Їй уже близько 20 років. Я використовував її ще в коледжі і досі застосовую для своїх проектів на C++ та Python, оскільки вона має непогану підтримку цих мов.

Але коли я почав вивчати та використовувати Go, мені стало цікаво, чи можна застосувати OpenCV для роботи з цією мовою. На той час уже існували приклади та туторіали щодо інтеграції, але мені здалося, що вони надто складні. Трохи згодом мені в руки потрапив враппер, створений командою The Hybrid Group. У цій статті я покажу, як почати з GoCV, розробивши просту систему розпізнавання облич із каскадами Хаара (Haar Cascades).

Skillbox рекомендує: Практичний курс "Python-розробник з нуля".

Нагадуємо: для всіх читачів "Хабра" - знижка 10 000 рублів при записі на будь-який курс Skillbox за промокодом "Хабр".

Що потрібно:

  • йти;
  • OpenCV (посилання на установник нижче);
  • веб- або звичайна відеокамера.

Встановлення

Приклад 1

У першому прикладі ми спробуємо створити програму, яка відкриває вікно з демонстрацією відеопотоку камери.

Спочатку треба імпортувати бібліотеки, необхідних роботи.

імпорт (
"log"
"gocv.io/x/gocv"
)

Після цього потрібно створити об'єкт VideoCapture за допомогою функції VideoCaptureDevice. Остання дозволяє захоплювати відеопотік за допомогою камери. У функції використовується ціле число як параметр (він представляє ID пристрою).

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

Тепер потрібно створити n-вимірну матрицю. Вона зберігатиме зображення, зчитані з камери.

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

Для відображення відеопотоку потрібно створити вікно – це можна зробити за допомогою функції NewWindow.

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

Тепер перейдемо до найцікавішої частини.

Оскільки відео є безперервним потоком кадрів-зображень, нам потрібно буде створити нескінченний цикл для нескінченного зчитування відеопотоку камери. Для цього потрібен спосіб Read типу VideoCapture. Він буде очікувати на тип Mat (матриця, яку ми створили вище), повертаючи логічне значення, що вказує, чи був кадр з VideoCapture рахований успішно чи ні.

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

Тепер потрібно відобразити кадр у створеному вікні. Пауза для переходу до наступного кадру – 50 мс.

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

Після запуску програми відкриється вікно відеопотоку з камери.

Будуємо систему розпізнавання осіб на основі Golang та 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)
}
}

Приклад 2

У цьому прикладі давайте скористаємося попереднім прикладом і побудуємо систему розпізнавання осіб на основі Haar Cascades (каскади Хаара).

Каскади Хаара - це каскадні класифікатори, які навчаються на основі техніки вейвлет Хаара. Вони аналізують пікселі у зображенні, щоб виявити певні ознаки. Щоб дізнатися більше про Haar Cascades, можна пройти посилання нижче.

Viola-Jones object detection framework
Cascading classifiers
Haar-like feature

Завантажити вже навчені каскади можна тут. У поточному прикладі каскади використовуватимуться для ідентифікації особи в фас.

Для того щоб зробити це, потрібно створити класифікатор і згодувати йому навчений файл (вище дане посилання). Я вже завантажив файл pencv_haarcascade_frontalface_default.xml у директорію, де розташована наша програма.

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

Для виявлення осіб на зображенні потрібно скористатися методом DetectMultiScale. Ця функція приймає кадр (тип Mat), який був щойно зчитаний з відеопотоку камери, і повертає масив типу Rectangle. Розмір масиву становить кількість осіб, які класифікатор зміг виявити у кадрі. Потім, щоб переконатися, що ми бачимо те, що він знайшов, пройдемося по списку прямокутників і виведемо об'єкт Rectangle на консоль, створивши кордон навколо виявленого прямокутника. Це можна зробити за допомогою функції Rectangle. Вона прийматиме Mat, лічений камерою, об'єкт Rectangle, який був повернутий методом DetectMultiScale, колір та товщину для кордону.

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

Будуємо систему розпізнавання осіб на основі Golang та OpenCV

Будуємо систему розпізнавання осіб на основі Golang та 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 web server, який я написав на Python та OpenCV. Він стримає дані на момент виявлення обличчя. Це основа для створення різних клієнтів різними мовами програмування. Вони зможуть підключатися до сервера та зчитувати з нього дані.

Дякую, що прочитали статтю!

Skillbox рекомендує:

Джерело: habr.com

Додати коментар або відгук