__init__.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import cv2
  2. import numpy as np
  3. from json import dump, load
  4. from pycs.interfaces.MediaFile import MediaFile
  5. from pycs.interfaces.MediaStorage import MediaStorage
  6. from pycs.interfaces.Pipeline import Pipeline as Interface
  7. from .detector import Detector
  8. from .classifier import Classifier
  9. class Scanner(Interface):
  10. def __init__(self, root_folder: str, configuration: dict):
  11. super().__init__(root_folder, configuration)
  12. self.detector = Detector(configuration["detector"])
  13. self.classifier = Classifier(configuration["classifier"], root=root_folder)
  14. def close(self):
  15. pass
  16. def execute(self, storage: MediaStorage, file: MediaFile):
  17. im = self.read_image(file.path)
  18. im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
  19. bw_im = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)
  20. detections = self.detector(bw_im)
  21. labels = {ml.reference: ml for ml in storage.labels()}
  22. for bbox, info in detections:
  23. if not info.selected:
  24. continue
  25. x0, y0, x1, y1 = bbox
  26. cls_ref = self.classifier(bbox.crop(im, enlarge=True))
  27. label = labels.get(cls_ref, cls_ref)
  28. file.add_bounding_box(x0, y0, bbox.w, bbox.h, label=label)
  29. def read_image(self, path: str, mode: int = cv2.IMREAD_COLOR) -> np.ndarray:
  30. return cv2.imread(path, mode)