/extract-op-data.py

https://bitbucket.org/projetrtma/motion-classification · Python · 153 lines · 120 code · 3 blank · 30 comment · 0 complexity · 1f6b806f24fec255080bf0cd7e7995af MD5 · raw file

  1. #! /usr/bin/python3
  2. """
  3. Manipulate Openpose Data - Convert all JSON files Openpose extraction
  4. Usage:
  5. extract-op-data.py convert <type> [--path <path>] [--out <out>] [--empty <val>]
  6. extract-op-data.py -h
  7. extract-op-data.py --version
  8. Examples:
  9. Arguments:
  10. Options:
  11. -h, --help
  12. -p <path>, --path <path> Json files directory
  13. -o <out>, --out <out> Output path and file name
  14. -d <detect>, --detect <detect> Element's type to detect
  15. -e <val>, --empty <val> keep empty values (1, true | 0, false) [default: 1]
  16. --version
  17. """
  18. import time
  19. import json
  20. import os
  21. import sys
  22. from docopt import docopt
  23. from collections import defaultdict
  24. def main():
  25. opt = docopt(__doc__, sys.argv[1:])
  26. print(opt)
  27. out_file_name = opt["--out"]
  28. out_type = opt["<type>"]
  29. list_files = element_path_files(opt)
  30. points = extract_op_data(list_files, "pose_keypoints_2d")
  31. # Delete '0' values
  32. if opt["--empty"] == '0' or opt["--empty"].lower() == 'false' :
  33. points = estimate_values(points)
  34. # Call dynamic function to export data
  35. getattr(sys.modules[__name__], "export_%s" % out_type)(points, out_file_name)
  36. def element_path_files(opt):
  37. """
  38. Convert data from JSON files to list
  39. """
  40. path_dir = opt["--path"]
  41. if (path_dir):
  42. if os.path.exists(path_dir):
  43. print("chemin ok")
  44. dir_name = path_dir.split("/")[-1]
  45. # Suppression du "/" du chemin
  46. if dir_name == "":
  47. dir_name = path_dir.split("/")[-2] + "/"
  48. list_files = os.listdir(path_dir)
  49. list_files.sort()
  50. return {
  51. "list": list_files,
  52. "path": path_dir,
  53. "name": dir_name
  54. }
  55. else:
  56. print("L'arguments --path ne correspond pas à un repertoire")
  57. exit()
  58. def extract_op_data(elements, *types):
  59. """
  60. Extract data from all JSON files
  61. """
  62. points = defaultdict(dict)
  63. for i,file_name in enumerate(elements["list"]):
  64. file_data = open(elements["path"] + file_name, "r").read()
  65. json_file = json.loads(file_data)
  66. # Get the file if there information in people key
  67. if json_file["people"] != []:
  68. for type_name in types:
  69. # print("1-")
  70. # print(json_file["people"][0][type_name])
  71. try:
  72. points[type_name][i] = json_file["people"][0][type_name]
  73. except:
  74. print("the type \"" + type_name + "\" not exist !")
  75. exit()
  76. return points
  77. def export_csv(points, out_file_name):
  78. """
  79. Export data into CSV file
  80. """
  81. for type_name in points:
  82. time_str = time.strftime("%Y%m%d-%H%M%S")
  83. with open(out_file_name + "_" + type_name + "_" + time_str + ".csv", 'w') as text_file:
  84. for frame in points[type_name]:
  85. line = ""
  86. for i, val in enumerate(points[type_name][frame]):
  87. if i % 3 != 2:
  88. line += str(val) + ','
  89. # text_file.write('\'' + str(val) + '\', ')
  90. # Remove the last comma
  91. line = line[0:-1]
  92. text_file.write(line + '\n')
  93. print(type_name)
  94. def estimate_values(points):
  95. """
  96. Replace each empty value by a new estimate value, between two values
  97. example :
  98. 15 - 0 - 0 - 0 - 19 --> Estimate empty values
  99. 15 - 16 - 17 - 18 - 19
  100. """
  101. start = 0
  102. begin = 0.0
  103. for type_name in points:
  104. for i in range(len(points[type_name][0])):
  105. for frame in points[type_name]:
  106. if points[type_name][frame][i] == 0.0 and frame != 0:
  107. if begin == 0.0:
  108. begin = points[type_name][frame-1][i]
  109. start = frame
  110. # print(begin)
  111. elif start != 0:
  112. ite = frame - start
  113. diff = abs(begin - points[type_name][frame][i]) / 3.0
  114. start = 0
  115. begin = 0.0
  116. for inc in range(ite):
  117. points[type_name][frame-ite+inc][i] = round(points[type_name][frame-ite+inc-1][i] + diff, 3)
  118. return points
  119. if __name__ == "__main__":
  120. main()