label_streaming2standard.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import os
  2. import json
  3. import argparse
  4. # Slice predictions into 30-second chunks
  5. def stream2standard(ann_path, save_path):
  6. total_idx = 0
  7. new_anns = []
  8. with open(ann_path, 'r') as fin, open(save_path, 'w') as fout:
  9. for line in fin:
  10. ann = json.loads(line)
  11. sorted_seconds = sorted(ann['pred'].keys())
  12. sub_pred_list = []
  13. begin_times = range(0, ann['end'], 30)
  14. for i in range(len(begin_times)):
  15. sub_pred_list.append({})
  16. for sec in sorted_seconds:
  17. idx_in_list = int(sec) // 30
  18. sub_pred_list[idx_in_list][sec] = ann['pred'][sec]
  19. for idx, item in enumerate(sub_pred_list):
  20. tmp_ann_sub = ann.copy()
  21. tmp_ann_sub['begin'] = begin_times[idx]
  22. tmp_ann_sub['end'] = min(tmp_ann_sub['begin'] + 30, ann['end'])
  23. tmp_ann_sub['pred'] = item
  24. tmp_ann_sub['idx'] = total_idx
  25. total_idx += 1
  26. new_anns.append(tmp_ann_sub)
  27. for new_ann in new_anns:
  28. fout.write(json.dumps(new_ann) + '\n')
  29. print(f'Saved to {save_path}')
  30. def stream2standard4label(ann_path, save_path):
  31. total_idx = 0
  32. new_anns = []
  33. with open(ann_path, 'r') as fin, open(save_path, 'w') as fout:
  34. for line in fin:
  35. ann = json.loads(line)
  36. sub_pred_list = []
  37. begin_times = range(0, ann['video_end'], 30)
  38. for i in range(len(begin_times)):
  39. sub_pred_list.append([])
  40. for sub_ann in ann['annotations']:
  41. idx_in_list = sub_ann['start'] // 30
  42. sub_pred_list[idx_in_list].append(sub_ann)
  43. for idx, item in enumerate(sub_pred_list):
  44. tmp_ann_sub = ann.copy()
  45. tmp_ann_sub['video_begin'] = begin_times[idx]
  46. tmp_ann_sub['video_end'] = min(tmp_ann_sub['video_begin'] + 30, ann['video_end'])
  47. tmp_ann_sub['duration'] = tmp_ann_sub['video_end'] - tmp_ann_sub['video_begin']
  48. tmp_ann_sub['annotations'] = item
  49. tmp_ann_sub['idx'] = total_idx
  50. total_idx += 1
  51. new_anns.append(tmp_ann_sub)
  52. for new_ann in new_anns:
  53. fout.write(json.dumps(new_ann) + '\n')
  54. print(f'Saved to {save_path}')
  55. if __name__ == '__main__':
  56. parser = argparse.ArgumentParser(description='Convert streaming annotations to standard format')
  57. parser.add_argument('--ann_path', type=str, required=True, help='Path to input annotation file')
  58. parser.add_argument('--save_path', type=str, required=True, help='Path to save output file')
  59. parser.add_argument('--mode', type=str, default='pred', choices=['pred', 'label'], help='Conversion mode: pred or label')
  60. args = parser.parse_args()
  61. if args.mode == 'pred':
  62. stream2standard(args.ann_path, args.save_path)
  63. else:
  64. stream2standard4label(args.ann_path, args.save_path)