Category Archives: Python ML@ Mac

Mac: GoogleHome通知

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から人物認識の段階に来ました。

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

写真データベース

知っている人の写真を画像フォルダに入れてください。
  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で動く

Mac: face_recognition

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

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 ~ %

CV(3) Eye Mosaic

検出領域にモザイク処理

検出した領域にモザイクをかけたりすることもできる。

Viでサンプルコードを作成

$ vi test3.py 

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'
                   'OpenCV/haarcascades/haarcascade_eye.xml'

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

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

ratio = 0.05

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_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)
        eye = face[ey: ey + eh, ex: ex + ew]
        small = cv2.resize(eye, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
        face[ey: ey + eh, ex: ex + ew] = cv2.resize(small, (ew, eh), interpolation=cv2.INTER_NEAREST)

cv2.imwrite('data/dst/opencv_eye_detect_mosaic.jpg', src)

処理結果

$ python2 test3.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 512
drwxr-xr-x 4 chen staff 128 6 25 01:45 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 108333 6 25 01:51 opencv_eye_detect_mosaic.jpg
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_eye_detect_mosaic.jpg が作成されたことが確認した。

Mac: OpenCVの導入

 

Homebrew OpenCVの導入

 

chen@Hong-Mac-mini Python % brew install opencv
Updating Homebrew…

沢山のメッセージが流れ、終わったらしい。

インストールしたものを確認。

最近知ったのですが、モジュールのインストールの確認だけであれば、わざわざインタラクティブシェルを起動しなくても、以下のようなコマンドで問題無いようです。

chen@Hong-Mac-mini ~ % python -c 'import cv2'
chen@Hong-Mac-mini ~ %

環境設定の確認

次のコードで、現在Phthonと顔認識パッケージのバージョンの確認できる

myenv.py

import sys
import cv2
import numpy
print("sys.path:\n" + "\n".join(sys.path))
print("OpenCV: " + cv2.__version__)
print("NumPy: " + numpy.__version__)

 

chen@Hong-Mac-mini Python % vi myenv.py
chen@Hong-Mac-mini Python % python myenv.py
sys.path:
/Users/chen/Documents/Python
/usr/local/lib/python3.8/site-packages/cv2/python-3.8
/usr/local/Cellar/python@3.8/3.8.3_1/Frameworks/Python.framework/Versions/3.8/lib/python38.zip
/usr/local/Cellar/python@3.8/3.8.3_1/Frameworks/Python.framework/Versions/3.8/lib/python3.8
/usr/local/Cellar/python@3.8/3.8.3_1/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload
/usr/local/lib/python3.8/site-packages
/usr/local/Cellar/protobuf/3.12.3/libexec/lib/python3.8/site-packages
OpenCV: 4.3.0
NumPy: 1.19.0
chen@Hong-Mac-mini Python %

 

 

顔画像の自動収集

ソースコードの取得

Cloning into ‘hello_ghome’…
remote: Enumerating objects: 23, done.
remote: Total 23 (delta 0), reused 0 (delta 0), pack-reused 23
Unpacking objects: 100% (23/23), done.

収集したデータの保存フォルダを作成

 % cd hello_ghome

% mkdir img

haarcascades PATHの修正

OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルhaarcascadesを事前に用意されています。

OpenCVインストールしたなら、haarcascadesファイルのもうどこかに置いてる。まず、locateコマンドでhaarcascadesファイルの場所を確認してください。
 % locate  haarcascade_frontalface_alt.xml
見つからないなら、Githubからgit cloneしましょう。
次は、テキストエディタで face_camera/detector.py の haarcascades に対応PATHの修正。
% vi face_camera/detector.py

コード実行してみる

 % python face_camera/camera.py img/
img//2020-07-10-180719_0.jpgis clip and saved!
img//2020-07-10-180719_0.jpgis clip and saved!
img//2020-07-10-180720_0.jpgis clip and saved!
img//2020-07-10-180720_0.jpgis clip and saved!
img//2020-07-10-180721_0.jpgis clip and saved!
img//2020-07-10-180721_0.jpgis clip and saved!
img//2020-07-10-180722_1.jpgis clip and saved!
img//2020-07-10-180722_1.jpgis clip and saved!

 

 

関連記事:

  • https://qiita.com/niwasawa/items/03b1496dbb360ca157e0 — OpenCV 4.3 + Python で Hello World と顔検出

CV(2) Face Detection

Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)

静止画の特徴検出

静止画: 画像ファイルを読み込んで顔検出と瞳検出

Macにhomebrewでopencv3をインストールした場合、

/usr/local/opt/opencv/share/OpenCV/haarcascades/
に学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)がある。

以下のようにいくつかの種類のデータが用意されている。

  • 正面の顔検出用: haarcascade_frontalface_default.xml
  • 瞳検出用: haarcascade_eye.xml
  • 笑顔検出用: haarcascade_smile.xml

cv2.CascadeClassifier()でパスを指定してxmlファイルを読み込む。

サンプル画像の用意

上の写真をダウンロードして保存し、必要なフォルダを作成して、写真を移動してください。

$ mkdir data
$ mkdir data/src
$ mkdir data/dst
$ cp ~/Downloads/Lenna_test_image.png data/src/lena_square.png

検出領域の枠を描画

そしてViでサンプルコードを作成

$ vi test2.py 

サンプルコード(test2.py)

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'
                   'OpenCV/haarcascades/haarcascade_eye.xml'

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

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_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)

cv2.imwrite('data/dst/opencv_face_detect_rectangle.jpg', src)

 

処理結果

$ python2 test2.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 256
drwxr-xr-x 3 chen staff 96 6 20 00:48 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_face_detect_rectangle.jpg が作成されたことが確認した。

 

参考

CV(1) Read image

画像ファイルを読み込み

おなじみのlenaさんの画像を使う

PythonのOpenCVで画像ファイルを読み込みはcv2.imreadを使う。

実行するコードと画像が別の場所にあるとして、
一度image_pathに画像のディレクトリのパスを指定します。
ここでは、”/Users/chen/Downloads/”とする。

動作確認環境は以下の通り
– Python 3.6
– OpenCV 3.2

何はともあれ画像出力

read_and_show.py
import cv2

#画像読み取り
image_path = "lenaさんの画像を格納してるディレクトリのパス" #例えば "/Users/chen/Downloads/"
image = cv2.imread(image_path+"lena.jpg")  #画像読み取り imread(filename)

#画像表示
cv2.imshow("image",image) #画像出力 imshow(window_name, matrix)
cv2.waitKey()             #キー入力待ち waitKey(delay=0)
cv2.destroyAllWindows()   #ウィンドウを消す destroyAllWindows()

無事表示ができました。

問題は、キーを押してもプログラムは終了されない、そのプロセスを殺して、やっと終了できた。

参考:

  • https://note.nkmk.me/python-opencv-imread-imwrite/

Install OpenCV by Homebrew

Homebrew導入

もしHomebrew導入されてない場合は、下記のコマンドで導入

/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

ChenLab-Mac-Urania:~ chen$ brew -v
Homebrew 1.5.10

Python, OpenCVの導入

ChenLab-Mac-Urania:~ chen$ python -V
Python 2.7.10

続いて、opencvの導入

ChenLab-Mac-Urania:~ chen$ brew install opencv
Updating Homebrew…

沢山のメッセージが流れ、終わったらしい。

インストールしたものを確認。

ChenLab-Mac-Urania:~ chen$ which python3
/usr/local/bin/python3
ChenLab-Mac-Urania:~ chen$ which python2
/usr/local/bin/python2
ChenLab-Mac-Urania:~ chen$ python3 -V
Python 3.6.5
ChenLab-Mac-Urania:~ chen$ python2 -V
Python 2.7.15
ChenLab-Mac-Urania:~ chen$

これて環境準備OK.