def main(): args = parse_args() cam = Camera(args) cam.open() # import pdb # pdb.set_trace() if not cam.is_opened: sys.exit('[INFO] Failed to open camera!') cls_dict = get_cls_dict('coco') yolo_dim = int(args.model.split('-')[-1]) # 416 or 608 trt_yolov3 = TrtYOLOv3(args.model, (yolo_dim, yolo_dim)) print('[INFO] Camera: starting') cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'TensorRT YOLOv3 Detector') vis = BBoxVisualization(cls_dict) loop_and_detect(cam, args.runtime, trt_yolov3, conf_th=0.3, vis=vis, window_name=WINDOW_NAME) print('[INFO] Program: stopped') cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() #YOLO INIT #cls_dict = get_cls_dict('coco') cls_dict = get_cls_dict('deepfamily') print("classes count : ", len(cls_dict)) yolo_dim = int(args.model.split('-')[-1]) # 416 or 608 print("yolo_dim : ", yolo_dim) trt_yolov3 = TrtYOLOv3(args.model, (yolo_dim, yolo_dim)) #CAMERA cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') cam.start() #CAM-WINDOW open_window(WINDOW_NAME, args.image_width, args.image_height, 'DEEPFAMILY PROJECT - TensorRT YOLOv3') vis = BBoxVisualization(cls_dict) #DETECT-LOOP loop_and_detect(cam, trt_yolov3, conf_th=0.95, vis=vis) #loop_and_detect(cam, trt_yolov3, conf_th=0.95) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') cls_dict = get_cls_dict('coco') yolo_dim = int(args.model.split('-')[-1]) # 416 or 608 trt_yolov3 = TrtYOLOv3(args.model, (yolo_dim, yolo_dim)) cam.start() # open_window(WINDOW_NAME, args.image_width, args.image_height, # 'Camera TensorRT YOLOv3 Demo') vis = BBoxVisualization(cls_dict) # for video # loop_and_detect(cam, trt_yolov3, conf_th=0.3, vis=vis) # for single file detect_demo(cam, trt_yolov3, conf_th=0.3, vis=vis) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() if args.category_num <= 0: raise SystemExit('Bad category_num: %d!' % args.category_num) cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') cls_dict = get_cls_dict(args.category_num) yolo_dim = int(args.model.split('-')[-1]) if yolo_dim not in (288, 416, 608): raise SystemExit('Bad yolo_dim: %d!\nPlease make sure the model file name contains the correct dimension...' % yolo_dim) trt_yolov3 = TrtYOLOv3(args.model, (yolo_dim, yolo_dim), args.category_num) cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT YOLOv3 Demo') vis = BBoxVisualization(cls_dict) loop_and_detect(cam, trt_yolov3, conf_th=0.3, vis=vis) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() if args.category_num <= 0: raise SystemExit('ERROR: bad category_num (%d)!' % args.category_num) if not os.path.isfile('yolo/%s.trt' % args.model): raise SystemExit('ERROR: file (yolo/%s.trt) not found!' % args.model) cam = Camera(args) cam.open() if not cam.is_opened: raise SystemExit('ERROR: failed to open camera!') cls_dict = get_cls_dict(args.category_num) yolo_dim = args.model.split('-')[-1] if 'x' in yolo_dim: dim_split = yolo_dim.split('x') if len(dim_split) != 2: raise SystemExit('ERROR: bad yolo_dim (%s)!' % yolo_dim) w, h = int(dim_split[0]), int(dim_split[1]) else: h = w = int(yolo_dim) if h % 32 != 0 or w % 32 != 0: raise SystemExit('ERROR: bad yolo_dim (%s)!' % yolo_dim) trt_yolo = TrtYOLO(args.model, (h, w), args.category_num) cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT YOLO Demo') vis = BBoxVisualization(cls_dict) loop_and_detect(cam, trt_yolo, conf_th=0.3, vis=vis) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') cls_dict = get_cls_dict(args.model) trt_ssd = TrtSSD(args.model, INPUT_HW) cam.start() if args.use_console: loop_and_detect_console(cam, trt_ssd, conf_th=0.3, loop=args.loop, cls_dict=cls_dict) else: open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT SSD Demo for Jetson Nano') vis = BBoxVisualization(cls_dict) loop_and_detect(cam, trt_ssd, conf_th=0.3, vis=vis) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') trt_ssd = TrtSSD(args.model) cam.start() # initialize bot logger.info('initialize robot') robot = Robot() logger.info('starting to loop and detect') loop_and_detect(cam=cam, trt_ssd=trt_ssd, conf_th=0.3, robot=robot, model=args.model) logger.info('cleaning up') robot.stop() cam.stop() cam.release()
def main(): logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Ask tensorflow logger not to propagate logs to parent (which causes # duplicated logging) logging.getLogger('tensorflow').propagate = False global args args = parse_args() logger.info('called with args: %s' % args) # build the class (index/name) dictionary from labelmap file logger.info('reading label map') cls_dict = read_label_map(args.labelmap_file) pb_path = './data/{}_trt.pb'.format(args.model) log_path = './logs/{}_trt'.format(args.model) if args.do_build: logger.info('building TRT graph and saving to pb: %s' % pb_path) build_trt_pb(args.model, pb_path) logger.info('opening camera device/file') cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') logger.info('loading TRT graph from pb: %s' % pb_path) trt_graph = load_trt_pb(pb_path) logger.info('starting up TensorFlow session') tf_config = tf.ConfigProto() tf_config.gpu_options.allow_growth = True #tf_sess = tf.Session(config=tf_config, graph=trt_graph) -- Vincent #Solve : "unable to satfisfy explicit device /dev/CPU:0 -- Vincent tf_sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True), graph=trt_graph) if args.do_tensorboard: logger.info('writing graph summary to TensorBoard') write_graph_tensorboard(tf_sess, log_path) logger.info('warming up the TRT graph with a dummy image') od_type = 'faster_rcnn' if 'faster_rcnn' in args.model else 'ssd' dummy_img = np.zeros((720, 1280, 3), dtype=np.uint8) _, _, _ = detect(dummy_img, tf_sess, conf_th=.3, od_type=od_type) cam.start() # ask the camera to start grabbing images # grab image and do object detection (until stopped by user) logger.info('starting to loop and detect') vis = BBoxVisualization(cls_dict) open_display_window(cam.img_height, cam.img_width) result = loop_and_detect(cam, tf_sess, args.conf_th, vis, od_type=od_type) logger.info('cleaning up') cam.stop() # terminate the sub-thread in camera tf_sess.close() cam.release() cv2.destroyAllWindows()
def main(): cam_config = "config/camera.json" config = CVConfig("config/config.json") config.load_cam_config(cam_config) camera = Camera(config) config_json = None try: camera.start() while (True): print "Enter a camera setting to change. (or 'P' to preview, 'X' to quit, 'V' to see current settings, 'S' to save image, 'L' to load config, 'SC' to save config)" print "1 to save hexagon pic, 2 to save resource pic, 3 to save num pic" token = raw_input("Input: ") if token == 'P': get_picture(camera) elif token == 'X': print "Saving config as:", cam_config config.save_cam_config(cam_config) break elif token == 'SC': print "Saving config as:", cam_config config.save_cam_config(cam_config) elif token == 'V': settings = config.get_cam_all() print "Settings for: ", cam_config for key in settings: print key, ": ", settings[key] elif token == 'S': img = get_picture(camera) path = raw_input("Path: ") CVUtils.save_img(img, path) elif token == 'L': cam_config = raw_input('Config path:') config_json = CVConfig.load_json(cam_config) camera._set_config(config_json) get_picture(camera) elif token =='1': img = get_picture(camera, CVConfig.load_json("config/camera_hex.json")) CVUtils.save_img(img, "images/test_hex.png") elif token =='2': img = get_picture(camera) CVUtils.save_img(img, "images/test_resource.png") elif token =='3': img = get_picture(camera, CVConfig.load_json("config/camera_nums.json")) CVUtils.save_img(img, "images/test_nums.png") else: process_token(token, camera) get_picture(camera) finally: camera.stop()
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') mtcnn = TrtMtcnn() cam.start() open_window(WINDOW_NAME, width=640, height=480, title='MTCNN Window') detect_faces(cam, mtcnn) cam.stop() cam.release() cv2.destroyAllWindows() del mtcnn
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') mtcnn = TrtMtcnn() cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT MTCNN Demo for Jetson TX2') loop_and_detect(cam, mtcnn, args.minsize) cam.stop() cam.release() cv2.destroyAllWindows() del (mtcnn)
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: raise SystemExit('ERROR: failed to open camera!') cls_dict = get_cls_dict(args.model.split('_')[-1]) trt_ssd = TrtSSD(args.model, INPUT_HW) cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT SSD Demo for Jetson Nano') vis = BBoxVisualization(cls_dict) loop_and_detect(cam, trt_ssd, conf_th=0.3, vis=vis) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() labels = np.loadtxt('googlenet/synset_words.txt', str, delimiter='\t') cam = Camera(args) cam.open() if not cam.is_opened: raise SystemExit('ERROR: failed to open camera!') # initialize the tensorrt googlenet engine net = PyTrtGooglenet(DEPLOY_ENGINE, ENGINE_SHAPE0, ENGINE_SHAPE1) cam.start() open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT GoogLeNet Demo for Jetson Nano') loop_and_classify(cam, net, labels, args.crop_center) cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() labels = np.loadtxt('googlenet/synset_words.txt', str, delimiter='\t') cam = Camera(args) cam.open() if not cam.is_opened: sys.exit('Failed to open camera!') cam.start() # let camera start grabbing frames open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT GoogLeNet Demo for Jetson Nano') condition = threading.Condition() trt_thread = TrtGooglenetThread(condition, cam, labels, args.crop_center) trt_thread.start() # start the child thread loop_and_display(condition) trt_thread.stop() # stop the child thread cam.stop() cam.release() cv2.destroyAllWindows()
def main(): args = parse_args() cam = Camera(args) cam.open() if not cam.is_opened: raise SystemExit('ERROR: failed to open camera!') cls_dict = get_cls_dict(args.model.split('_')[-1]) cuda.init() # init pycuda driver cam.start() # let camera start grabbing frames open_window(WINDOW_NAME, args.image_width, args.image_height, 'Camera TensorRT SSD Demo for Jetson Nano') vis = BBoxVisualization(cls_dict) condition = threading.Condition() trt_thread = TrtThread(condition, cam, args.model, conf_th=0.3) trt_thread.start() # start the child thread loop_and_display(condition, vis) trt_thread.stop() # stop the child thread cam.stop() cam.release() cv2.destroyAllWindows()
def loop_and_detect(cam, tf_sess, conf_th, vis, od_type): """Loop, grab images from camera, and do object detection. # Arguments cam: the camera object (video source). tf_sess: TensorFlow/TensorRT session to run SSD object detection. conf_th: confidence/score threshold for object detection. vis: for visualization. """ show_fps = True full_scrn = False fps = 0.0 tic = time.time() tracks = [] global rects, ct, temp, args frame_buff = 0 none_buff = 0 restart_flag = False backup_label = None while True: #if cv2.getWindowProperty(WINDOW_NAME, 0) < 0: # Check to see if the user has closed the display window. # If yes, terminate the while loop. # break if (restart_flag == True): cam = Camera(args) cam.open() cam.start() #pb_path = './data/{}_trt.pb'.format(args.model) #log_path = './logs/{}_trt'.format(args.model) #trt_graph = load_trt_pb(pb_path) #tf_config = tf.ConfigProto() #tf_config.gpu_options.allow_growth = True #tf_sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True),graph=trt_graph) #od_type = 'faster_rcnn' if 'faster_rcnn' in args.model else 'ssd' dummy_img = np.zeros((720, 1280, 3), dtype=np.uint8) _, _, _ = detect(dummy_img, tf_sess, conf_th=.3, od_type=od_type) restart_flag = False rects = [] img = cam.read() optical_flow_image = img if img is not None: box, conf, cls = detect(img, tf_sess, conf_th, od_type=od_type) img = vis.draw_bboxes(img, box, conf, cls) objects = ct.update(rects) cv2.rectangle(img, (0, 980), (1920, 1075), (0, 0, 0), -1) for (objectID, centroid) in objects.items(): # draw both the ID of the object and the centroid of the # object on the output frame text = "ID {}".format(objectID) cv2.putText(img, text, (centroid[0] - 10, centroid[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2) cv2.circle(img, (centroid[0], centroid[1]), 4, (255, 0, 255), -1) backup_label = str(objectID) cv2.putText(img, backup_label, (330, 1035), cv2.FONT_HERSHEY_TRIPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA) sys_clock = str( datetime.datetime.now()) + " Frame_buff=" + str(frame_buff) print(sys_clock) cv2.putText(img, sys_clock, (20, 950), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA) cv2.putText(img, "Traffic Counter: ", (20, 1035), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA) cv2.putText(img, "Detector Type: Human", (400, 1035), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA) cv2.putText(img, "Real Time Optical Trace :", (900, 1035), cv2.FONT_HERSHEY_TRIPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA) cv2.putText(img, "OFF", (1380, 1035), cv2.FONT_HERSHEY_TRIPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA) """ if(frame_buff == 2000): print("[SYSTEM] VSTARCAMERA Restart") cam.stop() # terminate the sub-thread in camera #tf_sess.close() #tf.reset_default_graph() #tf.contrib.keras.backend.clear_session() cam.release() restart_flag = True frame_buff = 0 img = None cv2.destroyAllWindows() frame_buff += 1 """ if (restart_flag == False): if show_fps: img = draw_help_and_fps(img, fps) #set_full_screen(full_scrn) cv2.moveWindow(WINDOW_NAME, 0, 0) cv2.imshow(WINDOW_NAME, img) toc = time.time() curr_fps = 1.0 / (toc - tic) # calculate an exponentially decaying average of fps number fps = curr_fps if fps == 0.0 else (fps * 0.9 + curr_fps * 0.1) tic = toc else: print("None Image --> None Buff = {}".format(none_buff)) none_buff += 1 if (none_buff == 500): print("[SYSTEM] VSTARCAMERA Restart") cam.stop() # terminate the sub-thread in camera #tf_sess.close() #tf.reset_default_graph() #tf.contrib.keras.backend.clear_session() cam.release() restart_flag = True none_buff = 0 img = None cv2.destroyAllWindows() if (restart_flag == False): key = cv2.waitKey(1) if key == 27: # ESC key: quit program break elif key == ord('H') or key == ord('h'): # Toggle help/fps show_fps = not show_fps elif key == ord('F') or key == ord('f'): # Toggle fullscreen full_scrn = not full_scrn set_full_screen(full_scrn)
class DiceController(object): _IMAGE_WIDTH = 1200 _CONFIG_FILE = "config/config.json" _SERVER_ADDR = "B8:27:EB:A6:25:50" _BUTTON_PIN = 17 def __init__(self): self._bt_client = None self._gpio = GPIOController() self._gpio.init_button(self._BUTTON_PIN) return def _prepare_config(self, reset=False): camera_config = "config/camera_dice.json" cv_config = self._CONFIG_FILE config = CVConfig(cv_config, reset) config.load_cv_config(cv_config) config.load_cam_config(camera_config) return config def _get_image(self, config=None): if self._camera is None: print "Camera unintialized" img = self._camera.capture(config) return imutils.resize(img, width=self._IMAGE_WIDTH) # Called to detect and save hexagons def _handle_detect_dice(self): img = self._get_image() initial = time.time() dice_roll = self._dice_detector.detect_roll(img) print "Rolled: ", dice_roll # print "Time: ", time.time() - initial if self._bt_client is not None: self._bt_client.send(str(dice_roll)) def start_auto(self): # Wait for button PRESS to connect to server, or HOLD to exit self._gpio.led_on() if self._gpio.wait_for_press_or_hold(self._BUTTON_PIN) == 'HOLD': self._gpio.led_restore() return self._config = self._prepare_config() self._camera = Camera(self._config) self._camera.start() self._dice_detector = DiceDetector(self._config) self._bt_client = BluetoothClient() # Connect to BT server self._gpio.led_off() ret = False try: ret = self._bt_client.connect(self._SERVER_ADDR) except e: self._gpio.led_blink(3) return # Green LED on if connected, blink 3 times if failed if ret: self._gpio.led_on() else: self._gpio.led_blink(3) return while(True): res = self._gpio.wait_for_press_or_hold(self._BUTTON_PIN) if res == 'PRESS': self._handle_detect_dice() else: break self._bt_client.send('\n') def start(self): self._config = self._prepare_config() self._camera = Camera(self._config) self._camera.start() self._dice_detector = DiceDetector(self._config) self._bt_client = None while (True): print '1 to detect dice roll, 2 to enable bluetooth' token = raw_input("Input: ") if token == '1': self._handle_detect_dice() elif token == '2': self._bt_client = BluetoothClient() self._bt_client.connect(self._SERVER_ADDR) elif token == 'X': if self._bt_client is not None: self._bt_client.send('\n') break return def start_test(self): self._config = self._prepare_config(True) self._camera = Camera(self._config) self._camera.start() self._dice_detector = DiceDetector(self._config) self._handle_detect_dice() self._config.save_cv_config(self._CONFIG_FILE)
def loop_and_detect(cam, tf_sess, conf_th, vis, od_type): """Loop, grab images from camera, and do object detection. # Arguments cam: the camera object (video source). tf_sess: TensorFlow/TensorRT session to run SSD object detection. conf_th: confidence/score threshold for object detection. vis: for visualization. """ show_fps = True full_scrn = False fps = 0.0 #tic = time.time() tic = 0 toc = 0 global rects, ct, temp global person_x, person_y global leave_zone global leave_zone_2 global leave_zone_counter global enter_zone zone_x_bed = 0 zone_y_bed = 0 zone_x_clean = 0 zone_y_clean = 0 #Boundary boxes for RTSP (low resolution) zone_x_min_bed, zone_y_min_bed, zone_x_max_bed, zone_y_max_bed = 366, 369, 521, 667 zone_x_min_clean, zone_y_min_clean, zone_x_max_clean, zone_y_max_clean = 194, 300, 330, 420 zone_x_min_door, zone_y_min_door, zone_x_max_door, zone_y_max_door = 620, 151, 674, 414 zone_x_min_alchol, zone_y_min_alchol, zone_x_max_alchol, zone_y_max_alchol = 430, 329, 470, 356 distance_thres_bed = 165 distance_thres_clean = 105 distance_thres_alchol = 100 counter_msg = 0 fail_msg = 0 pass_msg = 0 global hand_wash_status, args, client hd = 0 wash_delay = 0 invalid_id = [] invalid_id.append(999) enter, leave = False, False restart_flag = False #restart issue backup_label = None #restart issue none_buff = 0 #restart issue previous_id = 999 personal_status = [] for i in range(0, 1000): personal_status.append(0) #CSV Log File if (5 > 2): while True: #if cv2.getWindowProperty(WINDOW_NAME, 0) < 0: # Check to see if the user has closed the display window. # If yes, terminate the while loop. # break if (restart_flag == True): cam = Camera(args) cam.open() cam.start() print("Camera is opened!") dummy_img = np.zeros((720, 1280, 3), dtype=np.uint8) _, _, _ = detect(dummy_img, tf_sess, conf_th=.3, od_type=od_type) print("Loading dummy image!") restart_flag = False rects = [] img = cam.read() if img is not None: img = cv2.flip(img, 0) #check mqtt status #client.on_message = on_message #client.loop_forever() box, conf, cls = detect(img, tf_sess, conf_th, od_type=od_type) img, hd = vis.draw_bboxes(img, box, conf, cls) cv2.rectangle(img, (zone_x_min_bed, zone_y_min_bed), (zone_x_max_bed, zone_y_max_bed), (255, 102, 255), 2) zone_x_bed = int((zone_x_min_bed + zone_x_max_bed) / 2.0) zone_y_bed = int((zone_y_min_bed + zone_y_max_bed) / 2.0) cv2.circle(img, (zone_x_bed, zone_y_bed), 4, (255, 102, 255), -1) cv2.putText(img, "Patient", (zone_x_bed - 40, zone_y_bed - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 102, 255), 1) cv2.rectangle(img, (zone_x_min_clean, zone_y_min_clean), (zone_x_max_clean, zone_y_max_clean), (255, 255, 51), 2) zone_x_clean = int((zone_x_min_clean + zone_x_max_clean) / 2.0) zone_y_clean = int((zone_y_min_clean + zone_y_max_clean) / 2.0) cv2.circle(img, (zone_x_clean, zone_y_clean), 4, (255, 255, 51), -1) cv2.putText(img, "CLEANING ZONE", (zone_x_clean - 110, zone_y_clean - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 51), 1) cv2.rectangle(img, (zone_x_min_door, zone_y_min_door), (zone_x_max_door, zone_y_max_door), (127, 0, 255), 2) zone_x_door = int((zone_x_min_door + zone_x_max_door) / 2.0) zone_y_door = int((zone_y_min_door + zone_y_max_door) / 2.0) cv2.circle(img, (zone_x_door, zone_y_door), 4, (127, 0, 255), -1) cv2.putText(img, "ENTRANCE", (zone_x_door - 40, zone_y_door - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (127, 0, 255), 1) cv2.rectangle(img, (zone_x_min_alchol, zone_y_min_alchol), (zone_x_max_alchol, zone_y_max_alchol), (255, 255, 51), 2) zone_x_alchol = int( (zone_x_min_alchol + zone_x_max_alchol) / 2.0) zone_y_alchol = int( (zone_y_min_alchol + zone_y_max_alchol) / 2.0) cv2.circle(img, (zone_x_alchol, zone_y_alchol), 4, (255, 255, 51), -1) cv2.putText(img, "CLEANING ZONE", (zone_x_alchol - 35, zone_y_alchol - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 51), 1) #ROI cv2.rectangle(img, (160, 130), (697, 721), (0, 255, 255), 2) distance_bed = 0 distance_clean = 0 #Detection Zone objects, valid_checker = ct.update(rects) flag = False leave_zone_counter = 0 for ((objectID, centroid), (objectID, valid)) in zip(objects.items(), valid_checker.items()): # draw both the ID of the object and the centroid of the # object on the output frame #text_id = "ID {}".format(objectID) text_id = "id = 0" backup_label = str(objectID) text = "staff" cv2.putText(img, text, (centroid[0] - 10, centroid[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.putText(img, text_id, (centroid[0] - 10, centroid[1] - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.circle(img, (centroid[0], centroid[1]), 4, (0, 255, 0), -1) distance_bed = int( math.sqrt((centroid[0] - zone_x_bed)**2 + (centroid[1] - zone_y_bed)**2)) distance_clean = int( math.sqrt((centroid[0] - zone_x_clean)**2 + (centroid[1] - zone_y_clean)**2)) distance_clean_alchol = int( math.sqrt((centroid[0] - zone_x_alchol)**2 + (centroid[1] - zone_y_alchol)**2)) enter = ct.display_enter_status(objectID) leave = ct.display_leave_status(objectID) flag = ct.display_hygiene(objectID) if (distance_clean_alchol <= distance_thres_alchol): cv2.line(img, (centroid[0], centroid[1]), (zone_x_alchol, zone_y_alchol), (0, 0, 255), 1) # if(hand_wash_status == 1): # personal_status[objectID] = 1 # ct.update_wash(True,objectID) if (distance_bed <= distance_thres_bed): #personal_status[0] = 0 hand_wash_status = 0 cv2.line(img, (centroid[0], centroid[1]), (zone_x_bed, zone_y_bed), (0, 255, 0), 1) #Update Hygiene Status as the staff is originally cleaned ct.update_hygiene(False, objectID) """ #Never enter if(enter == False): ct.update_enter(True,objectID) #If the staff did not wash hand and go to patient directly hand_wash_flag = ct.display_wash(objectID) if(hand_wash_flag == False): ct.update_valid(False,objectID) m = 0 match = True #Check whether this ID is marked as fail or not (on the screen) while(m<len(invalid_id)): if(objectID==invalid_id[m]): #ObjectID is found in the invalid bank match = True else: match = False m+=1 #If it is not in the bank,then mark it and fail counter + 1 if(match == False): fail_msg +=1 invalid_id.append(objectID) #Enter again with uncleaned => invalid else: if(flag == False): #Re-enter the patient zone if((enter == True)and(leave == True)): ct.update_valid(False,objectID) m = 0 match = True #Check whether this ID is marked as fail or not (on the screen) while(m<len(invalid_id)): if(objectID==invalid_id[m]): #ObjectID is found in the invalid bank match = True else: match = False m+=1 #If it is not in the bank,then mark it and fail counter + 1 if(match == False): fail_msg +=1 invalid_id.append(objectID) else: if(enter == True): ct.update_leave(True,objectID) """ if ((distance_clean <= distance_thres_clean) or (distance_clean_alchol <= distance_thres_alchol)): if (distance_clean <= distance_thres_clean): cv2.line(img, (centroid[0], centroid[1]), (zone_x_clean, zone_y_clean), (51, 255, 255), 1) #if(hand_wash_status == 1): # personal_status[0] = 1 #hand_wash_status = 1 #Update Hygiene Status ct.update_hygiene(True, objectID) #Reset IN/OUT Mechanism ct.update_enter(False, objectID) ct.update_leave(False, objectID) ct.update_wash(True, objectID) #Return hygiene status flag = ct.display_hygiene(objectID) #if(previous_id!=objectID): #hand_wash_status = 0 #personal_status = 0 previous_id = objectID with open('./path_analyzer/path_log.csv', 'a', newline='') as csv_log_file: log_writer = csv.writer(csv_log_file) log_writer.writerow([ objectID, centroid[0], centroid[1], int(distance_bed), int(distance_clean), int(distance_clean_alchol), int(0), int(0) ]) #log_writer.writerow([objectID,centroid[0],centroid[1],int(distance_bed),int(distance_clean),int(distance_clean_alchol),int(hand_wash_status),int(personal_status[objectID])]) if(((centroid[0]>=zone_x_min_door)and(centroid[0]<=zone_x_max_door)) and \ ((centroid[1]>=zone_y_min_door)and(centroid[1]<=zone_y_max_door))): person_x = centroid[0] person_y = centroid[1] leave_zone_counter += 1 if ((leave_zone_counter == 0) and (enter_zone == True) and (leave_zone == False)): if (leave_zone_2 == False): print("LEAVE 1!!!\r\n") leave_zone = True else: print("LAEVE 2!!!\r\n") enter_zone = False leave_zone_2 = False #print("leave_zone_counter:",leave_zone_counter) #print("leave_zone_2:",leave_zone_2) #print("enter_zone:",enter_zone) #print("leave_zone:",leave_zone) #If any id passed through entrance if (((person_x > 0) and (person_y > 0)) and (leave_zone_counter > 0)): font = cv2.FONT_HERSHEY_PLAIN line = cv2.LINE_AA if (enter_zone == False): cv2.putText(img, "START", (40, 100), font, 3.0, (255, 0, 0), 4, line) print("START\r\n") enter_zone = True start_time = time.time() pp = ' { "sys_status" :"' + str(10) + '"}' client.publish("MDSSCC/STATUS", pp) else: if (leave_zone == True): cv2.putText(img, "COUNT", (40, 100), font, 3.0, (255, 0, 0), 4, line) print("COUNT\r\n") pp = ' { "sys_status" :"' + str(30) + '"}' client.publish("MDSSCC/STATUS", pp) leave_zone = False leave_zone_2 = True leave_zone_counter = 0 person_x = 0 person_y = 0 print() if (restart_flag == False): if show_fps: img = draw_help_and_fps(img, fps) #img = img[200:721, 160:697] cv2.imshow(WINDOW_NAME, img) cv2.setMouseCallback( WINDOW_NAME, pixel_info) #Receive mouse click on HSV_Picker #toc = time.time() #curr_fps = 1.0 / (toc - tic) # calculate an exponentially decaying average of fps number #fps = curr_fps if fps == 0.0 else (fps*0.9 + curr_fps*0.1) #tic = toc else: print("None Image --> None Buff = {}".format(none_buff)) none_buff += 1 if (none_buff == 1000): print("[SYSTEM] VSTARCAMERA Restart") cam.stop() # terminate the sub-thread in camera #tf_sess.close() #tf.reset_default_graph() #tf.contrib.keras.backend.clear_session() cam.release() restart_flag = True none_buff = 0 #img = None cv2.destroyAllWindows() hand_wash_status = 0 if (restart_flag == False): key = cv2.waitKey(1) if key == 27: # ESC key: quit program break elif key == ord('H') or key == ord('h'): # Toggle help/fps show_fps = not show_fps elif key == ord('F') or key == ord('f'): # Toggle fullscreen full_scrn = not full_scrn set_full_screen(full_scrn) #client.loop_start() #client.loop_forever() client.reconnect()
def loop_and_detect(cam, tf_sess, conf_th, vis, od_type): """Loop, grab images from camera, and do object detection. # Arguments cam: the camera object (video source). tf_sess: TensorFlow/TensorRT session to run SSD object detection. conf_th: confidence/score threshold for object detection. vis: for visualization. """ show_fps = True full_scrn = False fps = 0.0 tic = time.time() feature_params = dict(maxCorners=1000, qualityLevel=0.1, minDistance=4, blockSize=7) lk_params = dict(winSize=(15, 15), maxLevel=3, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.02)) tracks = [] track_len = 8 frame_idx = 0 detect_interval = 10 global rects,ct,temp,args,optical_enable #restart issue frame_buff = 0 none_buff = 0 restart_flag = False #restart issue backup_label = None #restart issue while True: #if cv2.getWindowProperty(WINDOW_NAME, 0) < 0: # Check to see if the user has closed the display window. # If yes, terminate the while loop. # break if(restart_flag == True): cam = Camera(args) cam.open() cam.start() print("Camera is opened!") #pb_path = './data/{}_trt.pb'.format(args.model) #log_path = './logs/{}_trt'.format(args.model) #trt_graph = load_trt_pb(pb_path) #tf_config = tf.ConfigProto() #tf_config.gpu_options.allow_growth = True #tf_sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True),graph=trt_graph) #od_type = 'faster_rcnn' if 'faster_rcnn' in args.model else 'ssd' dummy_img = np.zeros((720, 1280, 3), dtype=np.uint8) _, _, _ = detect(dummy_img, tf_sess, conf_th=.3, od_type=od_type) print("Loading dummy image!") restart_flag = False rects = [] img = cam.read() if img is not None: optical_flow_image = img box, conf, cls = detect(img, tf_sess, conf_th, od_type=od_type) img = vis.draw_bboxes(img, box, conf, cls) #Optical Flow if (optical_enable==True): frame_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if len(tracks) > 0: img0 , img1 = prev_gray, frame_gray p0 = np.float32([tr[-1] for tr in tracks]).reshape(-1,1,2) p1, st, err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None, **lk_params) p0r, _, _ = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None, **lk_params) d = abs(p0-p0r).reshape(-1,2).max(-1) good = d < 1 new_tracks = [] for i, (tr, (x, y), flag) in enumerate(zip(tracks, p1.reshape(-1, 2), good)): if not flag: continue tr.append((x,y)) if len(tr)> track_len: del tr[0] new_tracks.append(tr) cv2.circle(img, (x, y), 2, (0, 255, 0), -1) tracks = new_tracks cv2.polylines(img, [np.int32(tr) for tr in tracks], False, (0, 255, 0), 1) for box_coord in box: y_min, x_min, y_max, x_max = box_coord[0], box_coord[1], box_coord[2], box_coord[3] for tr in tracks: tail = len(tr) start_point = tr[0] end_point = tr[tail-1] if((start_point[0]<=x_max)and(start_point[0]>=x_min))and((end_point[0]<=x_max)and(end_point[0]>=x_min)): if((start_point[1]<=y_max)and(start_point[1]>=y_min))and((end_point[1]<=y_max)and(end_point[1]>=y_min)): if(end_point[0]-start_point[0])>40: cv2.putText(img, "ENTER", (x_min+10,y_min+50),cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,153),2,cv2.LINE_AA) elif(start_point[0]-end_point[0])>40: cv2.putText(img, "LEAVE", (x_min+10,y_min+50),cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,153),2,cv2.LINE_AA) #elif(abs(start_point[0]-end_point[0])<10)and(abs(start_point[1]-end_point[1])<10): # cv2.putText(img, "IDLE", (x_min+10,y_min-20),cv2.FONT_HERSHEY_TRIPLEX,1,(102,255,178),2,cv2.LINE_AA) if frame_idx % detect_interval==0: mask = np.zeros_like(frame_gray) mask[:] = 255 if frame_idx !=0: for x,y in [np.int32(tr[-1]) for tr in tracks]: cv2.circle(mask, (x, y), 5, 0, -1) p = cv2.goodFeaturesToTrack(frame_gray, mask=mask, **feature_params) if p is not None: for x, y in np.float32(p).reshape(-1,2): tracks.append([(x, y)]) frame_idx+=1 prev_gray = frame_gray #Optical Flow done cv2.rectangle(img, (0,980),(1920,1075),(0,0,0),-1) objects = ct.update(rects) for (objectID, centroid) in objects.items(): # draw both the ID of the object and the centroid of the # object on the output frame text = "ID {}".format(objectID) cv2.putText(img, text, (centroid[0] - 10, centroid[1] - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,255), 2) cv2.putText(img, str(objectID), (330,1035),cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,255),2,cv2.LINE_AA) cv2.circle(img, (centroid[0], centroid[1]), 4, (255,0,255), -1) backup_label = str(objectID) if(optical_enable == True): cv2.putText(img, "ON", (1380,1035), cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,255),2,cv2.LINE_AA) else: cv2.putText(img, "OFF", (1380,1035), cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,255),2,cv2.LINE_AA) sys_clock = str(datetime.datetime.now()) cv2.putText(img, backup_label, (330,1035),cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,255),2,cv2.LINE_AA) cv2.putText(img, sys_clock, (20,950), cv2.FONT_HERSHEY_TRIPLEX,1,(0,0,255),2,cv2.LINE_AA) cv2.putText(img, "Traffic Counter: ", (20,1035), cv2.FONT_HERSHEY_TRIPLEX,1,(0,0,255),2,cv2.LINE_AA) cv2.putText(img, "Detector Type: Human", (400,1035), cv2.FONT_HERSHEY_TRIPLEX,1,(0,0,255),2,cv2.LINE_AA) cv2.putText(img, "Real Time Optical Trace :", (900,1035), cv2.FONT_HERSHEY_TRIPLEX,1,(0,0,255),2,cv2.LINE_AA) #print(sys_clock) if(restart_flag == False): if show_fps: img = draw_help_and_fps(img, fps) cv2.moveWindow(WINDOW_NAME,0,0) #restart issue cv2.imshow(WINDOW_NAME, img) toc = time.time() curr_fps = 1.0 / (toc - tic) # calculate an exponentially decaying average of fps number fps = curr_fps if fps == 0.0 else (fps*0.9 + curr_fps*0.1) tic = toc else: print("None Image --> None Buff = {}".format(none_buff)) none_buff+=1 if(none_buff == 1000): print("[SYSTEM] VSTARCAMERA Restart") cam.stop() # terminate the sub-thread in camera #tf_sess.close() #tf.reset_default_graph() #tf.contrib.keras.backend.clear_session() cam.release() restart_flag = True none_buff = 0 #img = None cv2.destroyAllWindows() if(restart_flag== False): key = cv2.waitKey(1) if key == 27: # ESC key: quit program break elif key == ord('H') or key == ord('h'): # Toggle help/fps show_fps = not show_fps elif key == ord('F') or key == ord('f'): # Toggle fullscreen full_scrn = not full_scrn set_full_screen(full_scrn) elif key == ord ('P') or key == ord('p'): if(optical_enable == True): optical_enable = False else: optical_enable = True
class MainController(object): _IMAGE_WIDTH = 1200 _HEX_FILE = "config/hexagons.npy" _CONFIG_FILE = "config/config.json" _BUTTON_PIN = 17 def __init__(self): self._camera_hex_config = CVConfig.load_json("config/camera_hex.json") self._camera_nums_config = CVConfig.load_json("config/camera_nums.json") self._bt_server = BluetoothServer() self._debugger = Debugger(self._bt_server) self._gpio = GPIOController() self._card_dealer = None return def _prepare_config(self, reset=False): hex_config = self._HEX_FILE camera_config = "config/camera.json" cv_config = self._CONFIG_FILE config = CVConfig(cv_config, reset) config.load_cv_config(cv_config) config.load_cam_config("config/camera.json") config.load_hex_config(hex_config) return config def _get_image(self, config=None): if self._camera is None: print "Camera unintialized" img = self._camera.capture(config) return imutils.resize(img, width=self._IMAGE_WIDTH) # Called to detect and save hexagons def _handle_hexagon_init(self, reset=True, debug=False): img = self._get_image(self._camera_hex_config) if reset: self._config.set_hexagons(None) initial = time.time() hexes = self._game.init_game(img) if reset: self._game.save_hexagons(self._HEX_FILE) if debug: print "Hexagons detected, moving on to resources, time: ", time.time() - initial Debugger.show_hexagons(img, hexes, 250) # Called to detect resources and numbers def _handle_resource_init(self, debug=False): num_img = self._get_image(self._camera_nums_config) res_img = self._get_image() initial = time.time() tiles = self._game.new_game(res_img, num_img) if debug: print "Resources/numbers detected, moving on to pieces, time: ", time.time() - initial Debugger.show_resources(num_img, tiles, 250) self._debugger.log("Resource/number detection finished.", "RESOURCES") self._debugger.log_tiles(tiles) def _hardcode_numbers(self): img = self._get_image() hexagons = self._game._board_detector._hexagons mask = np.zeros(img.shape) for h in hexagons: cv2.drawContours(mask, [c], -1, (255, 255, 255), 2) GUIUtils.update_image(mask) cv2.waitKey(250) num = int(raw_input("Number? ")) h._number = num mask.fill(0) self._debugger.log_tiles(hexagons) # Called to detect new properties and deal cards based on roll def _handle_dice_roll(self, num, debug=False): img = self._get_image() initial = time.time() (detected, instructions) = self._game.dice_rolled(num, img) if debug: print "Pieces detected, exiting..., time: ", time.time() - initial Debugger.show_properties(img, detected, 250) self._debugger.log("Finished processing dice roll.", "DICE") self._debugger.log_pieces(detected) self._debugger.log_instructions(instructions) if self._card_dealer is not None: self._card_dealer.process_round(instructions) def _listen_for_dice(self, sock, debug=False): while True: num = self._bt_server.receive(sock) if num == '\n': break self._gpio.led_off() self._debugger.log("Dice roll received: " + num, "DICE") self._handle_dice_roll(int(num), debug) self._gpio.led_on() self._bt_server.close(sock) self._bt_server.close_server() def start_auto(self, visual_debug=False): self._gpio.init_button(self._BUTTON_PIN) # Wait for button PRESS to continue, or HOLD to exit self._gpio.led_on() if self._gpio.wait_for_press_or_hold(self._BUTTON_PIN) == 'HOLD': self._gpio.led_restore() return self._gpio.led_off() try: self._card_dealer = CardDealer() self._config = self._prepare_config() self._camera = Camera(self._config) self._camera.start() self._game = CatanomousGame(self._config) self._bt_server.start() self._gpio.led_on() # LED - ON = waiting for something, OFF = processing something # PRESS to connect debugger, HOLD to skip if self._gpio.wait_for_press_or_hold(self._BUTTON_PIN) == 'PRESS': self._gpio.led_off() self._debugger.accept() self._gpio.led_on() self._debugger.log("Connected to bluetooth debugger.", "CONNECT") else: self._debugger.log("No debugger chosen.", "CONNECT") self._gpio.led_blink(3) time.sleep(1.5) try: # Wait for dice detector to connect self._gpio.led_off() self._debugger.log("Waiting for dicebox to connect...", "CONNECT") dice_sock = self._bt_server.accept() self._gpio.led_on() self._debugger.log("Dice box connected.", "CONNECT") # Wait for HOLD to indicate reset hexagons, PRESS means load saved self._debugger.log("HOLD to reset hexes, PRESS to load.", "INPUT") reset_hexagons = self._gpio.wait_for_press_or_hold(self._BUTTON_PIN) == 'HOLD' self._debugger.log("Reset hexagons: " + str(reset_hexagons), "HEXAGONS") self._gpio.led_off() self._handle_hexagon_init(reset_hexagons, debug=visual_debug) self._gpio.led_on() self._debugger.log("Hexagons detected.", "HEXAGONS") # PRESS to initialize resources and numbers self._debugger.log("PRESS after setting up resources/numbers", "INPUT") self._gpio.wait_for_press(self._BUTTON_PIN) self._gpio.led_off() self._debugger.log("Starting resource/number detection.", "RESOURCES") self._handle_resource_init(debug=visual_debug) self._gpio.led_on() # Wait for signals from dice detector self._debugger.log("Waiting for dice rolls...", "INPUT") self._listen_for_dice(dice_sock, debug=visual_debug) except Exception as e: # Send to debugger and reraise to blink LED self._debugger.log(str(e), 'ERROR') raise e except Exception as e: # BLink to indicate an error occured import subprocess subprocess.call('sudo sh -c "echo ' + str(e) + ' > /home/pi/logs/pylog.txt"', shell=True) while True: self._gpio.led_on() time.sleep(1) self._gpio.led_off() time.sleep(1) return def start(self): self._config = self._prepare_config() self._camera = Camera(self._config) self._camera.start() self._game = CatanomousGame(self._config) while (True): print '1 to init hexagons, 2 for resources/numbers, 3 for pieces, 4 to use bluetooth, 5 to fix numbers' token = raw_input("Input: ") if token == '1': reset = raw_input("Reset?") == 'Y' self._handle_hexagon_init(reset, debug=True) elif token == '2': self._handle_resource_init(debug=True) elif token == '3': num = raw_input("Num? ") self._handle_dice_roll(int(num), debug=True) elif token == '5': self._hardcode_numbers() elif token == '4': self._bt_server.start() sock = self._bt_server.accept() self._listen_for_dice(sock, debug=True) elif token == 'X': break return def start_test(self, reset_hexes=False, skip_resources=False, dont_reset=False): self._config = self._prepare_config(not dont_reset) self._camera = Camera(self._config) self._camera.start() self._game = CatanomousGame(self._config) self._handle_hexagon_init(reset_hexes, debug=True) self._config.save_cv_config(self._CONFIG_FILE) if not skip_resources: self._handle_resource_init(debug=True) self._config.save_cv_config(self._CONFIG_FILE) self._handle_dice_roll(1, debug=True) self._config.save_cv_config(self._CONFIG_FILE)