Colab(6) Face Detect

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

事前準備

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

  1. haarcascade_eye.xml
  2. haarcascade_frontalface_default.xml

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

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

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

 

コード

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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

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時点)

コード

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# -*- 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()
# -*- 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()
# -*- 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()

 

結果

Colab(3) use MatPlot

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 必要なライブラリの利用を宣言
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
# グラフを描画
x = np.arange(0, 20, 0.1)
y = np.cos(x)
plt.plot(x,y)
plt.show()
# 必要なライブラリの利用を宣言 %matplotlib inline import matplotlib.pyplot as plt import numpy as np # グラフを描画 x = np.arange(0, 20, 0.1) y = np.cos(x) plt.plot(x,y) plt.show()
# 必要なライブラリの利用を宣言
 %matplotlib inline
 import matplotlib.pyplot as plt
 import numpy as np
 # グラフを描画
 x = np.arange(0, 20, 0.1)
 y = np.cos(x)
 plt.plot(x,y)
 plt.show()