Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118
Notice: A non well formed numeric value encountered in /export/sd215/www/jp/r/e/gmoserver/2/9/sd0971329/dandelions.co.jp/blog/wordpress-4.9.8-ja-jetpack_webfont-undernavicontrol/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119
技術者ブログと題して社員が日ごろ取り組んでいる学習内容を紹介します。
第1回は、AIをテーマにしている第1ユニットです。
今回のテーマ
『画像の中から顔を判別する』
使用する言語 – Python
機械学習向けのライブラリなど環境が充実しており情報も集めやすいです。
使ったもの – OpenCV
OpenCV(正式名称: Open Source Computer Vision Library)は、オープンソースのコンピューター・ビジョン・ライブラリです。コンピューターで画像や動画を処理するのに必要な、さまざま機能が実装されており、BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。
引用
https://www.buildinsider.net/small/opencv/001
OpenCVには画像の特徴から判断するためのライブラリがあらかじめ用意されています。(カスケード型分類器とか言ったりするらしい)
今回はそれを利用し、用意した画像から顔を認識させ、顔の部分だけ切り出した画像を出力するプログラムを作成します。
ソースコード(抜粋)
トライ&エラーの過程は省略させていただき、実際に作った内容をざっくりと書きます。
openCVのインポート
1 |
import cv2 |
カスケード型分類器に使用する分類器のデータ(xmlファイル)を読み込み
1 |
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')<br> eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') |
カスケード型分類器に使用する分類器のデータ(xmlファイル)を読み込みます。
今回は顔と目検出を行いたいため、上記2つのファイルを指定します。
カスケード型分類器を使用して画像ファイルから顔部分を検出する
1 |
faces = face_cascade.detectMultiScale(img, 1.02, 5) |
顔検出を行います。検出に成功した場合は画像のサイズが出力されます。
検出部分を切り出して画像保存
1 |
x,y,w,h = item['frame']<br>face = rotated[y:y+h, x:x+w] <br>face = cv2.resize(face, (IMAGE_SIZE, IMAGE_SIZE)) <br>web_path = '%s/%s_%s.jpg' % (out_dir, fn, item['face_id']) <br>out_file = '%s/%s' % (base_dir, web_path) <br>cv2.imwrite(out_file, face) <br> |
実際にやってみた
この画像を指定してプログラムを実行すると…
↓
顔だけ認識された画像が生成されました!
作ってみた感想
検索すると沢山の情報がでてきて、案外簡単につくることができました。
実際にソースを書く部分より、PythonやOpenCVのインストールなどの環境構築のほうが苦戦したかもしれません。
みなさんも興味があれば挑戦してみてください。
ここから切り出した画像を使い、誰の顔か判定する仕組みを作ってみたりしましたが、この先の話はまた次の機会に書きたいと思います。