| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | 
							- import os
 
- import khandy
 
- import numpy as np
 
- from .base import OnnxModel
 
- from .base import check_image_dtype_and_shape
 
- class InsectDetector(OnnxModel):
 
-     def __init__(self):
 
-         current_dir = os.path.dirname(os.path.abspath(__file__))
 
-         model_path = os.path.join(current_dir, 'models/quarrying_insect_detector.onnx')
 
-         self.input_width = 640
 
-         self.input_height = 640
 
-         super(InsectDetector, self).__init__(model_path)
 
-     def _preprocess(self, image):
 
-         check_image_dtype_and_shape(image)
 
-         
 
-          # image size normalization
 
-         image, scale, pad_left, pad_top = khandy.letterbox_image(
 
-             image, self.input_width, self.input_height, 0, return_scale=True)
 
-         # image channel normalization
 
-         image = khandy.normalize_image_channel(image, swap_rb=True)
 
-         # image dtype normalization
 
-         image = khandy.rescale_image(image, 'auto', np.float32)
 
-         # to tensor
 
-         image = np.transpose(image, (2,0,1))
 
-         image = np.expand_dims(image, axis=0)
 
-         return image, scale, pad_left, pad_top
 
-         
 
-     def _post_process(self, outputs_list, scale, pad_left, pad_top, conf_thresh, iou_thresh):
 
-         pred = outputs_list[0][0]
 
-         pass_t = pred[:, 4] > conf_thresh
 
-         pred = pred[pass_t]
 
-         
 
-         boxes = khandy.convert_boxes_format(pred[:, :4], 'cxcywh', 'xyxy')
 
-         boxes = khandy.unletterbox_2d_points(boxes, scale, pad_left, pad_top, False)
 
-         confs = np.max(pred[:, 5:] * pred[:, 4:5], axis=-1)
 
-         classes = np.argmax(pred[:, 5:] * pred[:, 4:5], axis=-1)
 
-         keep = khandy.non_max_suppression(boxes, confs, iou_thresh)
 
-         return boxes[keep], confs[keep], classes[keep]
 
-     def detect(self, image, conf_thresh=0.5, iou_thresh=0.5):
 
-         image, scale, pad_left, pad_top = self._preprocess(image)
 
-         outputs_list = self.forward(image)
 
-         boxes, confs, classes = self._post_process(
 
-             outputs_list, 
 
-             scale=scale, 
 
-             pad_left=pad_left,
 
-             pad_top=pad_top,
 
-             conf_thresh=conf_thresh, 
 
-             iou_thresh=iou_thresh)
 
-         return boxes, confs, classes
 
-         
 
 
  |