hero

Распознавание лиц на Go

Распознавания лиц в статических изображения на языке Go

Область распознавания лиц - это то, что меня очень интересует. Внедрение системы распознавания лиц своими силами делает вас похожим на Тони Старка, и вы можете использовать её для различных проектов, таких как автоматический замок на вашей двери или создание системы видеонаблюдения для вашего офиса, и это лишь некоторые из них.

В этом уроке мы будем создавать нашу собственную, действительно простую систему распознавания лиц на основе Go, используя несколько существующих библиотек. Мы начнем с простого распознавания лиц на неподвижных изображениях и посмотрим, как это работает, а затем мы расширим, чтобы посмотреть на распознавание лиц в реальном времени на видеопотоках в части 2 этой мини-серии.

Пакет Kagami/go-face

В качестве основы этого урока мы будем использовать пакет kagami/go-face, который оборачивается вокруг инструментария машинного обучения dlib!

Примечание - Kagami на самом деле написал о том, как он начал писать этот пакет. Это определенно интересное чтение, и вы можете найти его здесь: https://hackernoon.com/face-recognition-with-go-676a555b8a7e

Инструментарий Dlib

Инструментарий Dlib написан на языке C++ и является подходящим как для распознавания лиц, так и для обнаружения объектов. Согласно его документации, он набирает около 99,4% точности при обнаружении помеченных лиц в диком бенчмарке, что невероятно, и именно поэтому так много других сторонних библиотек используют его в качестве своей основы.

Установка

Думаю не совру, если скажу, что получить и запустить этот пакет немного сложнее, чем ваш стандартный пакет Go. Вам нужно будет установить на свой компьютер как pkg-config, так и dlib. Если вы работаете на MacOS, то это команда:

$ brew install pkg-config dlib
$ sed -i '' 's/^Libs: .*/& -lblas -llapack/' /usr/local/lib/pkgconfig/dlib-1.pc

Начало работы

Прежде всего нам нужно будет загрузить пакет kagami/go-face, сделать это можно с помощью следующей команды go get:

$ go get -u github.com/Kagami/go-face

Создайте новый каталог под названием go-face-recognition в вашем каталоге GOPATH. В этом каталоге создайте новый файл под названием main.go, здесь будет находиться весь наш исходный код.

После этого, вам нужно будет склонировать каталог image/ из репозитория TutorialEdge/go-Face-recognition-tutorial. Самый простой способ сделать это - клонировать в другой каталог и просто скопировать каталог изображений в ваш текущий рабочий каталог:

$ git clone https://github.com/TutorialEdge/go-face-recognition-tutorial.git

Как только вы это успешно проделаете, у нас будет два .dat файла, которые нам нужны для того, чтобы запустить нашу программу распознавания лиц. Также в папке вы должны увидеть список других .jpg файлов, которые содержат лица некоторых из Мстителей Marvel.

package main

import (
    "fmt"

    "github.com/Kagami/go-face"
)

const dataDir = "testdata"

func main() {
    fmt.Println("Система распознавания лиц v0.01")

    rec, err := face.NewRecognizer(dataDir)
    if err != nil {
        fmt.Println("Не могу инициализировать распознавание")
    }
    defer rec.Close()

    fmt.Println("Распознавание инициализировано")
}

Итак, если мы попытаемся запустить нашу программу сейчас, мы должны увидеть как систему распознавания лиц v0.01, так и распознаватель, инициализированный в выводе нашей программы. Мы успешно настроили все, что нам нужно, чтобы сделать классное продвинутое распознавание лиц!

Подсчет лиц на картинке

Наша первая реальная проверка этого пакета будет заключаться в том, чтобы проверить, можем ли мы точно подсчитать количество лиц на фотографии. Для целей этого урока я буду использовать эту фотографию:

Как видите, ничего особенного, только одно лицо Тони Старка.

Итак, теперь нам нужно расширить нашу существующую программу, чтобы иметь возможность анализировать это изображение, а затем подсчитать количество лиц внутри этого изображения:

package main

import (
    "fmt"
    "log"
    "path/filepath"

    "github.com/Kagami/go-face"
)

const dataDir = "testdata"

func main() {
    fmt.Println("Система рапознавания лиц v0.01")

    rec, err := face.NewRecognizer(dataDir)
    if err != nil {
        fmt.Println("Не могу инициализировать распознавание")
    }
    defer rec.Close()

    fmt.Println("Распознавание инициализировано")

    // мы создаем путь к нашему изображению с помощью filepath.Join
    avengersImage := filepath.Join(dataDir, "tony-stark.jpg")

// затем мы вызываем RecognizeFile, проходящий по пути
// к нашему файлу, чтобы получить количество лиц и любые
// потенциальные ошибки
faces, err := rec.RecognizeFile(avengersImage) if err != nil { log.Fatalf(Не могу распознать: %v", err) } // we print out the number of faces in our image
// мы выводим количество лиц на нашем изображении
fmt.Println("Количество лиц на Изображении: ", len(faces)) }

Когда мы это запустим, мы должны увидеть следующий вывод:

$ go run main.go
Система распознавания лиц v0.01
Распознавание инициализировано
Количество лиц на изображении:  1

Удивительно, но мы смогли проанализировать изображение и определить, что оно содержит лицо одного человека. Давайте попробуем более сложное изображение с большим количеством Мстителей на нём:

Когда мы обновим строку 24 (у вас может быть другая):

avengersImage := filepath.Join(dataDir, "avengers-01.jpg")

И снова запустим нашу программу, мы должны увидеть, что наша программа способна определить, что 2 человека находятся в этом новом изображении.


Распознавание Лиц

Отлично, значит, мы можем вычислить количество лиц на изображении, а теперь как насчет того, чтобы на самом деле определить, кто эти люди?

Для этого нам понадобится несколько эталонных фотографий. Например, если мы хотим узнать Тони Старка по фотографии, нам понадобятся примеры фотографий, помеченных его именем. Затем программа распознавания сможет анализировать фотографии на предмет лиц, похожих на него, и сопоставлять их друг с другом.

Итак, давайте возьмем наше изображение avengers-02.jpg, как наше эталонное изображение для Тони Старка, а затем посмотрим, сможем ли мы определить, содержит ли это изображение его лицо:

avengersImage := filepath.Join(dataDir, "avengers-02.jpeg")

faces, err := rec.RecognizeFile(avengersImage)
if err != nil {
    log.Fatalf("Не могу распознать: %v", err)
}
fmt.Println("Количество лиц на изображении: ", len(faces))

var samples []face.Descriptor
var avengers []int32
for i, f := range faces {
    samples = append(samples, f.Descriptor)
    // Каждое лицо на этом изображении уникально, поэтому оно относится к своей собственной категории.
    avengers = append(avengers, int32(i))
}
// Названия категорий, т.е. людей на изображении
labels := []string{
    "Доктор Стрендж",
    "Тони Старк",
    "Брюс Баннер",
    "Вонг",
}
// Даем образцы для распознавания.
rec.SetSamples(samples, avengers)

Итак, в приведенном выше коде мы рассмотрели все лица по порядку слева направо и пометили их соответствующими именами. Наша система распознавания может затем использовать эти эталонные образцы, чтобы попытаться выполнить собственное распознавание лиц в последующих файлах.

Давайте попробуем протестировать нашу систему распознавания с нашим существующим изображением Тони Старка и посмотрим, сможет ли она распознать его на основе дескриптора лица, который она сгенерировала из файла avengers-02.jpeg:

// Теперь давайте попробуем классифицировать некоторые, ещё не известные изображения.
testTonyStark := filepath.Join(dataDir, "tony-stark.jpg")
tonyStark, err := rec.RecognizeSingleFile(testTonyStark)
if err != nil {
    log.Fatalf("Не могу распознать: %v", err)
}
if tonyStark == nil {
    log.Fatalf("Ни одного лица на изображении")
}
avengerID := rec.Classify(tonyStark.Descriptor)
if avengerID < 0 {
    log.Fatalf("Не могу классифицировать")
}

fmt.Println(avengerID)
fmt.Println(labels[avengerID])

Давайте теперь попробуем проверить, что это не было случайностью, и посмотрим, работает ли наша система распознавания образов с изображением Доктора Стрэнджа.

testDrStrange := filepath.Join(dataDir, "dr-strange.jpg")
drStrange, err := rec.RecognizeSingleFile(testDrStrange)
if err != nil {
    log.Fatalf("Не могу распознать: %v", err)
}
if drStrange == nil {
    log.Fatalf("Ни одного лица на изображении")
}
avengerID = rec.Classify(drStrange.Descriptor)
if avengerID < 0 {
    log.Fatalf("Не могу классифицировать")
}

И наконец, давайте попробуем это сделать, используя образ Вонга:

testWong := filepath.Join(dataDir, "wong.jpg")
wong, err := rec.RecognizeSingleFile(testWong)
if err != nil {
    log.Fatalf("Не могу распознать: %v", err)
}
if wong == nil {
    log.Fatalf("Ни одного лица на изображении")
}
avengerID = rec.Classify(wong.Descriptor)
if avengerID < 0 {
    log.Fatalf("Не могу классифицировать")
}
fmt.Println(avengerID)
fmt.Println(labels[avengerID])

Когда вы запускаете все это вместе, вы должны увидеть следующие выходные данные:

$ go run main.go
Система распознавания лиц v0.01
Распознавание инициализировано
Количество лиц на изображении:  4
1
Тони Старк
0
Доктор Стрэндж
3
Вонг

Задача: Создайте несколько справочных файлов по всем Мстителям и попытайтесь извлечь фрагменты кода распознавания лиц в многоразовую функцию

Полный исходный текст

Полный исходный код этой статьи можно найти на Github: Tutorialedge/go-Face-recognition-tutorial

Вывод

В этом небольшом уроке нам удалось построить действительно простую систему распознавания лиц, которая работает на статических (неподвижных) изображениях. Надеюсь, что это послужит основой для следующей части этой серии учебников, в которой мы рассмотрим, как это сделать в режиме реального времени в видеопотоке.

Надеюсь, вам понравился этот материал.

Подготовлено с использованием статьи - Go Face Recognition Tutorial - Part 1


ОПИСАНИЕ

Область распознавания лиц - это то, что меня очень интересует. Внедрение системы распознавания лиц своими силами делает вас похожим на Тони Старка, и вы можете использовать её для различных проектов, таких как автоматический замок на вашей двери или создание системы видеонаблюдения для вашего офиса.

Параметры

Статус: Поддерживается

ОС:

Язык:

Дата:

Лицензия:

Скачать: Скачать

Документация: Читать

ЕСТЬ ВОПРОСЫ?

Задайте нам свой вопрос, мы обязательно на него ответим
Намного быстрее, чем вы думаете.

Связаться