#!/usr/bin/env python # -*- encoding: utf-8 -*- """ @File : darknetTR.py.py @Contact : JZ @Modify Time @Author @Version @Desciption ------------ ------- -------- ----------- 2020/6/12 14:40 JZ 1.0 None """ from ctypes import * import cv2 import numpy as np import argparse import os from threading import Thread import time class IMAGE(Structure): _fields_ = [("w", c_int), ("h", c_int), ("c", c_int), ("data", POINTER(c_float))] class BOX(Structure): _fields_ = [("x", c_float), ("y", c_float), ("w", c_float), ("h", c_float)] class DETECTION(Structure): _fields_ = [("cl", c_int), ("bbox", BOX), ("prob", c_float), ("name", c_char*20), ] lib = CDLL("./build/libdarknetTR.so", RTLD_GLOBAL) load_network = lib.load_network load_network.argtypes = [c_char_p, c_int, c_int] load_network.restype = c_void_p copy_image_from_bytes = lib.copy_image_from_bytes copy_image_from_bytes.argtypes = [IMAGE,c_char_p] make_image = lib.make_image make_image.argtypes = [c_int, c_int, c_int] make_image.restype = IMAGE do_inference = lib.do_inference do_inference.argtypes = [c_void_p, IMAGE] get_network_boxes = lib.get_network_boxes get_network_boxes.argtypes = [c_void_p, c_float, c_int, POINTER(c_int)] get_network_boxes.restype = POINTER(DETECTION) # cfg = 'yolo4_fp16.rt' # netMain = load_network(cfg.encode("ascii"), 80, 1) # batch size = 1 # # # darknet_image = make_image(512, 512, 3) # image = cv2.imread('/home/juzheng/dataset/mask/image/20190821004325_55.jpg') # frame_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # image = cv2.resize(frame_rgb, # (512, 512), # interpolation=cv2.INTER_LINEAR) # # # frame_data = np.asarray(image, dtype=np.uint8) # # print(frame_data.shape) # frame_data = image.ctypes.data_as(c_char_p) # copy_image_from_bytes(darknet_image, frame_data) # # num = c_int(0) # # pnum = pointer(num) # do_inference(netMain, darknet_image) # dets = get_network_boxes(netMain, 0.5, 0, pnum) # print('end') # print(dets[0].cl, dets[0].prob) def detect_image(net, meta, darknet_image, thresh=.5): num = c_int(0) pnum = pointer(num) do_inference(net, darknet_image) dets = get_network_boxes(net, 0.5, 0, pnum) res = [] for i in range(pnum[0]): b = dets[i].bbox res.append((dets[i].name.decode("ascii"), dets[i].prob, (b.x, b.y, b.w, b.h))) return res def loop_detect(detect_m, video_path): stream = cv2.VideoCapture(video_path) start = time.time() cnt = 0 while stream.isOpened(): ret, image = stream.read() if ret is False: break frame_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(frame_rgb, (512, 512), interpolation=cv2.INTER_LINEAR) detections = detect_m.detect(image, need_resize=False) cnt += 1 for det in detections: print(det) end = time.time() print("frame:{},time:{:.3f},FPS:{:.2f}".format(cnt, end-start, cnt/(end-start))) stream.release() # class myThread(threading.Thread): # def __init__(self, func, args): # threading.Thread.__init__(self) # self.func = func # self.args = args # def run(self): # # print ("Starting " + self.args[0]) # self.func(*self.args) # print ("Exiting " ) class YOLO4RT(object): def __init__(self, input_size=512, weight_file='./yolo4_fp16.rt', metaPath='Models/yolo4/coco.data', nms=0.2, conf_thres=0.3, device='cuda'): self.input_size = input_size self.metaMain =None self.model = load_network(weight_file.encode("ascii"), 80, 1) self.darknet_image = make_image(input_size, input_size, 3) self.thresh = conf_thres # self.resize_fn = ResizePadding(input_size, input_size) # self.transf_fn = transforms.ToTensor() def detect(self, image, need_resize=True, expand_bb=5): try: if need_resize: frame_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(frame_rgb, (self.input_size, self.input_size), interpolation=cv2.INTER_LINEAR) frame_data = image.ctypes.data_as(c_char_p) copy_image_from_bytes(self.darknet_image, frame_data) detections = detect_image(self.model, self.metaMain, self.darknet_image, thresh=self.thresh) # cvDrawBoxes(detections, image) # cv2.imshow("1", image) # cv2.waitKey(1) # detections = self.filter_results(detections, "person") return detections except Exception as e_s: print(e_s) def parse_args(): parser = argparse.ArgumentParser(description='tkDNN detect') parser.add_argument('weight', help='rt file path') parser.add_argument('--video', type=str, help='video path') args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() detect_m = YOLO4RT(weight_file=args.weight) t = Thread(target=loop_detect, args=(detect_m, args.video), daemon=True) # thread1 = myThread(loop_detect, [detect_m]) # Start new Threads t.start() t.join()