face_recognitionで顔認識するアプリでは起動時にいちいち顔画像をエンコーディングしますが、これが結構時間がかかります。
事前にエンコーディングデータを作っておいて、ハードコードしておくなりすれば、ぞの分起動が速くなります。
例えば、37人の顔画像を登録した場合、ラズパイ3 Model B+でエンコードしながらの起動には5分20秒かかりましたが、ハードコードした起動は18秒でした(ラズパイ4ならもっと速くなるはず)。
データ作成用Webサービスアプリを作ってみました。
こんな感じ。
JSON形式で結果を表示します。
保存するなりクリップボードにコピーするなりして使います。
こんなデータです、サンプル
nameとdataを使ってこんなデータを作ります。
これがヤットさんのお顔(128次元のリストデータ)
yatto_face_encoding=[ -0.1223393902182579, 0.12873263657093048, -0.009197290986776352, 0.00621375348418951, -0.1417301446199417, 0.041094422340393066, -0.060611411929130554, -0.11493755131959915, 0.10213411599397659, -0.0701097622513771, 0.2387552410364151, -0.03833388909697533, -0.21402744948863983, -0.12670837342739105, -0.05250973999500275, 0.12379790842533112, -0.19700384140014648, -0.1765545755624771, -0.012737743556499481, 0.01643414981663227, 0.09084143489599228, 0.08093442767858505, -0.04253370687365532, -0.015981800854206085, -0.15537907183170319, -0.3839258849620819, -0.05678056180477142, -0.09268031269311905, 0.009516284801065922, -0.08733998984098434, 0.042714089155197144, 0.04158158227801323, -0.17492759227752686, -0.04814831167459488, 0.05550876259803772, 0.10023626685142517, 0.004622483626008034, -0.023359406739473343, 0.16432049870491028, 0.048556528985500336, -0.24306173622608185, -0.0643935427069664, 0.09088004380464554, 0.30226603150367737, 0.17740163207054138, 0.04525737091898918, 0.002587258815765381, -0.10122675448656082, 0.11255323886871338, -0.12653230130672455, 0.037191204726696014, 0.14095038175582886, 0.10672520846128464, 0.10922341048717499, 0.012785977683961391, -0.1370948702096939, 0.07142874598503113, 0.11309219896793365, -0.11670095473527908, -0.008367640897631645, 0.1234077513217926, -0.06385749578475952, 0.043720994144678116, 0.0015134965069592, 0.22964757680892944, -0.06434835493564606, -0.03596683591604233, -0.21284693479537964, 0.11817958950996399, -0.1314842849969864, -0.1788932979106903, 0.1288330852985382, -0.1233619898557663, -0.16831892728805542, -0.3233073353767395, 0.02632237784564495, 0.4533247947692871, 0.15868014097213745, -0.17997640371322632, 0.006557745859026909, -0.03232560306787491, -0.030298274010419846, 0.1782272905111313, 0.09283589571714401, -0.008833039551973343, 0.013388171792030334, -0.1587553322315216, -0.032886847853660583, 0.287407249212265, 0.02616756409406662, -0.0861949697136879, 0.1822213977575302, 0.01323996763676405, 0.0471624992787838, 0.08737488836050034, -0.0031128963455557823, -0.05832566320896149, 0.08414702862501144, -0.10777832567691803, -0.10968420654535294, 0.06650596112012863, -0.03206443414092064, 0.015260832384228706, 0.16905567049980164, -0.16305550932884216, 0.17909671366214752, 0.007904036901891232, 0.07019868493080139, 0.01112724281847477, -0.008694862015545368, -0.09588325023651123, -0.0002739134943112731, 0.16407427191734314, -0.23168177902698517, 0.18881116807460785, 0.13833552598953247, 0.11008846759796143, 0.1300113946199417, 0.1529681235551834, 0.055368296802043915, -0.057471662759780884, -0.046220045536756516, -0.23475809395313263, -0.06732549518346786, 0.0645541101694107, -0.04108857363462448, 0.13848628103733063, 0.003051930572837591 ]
エンコードに関するソースなどはここ参照
facerec_from_webcam_faster.pyなどにある画像を読んでエンコーディンしている部分
xxx_image = face_recognition.load_image_file(xxx.jpg”)
xxx_face_encoding = face_recognition.face_encodings(xxx_image)[0]
これの代わりに上記のデータをハードコードしておきます(改行を無くせば見やすくなります)。
Webサービス用のコード
最終行のIPアドレスはご自分ので書き換えてください。
【web_encoding.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import face_recognition from flask import Flask, jsonify, request, redirect ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} app = Flask(__name__) def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/', methods=['GET', 'POST']) def upload_image(): if request.method == 'POST': if 'file' not in request.files: return redirect(request.url) file = request.files['file'] if file.filename == '': return redirect(request.url) if file and allowed_file(file.filename): return get_EncodingData(file.filename,file) # If no valid image file was uploaded, show the file upload form: return ''' <!doctype html> <title>Get Encoding Data</title> <h1>Upload a picture and Change to Encoding Data!</h1> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ''' def get_EncodingData(file_name,file_stream): img = face_recognition.load_image_file(file_stream) loaded_face_encodings = face_recognition.face_encodings(img)[0] encoding_data = loaded_face_encodings.tolist() l = file_name.split(".") e_name = l[0] + "_face_encoding" # Return the result as json result = { "name":e_name, "data": encoding_data } return jsonify(result) if __name__ == "__main__": app.run(host='192.168.0.32', port=5001, debug=True) |
1 |
python3 web_encoding.py |
これでサービスが起動します。
注:Exec format error が出る場合は、最終行の引数で debug=False に変えてみてください。
以下でアクセス
http://192.168.0.32:5001
データ(GAMBA OSAKA Players & Coach)
応用
「ラズパイ + カメラモジュール + 顔の表情分類の学習モデル + 顔認識 + OpenJTalk」で、カメラを被写体に向けると自動で「xxさん、はいチーズ」と発声して、にこっと笑ってくれたらオートシャッターするカメラアプリを作れると思います。
顔の表情分類の学習モデルにはface_classficationを使ってみます(表情を7パターンに分類するものです)。
こんな感じ(genderも認識しています)
Next
作ってみました
WisteriaHillはカマタマーレ讃岐のサポでもあります。
データをご用意しました。
このカマタマーレのデータには選手のJSONデータをそろえたkamatama-jsonというフォルダーがあります。
上記ではハードコードする例を記述していますが、このjsonフォルダーからダイレクトに読み込む場合は例えばこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import glob import json known_face_encodings = [] known_face_names = [] files = glob.glob("./kamatama-json/*") for file in files: with open(file) as f: json_data = json.load(f) jsn_name = json_data["name"] jsn_data = json_data["data"] alphabet_name = jsn_name.replace("_face_encoding","") filename_list = file.split("/") filename = filename_list[len(filename_list) - 1] filename = filename.replace(".json","") known_face_encodings.append(jsn_data) #known_face_names.append(filename) #日本語フォントがある場合 known_face_names.append(alphabet_name) |
Leave a Reply