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

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

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

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python 3.x

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

Q&A

解決済

1回答

883閲覧

映像出力しない場合のFPSの取得について

退会済みユーザー

退会済みユーザー

総合スコア0

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python 3.x

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

0グッド

0クリップ

投稿2020/01/05 12:23

映像出力しない場合のFPSを数える方法を知っている方がいたら教えてほしいです。
yolo(darkflow)で物体認識を行い、認識した物体に応じた音を再生するシステムを実装しようとしています。
物体認識を映像ではなく、音声情報で賄うため、映像出力をしていません。
このような場合、どのようにFPSを取得するべきなのかご教授お願いします。
(ループ内に関数をいれて数えるような話は聞いたことあるのですが、理解できなかったため、質問させて頂きました)
抽象的な質問になってしまい申し訳ありません。

Python

1import pyrealsense2 as rs 2from darkflow.net.build import TFNet 3import cv2 4import numpy as np 5import wave 6import winsound as ws 7from PIL import Image 8 9options = {"model": "cfg/yolov2-tiny-voc.cfg", "load": "bin/yolov2-tiny-voc.weights", "threshold": 0.1, "gpu": 0.8} 10tfnet = TFNet(options) 11 12class_names = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 13 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 14 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 15 'sheep', 'sofa', 'train', 'tvmonitor'] 16 17person = class_names[14] 18 19num_classes = len(class_names) 20class_colors = [] 21for i in range(0, num_classes): 22 hue = 255*i/num_classes 23 col = np.zeros((1,1,3)).astype("uint8") 24 col[0][0][0] = hue 25 col[0][0][1] = 128 26 col[0][0][2] = 255 27 cvcol = cv2.cvtColor(col, cv2.COLOR_HSV2BGR) 28 col = (int(cvcol[0][0][0]), int(cvcol[0][0][1]), int(cvcol[0][0][2])) 29 class_colors.append(col) 30 31sound_name1 = 'wav/1mobtection.wav' 32sound_name4 = 'wav/person.wav' 33sound_name8 = 'wav/center330sw20.wav' 34sound_name9 = 'wav/center0sw20.wav' 35sound_name10 = 'wav/center30sw20.wav' 36 37config = rs.config() 38config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) 39config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) 40 41pipeline = rs.pipeline() 42profile = pipeline.start(config) 43 44try: 45 while True: 46 # Wait for a coherent pair of frames: depth and color 47 frames = pipeline.wait_for_frames() 48 depth_frame = frames.get_depth_frame() 49 color_frame = frames.get_color_frame() 50 if not depth_frame or not color_frame: 51 continue 52 53 # Convert images to numpy arrays 54 depth_image = np.asanyarray(depth_frame.get_data()) 55 color_image = np.asanyarray(color_frame.get_data()) 56 57 result = tfnet.return_predict(color_image) 58 59 for item in result: 60 tlx = item['topleft']['x'] 61 tly = item['topleft']['y'] 62 brx = item['bottomright']['x'] 63 bry = item['bottomright']['y'] 64 label = item['label'] 65 meters = depth_frame.get_distance(tlx + int(brx-tlx/2), bry + int(tly-bry/2)) 66 xc = tlx + int(brx-tlx/2) 67 dep = item['confidence'] 68 69 if dep > 0.4: 70 71 for i in class_names: 72 if label == i: 73 class_num = class_names.index(i) 74 break 75 76 if label == person and meters < 1.0 and xc < 210: 77 ws.PlaySound(sound_name1,ws.SND_FILENAME) 78 ws.PlaySound(sound_name4,ws.SND_FILENAME) 79 ws.PlaySound(sound_name8,ws.SND_FILENAME) 80 elif label == person and meters < 1.0 and 210 < xc < 430: 81 ws.PlaySound(sound_name1,ws.SND_FILENAME) 82 ws.PlaySound(sound_name4,ws.SND_FILENAME) 83 ws.PlaySound(sound_name9,ws.SND_FILENAME) 84 elif label == person and meters < 1.0 and 430 < xc < 640: 85 ws.PlaySound(sound_name1,ws.SND_FILENAME) 86 ws.PlaySound(sound_name4,ws.SND_FILENAME) 87 ws.PlaySound(sound_name10,ws.SND_FILENAME) 88 89 # escを押したら終了。 90 k = cv2.waitKey(10); 91 if k == ord('q'): break; 92 93finally: 94 pipeline.stop() 95 cv2.destroyAllWindows() 96 97 98

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FPSは一秒あたりのフレーム数なので、一枚のフレームを取得したあとに次のフレームを取得するまでの時間を計算し、その逆数をとればFPSを計算できると思います。

あなたのコードであれば各While loopで一フレーム取得しているので、各loopでtime stampをとり、その差分の逆数からFPSを計算できるでしょう。

また、新しいフレームを取得するごとにFPSを計算することができ、これらは理想的にはすべて一致しているものと考えられるのですが実際にはWhile loop内の他の処理などの影響でそうはなりません。
それを解決するためには各FPSの平均をとれば良いと思います。
もしリアルタイムに物体認識しながらFPSを計算したいのであれば移動平均を使って現在のFPSを算出すればよいでしょう。

投稿2020/01/06 00:32

tkymtmt

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/06 01:56

ご丁寧にありがとうございます。 loopごとに現在時刻をテキスト上書きで出力して、差分の逆数の平均を取る方法でよろしいのでしょうか?
tkymtmt

2020/01/06 03:50

説明不足で申し訳ありません。リアルタイム処理でないのであれば差分の平均の逆数を計算し、リアルタイム処理なら差分の逆数の平均(移動平均)を計算すればよいと思います。
退会済みユーザー

退会済みユーザー

2020/01/06 15:04

僕の理解力が低くて申し訳ありません。 ご丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問