Win: face_recognition

次のビデオを見ながら、数ヶ月の悩むのタネ、顔認識の課題は一気に吹き飛ばすの気がする。
https://www.youtube.com/watch?v=QSTnwsZj2yc
参考サイト:

Contents

しかし

环境配置

  • Python 3.3+ or Python 2.7
  • macOS or Linux
  • Windows并不是我们官方支持的,但也许也能用

在Windows上安装

虽然本项目官方并不支持Windows,但一些大神们摸索出了在Windows上运行本项目的方法:

使用Ubuntu虚拟机镜像文件安装配置虚拟机,本项目已经包含在这个镜像中

 

入館時に体温を自動チェックシステム

新型肺炎対策・AIによる顔認識および非接触型温度計を利用して体温を自動測定するシステムを開発中です。

DonkeyCarのフレーム上、カメラとサーモセンサー(amg8833)を装備し、この装置の前に立つと自動的に顔認識による個人特定と体温測定を行うもの。大学のキャンパス、教室の出入り口での体温検知による入館チェックなどを想定したシステムです。

 

Mac: GoogleHome通知

Contents

python-googlehome-player

https://github.com/mtatsuma/python-googlehome-player.git

を参考しながら進める。

Architecture

google_home_download_from_gtts

How to use

chen@Hong-Mac-mini Python % git clone https://github.com/mtatsuma/python-googlehome-player.git
Cloning into ‘python-googlehome-player’…
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 34 (delta 14), reused 28 (delta 11), pack-reused 0
Unpacking objects: 100% (34/34), done.
chen@Hong-Mac-mini Python % cd python-googlehome-player
chen@Hong-Mac-mini python-googlehome-player % ls -al

必要のパッケージのインストール

chen@Hong-Mac-mini python-googlehome-player % pip3 install -r requirements.txt
Collecting beautifulsoup4==4.8.2
  Downloading beautifulsoup4-4.8.2-py3-none-any.whl (106 kB)
     |████████████████████████████████| 106 kB 2.6 MB/s
Collecting casttube==0.2.0
  Downloading casttube-0.2.0-py3-none-any.whl (4.2 kB)
Collecting certifi==2019.11.28
  Downloading certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
     |████████████████████████████████| 156 kB 13.1 MB/s
Requirement already satisfied: chardet==3.0.4 in /usr/local/lib/python3.8/site-packages (from -r requirements.txt (line 4)) (3.0.4)
Collecting Click==7.0
  Downloading Click-7.0-py2.py3-none-any.whl (81 kB)
     |████████████████████████████████| 81 kB 9.1 MB/s
Collecting gTTS==2.1.0
  Downloading gTTS-2.1.0-py3-none-any.whl (25 kB)
Collecting gTTS-token==1.1.3
  Downloading gTTS-token-1.1.3.tar.gz (3.4 kB)
Collecting idna==2.8
  Downloading idna-2.8-py2.py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 3.5 MB/s
Collecting ifaddr==0.1.6
  Downloading ifaddr-0.1.6.tar.gz (6.5 kB)
ERROR: Could not find a version that satisfies the requirement pkg-resources==0.0.0 (from -r requirements.txt (line 10)) (from versions: none)
ERROR: No matching distribution found for pkg-resources==0.0.0 (from -r requirements.txt (line 10))
ここでエラー発生
chen@Hong-Mac-mini python-googlehome-player % pip3 install pkg-resources
ERROR: Could not find a version that satisfies the requirement pkg-resources (from versions: none)
ERROR: No matching distribution found for pkg-resources
ネットで見つかった解決策は、pkg-resources==0.0.0 文を消すこと。

喋りする

chen@Hong-Mac-mini python-googlehome-player % python play.py
Enter language (English: en or Japanese: ja): ja
Enter Google Home name or IP: 192.168.86.106
You are ready to speak!
Start typing …
>> こんにちは
>> お元気ですか?
>> いいですね
>> bye
次は、顔認識の結果を音声で知らせる機能を作りたい。

Mac: face_rec webcam

ついに、webcamから人物認識の段階に来ました。

まず結果を見てください。

Contents

写真データベース

知っている人の写真を画像フォルダに入れてください。
  1. ./pictures_of_people_i_know/   —- 知っている人の写真を入れたフォルダ
    1. obama.jpg
    2. biden.jpg

プログラムの作成

face_recognitionのリポジトリ(https://github.com/ageitgey/face_recognition/)から、examples/facerec_from_webcam.pyファイルも同じ画像フォルダに入れてください。

知っている人の写真ファイル名を次のように追加してください。

(とりあえず手作業で追加、後ほどフォルダ内すべての写真を自動追加するようにプログラミングする)

プログラム起動

最後に、このプリグラムを起動するだけです。

$ python facerec_from_webcam.py

次は実用へ

フォルダ内すべての写真を自動追加するようにプログラミングする

Raspberry Piで動く

Colab(6) Face Detect

Haar特徴ベースのCascade型分類器を使った顔と目の検出を行う。

Contents

事前準備

事前に学習を済ませた学習機のxmlファイルを下記URLからダウンロードしてください。

  1. haarcascade_eye.xml
  2. haarcascade_frontalface_default.xml

ダウンロードする方法は、ブラウザChromeの場合まずgithubの画面をRaw画面に切り替えて、XMLのままの表示になります。それからブラウザを右クリックで、別名で保存にしてください。

またネットからLenna.pngを探して、ダウンロードしてください。

Colabに新しいノートブックを作り、上記ファイルをColabにアップしてください。

 

コード

import cv2
import matplotlib.pyplot as plt # matplotlib(描画用)

print(cv2.__version__)

face_cascade_path = "haarcascade_frontalface_default.xml"
eye_cascade_path = "haarcascade_eye.xml"

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

img = cv2.imread('Lenna.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray)

for x, y, w, h in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = img[y: y + h, x: x + w]
    face_gray = gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

# 結果表示
plt.imshow(img)

結果表示

はまりところ

済ませた学習機のxmlファイルの読み込ませるところは、” *** Unknown error code -49 *** “を発生しました。

もベタランと自負して、初歩的なエラーがあまりないと思うだが、このエラーに数時間も費やした。

  1. “Unknown error code -49″の対策を探す。
  2. パスがうまく設定できてないではないか。
  3. opencv 3からopencv 4になったから、それを疑い。
  4. 他人の成功例を探して実践する。

stackoverflow.comなどからの対策しても無駄でした。パスを相対パス、絶対パスに変えでも無駄、opencv 3からopencv 4に変化も見つからない、他人の成功例も再現できない、。。。

途方に暮れて、次のページで回答を見つかった。

https://answers.opencv.org/question/191490/opencv-error-unknown-error-code-49-persistencecpp-error/

英語:

  • have a look at those cascade files (e.g. with a text editor). do they really contain valid xml ?
  • (download errors do happen, there might just be a html errormsg in there, not valid xml)
  • also, when using weird python ide’s like pycharm, do yourself a favour, and use an absolute file path for anything, that needs to be loaded from disk.

日本語:

  • それらのカスケードファイルを見てください(テキストエディターなどを使用)。 彼らは本当に有効なxmlを含んでいますか?
  • (ダウンロードエラーが発生します、そこにはhtmlエラーメッセージがあり、有効なxmlではない可能性があります)
  • また、pycharmのような奇妙なpython ideを使用する場合は、ディスクからロードする必要のあるすべてのファイルに絶対パスを使用してください。

ダウンロードしたファイルをVSCodeで開いてみたら、htmlファイルでした!

正しいダウンロードする方法は、ブラウザChromeの場合まずgithubの画面をRaw画面に切り替えて、XMLのままの表示になります。それからブラウザを右クリックで、別名で保存にしてください。

RPi : face_recognition

次のビデオを見ながら、数ヶ月の悩むのタネ、顔認識の課題は一気に吹き飛ばすの気がする。
https://www.youtube.com/watch?v=QSTnwsZj2yc

Contents

dlibインストール

まずパッケージを更新します.

sudo apt update && sudo apt upgrade

dlibのインストールに必要なパッケージをインストールします.

sudo apt install build-essential cmake pkg-config

アレイをサポートするpicamerapythonライブラリをインストールします.

sudo apt-get install python3-picamera
sudo pip3 install --upgrade picamera[array]

Download and install dlib v19.6:

mkdir -p dlib
git clone -b 'v19.6' --single-branch https://github.com/davisking/dlib.git dlib/
cd ./dlib
sudo python3 setup.py install --compiler-flags "-mfpu=neon"

以上でインストールが完了しているはずです.Pythonから簡単に確認してみます.
dlibをインポートしてみて特にエラーが出なければ大丈夫です.

pi@raspberrypi:~/dlib $ python3
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import dlib
>>> dlib.__version__
‘19.22.0’
>>>
>>>
pi@raspberrypi:~/dlib $

Face_recognitionのインストール

sudo pip3 install face_recognition

顔認識コードの例をダウンロードします。

git clone --single-branch https://github.com/ageitgey/face_recognition.git
cd ./face_recognition/examples
python3 facerec_on_raspberry_pi.py

参考サイト:

  1. https://github.com/ageitgey/face_recognition
  2. https://github.com/ageitgey/face_recognition/blob/master/README_Simplified_Chinese.md — Face Recognition 人脸识别
  3. Raspberry Pi 2+インストール手順

Colab(4) Data Classify

こちらでBlue Book の機械学習の例題です。

カラー図解 Raspberry Piではじめる機械学習 基礎からディープラーニングまで (ブルーバックス)

新品価格
¥1,760から
(2020/7/17 13:56時点)

コード

# -*- coding: utf-8 -*-
from sklearn import datasets, svm
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# アヤメのデータをロードし、変数irisに格納
iris = datasets.load_iris()

# 特徴量のセットを変数Xに、ターゲットを変数yに格納
X = iris.data
y = iris.target

# 特徴量を外花被片の長さ(sepal length)と幅(sepal width)の
# 2つのみに制限(2次元で考えるため)
X = X[:,:2]

# ターゲットは2 (iris virginica) でないもの, 
# つまり iris setosa (0) と iris versicolor (1) のみを対象とする
# (領域の2分割)
X = X[y!=2]
y = y[y!=2]

# 分類用にサポートベクトルマシン (Support Vector Classifier) を用意
clf = svm.SVC(C=1.0, kernel='linear')
# データに最適化
clf.fit(X, y)

##### 分類結果を背景の色分けにより表示

# 外花被片の長さ(sepal length)と幅(sepal width)の
# 最小値と最大値からそれぞれ1ずつ広げた領域を
# グラフ表示エリアとする
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
y_min = min(X[:,1]) - 1
y_max = max(X[:,1]) + 1

# グラフ表示エリアを縦横500ずつのグリッドに区切る
# (分類クラスに応じて背景に色を塗るため)
XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]

# グリッドの点をscikit-learn用の入力に並べなおす
Xg = np.c_[XX.ravel(), YY.ravel()]

# 各グリッドの点が属するクラス(0か1)の予測をZに格納
Z = clf.predict(Xg)

# Zをグリッド上に並べなおす
Z = Z.reshape(XX.shape)

# クラス0 (iris setosa) が薄オレンジ (1, 0.93, 0.5, 1)
# クラス1 (iris versicolor) が薄青 (0.5, 1, 1, 1)
cmap01 = ListedColormap([(0.5, 1, 1, 1), (1, 0.93, 0.5, 1)])

# 背景の色を表示
plt.pcolormesh(XX, YY, Z==0, cmap=cmap01)

# 軸ラベルを設定
plt.xlabel('sepal length')
plt.ylabel('sepal width')

##### ターゲットに応じた色付きでデータ点を表示

# iris setosa (y=0) のデータのみを取り出す
Xc0 = X[y==0]
# iris versicolor (y=1) のデータのみを取り出す
Xc1 = X[y==1]

# iris setosa のデータXc0をプロット
plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
# iris versicolor のデータXc1をプロット
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')

# サポートベクトルを取得
SV = clf.support_vectors_
# サポートベクトルの点に対し、赤い枠線を表示
plt.scatter(SV[:,0], SV[:,1], c=(0,0,0,0), linewidths=1.0, edgecolors='red')

# 描画したグラフを表示
plt.show()

 

結果

Mac: face_recognition

次のビデオを見ながら、数ヶ月の悩むのタネ、顔認識の課題は一気に吹き飛ばすの気がする。
https://www.youtube.com/watch?v=QSTnwsZj2yc
参考サイト:

Contents

face_recognitionのインストール

cmakeを用意する。

chen@Hong-Mac-mini Python % brew install cmake

face_recognition(中にはdlibも)をインストール。
chen@Hong-Mac-mini Python % pip3 install face_recognition
Collecting face_recognition
  Downloading face_recognition-1.3.0-py2.py3-none-any.whl (15 kB)
Collecting dlib>=19.7
  Downloading dlib-19.20.0.tar.gz (3.2 MB)
     |████████████████████████████████| 3.2 MB 2.0 MB/s
Requirement already satisfied: numpy in /usr/local/lib/python3.8/site-packages (from face_recognition) (1.19.0)
Collecting Click>=6.0
  Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
     |████████████████████████████████| 82 kB 1.9 MB/s
Collecting Pillow
  Downloading Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl (2.2 MB)
     |████████████████████████████████| 2.2 MB 2.3 MB/s
Collecting face-recognition-models>=0.3.0
  Downloading face_recognition_models-0.3.0.tar.gz (100.1 MB)
     |████████████████████████████████| 100.1 MB 2.5 MB/s
Building wheels for collected packages: dlib, face-recognition-models
  Building wheel for dlib (setup.py) … \
……
  Building wheel for dlib (setup.py) … done
  Created wheel for dlib: filename=dlib-19.20.0-cp38-cp38-macosx_10_15_x86_64.whl size=3299491 sha256=31ff56825fb1b8cf9324b6ec04f75119441a626a0484058e0d6aaca48f2be168
  Stored in directory: /Users/chen/Library/Caches/pip/wheels/a5/82/2c/2d2ccc604e2c2e35994b89a173d922331f1c6e1af9320a7602
  Building wheel for face-recognition-models (setup.py) … done
  Created wheel for face-recognition-models: filename=face_recognition_models-0.3.0-py2.py3-none-any.whl size=100566172 sha256=05dade1c471823874bf848e4eeb13166a20b569d238fbb97f1c918a58ebf7d19
  Stored in directory: /Users/chen/Library/Caches/pip/wheels/b4/4b/8f/751e99d45f089bdf366a7d3e5066db3c2b84a62e4377f534d7
Successfully built dlib face-recognition-models
Installing collected packages: dlib, Click, Pillow, face-recognition-models, face-recognition
Successfully installed Click-7.1.2 Pillow-7.2.0 dlib-19.20.0 face-recognition-1.3.0 face-recognition-models-0.3.0
chen@Hong-Mac-mini Python %

コマンドラインで試す

face_recognitionをインストールすると、2つのシンプルなコマンドラインがついてきます。

  • face_recognition – 画像もしくはフォルダの中の複数の画像から顔を認識します
  • face_detection – 画像もしくはフォルダの中の複数の画像から顔を検出します
Githubにサンプル写真はあるので、丸ごと取り込む
chen@Hong-Mac-mini Python % git clone https://github.com/ageitgey/face_recognition
Cloning into ‘face_recognition’…
remote: Enumerating objects: 874, done.
remote: Total 874 (delta 0), reused 0 (delta 0), pack-reused 874
Receiving objects: 100% (874/874), 101.46 MiB | 2.02 MiB/s, done.
Resolving deltas: 100% (506/506), done.
chen@Hong-Mac-mini Python %
画像フォルダとサンプル写真の用意
  1. ./pictures_of_people_i_know/   —- 知っている人の画像を入れたフォルダ
    1. obama.jpg
    2. biden.jpg
  2. ./unknown_pictures/  —- 特定したい画像のフォルダ
    1. two_people.jpg

実際はexamplesからコピーする。

chen@Hong-MacBook-Air-2017 ~ % mkdir pictures_of_people_i_know
chen@Hong-MacBook-Air-2017 ~ % mkdir unknown_pictures
chen@Hong-MacBook-Air-2017 ~ % cp -P face_recognition/examples/obama.jpg pictures_of_people_i_know
chen@Hong-MacBook-Air-2017 ~ % cp -P face_recognition/examples/biden.jpg pictures_of_people_i_know
chen@Hong-MacBook-Air-2017 ~ % cp -P face_recognition/examples/two_people.jpg unknown_pictures

識別してみる

chen@Hong-MacBook-Air-2017 ~ % face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/
./unknown_pictures/two_people.jpg,biden
./unknown_pictures/two_people.jpg,obama
chen@Hong-MacBook-Air-2017 ~ %

Pixel入門とVSCode利用

古いMacまたはWindowsマシンを持って、最新版OSに対応してない、重くで使い物にならない、または最新版のgcc, VS Codeなどのツールが動作しない場合、Linuxをインストールして、多くのタスクが軽快に実行できるようになるだろう。

特にRaspberry Pi Desktop X86は、学習用Raspberry Piと同じUIを持つ、C言語、Python言語の勉強のみならず、便利な生産性アプリやプログラミング・ツールがバンドルされている。すべてDebianのビルドなので、大量の無料ソフトウェアが利用可能だ。
必要材料:
  1. MacまたはWindowsマシン(古いでもx86 CPUと512MB以上のRAMならOK)。
  2. 容量16G 以上のUSBメモリ(USB 3.0対応が望ましい)一個。
    (PCのSDカードスロットがあり、16G 以上のSD Cardでも可)
(小さいのUSBメモリは付けたままでも邪魔にならない)

Contents

メディア作成

公式サイトからISOイメージをダウンロードして、Win32DiskImagerなどを使って、USBやSDにイメージを書き込みます。
ダウンロード先は、こちらからも確認できます。
メディアから起動して、そのまま利用しても良い。起動時の立ち上げは時間がかかるが、利用時特に遅いと感じがない。
ハードディスクにインストールして利用すると、起動時の立ち上げは早くなるが、既存システムを誤って消去する恐れがあるので、十分検討してから行いましょう。

Win32DiskImagerの使い方

Win32DiskImagerを起動します。

フォルダマークのボタンを押して読み込むimgファイルを選択し、その右側のインストール先のドライブを書き込むドライブ(マイクロSDカード等)に変更します。imgファイルと書き込み先ドライブに間違いが無ければWriteをクリックします。

ブート

イメージを書き込んだUSBをPCに差し込んで、電源を投入します。持ちのPCに依りますが、BIOS設定画面を表示するために、[F2]または[ESC]キーを押します。

ラズパイのマークが表示されてブートがはじまります。しばらくすると、見慣れた Raspbian のデスクトップが表示されました。

コンパイラをインストール

Raspberry Pi Desktop X86には、コンパイラ(gcc)すでに含まれているので、特にインストールする必要がない。

VSCodeをインストール

ターミナルから、下記のコマンドでインストールする。
$ sudo su
# . <( wget -O - https://code.headmelted.com/installers/apt.sh )
# exit

これて導入完了。

導入後はメニューから code-oss を選択して起動する。

ソースコードコンパイル

C言語プログラムのファイル名を「hello.c」というファイルを作成します。ファイルの中身は「Hello, World!」という文字列を出力するプログラムです。

hello.cをコンパイルします。

$ gcc hello.c 

エラーが表示されなければ、OKです。

プログラムの実行

実行します。

$ ./a.out 
Hello, World

無事に実行できましたね。

画面コピーをとる

ターミナルから、下記のコマンドで画面コピーを取れる。
$ scort -sb

マウスでクリックした窓が、画面コピーを取れて、ホームに保存される。

Beyond the IoT and cloud computing