detector.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import cv2
  2. import numpy as np
  3. import typing as T
  4. from munch import munchify
  5. from collections import namedtuple
  6. from blob_detector import utils
  7. from blob_detector.core.bbox import BBox
  8. from blob_detector.core.bbox_proc import Splitter
  9. from blob_detector.core.binarizers import BinarizerType
  10. from blob_detector.core.pipeline import Pipeline
  11. class Detector(object):
  12. def __init__(self, configuration: T.Dict[str, T.Dict]) -> None:
  13. super().__init__()
  14. config = munchify(configuration)
  15. self.img_proc = Pipeline()
  16. self.img_proc.find_border()
  17. if config.preprocess.min_size:
  18. self.img_proc.rescale(
  19. min_size=config.preprocess.min_size,
  20. min_scale=config.preprocess.scale)
  21. self.img_proc.preprocess(
  22. equalize=False, sigma=config.preprocess.sigma)
  23. self.img_proc.binarize(
  24. type=BinarizerType.gauss_local,
  25. use_masked=True,
  26. use_cv2=True,
  27. window_size=config.threshold.window_size,
  28. offset=2.0,
  29. )
  30. self.img_proc.remove_border()
  31. self.img_proc.open_close(
  32. kernel_size=config.postprocess.kernel_size,
  33. iterations=config.postprocess.dilate_iterations)
  34. self.bbox_proc = Pipeline()
  35. self.bbox_proc.detect(use_masked=True)
  36. _, splitter = self.bbox_proc.split_bboxes(
  37. preproc=Pipeline(), detector=Pipeline())
  38. _, bbox_filter = self.bbox_proc.bbox_filter(
  39. score_threshold=0.5,
  40. nms_threshold=0.3,
  41. enlarge=0.01,
  42. )
  43. # _, scorer = self.bbox_proc.score()
  44. self.img_proc.requires_input(splitter.set_image)
  45. self.img_proc.requires_input(bbox_filter.set_image)
  46. # self.img_proc.requires_input(scorer.set_image)
  47. def __call__(self, im: np.ndarray) -> T.List[BBox]:
  48. _im = self.img_proc(im)
  49. det_result = self.bbox_proc(_im)
  50. return det_result.bboxes