|
|
| import argparse
|
|
|
| import mmengine
|
|
|
|
|
| def parse_args():
|
| parser = argparse.ArgumentParser(
|
| description='Convert txt annotation list to json')
|
| parser.add_argument(
|
| 'annofile', type=str, help='the txt annotation file to convert')
|
| parser.add_argument(
|
| '--format',
|
| type=str,
|
| default='rawframes',
|
| choices=['rawframes', 'videos'],
|
| help='the format of the txt annotation file')
|
| parser.add_argument(
|
| '--output',
|
| type=str,
|
| default=None,
|
| help=(
|
| 'the output file name, use annofile.replace(\'.txt\', \'.json\') '
|
| 'if the arg value is None'))
|
| args = parser.parse_args()
|
|
|
| return args
|
|
|
|
|
| def lines2dictlist(lines, format):
|
| """Convert lines in 'txt' format to dictionaries in 'json' format.
|
| Currently support single-label and multi-label.
|
|
|
| Example of a single-label rawframes annotation txt file:
|
|
|
| .. code-block:: txt
|
|
|
| (frame_dir num_frames label)
|
| some/directory-1 163 1
|
| some/directory-2 122 1
|
| some/directory-3 258 2
|
|
|
| Example of a multi-label rawframes annotation txt file:
|
|
|
| .. code-block:: txt
|
|
|
| (frame_dir num_frames label1 label2 ...)
|
| some/directory-1 163 1 3 5
|
| some/directory-2 122 1 2
|
| some/directory-3 258 2
|
|
|
| Example of a single-label videos annotation txt file:
|
|
|
| .. code-block:: txt
|
|
|
| (filename label)
|
| some/path/000.mp4 1
|
| some/path/001.mp4 1
|
| some/path/002.mp4 2
|
|
|
| Example of a multi-label videos annotation txt file:
|
|
|
| .. code-block:: txt
|
|
|
| (filename label1 label2 ...)
|
| some/path/000.mp4 1 3 5
|
| some/path/001.mp4 1 4 8
|
| some/path/002.mp4 2 4 9
|
|
|
| Args:
|
| lines (list): List of lines in 'txt' label format.
|
| format (str): Data format, choices are 'rawframes' and 'videos'.
|
|
|
| Returns:
|
| list[dict]: For rawframes format, each dict has keys: frame_dir,
|
| total_frames, label; for videos format, each diction has keys:
|
| filename, label.
|
| """
|
| lines = [x.split() for x in lines]
|
| if format == 'rawframes':
|
| data = [
|
| dict(
|
| frame_dir=line[0],
|
| total_frames=int(line[1]),
|
| label=[int(x) for x in line[2:]]) for line in lines
|
| ]
|
| elif format == 'videos':
|
| data = [
|
| dict(filename=line[0], label=[int(x) for x in line[1:]])
|
| for line in lines
|
| ]
|
| return data
|
|
|
|
|
| if __name__ == '__main__':
|
|
|
| args = parse_args()
|
| lines = open(args.annofile).readlines()
|
| lines = [x.strip() for x in lines]
|
| result = lines2dictlist(lines, args.format)
|
| if args.output is None:
|
| args.output = args.annofile.replace('.txt', '.json')
|
| mmengine.dump(result, args.output)
|
|
|