123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- from deep_sort.utils.parser import get_config
- from deep_sort.deep_sort import DeepSort
- import torch
- import cv2
- import logging
- logging.basicConfig(filename='detection_log.txt', level=logging.INFO,
- format='%(asctime)s - %(message)s')
- palette = (2 ** 11 - 1, 2 ** 15 - 1, 2 ** 20 - 1)
- cfg = get_config()
- cfg.merge_from_file("deep_sort/configs/deep_sort.yaml")
- deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT,
- max_dist=cfg.DEEPSORT.MAX_DIST, min_confidence=cfg.DEEPSORT.MIN_CONFIDENCE,
- nms_max_overlap=cfg.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distance=cfg.DEEPSORT.MAX_IOU_DISTANCE,
- max_age=cfg.DEEPSORT.MAX_AGE, n_init=cfg.DEEPSORT.N_INIT, nn_budget=cfg.DEEPSORT.NN_BUDGET,
- use_cuda=True)
- def plot_bboxes(image, bboxes, line_thickness=None):
- # Plots one bounding box on image img
- tl = line_thickness or round(0.002 * (image.shape[0] + image.shape[1]) / 2) + 1 # line/font thickness
- for (x1, y1, x2, y2, cls_id, pos_id) in bboxes:
- if cls_id == 'person':
- color = (0, 0, 255)
- # 输出日志信息
- logging.info(f'Detected: {cls_id} ID-{pos_id}') # 记录检测到的类别和ID
- else:
- color = (0, 255, 0)
- c1, c2 = (x1, y1), (x2, y2)
- cv2.rectangle(image, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
- tf = max(tl - 1, 1) # font thickness
- t_size = cv2.getTextSize(cls_id, 0, fontScale=tl / 3, thickness=tf)[0]
- c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
- cv2.rectangle(image, c1, c2, color, -1, cv2.LINE_AA) # filled
- cv2.putText(image, '{} ID-{}'.format(cls_id, pos_id), (c1[0], c1[1] - 2), 0, tl / 3,
- [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)
- return image
- def update_tracker(target_detector, image):
- new_faces = []
- _, bboxes = target_detector.detect(image)
- bbox_xywh = []
- confs = []
- clss = []
- for x1, y1, x2, y2, cls_id, conf in bboxes:
- obj = [
- int((x1+x2)/2), int((y1+y2)/2),
- x2-x1, y2-y1
- ]
- bbox_xywh.append(obj)
- confs.append(conf)
- clss.append(cls_id)
- xywhs = torch.Tensor(bbox_xywh)
- confss = torch.Tensor(confs)
- outputs = deepsort.update(xywhs, confss, clss, image)
- bboxes2draw = []
- face_bboxes = []
- current_ids = []
- for value in list(outputs):
- x1, y1, x2, y2, cls_, track_id = value
- bboxes2draw.append(
- (x1, y1, x2, y2, cls_, track_id)
- )
- current_ids.append(track_id)
- if cls_ == 'face':
- if not track_id in target_detector.faceTracker:
- target_detector.faceTracker[track_id] = 0
- face = image[y1:y2, x1:x2]
- new_faces.append((face, track_id))
- face_bboxes.append(
- (x1, y1, x2, y2)
- )
- ids2delete = []
- for history_id in target_detector.faceTracker:
- if not history_id in current_ids:
- target_detector.faceTracker[history_id] -= 1
- if target_detector.faceTracker[history_id] < -5:
- ids2delete.append(history_id)
- for ids in ids2delete:
- target_detector.faceTracker.pop(ids)
- print('-[INFO] Delete track id:', ids)
- image = plot_bboxes(image, bboxes2draw)
- return image, new_faces, face_bboxes
|