顔検出 3分クッキング on MacOSX

概要

ラズパイ使って家族と判断したら
「こんにちはご主人様」
家族以外なら
「通報しまーす」
と話してくれるおもちゃを
作ろうと思ってます。

その前段の前段として
静止画で顔検出してみます。

ちなみに顔検出と顔認識は意味が全く異なります。

  • 顔検出 … 顔部分を検出すること。
  • 顔認識 … 特定の人物の顔と判断すること。

環境構築は前回記事を参照してください。

環境

  • MacOSX 10.11.5
  • Python 3

CV2 インストール

  • homebrew で cv2 インストール
1
2
$ brew tap homebrew/science
$ brew install opencv3 --with-python3
  • Python 3 を利用する
1
2
$ source ~/py3env/bin/active
(py3env)$
  • cv2.so を pip の site-package へコピー
1
2
(py3env)$ cd ~/py3env/lib/python3.4/site-packages
(py3env)$ cp /usr/local/Cellar/opencv3/3.1.0_3/lib/python3.4/site-packages/cv2.so .
  • cv2 import 確認

Version が表示されれば成功

1
2
(py3env)$ python -c 'import cv2; print(cv2.__version__)'
3.1.0

スクリプトインストール

1
2
3
(py3env)$ cd ~/py3env
(py3env)$ git clone https://gist.github.com/kenzo0107/5d174797a5a222295b5a39f6fa435777
(py3env)$ cp ./5d174797a5a222295b5a39f6fa435777/trimming.py .

スクリプト実行

1
(py3env)$ python trimming.py <img_path>
  • Before

  • After

革パンも顔認識されてしまう…

が、一応まずできました。

今回のスクリプト要点

  • 正確な検知数を向上させるべく、スクリプト上の以下 detectMultiScale メソッドのパラメータを調整します。
1
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.02, minNeighbors=3, minSize=(7,7))
Item Value
scaleFactor 画像解析する際に随時縮小し解析するその尺度
minNeighbors 最小近傍矩形
minSize 顔部分を認識するためのサイズ (縦,横)

まず最初の第一歩ができました♪

負荷監視とその原因調査

負荷監視とその原因調査

概要

新卒向けの説明として簡単な備忘録です。

-Item- -Explain-
%user ユーザー空間での CPU 使用率
%system カーネル空間での CPU 使用率
%iowait I/O 待ち時間の割合
%idle I/O 待ち以外で CPU が何もしていない時間の割合

ある日の Zabbix + Grafana の CPU 関連のグラフから原因を調査する。

① %iowait が飛び抜けて高い

  • %iowait 高
  • %user 低
  • %system 低

原因

スワップが大量に発生している可能性がある。

調査手順

1. SwapIn & SwapOut 確認

1
$ sar -W

2. システム全体のメモリ使用状況

1
$ free

3. メモリ使用率順でソート後メモリを消費しているプロセスを特定する

1
$ top
  • Shift+p: CPU 使用率順にソート
  • Shift+m: メモリ使用率順にソート
実際の原因

定期的に同時刻に発生した為
crontab -l でクーロン設定確認したら
誰も知らないバッチが動いていた汗

② %user が飛び抜けて高い

  • %iowait 低
  • %user 高
  • %system 低

原因

CPU 使用率が高い。

調査手順

1. CPU 使用率の高い順にソートしてプロセス特定

1
$ top
  • Shift+p: CPU 使用率順にソート

ほんの一部分ですが参考になれば何よりです。
以上です。

機械学習ド素人のWebエンジニアが始める機械学習で顔認識

前回

顔検知と顔認識は本質が異なる。

  • 顔検知は顔と判定すること
  • 顔認識は顔が誰か特定の人の顔だと判定すること

今回は後者の顔認識をする仕組みをまとめました。

やろうとしてること

以下5つのSTEPを順を追って実施しています。

  1. 検索エンジンから画像ダウンロード
  2. ダウンロードした画像から顔検知し顔部分のみ抜き取る
  3. 顔部分を抜き取った画像を訓練用と試験用に分ける
  4. 機械学習によりモデル作成
  5. 試験用画像をモデルを利用し誰の顔であるか評価

参考

機械学習では TensorFlow を利用してます。

① 以下 TensorFlow の Hello World 的な例題とコピペすればすぐ動作するコードが記載されてます。

② すぎゃーんさんの記事は非常に参考になりました。

やっていることもシンプルでわかりやすく、且つ、Webエンジニアの発想でサービス化してる所が興味持って望めました。

今後

元々やりたかったことは
Raspberry PI で顔認識して家族だと判定したら「おはよう」と挨拶させる、
なのでその顔認識部分の基礎を今回は学びました。

今後は実際にRaspberry PI とどう今回の仕組みを連結させるかを
やってみようと思います。

とはいえ家族の写真はそう簡単には集まらないので
SMAPで基礎作りをもうちょい頑張ってみよう!

複数画像ファイルから顔検知し顔部分をトリミングしたサンプルを集める

複数画像ファイルから顔検知し顔部分をトリミングしたサンプルを集める

前回

画像ファイルを指定し
顔検知させる機能を実装しました。

今回

まずはサンプル画像を集めます。
自分はネット上から BeautifulSoup でスクレイピングして落としてみました。
(スクリプトまとめたら公開します)

適当に 13 枚。
ゆくゆくは機械学習したいのでもっと欲しいところですが
今回はスクリプトの紹介がメインなので
この程度で。

顔部分トリミング

スクリプトです。(for Python 3)

1
2
3
4
5
6
// clone
$ git clone https://gist.github.com/kenzo0107/517258ab06715f73c4a3457e87fd25a5
$ cd 517258ab06715f73c4a3457e87fd25a5

// スクリプト実行
$ python collect_face_samples.py -p <サンプル画像が格納されているディレクトリ>

実際スクリプト実行した様子です。

_trimming フォルダにトリミングされた画像群が格納されているのがわかります。

以下 No 順に格納されていきます。

No Item Explain
1 _resize 大小さまざまな画像サイズを一定して高さ 500 以下の画像にリサイズします。
2 _addbox 顔周りに囲い画像が追加された画像が格納されます。各画像でどこが顔として検知されたかの確認用です。
2 _trimming _addbox に格納されているファイルの顔部分をトリミングした画像を 64×64 サイズにリサイズし
且つ、数度回転させた画像が格納されています。

これでサンプル集めが捗れば何よりです。