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

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

ただいまの
回答率

88.78%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 215
退会済みユーザー

退会済みユーザー

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

import pyrealsense2 as rs
from darkflow.net.build import TFNet
import cv2
import numpy as np
import wave
import winsound as ws
from PIL import Image

options = {"model": "cfg/yolov2-tiny-voc.cfg", "load": "bin/yolov2-tiny-voc.weights", "threshold": 0.1, "gpu": 0.8}
tfnet = TFNet(options)

class_names = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle',
              'bus', 'car', 'cat', 'chair', 'cow', 'diningtable',
              'dog', 'horse', 'motorbike', 'person', 'pottedplant',
              'sheep', 'sofa', 'train', 'tvmonitor']

person = class_names[14]

num_classes = len(class_names)
class_colors = []
for i in range(0, num_classes):
    hue = 255*i/num_classes
    col = np.zeros((1,1,3)).astype("uint8")
    col[0][0][0] = hue
    col[0][0][1] = 128
    col[0][0][2] = 255
    cvcol = cv2.cvtColor(col, cv2.COLOR_HSV2BGR)
    col = (int(cvcol[0][0][0]), int(cvcol[0][0][1]), int(cvcol[0][0][2]))
    class_colors.append(col)

sound_name1 = 'wav/1mobtection.wav'
sound_name4 = 'wav/person.wav'
sound_name8 = 'wav/center330sw20.wav'
sound_name9 = 'wav/center0sw20.wav'
sound_name10 = 'wav/center30sw20.wav'

config = rs.config()
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

pipeline = rs.pipeline()
profile = pipeline.start(config)

try:
    while True:
        # Wait for a coherent pair of frames: depth and color
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

        # Convert images to numpy arrays
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        result = tfnet.return_predict(color_image)

        for item in result:
            tlx = item['topleft']['x']
            tly = item['topleft']['y']
            brx = item['bottomright']['x']
            bry = item['bottomright']['y']
            label = item['label']
            meters = depth_frame.get_distance(tlx + int(brx-tlx/2), bry + int(tly-bry/2))
            xc = tlx + int(brx-tlx/2)
            dep = item['confidence']

            if dep > 0.4:

                for i in class_names:
                    if label == i:
                        class_num = class_names.index(i)
                        break

            if label == person and meters < 1.0 and xc < 210:
                ws.PlaySound(sound_name1,ws.SND_FILENAME)
                ws.PlaySound(sound_name4,ws.SND_FILENAME)
                ws.PlaySound(sound_name8,ws.SND_FILENAME)
            elif label == person and meters < 1.0 and 210 < xc < 430:
                ws.PlaySound(sound_name1,ws.SND_FILENAME)
                ws.PlaySound(sound_name4,ws.SND_FILENAME)
                ws.PlaySound(sound_name9,ws.SND_FILENAME)
            elif label == person and meters < 1.0 and 430 < xc < 640:
                ws.PlaySound(sound_name1,ws.SND_FILENAME)
                ws.PlaySound(sound_name4,ws.SND_FILENAME)
                ws.PlaySound(sound_name10,ws.SND_FILENAME)

        # escを押したら終了。
                k = cv2.waitKey(10);
                if k == ord('q'):  break;

finally:
        pipeline.stop()
        cv2.destroyAllWindows()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/06 10:56

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

    キャンセル

  • 2020/01/06 12:50

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

    キャンセル

  • 2020/01/07 00:04

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

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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