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

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

ただいまの
回答率

88.58%

jsonからcsvに変更した際に数値が変わる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,853

MidoriK

score 35

 前提・実現したいこと

Openposeを利用しています。
jsonファイルとして出力されたデータをcsvとして整形し、解析をしたいです。

 発生している問題・エラーメッセージ

jsonファイルをcsvファイルに整形しましたが、出てきたデータが元のデータと異なってしまいます。

入力したデータ

{"version":1.2,"people":[{"pose_keypoints_2d":
[607.999,476.911,0.816635,655.268,571.594,0.862697,540.058,560.921,0.849626,518.767,733.718,0.903921,476.951,890.834,0.837659,775.781,602.601,0.822461,775.982,812.565,0.856365,765.25,985.312,0.911167,607.936,906.613,0.718905,534.765,896.152,0.676373,471.73,1189.44,0.755163,362.115,1472.29,0.789471,681.462,917.147,0.676364,629.089,1226.17,0.70003,602.946,1446.07,0.896496,581.898,435.272,0.757696,639.494,435.333,0.743821,555.803,429.939,0.121278,692.001,435.28,0.76239,555.729,1535.17,0.854017,602.586,1535.19,0.853378,602.7,1456.59,0.697083,278.083,1467.02,0.706469,273.077,1451.43,0.780069,372.448,1509.06,0.780327],
"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":[]}]}


出てきたデータ(/frame_data)

person0
608.118,471.851,0.865448,
655.278,581.937,0.843845, 
539.935,566.049,0.867245, 
518.735,744.297,0.830558, 
471.961,896.112,0.811827, 
775.873,602.869,0.832397, 
801.773,817.442,0.821503, 
791.439,985.439,0.836332, 
607.916,922.345,0.699928, 
529.72,906.58,0.680761, 
466.616,1194.82,0.75059 
361.876,1472.24,0.796895, 
681.484,937.898,0.682566, 
628.963,1231.56,0.72671, 
603.057,1445.98,0.900871, 
582.007,435.21,0.818033, 
644.552,435.249,0.844008, 
560.676,435.099,0.17378, 
692.157,435.35,0.771408, 
561.053,1540.48,0.85584, 
602.955,1535.29,0.842224, 
602.655,1451.32,0.737746, 
382.774,1608.47,0.76988, 
351.205,1592.76,0.690698, 
356.691,1482.76,0.70357,

出てきてほしいデータ(/frame_data) 

person0
607.999,476.911,0.816635
655.268,571.594,0.862697
540.058,560.921,0.849626 
518.767,733.718,0.903921 
476.951,890.834,0.837659 
...


jsonコードの数値をそのまま3*25のcsv構造にしたものを得たいです。

jsonデータが1,2,3,4,5,6,...となっているものを

1,2,3,
4,5,6,

とcsvに変換したいのですが、
出てきた数値が

1.1, 2.2, 3.3,
4.4, 5.5, 6.6,
,,,
という具合で不規則に異なる値が出ています。

 該当のソースコード

import json
import numpy as np
import os

PROJECTNAME = 'legtest' \
              ''
PROJECTPATH = '/home/deepstation/openpose/my_project/'
JSONFOLDERPATH = PROJECTPATH + PROJECTNAME + '/result/'

files = os.listdir(JSONFOLDERPATH)
file_num = 1

MAIN_DIRECTORYNAME = './' + PROJECTNAME + '/'
FRAME_DIRECTORYNAME = './' + PROJECTNAME + '/frame_data/'
BODYPARTS_DIRECTORYNAME = './' + PROJECTNAME + '/parts_data/'

if not os.path.exists(MAIN_DIRECTORYNAME):
    os.mkdir(MAIN_DIRECTORYNAME)
    os.mkdir(FRAME_DIRECTORYNAME)
    os.mkdir(BODYPARTS_DIRECTORYNAME)

body_parts_list = []
for i in range(25):
    part = []
    body_parts_list.append(part)


for filename in files:
    output_file_name = FRAME_DIRECTORYNAME + str(file_num) + '.txt'
    with open(output_file_name, mode='wt') as output_file:
        with open(JSONFOLDERPATH + filename, 'r') as f:
            data = json.load(f)
            personID = 0
            for d in data['people']:
                output_file.write('person' + str(personID) + '\n')
                kpt = np.array(d['pose_keypoints_2d']).reshape((25, 3))
                parts_num = 0
                for p in kpt:
                    if personID == 0:
                        body_parts_list[parts_num].append(p)
                    for elem in p:
                        output_file.write(str(elem) + ' ')
                    output_file.write('\n')
                    parts_num += 1
                output_file.write('\n')
                personID += 1
    file_num += 1


elemID = 0
for body_elem_array in body_parts_list:
    output_file_name = BODYPARTS_DIRECTORYNAME + str(elemID) + '.txt'
    with open(output_file_name, mode='wt') as output_file:
        print(elemID)
        for elem in body_elem_array:
            print(elem)
            for e in elem:
                output_file.write(str(e) + ' ')
            output_file.write('\n')
    elemID += 1

 試したこと

別時間のデータを参照してるのかと考えましたが、最初のフレームと最後のフレームでも数値は異なりました。

 補足情報(FW/ツールのバージョンなど)

Python3.4
Pycharm
Ubuntu14.04

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/11/12 18:14

    コードは問題ないように見えます。あと1点だけ。「kpt = np.array(d['pose_keypoints_2d']).reshape((25, 3))」の次行にて「print(kpt)」したときの行列の並びと値は正しいですか?

    キャンセル

  • MidoriK

    2018/11/12 18:26

    実行してログとして出てきた値のことでしょうか? 行列の並びは正しかったものの、値は変わらず元のファイルと異なった値を出力していました。

    キャンセル

  • can110

    2018/11/12 18:39 編集

    確認ありがとうございます。読込~reshapeのタイミングで値が変わっているようですね。ちょっと考えにくいですが…

    キャンセル

回答 2

+1

ファイルなどのデータを用意するのが手間だったので、最小限コードで動作を確認してみましたが、問題なく出力されます。

もしかしてですが、実際にはpeopleリストは複数の要素で似たような値が入っていると思いますが、ひとつ前あるいは後ろのデータと誤認していないでしょうか?

import numpy as np

data = {"version":1.2,"people":[{"pose_keypoints_2d":
[607.999,476.911,0.816635,655.268,571.594,0.862697,540.058,560.921,0.849626,518.767,733.718,0.903921,476.951,890.834,0.837659,775.781,602.601,0.822461,775.982,812.565,0.856365,765.25,985.312,0.911167,607.936,906.613,0.718905,534.765,896.152,0.676373,471.73,1189.44,0.755163,362.115,1472.29,0.789471,681.462,917.147,0.676364,629.089,1226.17,0.70003,602.946,1446.07,0.896496,581.898,435.272,0.757696,639.494,435.333,0.743821,555.803,429.939,0.121278,692.001,435.28,0.76239,555.729,1535.17,0.854017,602.586,1535.19,0.853378,602.7,1456.59,0.697083,278.083,1467.02,0.706469,273.077,1451.43,0.780069,372.448,1509.06,0.780327],
"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":[]}]}

people = data['people'][0]
kpt = people['pose_keypoints_2d']

with open( 'frame_data.txt', 'wt') as f:
    kpt = np.array(kpt).reshape((25, 3))

    np.savetxt( f, kpt,fmt='%.3f', delimiter=',') # 簡便な書き方
    # どちらも同じ数値が出力される
    """
    for p in kpt:
        for elem in p:
            f.write(str(elem) + ' ')
        f.write('\n')
    f.write('\n')
    """

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

0

files.sort()

を10行目に挿入することで解決しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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