json_AnnoSta.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. # -*- coding: utf-8 -*-
  2. # @File : json_annotations_sta.py
  3. # @Author : zhaoHL
  4. # @Contact : huilin16@qq.com
  5. # @Time Create First: 2021/8/1 10:25
  6. # @Contributor : zhaoHL
  7. # @Time Modify Last : 2021/8/1 10:25
  8. '''
  9. @File Description:
  10. # json文件annotations信息,生成统计结果csv,对象框shape、对象看shape比例、对象框起始位置、对象结束位置、对象结束位置、对象类别、单个图像对象数量的分布
  11. python ./coco_tools/json_AnnoSta.py \
  12. --json_path=./annotations/instances_val2017.json \
  13. --csv_path=./anno_sta/annos.csv \
  14. --png_shape_path=./anno_sta/annos_shape.png \
  15. --png_shapeRate_path=./anno_sta/annos_shapeRate.png \
  16. --png_pos_path=./anno_sta/annos_pos.png \
  17. --png_posEnd_path=./anno_sta/annos_posEnd.png \
  18. --png_cat_path=./anno_sta/annos_cat.png \
  19. --png_objNum_path=./anno_sta/annos_objNum.png \
  20. --get_relative=True
  21. '''
  22. import os
  23. import json
  24. import argparse
  25. import numpy as np
  26. import pandas as pd
  27. import seaborn as sns
  28. import matplotlib.pyplot as plt
  29. shp_rate_bins = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1,
  30. 2.2, 2.4, 2.6, 3, 3.5, 4, 5]
  31. def check_dir(check_path,show=True):
  32. if os.path.isdir(check_path):
  33. check_directory = check_path
  34. else:
  35. check_directory = os.path.dirname(check_path)
  36. if not os.path.exists(check_directory):
  37. os.makedirs(check_directory)
  38. if show:
  39. print('make dir:',check_directory)
  40. def js_anno_sta(js_path, csv_path, png_shape_path, png_shapeRate_path, png_pos_path, png_posEnd_path, png_cat_path,
  41. png_objNum_path, get_relative, image_keyname, anno_keyname):
  42. print('json read...\n')
  43. with open(js_path, 'r') as load_f:
  44. data = json.load(load_f)
  45. df_img = pd.DataFrame(data[image_keyname])
  46. sns.jointplot('height', 'width', data=df_img, kind='hex')
  47. plt.close()
  48. df_img = df_img.rename(columns={"id": "image_id", "height": "image_height", "width": "image_width"})
  49. df_anno = pd.DataFrame(data[anno_keyname])
  50. df_anno[['pox_x', 'pox_y', 'width', 'height']] = pd.DataFrame(df_anno['bbox'].values.tolist())
  51. df_anno['width'] = df_anno['width'].astype(int)
  52. df_anno['height'] = df_anno['height'].astype(int)
  53. df_merge = pd.merge(df_img, df_anno, on="image_id")
  54. if png_shape_path is not None:
  55. check_dir(png_shape_path)
  56. sns.jointplot('height', 'width', data=df_merge, kind='hex')
  57. plt.savefig(png_shape_path)
  58. plt.close()
  59. print('png save to', png_shape_path)
  60. if get_relative:
  61. png_shapeR_path = png_shape_path.replace('.png', '_Relative.png')
  62. df_merge['heightR'] = df_merge['height'] / df_merge['image_height']
  63. df_merge['widthR'] = df_merge['width'] / df_merge['image_width']
  64. sns.jointplot('heightR', 'widthR', data=df_merge, kind='hex')
  65. plt.savefig(png_shapeR_path)
  66. plt.close()
  67. print('png save to', png_shapeR_path)
  68. if png_shapeRate_path is not None:
  69. check_dir(png_shapeRate_path)
  70. plt.figure(figsize=(12, 8))
  71. df_merge['shape_rate'] = (df_merge['width'] / df_merge['height']).round(1)
  72. df_merge['shape_rate'].value_counts(sort=False, bins=shp_rate_bins).plot(kind='bar', title='images shape rate')
  73. plt.xticks(rotation=20)
  74. plt.savefig(png_shapeRate_path)
  75. plt.close()
  76. print('png save to', png_shapeRate_path)
  77. if png_pos_path is not None:
  78. check_dir(png_pos_path)
  79. sns.jointplot('pox_y', 'pox_x', data=df_merge, kind='hex')
  80. plt.savefig(png_pos_path)
  81. plt.close()
  82. print('png save to', png_pos_path)
  83. if get_relative:
  84. png_posR_path = png_pos_path.replace('.png', '_Relative.png')
  85. df_merge['pox_yR'] = df_merge['pox_y'] / df_merge['image_height']
  86. df_merge['pox_xR'] = df_merge['pox_x'] / df_merge['image_width']
  87. sns.jointplot('pox_yR', 'pox_xR', data=df_merge, kind='hex')
  88. plt.savefig(png_posR_path)
  89. plt.close()
  90. print('png save to', png_posR_path)
  91. if png_posEnd_path is not None:
  92. check_dir(png_posEnd_path)
  93. df_merge['pox_y_end'] = df_merge['pox_y'] + df_merge['height']
  94. df_merge['pox_x_end'] = df_merge['pox_x'] + df_merge['width']
  95. sns.jointplot('pox_y_end', 'pox_x_end', data=df_merge, kind='hex')
  96. plt.savefig(png_posEnd_path)
  97. plt.close()
  98. print('png save to', png_posEnd_path)
  99. if get_relative:
  100. png_posEndR_path = png_posEnd_path.replace('.png', '_Relative.png')
  101. df_merge['pox_y_endR'] = df_merge['pox_y_end'] / df_merge['image_height']
  102. df_merge['pox_x_endR'] = df_merge['pox_x_end'] / df_merge['image_width']
  103. sns.jointplot('pox_y_endR', 'pox_x_endR', data=df_merge, kind='hex')
  104. plt.savefig(png_posEndR_path)
  105. plt.close()
  106. print('png save to', png_posEndR_path)
  107. if png_cat_path is not None:
  108. check_dir(png_cat_path)
  109. plt.figure(figsize=(12, 8))
  110. df_merge['category_id'].value_counts().sort_index().plot(kind='bar', title='obj category')
  111. plt.savefig(png_cat_path)
  112. plt.close()
  113. print('png save to', png_cat_path)
  114. if png_objNum_path is not None:
  115. check_dir(png_objNum_path)
  116. plt.figure(figsize=(12, 8))
  117. df_merge['image_id'].value_counts().value_counts().sort_index().plot(kind='bar', title='obj number per image')
  118. # df_merge['image_id'].value_counts().value_counts(bins=np.linspace(1,31,16)).sort_index().plot(kind='bar', title='obj number per image')
  119. plt.xticks(rotation=20)
  120. plt.savefig(png_objNum_path)
  121. plt.close()
  122. print('png save to', png_objNum_path)
  123. if csv_path is not None:
  124. check_dir(csv_path)
  125. df_merge.to_csv(csv_path)
  126. print('csv save to', csv_path)
  127. def get_args():
  128. parser = argparse.ArgumentParser(description='Json Images Infomation Statistic')
  129. # parameters
  130. parser.add_argument('--json_path', type=str,
  131. help='json path to statistic images information')
  132. parser.add_argument('--csv_path', type=str, default=None,
  133. help='csv path to save statistic images information, default None, do not save')
  134. parser.add_argument('--png_shape_path', type=str, default=None,
  135. help='png path to save statistic images shape information, default None, do not save')
  136. parser.add_argument('--png_shapeRate_path', type=str, default=None,
  137. help='png path to save statistic images shape rate information, default None, do not save')
  138. parser.add_argument('--png_pos_path', type=str, default=None,
  139. help='png path to save statistic pos information, default None, do not save')
  140. parser.add_argument('--png_posEnd_path', type=str, default=None,
  141. help='png path to save statistic end pos information, default None, do not save')
  142. parser.add_argument('--png_cat_path', type=str, default=None,
  143. help='png path to save statistic category information, default None, do not save')
  144. parser.add_argument('--png_objNum_path', type=str, default=None,
  145. help='png path to save statistic images object number information, default None, do not save')
  146. parser.add_argument('--get_relative', type=bool, default=True,
  147. help='if True, get relative result')
  148. parser.add_argument('--image_keyname', type=str, default='images',
  149. help='image key name in json, default images')
  150. parser.add_argument('--anno_keyname', type=str, default='annotations',
  151. help='annotation key name in json, default annotations')
  152. parser.add_argument('-Args_show', '--Args_show', type=bool, default=True,
  153. help='Args_show(default: True), if True, show args info')
  154. args = parser.parse_args()
  155. if args.Args_show:
  156. print('Args'.center(100, '-'))
  157. for k, v in vars(args).items():
  158. print('%s = %s' % (k, v))
  159. print()
  160. return args
  161. if __name__ == '__main__':
  162. args = get_args()
  163. js_anno_sta(args.json_path, args.csv_path, args.png_shape_path, args.png_shapeRate_path,
  164. args.png_pos_path, args.png_posEnd_path, args.png_cat_path, args.png_objNum_path,
  165. args.get_relative, args.image_keyname, args.anno_keyname)