Created
September 17, 2020 12:18
-
-
Save pythonlessons/2ca8e2f27ba8664688fe5d3b422bbd33 to your computer and use it in GitHub Desktop.
Multiprocessing_video
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def Predict_bbox_mp(Frames_data, Predicted_data, Processing_times): | |
| gpus = tf.config.experimental.list_physical_devices('GPU') | |
| if len(gpus) > 0: | |
| try: tf.config.experimental.set_memory_growth(gpus[0], True) | |
| except RuntimeError: print("RuntimeError in tf.config.experimental.list_physical_devices('GPU')") | |
| Yolo = Load_Yolo_model() | |
| times = [] | |
| while True: | |
| if Frames_data.qsize()>0: | |
| image_data = Frames_data.get() | |
| t1 = time.time() | |
| Processing_times.put(time.time()) | |
| if YOLO_FRAMEWORK == "tf": | |
| pred_bbox = Yolo.predict(image_data) | |
| elif YOLO_FRAMEWORK == "trt": | |
| batched_input = tf.constant(image_data) | |
| result = Yolo(batched_input) | |
| pred_bbox = [] | |
| for key, value in result.items(): | |
| value = value.numpy() | |
| pred_bbox.append(value) | |
| pred_bbox = [tf.reshape(x, (-1, tf.shape(x)[-1])) for x in pred_bbox] | |
| pred_bbox = tf.concat(pred_bbox, axis=0) | |
| Predicted_data.put(pred_bbox) | |
| def postprocess_mp(Predicted_data, original_frames, Processed_frames, Processing_times, input_size, CLASSES, score_threshold, iou_threshold, rectangle_colors, realtime): | |
| times = [] | |
| while True: | |
| if Predicted_data.qsize()>0: | |
| pred_bbox = Predicted_data.get() | |
| if realtime: | |
| while original_frames.qsize() > 1: | |
| original_image = original_frames.get() | |
| else: | |
| original_image = original_frames.get() | |
| bboxes = postprocess_boxes(pred_bbox, original_image, input_size, score_threshold) | |
| bboxes = nms(bboxes, iou_threshold, method='nms') | |
| image = draw_bbox(original_image, bboxes, CLASSES=CLASSES, rectangle_colors=rectangle_colors) | |
| times.append(time.time()-Processing_times.get()) | |
| times = times[-20:] | |
| ms = sum(times)/len(times)*1000 | |
| fps = 1000 / ms | |
| image = cv2.putText(image, "Time: {:.1f}FPS".format(fps), (0, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 2) | |
| #print("Time: {:.2f}ms, Final FPS: {:.1f}".format(ms, fps)) | |
| Processed_frames.put(image) | |
| def Show_Image_mp(Processed_frames, show, Final_frames): | |
| while True: | |
| if Processed_frames.qsize()>0: | |
| image = Processed_frames.get() | |
| Final_frames.put(image) | |
| if show: | |
| cv2.imshow('output', image) | |
| if cv2.waitKey(25) & 0xFF == ord("q"): | |
| cv2.destroyAllWindows() | |
| break | |
| def detect_video_realtime_mp(video_path, output_path, input_size=416, show=False, CLASSES=YOLO_COCO_CLASSES, score_threshold=0.3, iou_threshold=0.45, rectangle_colors='', realtime=False): | |
| if realtime: | |
| vid = cv2.VideoCapture(0) | |
| else: | |
| vid = cv2.VideoCapture(video_path) | |
| # by default VideoCapture returns float instead of int | |
| width = int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
| height = int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
| fps = int(vid.get(cv2.CAP_PROP_FPS)) | |
| codec = cv2.VideoWriter_fourcc(*'XVID') | |
| out = cv2.VideoWriter(output_path, codec, fps, (width, height)) # output_path must be .mp4 | |
| no_of_frames = int(vid.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| original_frames = Queue() | |
| Frames_data = Queue() | |
| Predicted_data = Queue() | |
| Processed_frames = Queue() | |
| Processing_times = Queue() | |
| Final_frames = Queue() | |
| p1 = Process(target=Predict_bbox_mp, args=(Frames_data, Predicted_data, Processing_times)) | |
| p2 = Process(target=postprocess_mp, args=(Predicted_data, original_frames, Processed_frames, Processing_times, input_size, CLASSES, score_threshold, iou_threshold, rectangle_colors, realtime)) | |
| p3 = Process(target=Show_Image_mp, args=(Processed_frames, show, Final_frames)) | |
| p1.start() | |
| p2.start() | |
| p3.start() | |
| while True: | |
| ret, img = vid.read() | |
| if not ret: | |
| break | |
| original_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) | |
| original_frames.put(original_image) | |
| image_data = image_preprocess(np.copy(original_image), [input_size, input_size]) | |
| image_data = image_data[np.newaxis, ...].astype(np.float32) | |
| Frames_data.put(image_data) | |
| while True: | |
| if original_frames.qsize() == 0 and Frames_data.qsize() == 0 and Predicted_data.qsize() == 0 and Processed_frames.qsize() == 0 and Processing_times.qsize() == 0 and Final_frames.qsize() == 0: | |
| p1.terminate() | |
| p2.terminate() | |
| p3.terminate() | |
| break | |
| elif Final_frames.qsize()>0: | |
| image = Final_frames.get() | |
| if output_path != '': out.write(image) | |
| cv2.destroyAllWindows() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment