2021年05月10日
好みの顔の判別器をラズパイに実装し、webブラウザで判別結果を表示
2000枚以上の顔写真から、
好みの顔と好みでない顔を手作業で選び、
好みの顔の特徴量を学習したHAAR判別器を作成しました。
詳しくはこちら。
せっかく作った判別器なので、
手軽に利用できるように、webブラウザをもちいて、
webサーバーに顔写真を投稿すると、
そこに移っている顔が私の好みの顔に該当すると、
赤い矩形で囲んでくれるcgiプログラムを作成しました。
こんな感じです。
cgiプログラムは以下の感じです。
好みの顔と好みでない顔を手作業で選び、
好みの顔の特徴量を学習したHAAR判別器を作成しました。
詳しくはこちら。
せっかく作った判別器なので、
手軽に利用できるように、webブラウザをもちいて、
webサーバーに顔写真を投稿すると、
そこに移っている顔が私の好みの顔に該当すると、
赤い矩形で囲んでくれるcgiプログラムを作成しました。
こんな感じです。
cgiプログラムは以下の感じです。
#!/usr/bin/env python3
# coding: utf-8
import cv2
import datetime
import cgi
import os
import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
from PIL import Image
password="適当に決めてください"
today=str(datetime.date.today())
path="/prefer_face/" #アップロードされたファイルを保存するディレクトリ
MEGA = 100000000 # 一度にアップロードするデータサイズ
cgi.maxlen=400000000
cascade_path="/prefer_face/cascade.xml" #私の好みを学習したHAAR分類器へのパス
# 入力フォーム
_input_form = """
<html>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<head>
<title>顔写真投稿フォーム</title>
</head>
<body>
<form action enctype="multipart/form-data" method="post">
顔画像の投稿にはパスワードが必須です:<input type="password" name="pass" value="" size="10">
<br><br><br>
顔画像投稿
<p>今日は %s です</p>
File name:
<input type="file" name="foobar" required>
<input type="submit" value="Upload">
</form>
</body>
</html>
"""
# 出力フォーム
_output_form = """
<html>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<head>
<title>好みの顔の判別</title>
</head>
<body>
<h2>判別結果</h2>
<p>顔画像</p>
<p><img src="%s">
</body>
</html>
"""
form = cgi.FieldStorage() #入力フォームでpostされたデータを扱う
if form.getvalue('pass','')==password:
file_name = form["foobar"].filename #ファイル名を取得
full_path = path + file_name #ファイル名にパスを付加
if os.path.exists(full_path): #上書き確認
sys.exit(0)
data_1=str(file_name) #ファイル名をテキストとして収容
data_2=str(full_path)
uploaded_file = open(full_path, 'wb') #アップロードされたデータを保存する新規ファイルを同名で作成
item = form['foobar']
while True:
chunk = item.file.read(MEGA)
if not chunk:
break
uploaded_file.write(chunk)
uploaded_file.close()
image = cv2.imread(data_2) #ファイル読み込み
cascade = cv2.CascadeClassifier(cascade_path) #顔の特徴から判別
#私の好みの顔であれば赤い矩形で囲まれるスクリプト
facerect = cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=1, minSize=(50, 50))
if len(facerect) >0:
#好みの顔を囲む矩形の作成
for rect in facerect:
cv2.rectangle(image, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0,0,255), thickness=2)
#認識結果の保存
cv2.imwrite("/prefer_face/preferface_detected.jpg", image)
print (_output_form % ("/prefer_face/preferface_detected.jpg"))
else:
print (_input_form % (today))
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image