画像処理エンジン設定(顔認識)

このページは、https://www.pc-koubou.jp/magazine/19205 をお手本に勉強していきます。

このサイトのテーマは「RaspbrryPiとOpenCVによる画像認識で人の顔を判別する」です。

まずは画像処理のメインソフト「OpenCV」をインストールします。<Python対応>

  sudo apt-get install python-opencv

次に人の顔を認識するために予め準備(機械学習)されたデータベースを利用します。
これを「カスケード分類器」というようです。
下記の GitHub からデータをダウンロードします。
https://github.com/opencv/opencv/


Zipファイルとしてダウンロードします。

/home/robocar/ダウンロード/ のフォルダーに入ります。


ターミナル上で上記ダウンロードに移動します。

  cd ダウンロード

移動後、zip ファイルを解凍します。解凍コマンドは以下のコマンドです。

  unzip opencv-master.zip


多くのファイルが解凍されていきます。

解凍が完了すると「ダウンロード」フォルダーに「opencv-master」が出来上がっています。


このファイル内に「data」ファイルがあります。<以下の画像参照>
この中を見てみましょう。

  cd data
  ls


さらに「data」の中にある「haarcascades」ファイルを見つけてください。<上記画像参照>
この中を確認します。

  cd haarcascades
  ls


「haarcascades」ファイル内には、上記のような多くのファイルが入っています。
各ファイルは、カスケード分類器(判別する対象物の画像的特徴を学習した結果データ)です。

 目に関するもの :haarcascade_eye.xml
 眼鏡に関するもの:haarcascade_eye_tree_eyeglasses.xml
 猫の顔(正面) :haarcascade_frontalcatface_extended.xml
 顔(正面)   :haarcascade_frontalface_alt.xml
 顔(正面)   :haarcascade_frontalface_alt2.xml
 顔(正面)   :haarcascade_frontalface_alt_tree.xml
 顔(正面)   :haarcascade_frontalface_default.xml
 全身      :haarcascade_fullbody.xml
 左目      :haarcascade_lefteye_2splits.xml
 ロシアのナンバープレート(全体):haarcascade_licence_plate_rus_16stages.xml
 下半身     :haarcascade_lowerbody.xml
 顔(証明写真) :haarcascade_profileface.xml
 右目      :haarcascade_righteye_2splits.xml
 ロシアのナンバープレート(数字):haarcascade_russian_plate_number.xml
 笑顔      :haarcascade_smile.xml
 上半身     :haarcascade_upperbody.xml

今回はこの中で目「haarcascade_eye.xml」と顔「haarcascade_frontalface_alt.xml」を
使用します。

「haarcascades」フォルダを「home/user/」内にドラッグ&ドロップして移動します。
私の環境では、「/home/robocar/」となります。
下の画像は「/home/robocar/ダウンロード/opencv-master/data/」内フォルダー群です。


移動する前の「/home/robocar/」内のフォルダー<下の画像>


移動した結果「/home/robocar」内に「haarcascades」フォルダがあります。<上記画像>



目と顔に枠を描画するプログラムの作成

カスケード分類器の準備が出来たので、実際にソースコードを書いてOpenCVを使ってみます。
編集用エディターは nano を使用します。

  sudo nano camface.py

下記のプログラムを入力します。


2画面に分かれています、一部オーバーラップしています。print 文の所です。


以下が目と顔認識/枠描画 Python プログラムです。

# -*- coding: utf-8 -*-
import time
import picamera
import cv2 as cv

fn = 'my_pic.jpg'

# カメラ初期化
with picamera.PiCamera() as camera:
# 解像度の設定
camera.resolution = (512, 384)
# 撮影の準備
camera.start_preview()
# 準備している間、少し待機する
time.sleep(2)
# 撮影して指定したファイル名で保存する
camera.capture(fn)

# 撮影した写真を読み込む
img = cv.imread(fn)

# 顔検出の処理効率化のために、写真の情報量を落とす(モノクロにする)
grayimg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 顔検出のための学習元データを読み込む
face_cascade = cv.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
# 目検出のための学習元データを読み込む
eye_cascade = cv.CascadeClassifier('haarcascades/haarcascade_eye.xml')
# 顔検出を行う
facerect = face_cascade.detectMultiScale(grayimg, scaleFactor=1.2, minNeighbors=2, minSize=(1, 1))
# 目検出を行う
eyerect = eye_cascade.detectMultiScale(grayimg)

print(facerect)
print(eyerect)

# 顔を検出した場合
if len(facerect) > 0:
# 検出した場所すべてに赤色で枠を描画する
for rect in facerect:
cv.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0, 255), thickness=3)

# 目を検出した場合
if len(eyerect) > 0:
# 検出した場所すべてに緑色で枠を描画する
for rect in eyerect:
cv.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 255, 0), thickness=3)

# 結果の画像を表示する
cv.imshow('camera', img)
# 結果を書き出す
cv.imwrite(fn, img)
# 何かキーが押されるまで待機する
cv.waitKey(0)
# 表示したウィンドウを閉じる
cv.destroyAllWindows()

プログラムが記述出来たら下記のコマンドでプログラムを実行してみましょう。

  sudo python camface.py


目と顔を認識したら枠で囲み表示後、端末にはアドレスが表記されています。
下記の様に完璧に認識は難しいようですが、プログラムの勉強用としては十分です。
解像度もプログラムで指定した通り「512x384」となっています。



今のプログラムに機能追加をしてみます。
顔を認識したら写真撮影するプログラムです。プログラム名は「camface2.py」とします。

  sudo nano camface2.py

nano エディターで下記のプログラムを記述します。

# -*- coding: utf-8 -*-
import picamera
import picamera.array
import cv2 as cv

# カメラ初期化
with picamera.PiCamera() as camera:
# カメラの画像をリアルタイムで取得するための処理
with picamera.array.PiRGBArray(camera) as stream:
# 解像度の設定
camera.resolution = (512, 384)

while True:
# カメラから映像を取得する(OpenCVへ渡すために、各ピクセルの色の並びをBGRの順番にする)
camera.capture(stream, 'bgr', use_video_port=True)
# 顔検出の処理効率化のために、写真の情報量を落とす(モノクロにする)
grayimg = cv.cvtColor(stream.array, cv.COLOR_BGR2GRAY)

# 顔検出のための学習元データを読み込む
face_cascade = cv.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
# 顔検出を行う
facerect = face_cascade.detectMultiScale(grayimg, scaleFactor=1.2, minNeighbors=2, minSize=
(100, 100))

# 顔が検出された場合
if len(facerect) > 0:
# そのときの画像を保存する
cv.imwrite('my_pic2.jpg', stream.array)
break

# カメラから取得した映像を表示する
cv.imshow('camera', stream.array)

# カメラから読み込んだ映像を破棄する
stream.seek(0)
stream.truncate()

# 何かキーが押されたかどうかを検出する(検出のため、1ミリ秒待つ)
if cv.waitKey(1) > 0:
break

# 表示したウィンドウを閉じる
cv.destroyAllWindows()


記述が終了したら「camface2.py」として保存。
早速実行してみましょう。

  sudo python camface2.py

インデントエラー中
 Pythonプログラムを「nano」エディターで書いているので、Python記述ルールに従わない記述となって
 Python 構文ルールを理解していないとエラーとなる。
 実は、前回の「camface.py」でもインデントエラーが出ていました。

反省点として Python 初心者は、Python用エディターを使った方が構文エラーで苦労することはなくなるので
お勧めします。
候補として、それぞれ長所短所・個人的な使い勝手がありますが最近では「Visual Studio Code」 が使われている
ようなので試してみます。

UbuntuMATE16.04に「Viisual Studio Code」をインストールするとエラーとなりうまくインストールが出来なか
ったので別の方法を考えてみます。
< Code_1.40.1-1573664190_amd64.deb > Ubuntu系は.deb amd64エラー

<Viisual Studio Codeインストールに再チャレンジ>
同サイトを参考にさせて頂きました。URLが長いので「ここをクリック」でジャンプします。
 code-oss が見つからないとなりインストール先が見つからなく失敗。
ネット検索でも失敗報告が多く「Ver 依存」が原因と思われる。
もう一つの原因として、VSCodeは64Bit版なので、UbuntuMATE18.04(32Bit)の可能性
64Bit版をインストールして再度チェックしてみます。
UbuntuMATE18.04(64Bit)をインストール後、chrominum,日本語化を行い下記コマンドでVisual Studio Code
をインストール

  sudo su   管理者モードに切り替え
  . <( wget -O - https://code.headmelted.com/installers/apt.sh )

インストールエラーで使用できない。
色々試してみたがNGなので諦めます。<外部PCで作成を検討>
あるネット情報では、ARM系(RasPi)にはVisual Studio Codeが使えないという事です。