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

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

ただいまの
回答率

88.77%

Jsonファイルの中身を統合するとき、データが空のファイルは飛ばして統合したいのですが。。

解決済

回答 1

投稿

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

Masarukun

score 13

申し訳ございません。おそらく初歩的な質問です。

Openposeという画像処理のソースを使って、人の動きを解析しようとしてます。出力はフレーム毎にJSONファイルで出てくるので統合しようとしてます。

Jsonの中身は色々あるのですが、"pose_keypoints_2d"のデータを抜き出すコードを書いているのですが、下記のようなエラーがでました。

IndexError                                Traceback (most recent call last)
<ipython-input-15-1b76292cda10> in <module>
2     with open(file_name) as f:
3         jsn_s = json.load(f)
----> 4         df_s = jsn_s['people'][0]["pose_keypoints_2d"]
5         print(df_s)

IndexError: list index out of range

Jsonファイルの中身をチェックすると、動画の前半は人が画像にいないためだと推測しました。空のファイルはif関数で飛ばすようなコードが良いのかな?と思ってますが、データの中身がないときの条件はどういう風に書いたらよいのでしょう?(文字列が無い→False とする?)

添付した元々のコードは人が最初からいる前提で作られたもので、途中から人が現れると動かなくて。。

6p-c0_000000000000_keypoints.json (人は映っていない)
6p-c0_000000000001_keypoints.json (人は映っていない)
6p-c0_000000000002_keypoints.json (人は映っていない)


6p-c0_000000000700_keypoints.json (人が映っている)
6p-c0_000000000701_keypoints.json (人が映っている)

<人が映っていないときのJsonファイルの中身例:データが空っぽ>
{"version":1.3,"people":[]}  

<人が映っているときのJsonファイルの中身例:たくさんデータあり>
{"version":1.3,"people":[{"person_id":[-1],"pose_keypoints_2d":[244.301,13.1095,0.841262,255.98,26.5888,0.926749,262.335,25.738,0.914681,264.112,47.3069,0.760424,262.322,61.7204,0.74454,248.821,26.584,0.895842,245.199,49.9938,0.796818,234.442,67.0829,0.892589,253.305,64.3705,0.76928,256.9,64.3667,0.760762,248.777,89.5744,0.808776,254.225,111.17,0.781717,247.915,64.3817,0.808745,246.975,93.1669,0.767021,247.925,119.23,0.913405,243.432,11.2712,0.533857,247.887,11.2835,0.937553,0,0,0,255.102,12.1937,0.910615,234.449,118.31,0.833322,236.211,119.3,0.789415,249.727,121.966,0.863557,240.706,112.042,0.396824,241.601,111.14,0.32025,256.063,112.097,0.613827],"face_keypoints_2d":[],"hand_left_keypoints_2d":[],"hand_right_keypoints_2d":[],"pose_keypoints_3d":[],"face_keypoints_3d":[],"hand_left_keypoints_3d":[],"hand_right_keypoints_3d":[]},{"person_id":[-1],"pose_keypoints_2d":[82.3504,9.46582,0.857862,82.3797,19.3792,0.942986,69.8021,19.3838,0.870842,69.7794,40.9972,0.844526,90.4669,39.2081,0.834407,93.1671,18.541,0.857345,98.5741,40.9829,0.783856,81.4529,41.017,0.592251,86.8627,62.5637,0.790018,77.8739,63.4723,0.760854,83.2676,96.8046,0.888459,88.6587,123.738,0.794038,94.9777,61.6849,0.80242,97.6554,95.8602,0.857453,101.28,122.852,0.7934,0,0,0,83.2894,2.28294,0.934449,0,0,0,88.6631,2.28801,0.803164,104.864,131.854,0.836709,110.235,128.255,0.784325,97.7133,125.547,0.783372,89.5378,130.954,0.75428,83.306,130.043,0.754168,89.593,125.53,0.723697],"face_keypoints_2d":[],"hand_left_keypoints_2d":[],"hand_right_keypoints_2d":[],"pose_keypoints_3d":[],"face_keypoints_3d":[],"hand_left_keypoints_3d":[],"hand_right_keypoints_3d":[]}]}

import os
import glob
import json
%matplotlib notebook

#フォルダ中のJsonファイルの数をカウント
count = 0
for name in glob.glob('*.json'):
    count = count + 1
print(count)

#必要なデータのみ統合する
for file_name in ["6p-c0_{:012}_keypoints.json".format(i) for i in range(count)]:
    with open(file_name) as f:
        jsn_s = json.load(f)
        df_s = jsn_s['people'][0]["pose_keypoints_2d"]
        print(df_s)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

jsn_s['people'] が空リストかどうか判定できれば良いのですね。
シンプルにif文で捌いてやってはどうでしょうか。

persons = jsn_s['people']
if persons:
    df_s = persons[0]["pose_keypoints_2d"]
else:
    df_s = お好きな値をどうぞ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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