アフィリエイト広告を利用しています

広告

posted by fanblog

2021年05月10日

好みの顔の判別器をラズパイに実装し、webブラウザで判別結果を表示

2000枚以上の顔写真から、

好みの顔と好みでない顔を手作業で選び、

好みの顔の特徴量を学習したHAAR判別器を作成しました。

詳しくはこちら


せっかく作った判別器なので、

手軽に利用できるように、webブラウザをもちいて、

webサーバーに顔写真を投稿すると、

そこに移っている顔が私の好みの顔に該当すると、

赤い矩形で囲んでくれるcgiプログラムを作成しました。

こんな感じです。
2021-05-10 (6).png

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))


検索

私が見た動画紹介コーナー

素敵です

プロフィール
もう一人の自分さんの画像
もう一人の自分
好きなことを仕事にしなかった
プロフィール
最新記事
カテゴリーアーカイブ
ファン
写真ギャラリー
×

この広告は30日以上新しい記事の更新がないブログに表示されております。