質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

解決済

tensorflowによる性別予測モデルのリアルタイム予測と描画方法について

teramax
teramax

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

1回答

0リアクション

1クリップ

301閲覧

投稿2022/07/24 04:56

編集2022/07/24 05:08

現在、tensorflowを使用したリアルタイム性別予測のシステムを作成しています。
顔の切り出しはpaddlehub、分類はwide_resnetというmoduleを使用しました。
描画と予測を逐次処理で流す場合推論部分で時間がかかってしまいwebカメラの映像がカクついてしまうため、マルチスレッドにより描画と推論別々の処理として実行させようと考えました。
作成したプログラムは以下の通りです。

python

import tkinter as tk from PIL import Image, ImageTk, ImageOps import paddlehub as hub import cv2 import numpy as np import threading from wide_resnet import WideResNet from pathlib import Path import tensorflow as tf from keras.utils.data_utils import get_file import os.path as os tf.compat.v1.disable_eager_execution() module = hub.Module(name="pyramidbox_lite_server_mask", version='1.1.0') class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.process_list = [] self.master.title("monoliths_stream_windows") self.master.geometry("1000x1000") self.canvas = tk.Canvas(self.master) self.canvas.bind('<Button-1>', self.canvas_click) self.canvas.pack(expand=True, fill=tk.BOTH) self.capture = cv2.VideoCapture(0) self.disp_id = None self.frame = None self.roop_flag = False self.axis = [] def canvas_click(self, event): if self.disp_id is None: self.roop_flag = True thread1 = threading.Thread(target=self.disp_image) thread1.start() thread2 = threading.Thread(target=self.reserch_face) thread2.start() else: self.after_cancel(self.disp_id) self.disp_id = None self.roop_flag = False # 性別・年齢を表記する関数 def draw_label(self, image, point, label, font=cv2.FONT_HERSHEY_SIMPLEX, font_scale=0.3, thickness=1): cv2.putText(image, label, point, font, font_scale, (0, 0, 0), thickness, lineType=cv2.LINE_AA) def disp_image(self): ret, self.frame = self.capture.read() frame_copy = self.frame.copy() if len(self.axis) != 0: for i in range(len(self.axis)): top, right, bottom, left = self.axis[i][1], self.axis[i][2], self.axis[i][3], self.axis[i][4] cv2.rectangle(frame_copy, (top, left), (bottom, right), (0, 255, 255), 2) label = self.axis[i][0] self.draw_label(frame_copy, (top, right), label) out_put = cv2.cvtColor(frame_copy, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(out_put) canvas_width = self.canvas.winfo_width() canvas_height = self.canvas.winfo_height() pil_image = ImageOps.pad(pil_image, (700, 700)) self.photo_image = ImageTk.PhotoImage(image=pil_image) self.canvas.create_image( canvas_width / 2, canvas_height / 2, image=self.photo_image ) self.disp_id = self.after(10, self.disp_image) def age_gender_predict(self, faces): if len(faces) > 0: # モデルの設定 img_size = np.asarray(faces.shape)[1] if os.isdir("model") == False: pre_model = "https://github.com/yu4u/age-gender-estimation/releases/download/v0.5/weights.28-3.73.hdf5" modhash = 'fbe63257a054c1c5466cfd7bf14646d6' self.weight_file = get_file("weights.28-3.73.hdf5", pre_model, cache_subdir="model", file_hash=modhash, cache_dir=str(Path(__file__).resolve().parent)) else: self.weight_file = "model/weights.28-3.73.hdf5" model = WideResNet(img_size, depth=16, k=8)() model.load_weights(self.weight_file) # 予測 results = model.predict(faces) Genders = results[0] return Genders def reserch_face(self): while self.roop_flag: if self.frame is not None: target_axis = [] input_dict = {"data": [self.frame]} results = module.face_detection(data=input_dict) faces = np.zeros((len(results), 64, 64, 3), dtype="uint8") for i in range(len(results)): result = results[i] top, right, bottom, left = int(result['data']['top']), int( result['data']['right']), int(result['data']['bottom']), int( result['data']['left']) aligned = cv2.resize(self.frame[top: bottom, left: right], (64, 64)) faces[i, :, :, :] = cv2.cvtColor(aligned, cv2.COLOR_BGR2RGB) target_axis.append([top, right, bottom, left]) import time start_time = time.time() genders = self.age_gender_predict(faces) print(time.time() - start_time) for i in range(len(target_axis)): gender = "Male" if genders[i][0] < 0.5 else "Female" target_axis[i].insert(0, gender) # genders[i]) del faces self.axis = target_axis if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()

上記プログラムを実行したのですが、age_gender_predictメソッドについて処理のたびに処理時間が延びていってしまう事象が発生しました。
処理時間の推移は以下に示します。

1.4923202991485596 1.6585233211517334 1.9348974227905273 2.128232002258301 2.41341495513916 2.723492383956909 3.138969659805298 3.9985647201538086 4.804307460784912 5.1527650356292725 5.146689176559448 5.88690710067749 6.015024185180664 6.525038957595825 6.470944166183472 8.12919569015503 8.783061742782593 8.08810830116272

メソッド内でモデルのロードも同時に行っているため処理に時間がかかっていると考えファイルの穂見込みからload_weightsをクラスの外に出すプログラムに変更しました。
しかし、modelの定義をクラス外で行ったところ以下のようなエラーが出てしまいました。

exception

Exception in thread Thread-6: Traceback (most recent call last): File "C:\Program Files\Python38\lib\threading.py", line 932, in _bootstrap_inner self.run() File "C:\Program Files\Python38\lib\threading.py", line 870, in run self._target(*self._args, **self._kwargs) File ".\realtime_face.py", line 126, in reserch_face genders = self.age_gender_predict(faces) File ".\realtime_face.py", line 105, in age_gender_predict File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\ops.py", line 5070, in control_dependencies c = self.as_graph_element(c) File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\ops.py", line 3974, in as_graph_element return self._as_graph_element_locked(obj, allow_tensor, allow_operation) File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\ops.py", line 4053, in _as_graph_element_locked raise ValueError("Tensor %s is not an element of this graph." % obj) ValueError: Tensor Tensor("pred_gender/Softmax:0", shape=(None, 2), dtype=float32) is not an element of this graph.

modelをクラス変数として使いまわそうとしても似たようなエラーが出てしまいます。
自分自身、これまでtensorflowやkerasでのモデルの生成と評価はコンペなどでやったことがあるのですが、アプリへの導入はやったことがなかったため対処法がわからないです。
上記の原因について回答していただけると助かります。
文章が下手でわかりずらいところがあれば申し訳ありません。
回答よろしくお願い致します。

追記
上記エラーについて、参照サイトにてスレッドごとにモデルを初期化する必要があるため、そのために_make_predict_function()を使うべきとのことが書かれていたため追記してみたのですが、別途以下のようなエラーが出てしまいい対処がわからない状態です。

Colocations handled automatically by placer. File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\keras\backend.py", line 4273, in __call__ self._make_callable(feed_arrays, feed_symbols, symbol_vals, session) File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\keras\backend.py", line 4209, in _make_callable callable_fn = session._make_callable_from_options(callable_opts) File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\client\session.py", line 1513, in _make_callable_from_options return BaseSession._Callable(self, callable_options) File "C:\Users\terao_yuta_microad\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\client\session.py", line 1471, in __init__ self._handle = tf_session.TF_SessionMakeCallable( tensorflow.python.framework.errors_impl.InvalidArgumentError: Tensor input_1:0, specified in either feed_devices or fetch_devices was not found in the Graph

顔画像から顔の部分を縁取りして性別、年齢を予測し出力するというロジックはうまくいっているためマルチスレッドによる弊害と考えられますが、逐次処理じゃないプログラムを組んだことがないため助言いただきたいです。
長文となり申し訳ありません。よろしくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。