見出し画像

【初心者OK】5分でできる!Pythonで初めての顔認識プログラムを作ろう!

はじめに

数あるnoteの中からご覧いただき、ありがとうございます。
また、プログラミング言語Pythonに興味をもってくださり、ありがとうございます。

この記事では、プログラミング言語「Python」を使ってAIのスクリプトを体験することができます。

予備知識は不要!プログラミング経験ゼロでもできるように解説しています。

ぜひ最後までご覧ください。


この記事でできること

このnoteでは、プログラミングをやったことがないという方でも、たった「5分」で画像に写っている顔を認識するプログラムを作成する方法をご紹介します。

なお、最初にお断りしておきますが、タイトルにある「5分でできる」というのは「プログラムの入力が5分でできる」という意味であり、この資料を読みながら説明を理解して進めると5分では終わりません笑。

この点をご理解いただき、怒らないと約束していただける方はぜひ読み進めてください。

なお、「説明は不要でプログラムだけ知れば良い」という経験者の方は【顔を認識するプログラムの作成】まで読み進めてください。

前提条件

今回ご紹介する「顔認識」のプログラムは、顔認識の中でも少し古い手法となります。

AI分野は日進月歩、常に新しい技術や手法が開発されています。
僕は仕事柄、常に最新技術を追いかけていますが、どんどん複雑になっており、初心者が手を出すには敷居が高いと感じています。

そこで、少し古いとはいえ、立派な「顔認識」のプログラムが作れることを目的に手順を解説し、AI技術を「使ってみる」ことを主目的としています。

この資料を元に顔認識プログラムができたとき、「面白い!」と思ってもらえたら、次のステップとして他のやり方や新しい技術にもチャレンジしてもらえると嬉しいです。

開発環境

この資料は、プログラミングが初めての方でも簡単にプログラムが作れるように説明しています。

そのため、「そもそも開発環境を整えましょう!」から始めるとそれだけで30分以上かかりますし、エラーが出たものならそこで退場されてしまうかもしれません。

それはとてももったいないので、今回は「もっとも簡単に用意できる開発環境」として「Google Colaboratory」を利用します。
もちろん無料で利用できますので、安心して進めてください。

この「Google Colaboratory」は、Pythonの開発環境を手軽にウェブ(クラウド)上で利用できるだけではなく、他のメンバーと簡単に共有したり、リアルタイムで共同開発することもできます。

これを機に、ぜひ「Google Colaboratory」を利用してみてはいかがでしょうか。

【補足】
ここで紹介している「Google Colaboratory」の利用には「Googleアカウントへのログイン」が必要です。
アカウントを取得していない方は、取得してから読み進めてください。

tips

「Google Colaboratory」の利用準備

はじめに、「Google Colaboratory」にアクセスします。
以下のリンク先を開いてください。

リンク先にアクセスすると、以下のページが表示されます。
*すでに使ったことがあるという方は、画面が異なるかもしれません。

この時、右下の「ノートブックを新規作成」をクリックします。

これで開発環境は整いました!

準備完了!

あっという間でビックリしましたか??

「Google Colaboratory」について

本来、Pythonの開発はPC内にインストールしたり設定したり、という作業が必要ですが、この「Google Colaboratory」はクラウド上のPythonの開発環境を手軽に利用できます。

今後は「ファイルを作成する」だけでPythonのプログラミングが始められるのです。

また、基本的なライブラリやフレームワークは一通りインストールされていますので、自分でインストールする必要はありません。

自分でライブラリをインストールしたいという場合でも、一時的にインストールすることもできるので、非常に使い勝手は良いです。

例:「Google Colaboratory」でpipコマンドを利用する場合、「!pip ~」のようにpipの先頭に「!」を付けます。

「Google Colaboratory」の基本操作

はじめに、どのようにプログラムを記述するかを簡単に説明します。

現在表示されている▶の右側でカーソルが点滅しています。
ここに以下のコードを入力してください。

print(‘hello world!’)
入力結果

入力ができたら、▶をクリックすると「実行」することができます。
以下は実行結果です。

printという関数を使い、「hello world!」と表示されるプログラムを実行しました。

初めて実行するときは、少し時間がかかります。

このように、クラウド上にプログラムを記述し、実行することができます。

顔認識の仕組み

顔認識するプログラムには、「たくさんの人の顔の情報を学習したデータ」が必要です。

世の中の顔認識プログラムの大半は、類似する「学習データ」が必要となります。

その「学習データ」をプログラムが「学習」するAIの仕組みを「機械学習」といい、今回はこの機械学習の代表的なプログラムをご紹介します。

機械学習の仕組み(簡易)

私たち人間も「これは猫である」と認識するためには、「猫はこういうものだ」というサンプル(情報)が必要ですね。

生まれたばかりの赤ちゃんが猫を見ても「猫だ」と認識できないのは、「猫の情報がないから」です。

同じように、プログラムが「人の顔」を認識するためには、「人の顔の情報」が必要となるのです。

その「人の顔の情報」を学習し、与えられた画像(未知のデータ)の中から顔を探すことができるプログラムを作成します。

機械学習の流れ(簡易)

なお、AIの技術は顔認識だけではなく、Gmailでスパム(迷惑メール)を自動で仕分ける仕組みや、メルカリの出品システム(写真から似ている商品を検索したり、違反を検知する仕組みなど)でも利用されており、私たちにとってとても身近な技術です。

学習データが必要だということをご理解いただいた上で、そのデータを用意する流れを簡単に図解しておきます。

見ての通り、自分で用意するのは大変なので、次ページの作業を行います。

前処理から学習まで

準備

顔の学習データの取得

さて、「顔の学習データ」は自分で用意することもできますが、それはとても大変な作業なので、今回はすでに作成されたデータを利用させてもらいます。

今回のプログラムでは、「OpenCV」という画像処理や解析の機能を持つオープンソースのライブラリを利用し、「Haar-like特徴分類器」と呼ばれる方法で顔の特徴量を学習させ、学習データをもとにパターン認証を行うカスケード分類で顔を認識します。

Haar-like特徴分類器のイメージ解説

頭の中が「?」でいっぱいになったという方。安心してください。

理屈は不要ですので、上の説明が理解できなくても問題ありません。
それがPythonの便利なところでもあり、怖いところでもあると思いますが、今回は「体験してみよう」なので問題ないのです。

早速、顔のデータを取得するために、以下にアクセスしてください。

GitHubというサイト内のカスケードファイルの一覧
https://github.com/opencv/opencv/tree/master/data/haarcascades

OpenCVのカスケードファイル(学習済みの顔データ)

下にスクロールすると、「haarcascade_frontalface_alt.xml」というリンクがあるので、これをクリックします。
※似たものがたくさんあるので注意してください。

今回はこれを選ぼう

リンク先の右側に「Raw」というボタンがあるのでクリックします。

そのままの生データが見れる

コードがずらっと表示されますが、混乱しないようになるべく見ないでください。

このとき、コードの辺りをどこでも良いので 右クリック して 名前を付けて保存 をクリックします。

右クリックの位置によっては同じメニューがでないので注意

適当な場所に「haarcascade_frontalface_alt.xml」という名前で保存します。

変えても良いが、スクリプトも変える必要が出るので変えないのが無難

ファイルが保存されました。

保存された

上の図はEdgeのアイコンになっていますが、お使いの環境によっては異なります。

今後の作業には影響がありませんので気にしないでください。

画像データのアップロード

最後の準備として、以下2つのファイルを「Google Colaboratory」にアップロードします。

①先ほど用意したカスケードファイル(haarcascade_frontalface_alt.xml)
②認識したい画像ファイル

やり方は、①左側のフォルダのマークをクリックし、②上記の画像ファイルとカスケードファイルを下図の緑の□の辺りにドラッグします。

ファイルをコピー(転送)している

ファイル名が表示されたら成功です。

この例では画像ファイルはfacesample.jpg

これで準備はすべて終わりました。

なお、詳しい方に向けて補足しておきます。
顔の学習用データは他にも種類がありますので、興味があれば上記のGitHubのサイトからダウンロードして試してみると良いでしょう。

例:haarcascade_eye_tree_eyeglasses.xml = 眼鏡を認識する、等

その他のカスケードファイルの例

いよいよ、次からプログラムを作成します。

顔を認識するプログラムの作成

プログラムだけ知りたいという方への補足

説明不要でプログラムだけ知りたいという方はここからご覧いただいていると思いますが、顔認識に使うカスケードファイルが必要です。

手順は上の「準備」で説明していますので合わせてご覧ください。

また、今回はGoogle Colaboratoryを使って解説しますが、ご自身のローカル環境でも同じことができます。

ただし、プログラムを実行するために必要なライブラリが必要となりますので、その説明については後述する「ローカル環境の準備」を参考にしてください。

本題

さて、ここからが本題です。

顔を認識するプログラムの詳細説明は割愛しますが、プログラムの流れとしては、

  1. 顔のデータ(haarcascade_frontalface_alt.xml)から学習データを作成

  2. 顔を認識したい画像データを読み込んで白黒画像に変換

  3. 顔を検出したら赤い枠線を付ける

となっています。

実行し、画像データ内に人の顔(正面)がある場合は下のように赤い枠が付いて画像ファイルが出力されます。

顔認識のビフォーアフター

それでは、順に進めていきましょう。

手順

「Google Colaboratory」を開きます。

前述の【動作確認】で「hello world!」を実行した方は、入力した部分を削除してください。

何もない状態で進めます

この中に、次のプログラムを入力します。

顔を認識して赤枠を付ける最低限のコード

「入力するのがメンドクサイ!」という方、下のコードをコピーしてお使いください!

import matplotlib.pyplot as plt
import cv2

cascade_file = 'haarcascade_frontalface_alt.xml'
cascade = cv2.CascadeClassifier(cascade_file)

img = cv2.imread('face01.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

for (x,y,w,h) in face_list:
    red = (0, 0, 255)
    cv2.rectangle(img, (x, y), (x+w, y+h), red, thickness=20)

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

コードが入力できたら、実行します。

コードを入れたら、実行しましょう

顔を認識するプログラムの手順は以上です。

なお、エラーが出るという方は「良くある原因」をまとめたので以下を参考にして見直してください。

  • 写真ファイルの名前または保存先が違う

  • カスケードファイルの名前または保存先が違う

  • コードの入力ミス

以下、エラーが出る場合の実行結果です。

写真がない(ファイル名が違う)場合のエラー
カスケードファイルがない(ファイル名が違う)場合のエラー
コードに間違いがある場合のエラー

初心者のうちは、エラーを見ても解決できないかもしれません。

しかし、最も多いエラーの原因は「入力ミス」です。
もう一度、コードを良く見直しましょう。

それでもエラーが出るという方は、記事の最後に紹介している問い合わせフォームまで連絡してください。

実行結果

上手くできましたか?

顔を認識していると、顔の周りに赤い枠がついた結果が表示されます。

上手くいった場合

このとき、上手く認識できないと赤い枠はつきません。

失敗した場合

その原因と対策については次のセクションで解説します。

失敗する場合の原因と対策

同じようにやっているのに顔が認識できない場合、以下の理由が考えられます。

  • カスケードファイルが適切ではない

  • プログラム内のパラメータが適切ではない

  • 画像ファイルの顔の状態が適切ではない

順に説明します。

カスケードファイルが適切ではない

上の「準備」で説明した通り、GitHubのサイトから顔のデータである「haarcascade_frontalface_alt.xml」を保存して使います。

このとき、似たような名前がたくさんあったと思いますが、「haarcascade_frontalface_alt2.xml」「haarcascade_frontalface_default.xml」「haarcascade_fullbody.xml」など他のファイルを使用すると上手く認識できない場合があります。

まずは、同じようにやってみてください。

プログラム内のパラメータが適切ではない

今回はプログラムの詳細説明は割愛していますが、パラメータについて簡単に解説します。

プログラムの中で、以下の部分に注目してください。

face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

本来、AI(機械学習)の顔認識プログラムは、複数のパラメータを調整することが必要です。

しかし、今回のプログラムは最低限の処理に留めており、パラメータといえるのはこの1か所のみです。

簡単にいうと、「顔として認識する最小サイズ」を150×150としています。
これよりも小さいものは認識されません。

例えば、以下の写真は顔が小さすぎて認識できなかったものです。
このとき、minSizeを変えることで認識するようになりました。

つまり、写真サイズを変えるか、写っている顔の大きさを変えるか、このパラメータの数値を変えることで認識できるようになるかもしれません。

ただし、このパラメータを小さくし過ぎると「顔に見える顔ではないもの」も認識してしまう(=誤認識)ということがおきます。

適切な値は150を推奨していますので、写真をもう一度選びなおしても良いでしょう。

画像ファイルが適切ではない

今回使用しているカスケードファイルは「haarcascade_frontalface_alt.xml」ですが、これは「顔の正面」を認識することができます。

つまり、以下のような顔は認識できないのです。

  • 横顔

  • 正面でも一定以上回転している状態

  • 目、鼻、口の一部のパーツが隠れている

上手く認識できない理由:顔の角度の問題

また、以下の理由でも顔の部分を上手く認識できません。

  • 顔の背景がゴチャゴチャしている

  • 写真が明るすぎる(または暗すぎる)

  • 写真のコントラストが強すぎる(または弱すぎる)

  • 写真サイズ(ピクセル)が大きすぎる(または小さすぎる)

結構制限されるように感じるかもしれませんが、今回の顔認識の方法には限界があるということです。

他の顔認識の技術を使うことで、解決されるものもあります。

ローカル環境の準備

今回紹介したプログラムには、matplotlibとOpenCVというライブラリが使われています。
(ライブラリの意味について、本題にはあまり関係がないので説明は省略します。)

matplotlibはグラフや画像を描画するため、OpenCVは画像処理のために必要です。

Google Colaboratoryを利用する場合、基本的なライブラリがインストールされた環境が用意されているので問題がありませんが、ご自身のローカル環境で実行する場合は必要なライブラリをインストールする必要があります。

おそらく、この説明をご覧になる方は経験者だと思いますので、詳しい説明は抜きに手順だけご紹介します。

コマンドプロンプトでインストール

はじめに、コマンドプロンプトでインストールする方法をご紹介します。

通常、Pythonでライブラリを操作するコマンドは「pip」を使います。
インストールするなら「pip install」、ライブラリの状況を確認するなら「pip list」を使います。

例えば、現在のライブラリのインストール状況を確認する場合、

pip list

と入力します。
すると、ローカル環境にインストールされているライブラリが一覧で表示されます。

pip listの実行結果

また、matplotlibをインストールする場合、

pip install

と入力します。
すると、勝手にインストールが行われます。

pip install matplotlibの実行結果

なお、OpenCVをインストールする場合は

pip install opencv-python

と入力します。

ちなみに、複数のPythonのバージョンがインストールされている場合、若干複雑になります。
ここでは解説を省略しますので、下記のブログ記事を参照してください。

IDE等の開発環境でインストール

その他、Visual Studio CodeやPyCharmなどの開発環境をお使いの場合は環境ごとに様々かと思いますが、私個人はPyCharm推しなので下記のブログ記事を参照してください。

こちらの記事では、仮想環境を作ってライブラリをインストールする方法を紹介しています。

まとめ

最後までご覧いただき、ありがとうございます。

今回は「プログラミングが初めて」の方でも「顔認識プログラムが実行できる」を目標に解説しました。

上手くできましたか?上手くできなかった場合、下のトピックスを参照にしてください。

この記事をきっかけに「プログラミングって面白い!!」と思って頂けたらとても嬉しいです。

今後も楽しい講座を企画しますので、またお会いしましょう!

上手くいかない場合

できるだけ丁寧に解説してきたつもりですが、それでも人によって環境が異なるなどして同じようにできない場合があります。

そのときは、ぜひお問い合わせください。

いつまでサポートできるかは分かりませんが、この文章が見えている間はサポートしたいと思います。

以下のブログのお問い合わせフォームからどうぞ。

また、定期的にPythonやプログラミング初心者に向けた情報を発信しています。
最新情報を見逃さないようにメルマガを購読してください。

それでは、ステキなPythonライフを!


この記事が気に入ったらサポートをしてみませんか?