見出し画像

【杜陵高・定時制】pythonで顔を検出する!(杜陵高校DX化戦略#07)

杜陵高校DX化戦略の第7弾です。

3年次の宮田くんが、テキスト型プログラミング言語『python(パイソン)』の習得中です。
pythonは「情報Ⅰ」の授業でも触れたプログラミング言語です。以下のような特徴がある開発言語です。

・シンプルで読みやすい構文
・豊富なライブラリ(部品)が活用できる
・多くの利用者があるため、その開発情報が豊富に手に入る
・数値計算や統計処理を得意とする

pythonの主な用途は、Webアプリケーション開発、AI開発、科学技術計算、データ分析、事務作業の自動化など、多岐にわたる活用がされています。

プログラミングのビギナーから、情報系大学の学生さん、研究開発者、一般企業の開発者の方々が活用されているそうです。今はやりの「AI」関連も得意分野のpythonです。

宮田くんは、このような特性を生かして、スマホやデジカメ、ビデオカメラには標準搭載されている機能である「顔検出」プログラムの開発をしました。インターネット上には、多くの作成例も公開されているところですが、宮田くんは自分なりの工夫を加えてプログラミングしてくれたようです。

開発環境は、Googleで提供している、「Google Colaboratory」です。

プログラムの構造は、下図のとおりです。


【実行結果】
 

【検証】
・横顔は認識されませんでした。
 理由は、「前面から見た顔の分類器を使用」したからでした。
・かなりの精度で顔が検出されました。


【開発コード】

# 顔検出(トリミング+保存)
# *****************************************************************************

# ライブラリのインポート
import cv2
import os
import shutil

# 元画像ファイルの指定
image_path = "/content/_input/family.jpg"

# カスケード分類器ファイルの指定
cascade_path = "/content/_input/haarcascade_frontalface_alt.xml"

# 画像ファイル読み込み
image = cv2.imread(image_path)

# グレースケール変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)

#物体認識(顔認識)の実行
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.2,
 minNeighbors=2, minSize=(10, 10))

# outputフォルダの初期化
shutil.rmtree("/content/_output")
os.mkdir("/content/_output")

for rect in facerect:
  #顔だけ切り出して保存
  for i, rect in enumerate(facerect):
    x, y, width, height = rect

    face_image = image[y:y+height, x:x+width]
    new_image_path = "/content/_output" + '/' + str(i) + path[1]
    # 切り出しファイルの保存
    cv2.imwrite(new_image_path, face_image)
    i +=1


【開発者宮田くんの感想】

★顔を切り出すコードと枠をつけるコードを組み合わせる時に出来るだけ簡素になるように設計するところに苦労しました。
★顔検出した画像に枠を付けてから切り取る事で、同じ命令をなくす所を工夫しました。