def process_live_feed(self, cv_image, objects, distancings, violating_objects, out, out_birdseye): dist_threshold = float(self.config.get_section_dict("PostProcessor")["DistThreshold"]) birds_eye_window = np.zeros(self.birds_eye_resolution[::-1] + (3,), dtype="uint8") class_id = int(self.config.get_section_dict('Detector')['ClassID']) output_dict = visualization_utils.visualization_preparation(objects, distancings, dist_threshold) category_index = {class_id: { "id": class_id, "name": "Pedestrian", }} # TODO: json file for detector config face_index = { 0: "YES", 1: "NO", -1: "N/A", } # Draw bounding boxes and other visualization factors on input_frame visualization_utils.visualize_boxes_and_labels_on_image_array( cv_image, output_dict["detection_boxes"], output_dict["detection_classes"], output_dict["detection_scores"], output_dict["detection_colors"], category_index, instance_masks=output_dict.get("detection_masks"), use_normalized_coordinates=True, line_thickness=3, face_labels=output_dict["face_labels"], face_index=face_index ) # TODO: Implement perspective view for objects birds_eye_window = visualization_utils.birds_eye_view( birds_eye_window, output_dict["detection_boxes"], output_dict["violating_objects"]) try: fps = self.detector.fps except: # fps is not implemented for the detector instance" fps = None # Put fps to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- txt_fps = 'Frames rate = ' + str(fps) + '(fps)' # Frames rate = 95 (fps) # (0, 0) is the top-left (x,y); normalized number between 0-1 origin = (0.05, 0.93) visualization_utils.text_putter(cv_image, txt_fps, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # Put environment score to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- env_score = mx_environment_scoring_consider_crowd(len(objects), len(violating_objects)) txt_env_score = 'Env Score = ' + str(env_score) # Env Score = 0.7 origin = (0.05, 0.98) visualization_utils.text_putter(cv_image, txt_env_score, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion out.write(cv_image) out_birdseye.write(birds_eye_window)
def update(self, input_frame, nn_out): """ Args: input_frame: uint8 numpy array with shape (img_height, img_width, 3) nn_out: List of dicionary contains normalized numbers of bounding boxes {'id' : '0-0', 'bbox' : [x0, y0, x1, y1], 'score' : 0.99(optional} of shape [N, 3] or [N, 2] Returns: draw the bounding boxes to an output frame """ # Get a proper dictionary of bounding boxes and colors for visualizing_boxes_and_labels_on_image_array function output_dict = vis_util.visualization_preparation(nn_out) # TODO #print(output_dict) category_index = { 0: { "id": 0, "name": "Mask", }, 1: { "id": 1, "name": "Face", }} # Draw bounding boxes and other visualization factors on input_frame vis_util.visualize_boxes_and_labels_on_image_array( input_frame, output_dict["detection_boxes"], output_dict["detection_classes"], output_dict["detection_scores"], output_dict["detection_colors"], category_index, instance_masks=output_dict.get("detection_masks"), use_normalized_coordinates=True, line_thickness=3, ) # TODO: Implement perspective view for objects try: self._displayed_items['fps'] = self.__ENGINE_INSTANCE.detector.fps except: # fps is not implemented for the detector instance" self._displayed_items['fps'] = None # Put fps to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- txt_fps = 'Frames rate = ' + str(self._displayed_items['fps']) + '(fps)' # Frames rate = 95 (fps) # (0, 0) is the top-left (x,y); normalized number between 0-1 origin = (0.05, 0.93) vis_util.text_putter(input_frame, txt_fps, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # Lock the main thread and copy input_frame to output_frame with self._lock: self._output_frame = input_frame.copy()
def update(self, cv_image, objects, post_processing_data, fps, log_time): if not self.live_feed_enabled: return self.update_history(post_processing_data["tracks"]) distancings = post_processing_data.get("distances", []) dist_threshold = post_processing_data.get("dist_threshold", 0) birds_eye_window = np.zeros(self.birds_eye_resolution[::-1] + (3, ), dtype="uint8") class_id = int( get_model_json_file_or_return_default_values( self.config, self.config.get_section_dict('Detector')['Device'], self.camera_id)["variables"]["ClassID"]) roi_contour = ObjectsFilteringPostProcessor.get_roi_contour( self.roi_file_path) if roi_contour is not None: color = (41, 127, 255) # #ff7f29 (255, 127, 41) visualization_utils.draw_contour(cv_image, roi_contour, color) output_dict = visualization_utils.visualization_preparation( objects, distancings, dist_threshold) category_index = { class_id: { "id": class_id, "name": "Pedestrian", } } # TODO: json file for detector config face_index = { 0: "YES", 1: "NO", -1: "N/A", } # Assign object's color to corresponding track history for i, track_id in enumerate(output_dict["track_ids"]): self.track_hist[track_id][1].append( output_dict["detection_colors"][i]) # Draw bounding boxes and other visualization factors on input_frame visualization_utils.visualize_boxes_and_labels_on_image_array( cv_image, output_dict["detection_boxes"], output_dict["detection_classes"], output_dict["detection_scores"], output_dict["detection_colors"], output_dict["track_ids"], category_index, instance_masks=output_dict.get("detection_masks"), use_normalized_coordinates=True, line_thickness=3, face_labels=output_dict["face_labels"], face_index=face_index) # TODO: Implement perspective view for objects birds_eye_window = visualization_utils.birds_eye_view( birds_eye_window, output_dict["detection_boxes"], output_dict["violating_objects"]) # Put occupancy to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- txt_fps = 'Occupancy = ' + str(len(objects)) # (0, 0) is the top-left (x,y); normalized number between 0-1 origin = (0.05, 0.93) visualization_utils.text_putter(cv_image, txt_fps, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # visualize tracks # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- visualization_utils.draw_tracks(cv_image, self.track_hist, radius=1, thickness=1) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion self.out.write(cv_image) self.out_birdseye.write(birds_eye_window)
def update(self, cv_image, objects, post_processing_data, fps): if not self.live_feed_enabled: return self.update_history(post_processing_data["tracks"]) distancings = post_processing_data.get("distances", []) violating_objects = post_processing_data.get("violating_objects", []) dist_threshold = post_processing_data.get("dist_threshold", 0) birds_eye_window = np.zeros(self.birds_eye_resolution[::-1] + (3,), dtype="uint8") class_id = int(self.config.get_section_dict('Detector')['ClassID']) output_dict = visualization_utils.visualization_preparation(objects, distancings, dist_threshold) category_index = {class_id: { "id": class_id, "name": "Pedestrian", }} # TODO: json file for detector config face_index = { 0: "YES", 1: "NO", -1: "N/A", } # Assign object's color to corresponding track history for i, track_id in enumerate(output_dict["track_ids"]): self.track_hist[track_id][1].append(output_dict["detection_colors"][i]) # Draw bounding boxes and other visualization factors on input_frame visualization_utils.visualize_boxes_and_labels_on_image_array( cv_image, output_dict["detection_boxes"], output_dict["detection_classes"], output_dict["detection_scores"], output_dict["detection_colors"], output_dict["track_ids"], category_index, instance_masks=output_dict.get("detection_masks"), use_normalized_coordinates=True, line_thickness=3, face_labels=output_dict["face_labels"], face_index=face_index ) # TODO: Implement perspective view for objects birds_eye_window = visualization_utils.birds_eye_view( birds_eye_window, output_dict["detection_boxes"], output_dict["violating_objects"]) # Put fps to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- txt_fps = 'Frames rate = ' + str(fps) + '(fps)' # Frames rate = 95 (fps) # (0, 0) is the top-left (x,y); normalized number between 0-1 origin = (0.05, 0.93) visualization_utils.text_putter(cv_image, txt_fps, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # Put environment score to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- env_score = mx_environment_scoring_consider_crowd(len(objects), len(violating_objects)) txt_env_score = 'Env Score = ' + str(env_score) # Env Score = 0.7 origin = (0.05, 0.98) visualization_utils.text_putter(cv_image, txt_env_score, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # visualize tracks # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- visualization_utils.draw_tracks(cv_image, self.track_hist, radius=1, thickness=1) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion self.out.write(cv_image) self.out_birdseye.write(birds_eye_window)
def process_video(self, video_uri): if self.device == 'Jetson': from libs.detectors.jetson.detector import Detector self.detector = Detector(self.config) elif self.device == 'EdgeTPU': from libs.detectors.edgetpu.detector import Detector self.detector = Detector(self.config) elif self.device == 'Dummy': from libs.detectors.dummy.detector import Detector self.detector = Detector(self.config) elif self.device == 'x86': from libs.detectors.x86.detector import Detector self.detector = Detector(self.config) if self.device != 'Dummy': print('Device is: ', self.device) print('Detector is: ', self.detector.name) print('image size: ', self.image_size) input_cap = cv.VideoCapture(video_uri) fps = input_cap.get(cv.CAP_PROP_FPS) if (input_cap.isOpened()): logger.info(f'opened video {video_uri}') else: logger.error(f'failed to load video {video_uri}') return self.running_video = True # enable logging gstreamer Errors (https://stackoverflow.com/questions/3298934/how-do-i-view-gstreamer-debug-output) os.environ['GST_DEBUG'] = "*:1" out, out_birdseye = ( self.gstreamer_writer(feed, fps, resolution) for (feed, resolution) in (('default', self.resolution), ( 'default-birdseye', self.birds_eye_resolution)) # TODO: use camera-id ) dist_threshold = float( self.config.get_section_dict("PostProcessor")["DistThreshold"]) class_id = int(self.config.get_section_dict('Detector')['ClassID']) frame_num = 0 while input_cap.isOpened() and self.running_video: _, cv_image = input_cap.read() birds_eye_window = np.zeros(self.birds_eye_resolution[::-1] + (3, ), dtype="uint8") if np.shape(cv_image) != (): cv_image, objects, distancings = self.__process(cv_image) output_dict = visualization_utils.visualization_preparation( objects, distancings, dist_threshold) category_index = { class_id: { "id": class_id, "name": "Pedestrian", } } # TODO: json file for detector config # Draw bounding boxes and other visualization factors on input_frame visualization_utils.visualize_boxes_and_labels_on_image_array( cv_image, output_dict["detection_boxes"], output_dict["detection_classes"], output_dict["detection_scores"], output_dict["detection_colors"], category_index, instance_masks=output_dict.get("detection_masks"), use_normalized_coordinates=True, line_thickness=3, ) # TODO: Implement perspective view for objects birds_eye_window = visualization_utils.birds_eye_view( birds_eye_window, output_dict["detection_boxes"], output_dict["violating_objects"]) try: fps = self.detector.fps except: # fps is not implemented for the detector instance" fps = None # Put fps to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- txt_fps = 'Frames rate = ' + str( fps) + '(fps)' # Frames rate = 95 (fps) # (0, 0) is the top-left (x,y); normalized number between 0-1 origin = (0.05, 0.93) visualization_utils.text_putter(cv_image, txt_fps, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion # Put environment score to the frame # region # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- violating_objects = extract_violating_objects( distancings, dist_threshold) env_score = mx_environment_scoring_consider_crowd( len(objects), len(violating_objects)) txt_env_score = 'Env Score = ' + str( env_score) # Env Score = 0.7 origin = (0.05, 0.98) visualization_utils.text_putter(cv_image, txt_env_score, origin) # -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- -_- # endregion out.write(cv_image) out_birdseye.write(birds_eye_window) frame_num += 1 if frame_num % 10 == 1: logger.info(f'processed frame {frame_num} for {video_uri}') else: continue self.logger.update(objects, distancings) input_cap.release() out.release() out_birdseye.release() del self.detector self.running_video = False