test_annotations.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import unittest
  2. import numpy as np
  3. import os
  4. import uuid
  5. from tests.configs import config
  6. from os.path import *
  7. from abc import ABC, abstractproperty
  8. from cvdatasets import FileListAnnotations
  9. from cvdatasets.utils import read_info_file
  10. class MockAnnotation(FileListAnnotations):
  11. index_offset = 0
  12. @property
  13. def meta(self):
  14. info = _MetaInfo(
  15. images_folder="images",
  16. images_file="images.txt",
  17. labels_file="labels.txt",
  18. split_file="tr_ID.txt",
  19. bounding_boxes="bounding_boxes.txt",
  20. bounding_box_dtype=np.dtype([(v, np.int32) for v in "xywh"]),
  21. parts_file=join("parts", "part_locs.txt"),
  22. part_names_file=join("parts", "parts.txt"),
  23. )
  24. info.structure = [
  25. [info.images_file, "_images"],
  26. [info.labels_file, "labels"],
  27. [info.split_file, "_split"],
  28. [info.parts_file, "_part_locs"],
  29. [info.part_names_file, "_part_names"],
  30. [info.bounding_boxes, "_bounding_boxes"],
  31. ]
  32. return info
  33. class BaseAnnotationTest(unittest.TestCase, ABC):
  34. def tearDown(self):
  35. # clear mock data folder?
  36. pass
  37. def setUp(self):
  38. self.info = read_info_file(config.INFO_FILE)
  39. def create_annotations(self, images, labels, split,
  40. bboxes=False,
  41. index_offset=0,
  42. n_parts=None,
  43. annot_params={}):
  44. data_root = join(self.info.BASE_DIR, self.info.DATA_DIR)
  45. dataset_info = self.info.DATASETS.MOCK
  46. annot_dir = join(data_root, dataset_info.folder, dataset_info.annotations)
  47. if not isdir(annot_dir):
  48. os.makedirs(annot_dir)
  49. fname = lambda name: join(annot_dir, name)
  50. with open(fname("images.txt"), "w") as images_f,\
  51. open(fname("labels.txt"), "w") as labels_f,\
  52. open(fname("tr_ID.txt"), "w") as split_f:
  53. for im, lab, sp in zip(images, labels, split):
  54. print(*im, file=images_f)
  55. print(lab, file=labels_f)
  56. print(sp, file=split_f)
  57. if bboxes:
  58. with open(fname("bounding_boxes.txt"), "w") as bbox_f:
  59. for i in range(index_offset, index_offset + len(images)):
  60. print(images[i][0], 0, 0, 100, 100, file=bbox_f)
  61. if n_parts is not None:
  62. parts_dir = join(annot_dir, "parts")
  63. if not isdir(parts_dir):
  64. os.makedirs(parts_dir)
  65. fname = lambda name: join(parts_dir, name)
  66. with open(fname("parts.txt"), "w") as part_names_f, \
  67. open(fname("part_locs.txt"), "w") as part_locs_f:
  68. for i in range(n_parts):
  69. print(i, "part_{}".format(i), file=part_names_f)
  70. for i, imname in images:
  71. for p in range(n_parts):
  72. print(i, p, 10*(p+1), 10*(p+1), 1, file=part_locs_f)
  73. return MockAnnotation(
  74. root_or_infofile=config.INFO_FILE,
  75. **annot_params)
  76. class AnnotationTest(BaseAnnotationTest):
  77. # @unittest.skip
  78. def test_simple(self):
  79. _annotation_params = dict(
  80. images=[(i, "images{}.jpg".format(i)) for i in range(10)],
  81. labels=[i % 5 for i in range(10)],
  82. split=[int(i < 5) for i in range(10)],
  83. bboxes=True,
  84. n_parts=5,
  85. annot_params=dict(dataset_key="MOCK")
  86. )
  87. annot = self.create_annotations(**_annotation_params)
  88. # @unittest.skip
  89. def test_with_uuids(self):
  90. _annotation_params = dict(
  91. images=[(uuid.uuid4(), "images{}.jpg".format(i)) for i in range(10)],
  92. labels=[i % 5 for i in range(10)],
  93. split=[int(i < 5) for i in range(10)],
  94. bboxes=True,
  95. n_parts=5,
  96. annot_params=dict(dataset_key="MOCK")
  97. )
  98. annot = self.create_annotations(**_annotation_params)
  99. self.assertFalse(0)