Golang と OpenCV をベースにした顔認識システムの構築

Golang と OpenCV をベースにした顔認識システムの構築
OpenCV は、コンピューター ビジョン プロジェクト用に設計されたライブラリです。 彼女はもう20歳くらいです。 私は大学でこれを使用しており、C++ と Python のプロジェクトでこれらの言語を十分にサポートしているため、今でも使用しています。

しかし、Go を学習して使用し始めたとき、OpenCV を使用してこの言語を操作できるかどうかに興味を持ちました。 当時、統合に関する例やチュートリアルはすでにありましたが、私にはそれらが複雑すぎるように思えました。 少し後、The Hybrid Group チームが作成したラッパーを見つけました。 この記事では、Haar Cascades を使用して簡単な顔認識システムを開発することで、GoCV を始める方法を説明します。

スキルボックスは次のことを推奨します。 実践コース 「ゼロからのPython開発者」.

リマインダー: 「Habr」のすべての読者が対象 - 「Habr」プロモーション コードを使用してスキルボックス コースに登録すると 10 ルーブルの割引。

必要なもの:

  • 行け;
  • OpenCV (以下のインストーラーリンク);
  • ウェブカメラまたは通常のビデオカメラ。

インストール

例1

最初の例では、カメラ ビデオ ストリームを表示するウィンドウを開くアプリケーションを作成してみます。

まず、作業に必要なライブラリをインポートする必要があります。

インポート(
"ログ"
「gocv.io/x/gocv」
)

この後、VideoCaptureDevice 関数を使用して VideoCapture オブジェクトを作成する必要があります。 後者により、カメラを使用してビデオ ストリームをキャプチャできるようになります。 この関数はパラメータとして整数を使用します (デバイス 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()

それでは、最も興味深い部分に移りましょう。

ビデオは画像フレームの連続ストリームであるため、カメラのビデオ ストリームを無限に読み取る無限ループを作成する必要があります。 これを行うには、VideoCapture タイプの Read メソッドが必要です。 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 カスケードは、Haar ウェーブレット手法を使用してトレーニングされたカスケード分類器です。 画像内のピクセルを分析して特定の特徴を検出します。 ハール カスケードについて詳しくは、以下のリンクをご覧ください。

Viola-Jones オブジェクト検出フレームワーク
カスケード分類器
ハールのような特徴

すでにトレーニングされたカスケードをダウンロードする ここに。 現在の例では、カスケードを使用して人物の顔を正面から識別します。

これを行うには、分類子を作成し、すでにトレーニング済みのファイルをそれにフィードする必要があります (リンクは上にあります)。 プログラムが配置されているディレクトリに、pencv_haarcascade_frontalface_default.xml ファイルをすでにアップロードしました。

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

画像内の顔を検出するには、次のメソッドを使用する必要があります。 検出マルチスケール。 この関数は、カメラのビデオ ストリームから読み取られたフレーム (Mat 型) を取得し、Rectangle 型の配列を返します。 配列のサイズは、分類子がフレーム内で検出できた顔の数を表します。 次に、何が見つかったかを確認するために、四角形のリストを繰り返し処理し、 Rectangle オブジェクトをコンソールに出力して、検出された四角形の周囲に境界線を作成します。 これは Rectangle 関数を使用して実行できます。 カメラによって読み取られた Mat、DetectMultiScale メソッドによって返された Rectangle オブジェクト、境界線の色と太さを受け入れます。

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 サーバー、PythonとOpenCVで書きました。 顔が検出された瞬間にデータをストリーミングします。 これは、さまざまなプログラミング言語でさまざまなクライアントを作成するための基礎です。 サーバーに接続して、そこからデータを読み取ることができるようになります。

記事をお読みいただきありがとうございます!

スキルボックスは次のことを推奨します。

出所: habr.com

コメントを追加します