Cascade分類器を使って、写真ファイルに顔認識を実行したときのメソッドやモジュールのまとめ

▼この記事をSNSでシェアする▼

スポンサーリンク

スポンサーリンク

最近Djangoから離れて、Pythonの機械学習をボチボチやってます。

PythonのWebフレームワークどうせやるならPythonも詳しくなりたいなっていうのと機械学習が面白そうで始めました。

1. 顔認識に必要なもの・ゴール

今回はJupyter NotebookでイメージファイルやPythonのスクリプトを管理して、とりこんだ写真の人の顔に長方形の枠を当てることをゴールとします。

こんなかんじ。

カメラで写真とるときに新しいカメラだと、こんなのありますよね。今回はこれをやって見ます。

必要なもの・前提条件

  1. カスケードファイル
  2. 読み込みたい写真
  3. OpenCVなどのパッケージがインストールされていて、Jupyter Notebookが利用できる環境

1については3.1、2については3.2で説明します。

3.については2.の次の環境についての説明を参照してください。

2. ぼくの利用している環境

おさらいしておきましょう。

Mac OS High Sierra10.13.6に下記のものを利用しています。

  • Atom(テキストエディタ+ターミナル付き)
  • Homebrew(パッケージマネージャ)
  • pyenv(Pythonのバージョン管理ツール)
  • pyenv-virtualenv(仮想実行環境用のツール)
  • Anaconda(Numpyとか便利なライブラリがセットで便利)
  • OpenCV:画像・動画処理のライブラリ
  • MeCab:日本語形態素解析のライブラリ
  • Gensim:自然言語処理のライブラリ
  • TensorFlow / Keras:ディープラーニングライブラリ

ここらへんを入れて、Jupyter Notebookを使っています。

機械学習のために上のセットアップをした時の手順はこちらを参照してください。

今回使うのはOpenCVです。
下記コマンドを使えばインストールできます。

3.  顔認識用のデータ準備

3.1 カスケードファイル

YML形式のファイルをGitHubからダウンロードします。

下記GitHubへのリンクをクリック

GitHub(haarcascades)

今回は顔全体の認識用のカスケード分類に用いるファイルをダウンロードしますが、他のファイルをダウンロードすれば、鼻など顔の他のパーツの認識を行うことができます。

「haarcascade_frontalface_alt.xml」というものを選びます。

[Raw]ボタンをクリックすると、ダウンロードできます。

Jupyter NotebookにUploadするときは、

[Upload]ボタンをクリックし、そのファイルを選択し、[開く]ボタンをクリックすると、Jupyter Notebookで使っているフォルダに格納できます。

また、ローカルから仮想環境を実行している場合は、Jupyter Notebookで管理しているフォルダにファイルを格納すれば使えます。

3.2 顔認識を適用したい写真

png/jpeg/jpg使えます。

※ 厳密に使える全ての拡張子は確認できてなくてすみません。

3.1で紹介した方法で用意した画像ファイルをアップロードしてください。

4. 顔認識を実行するPythonスプリプト

4.1 Pythonスクリプト

[New] > [Python3]をクリック

下記コードを入力します。

4.2 コードの説明

今回出ているメソッドの説明の詳細は以下のリファレンスをみると良いと思います。

OpenCVの仕様:http://opencv.jp/

matplotlibの仕様:https://matplotlib.org/

といっては投げやりすぎるので、おおまかな説明を残しておきます。

(1)cv2(OpenCV)のモジュールをインポートして、3.1でアップしたYMLファイルを

「cv2.CascadeClassifier(カスケードファイル)」でカスケード分類器の特徴量をcascadeという変数に代入します。

(2) 画像をダウンロードして、imgという変数に格納します。

「cv2.imread(“ファイル名”)」で画像を取得できます。3.2で準備したファイルの名前を指定します。

cvtColorメソッドをつかって、

cv2.cvtColor(入力画像ファイル(, 出力画像ファイル),色空間の変換コード(,出力画像のチャンネル数))

画像ファイルは8ビット符号なし整数型,16ビット符号なし整数型( CV_16UC... ),または単精度浮動小数型のものを使う指定がありますが、imreadメソッドを使ってクリアされています。

※色空間の変換の詳細についてはこちらがわかりやすいかと思います。

Python3 & OpenCV で画像処理を学ぶ[1] 〜 色空間を工学的に理解する

(3) (1)で使用したcascade変数にdetectMultiScaleメソッドを用いて顔認識を実行します。

detectMultiScale(画像(CV_8U行列),minSize(width,height),maxSize(width,height))

このパラメータがよく使います。

認識されたデータはface_listに配列として格納されます。

詳しい仕様はこちら

(4) (3)でface_listにデータが格納されなかった場合の処理を書いています。該当データがない場合はquit()し、(5)(6)の処理を実行せず、「失敗」の表示を出します。

(5)(3)で顔認識を実行し、face_listに格納されたデータは(x,y,w,h)という形式になっています。

  • 画像の左上の座標を(0,0)
  • 右方向x正、下方向y正とする。
  • x:長方形の左上の頂点のx座標
  • y:長方形の左上の頂点のy座標
  • w:長方形の横の長さ
  • h:長方形の縦の長さ

これらのデータを用いて、rectangleメソッドを使ってプロットします。

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

  • img:画像ファイル
  • pt1:長方形の左上の頂点の座標
  • pt2:長方形の右下の頂点の座標
  • color:(B,G,R)形式の色の情報 Blue,Green,Red:0~255
  • thickness:線の太さ、塗りつぶし。デフォルト1,-1にすると閉じている図形は塗りつぶされる
  • lineType:線の種類。デフォルトはcv2.LINE_8(8連結)他にはcv2.LINE_4(4連結)、cv2.LINE_AA(アンチエイリアス

(6) 枠つきの画像を別名で保存し、コンソール上に出力します。

ファイルの保存はimwriteメソッドを使用します。

cv2.imwrite(“保存したいファイルの名前”, 枠をつけた画像ファイルの変数)

pltという変数でインポートしているmatplotli.pyplotのメソッドを使いコンソール状に出力します。

plt.imshow(画像ファイル)で画像を表示することができます。

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html

plt.axis(“off”)と記述することで座標軸の表示を消します。

引数がcvtColorについては(2)参照。

plt.showでディスプレイ用に加工した画像を実際に表示します。

5. 実行結果

Jupyter Notebookの[▶︎Run]をクリックすると、

このように、ぼくが尊敬しているYouTuberのステハゲ さんの顔が赤い四角で囲われていて、その座標情報も出力されています。

途中言葉足らずな説明もあったとは思いますが、最後までご覧いただきありがとうございます。

面白いなと思ったら是非試して見てください!

スポンサーリンク

▼この記事をSNSでシェアする▼

フォローする

メニュー・主な記事カテゴリ

おすすめ特集!




「ゆとり鳥日記」について
ITを中心に関心の赴くままに好きなように書いていく雑記ブログ!管理人が二人います。
◆フクロウ(19卒就活生)
◆トンビ(社会人1年目SE)

詳しいプロフィール
お仕事の依頼・ご要望

ゆとり鳥日記をBTCで応援する