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

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

ただいまの
回答率

90.04%

darkflow(yolo)の物体検出にrealsenseから得た深度をラベル横に出力したい。(YOLO(RGB,3ch)に1ch(Depth)を加えたい)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 189

ATMman

score 11

https://github.com/thtrieu/darkflow.git のdarkflow(yolo)の物体検出にrealsense(pyrealsens2)から得た深度をラベル横(confの部分)に出力したい。(YOLO(RGB,3ch)に1ch(Depth)を加えたい)```python コード

from darkflow.net.build import TFNet  
import cv2  
import numpy as np  

options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}  
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']  

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)  

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)  

while True:  
frames = pipeline.wait_for_frames()  
result = tfnet.return_predict(frames)  
depth_frame = frames.get_depth_frame()  
if not depth_frame: continue  

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

if dep > 0.4:  

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


cv2.rectangle(frame, (tlx, tly), (brx, bry), class_colors[class_num], 2)  


text = label + " " + ('%.2f' % dep)  
cv2.rectangle(frame, (tlx, tly - 15), (tlx + 100, tly + 5), class_colors[class_num], -1)  
cv2.putText(frame, text, (tlx, tly), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)  


cv2.imshow("Show FLAME Image", frame)  


k = cv2.waitKey(10);  
if k == ord('q'):  break;  

pipeline.stop()  
cv2.destroyAllWindows()  

if __name__ == '__main__':  
main()  

python エラー

result = tfnet.return_predict(frames)  
File "C:\Users\Public\darkflow\darkflow\net\flow.py", line 78, in return_predict  
'Image is not a np.ndarray'  
AssertionError: Image is not a np.ndarray  

python コード ```darkflow/darkflow/net
flow.py内76~102行目

def return_predict(self, im):
assert isinstance(im, np.ndarray), \
'Image is not a np.ndarray'
h, w, _ = im.shape
im = self.framework.resize_input(im)
this_inp = np.expand_dims(im, 0)
feed_dict = {self.inp : this_inp}

out = self.sess.run(self.out, feed_dict)[0]
boxes = self.framework.findboxes(out)
threshold = self.FLAGS.threshold
boxesInfo = list()
for box in boxes:
tmpBox = self.framework.process_box(box, h, w, threshold)
if tmpBox is None:
continue
boxesInfo.append({
"label": tmpBox[4],
"confidence": tmpBox[6],
"topleft": {
"x": tmpBox[0],
"y": tmpBox[2]},
"bottomright": {
"x": tmpBox[1],
"y": tmpBox[3]}
})
return boxesInfo

のconfidenceの部分を書き換えれば、深度を出力することは可能でしょうか?
プログラミング初心者のため投げやりになってしまい、申し訳ありません。
ご教授頂けると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

import pyrealsense2 as rs
from darkflow.net.build import TFNet
import cv2
import numpy as np
import sys

options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
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']

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)

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)

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)
    print(result)

    sys.exit(0)

実行結果は下記です。特にエラー無く動作しました。

$ python3 test.py 
WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.

=============== 中略 ===============

Finished in 2.767444133758545s

[{'label': 'clock', 'confidence': 0.2793427, 'topleft': {'x': 0, 'y': 16}, 'bottomright': {'x': 122, 'y': 148}}]

Firmware と SDK のバージョンを一度確認してみてください。 現時点の製品版のものに統一しておくことをおすすめします。Intel製品の最新版は不安定であることが多いです。

Firmware 5.11.6.250
SDK 2.30.1

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/13 11:15

    ご丁寧にありがとうございます。

    CPUonlyで動かしているのでめちゃめちゃ重いですが、無事距離表示できるようになりました。

    キャンセル

  • 2019/11/13 11:58

    なによりです。当初の問題が解消したようでしたら、解決済みとしてマークしてください。

    キャンセル

0

まずは下記でエラーが解消できるかどうかをお試しください。pipeline.wait_for_frames() は画像そのものを返しません。深度画像とRGB画像のワンセットになっています。また、 tfnet.return_predict に渡す前にnumpy配列への変換が必要だと思います。 depth_image を渡すのか color_image を渡すのかは要件次第ですので適宜入れ替えてみてください。

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/10 23:49

    貴重なご意見・ご指摘ありがとうございます。
    ご指摘の通り、コードを以下のように修正しました。
    <コード>
    import pyrealsense2 as rs
    from darkflow.net.build import TFNet
    import cv2
    import numpy as np

    options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
    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']

    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)

    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)

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

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

    if dep > 0.4:

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

    #枠の作成
    cv2.rectangle(frame, (tlx, tly), (brx, bry), class_colors[class_num], 2)

    #ラベルの作成
    text = label + " " + ('%.2f' % dep)
    cv2.rectangle(frame, (tlx, tly - 15), (tlx + 100, tly + 5), class_colors[class_num], -1)
    cv2.putText(frame, text, (tlx, tly), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)

    # 表示
    cv2.imshow("Show FLAME Image", frame)

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

    pipeline.stop()
    cv2.destroyAllWindows()

    if __name__ == '__main__':
    main()

    下記のエラーが出てしまいました。
    <エラー>
    File "yolodistancetry2.py", line 45, in <module>
    result = tfnet.return_predict(depth_image)
    File "C:\Users\Public\darkflow\darkflow\net\flow.py", line 79, in return_predict
    h, w, _ = im.shape
    ValueError: not enough values to unpack (expected 3, got 2)

    こちらの対処方法を知っていたら、教えていただけないでしょうか?
    よろしくお願いします。

    キャンセル

0

depth_image の中身、サイズがどのようになっているか確認してみてください。深度の数値のみが縦横の2次元で格納されていたかもしれません。失礼しました。color_image を指定してみてください。 なお、エラーになっている下記の箇所は、3つの値が取得できることを想定しているようです。 flow.py の return_predict

h, w, _ = im.shape


おそらく、高さ、幅、チャンネル(RGB) だと思いますが、color_image を渡していればそのままでも正常に動作する可能性があります。

ご参考までに、私が過去に作成したロジックをご紹介します。darkflow(Yolo)ではありませんが、t-1996-kさんが実現したいことがSSDでほぼそのまま再現されているロジックです。深度情報の取得の仕方の部分はご参考になるかと思います。
MobileNetV2-SSD + RealSense D435

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/12 00:36

    ご丁寧にありがとうございます。
    参考にさせていただきます。

    キャンセル

  • 2019/11/12 00:49

    <コード>
    import pyrealsense2 as rs
    from darkflow.net.build import TFNet
    import cv2
    import numpy as np

    options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
    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']

    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)

    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)

    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']
    #dist_to_center = depth_frame.get_distance(int(tlx+ brx/2), int(tly + bry/2))
    dep = item['confidence']

    if dep > 0.4:

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

    #枠の作成
    cv2.rectangle(frame, (tlx, tly), (brx, bry), class_colors[class_num], 2)

    #ラベルの作成
    text = label + " " + ('%.2f' % dep)
    cv2.rectangle(frame, (tlx, tly - 15), (tlx + 100, tly + 5), class_colors[class_num], -1)
    cv2.putText(frame, text, (tlx, tly), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)

    # 表示
    cv2.imshow("Show FLAME Image", frame)

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

    pipeline.stop()
    cv2.destroyAllWindows()

    if __name__ == '__main__':
    main()

    <エラー>
    File "yolodistancetry2.py", line 35, in <module>
    frames = pipeline.wait_for_frames()
    RuntimeError: wait_for_frames cannot be called before start()

    このようなエラーが出てしまいました。
    start前にframeが呼び出されていないとのことですが、どのようにコードを変えればよいのでしょうか?
    度々の質問になってしまい、申し訳ありません。

    キャンセル

  • 2019/11/12 15:38

    コードを整形できないため、回答欄に記載します。

    キャンセル

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

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

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

  • トップ
  • Pythonに関する質問
  • darkflow(yolo)の物体検出にrealsenseから得た深度をラベル横に出力したい。(YOLO(RGB,3ch)に1ch(Depth)を加えたい)