def postProcess(result_list, width, height, labels_map, out_path, is_async_mode, ren_progress_file_path=None): post_process_t = time.time() vw = cv2.VideoWriter(out_path, 0x00000021, 30.0, (width, height), True) for i in range(len(result_list)): frame,res = result_list[i] if len(res) > 0: placeBoxes(res, labels_map, frame, is_async_mode) vw.write(frame) if not ren_progress_file_path is None: progressUpdate(ren_progress_file_path, time.time()-post_process_t, i+1, len(result_list)) vw.release()
indicies_validation = [40, 63, 43, 55, 99, 101, 19, 46] #[40] val_id = 1 infer_time = 0 process_time_start = time.time() progress_file_path = os.path.join(png_directory, "i_progress.txt") for idx in indicies_validation: input_data_transposed = input_data[idx:(idx + batch_size)].transpose( 0, 3, 1, 2) start_time = time.time() res = exec_net.infer( inputs={input_blob: input_data_transposed[:, :n_channels]}) # Save the predictions to array predictions = res[out_blob] time_elapsed = time.time() - start_time infer_time += time_elapsed plotDiceScore(idx, input_data_transposed, label_data[[idx]].transpose(0, 3, 1, 2), predictions, True, round(time_elapsed * 1000)) progressUpdate(progress_file_path, time.time() - process_time_start, val_id, len(indicies_validation)) val_id += 1 total_time = time.time() - process_time_start with open(os.path.join(png_directory, 'stats.txt'), 'w') as f: f.write(str(round(infer_time, 4)) + '\n') f.write(str(val_id) + '\n') f.write("Frames processed per second = {}".format( round(val_id / infer_time)))
def main(): log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.INFO, stream=sys.stdout) args = build_argparser().parse_args() model_xml = args.model model_bin = os.path.splitext(model_xml)[0] + ".bin" # Plugin initialization for specified device and load extensions library if specified log.info("Initializing plugin for {} device...".format(args.device)) plugin = IEPlugin(device=args.device, plugin_dirs=args.plugin_dir) if args.cpu_extension and 'CPU' in args.device: log.info("Loading plugins for {} device...".format(args.device)) plugin.add_cpu_extension(args.cpu_extension) # Read IR log.info("Reading IR...") net = IENetwork(model=model_xml, weights=model_bin) if plugin.device == "CPU": supported_layers = plugin.get_supported_layers(net) not_supported_layers = [ l for l in net.layers.keys() if l not in supported_layers ] if len(not_supported_layers) != 0: log.error( "Following layers are not supported by the plugin for specified device {}:\n {}" .format(plugin.device, ', '.join(not_supported_layers))) log.error( "Please try to specify cpu extensions library path in sample's command line parameters using -l " "or --cpu_extension command line argument") sys.exit(1) assert len( net.inputs.keys()) == 1, "Sample supports only single input topologies" assert len( net.outputs) == 1, "Sample supports only single output topologies" input_blob = next(iter(net.inputs)) out_blob = next(iter(net.outputs)) if args.input == 'cam': input_stream = 0 out_file_name = 'cam' else: input_stream = args.input assert os.path.isfile(args.input), "Specified input file doesn't exist" log.info("Loading IR to the plugin...") exec_net = plugin.load(network=net, num_requests=args.number_infer_requests) log.info( "Starting inference in async mode, {} requests in parallel...".format( args.number_infer_requests)) job_id = str(os.environ['PBS_JOBID']) result_file = open( os.path.join(args.output_dir, 'output_' + job_id + '.txt'), "w") pre_infer_file = os.path.join(args.output_dir, 'pre_progress_' + job_id + '.txt') infer_file = os.path.join(args.output_dir, 'i_progress_' + job_id + '.txt') processed_vid = '/tmp/processed_vid.bin' # Read and pre-process input image if isinstance(net.inputs[input_blob], list): n, c, h, w = net.inputs[input_blob] else: n, c, h, w = net.inputs[input_blob].shape del net cap = cv2.VideoCapture(input_stream) video_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) if video_len < args.number_infer_requests: args.number_infer_requests = video_len #Pre inference processing, read mp4 frame by frame, process using openCV and write to binary file width = int(cap.get(3)) height = int(cap.get(4)) CHUNKSIZE = n * c * w * h id_ = 0 with open(processed_vid, 'w+b') as f: time_start = time.time() while cap.isOpened(): ret, next_frame = cap.read() if not ret: break in_frame = cv2.resize(next_frame, (w, h)) in_frame = in_frame.transpose( (2, 0, 1)) # Change data layout from HWC to CHW in_frame = in_frame.reshape((n, c, h, w)) bin_frame = bytearray(in_frame) f.write(bin_frame) id_ += 1 if id_ % 10 == 0: progressUpdate(pre_infer_file, time.time() - time_start, id_, video_len) cap.release() if args.labels: with open(args.labels, 'r') as f: labels_map = [x.strip() for x in f] else: labels_map = None log.info("Starting inference in async mode...") log.info("To switch between sync and async modes press Tab button") log.info("To stop the sample execution press Esc button") current_inference = 0 previous_inference = 1 - args.number_infer_requests infer_requests = exec_net.requests frame_count = 0 try: infer_time_start = time.time() with open(processed_vid, "rb") as data: while frame_count < video_len: # Read next frame from input stream if available and submit it for inference byte = data.read(CHUNKSIZE) if not byte == b"": deserialized_bytes = np.frombuffer(byte, dtype=np.uint8) in_frame = np.reshape(deserialized_bytes, newshape=(n, c, h, w)) exec_net.start_async(request_id=current_inference, inputs={input_blob: in_frame}) # Retrieve the output of an earlier inference request if previous_inference >= 0: status = infer_requests[previous_inference].wait() if status is not 0: raise Exception( "Infer request not completed successfully") # Parse inference results res = infer_requests[previous_inference].outputs[out_blob] processBoxes(frame_count, res, labels_map, args.prob_threshold, width, height, result_file) frame_count += 1 # Write data to progress tracker if frame_count % 10 == 0: progressUpdate(infer_file, time.time() - infer_time_start, frame_count + 1, video_len + 1) # Increment counter for the inference queue and roll them over if necessary current_inference += 1 if current_inference >= args.number_infer_requests: current_inference = 0 previous_inference += 1 if previous_inference >= args.number_infer_requests: previous_inference = 0 # End while loop total_time = time.time() - infer_time_start with open(os.path.join(args.output_dir, 'stats_{}.txt'.format(job_id)), 'w') as f: f.write('{:.3g} \n'.format(total_time)) f.write('{} \n'.format(frame_count)) result_file.close() finally: log.info("Processing done...") del exec_net del plugin
def main(): log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.INFO, stream=sys.stdout) args = build_argparser().parse_args() model_xml = args.model model_bin = os.path.splitext(model_xml)[0] + ".bin" # Plugin initialization for specified device and load extensions library if specified log.info("Initializing plugin for {} device...".format(args.device)) ie = IECore() #plugin = IEPlugin(device=args.device, plugin_dirs=args.plugin_dir) if args.cpu_extension and 'CPU' in args.device: log.info("Loading plugins for {} device...".format(args.device)) ie.add_extension(args.cpu_extension, "CPU") # log.info("Loading plugins for {} device...".format(args.device)) # plugin.add_cpu_extension(args.cpu_extension) # Read IR log.info("Reading IR...") net = IENetwork(model=model_xml, weights=model_bin) if args.device == "CPU": #supported_layers = plugin.get_supported_layers(net) supported_layers = ie.query_network(net, "CPU") not_supported_layers = [ l for l in net.layers.keys() if l not in supported_layers ] if len(not_supported_layers) != 0: log.error( "Following layers are not supported by the plugin for specified device {}:\n {}" .format(ie.device, ', '.join(not_supported_layers))) log.error( "Please try to specify cpu extensions library path in sample's command line parameters using -l " "or --cpu_extension command line argument") sys.exit(1) assert len( net.inputs.keys()) == 1, "Sample supports only single input topologies" assert len( net.outputs) == 1, "Sample supports only single output topologies" input_blob = next(iter(net.inputs)) out_blob = next(iter(net.outputs)) log.info("Loading IR to the plugin...") #exec_net = plugin.load(network=net, num_requests=2) ## Removed spaces ################ exec_net = ie.load_network(network=net, num_requests=2, device_name=args.device) # Read and pre-process input image if isinstance(net.inputs[input_blob], list): n, c, h, w = net.inputs[input_blob] else: n, c, h, w = net.inputs[input_blob].shape del net out_file_name = os.path.splitext(os.path.basename(args.input))[0] if args.output_dir: out_path = os.path.join(args.output_dir, out_file_name + '.mp4') if args.labels: with open(args.labels, 'r') as f: labels_map = [x.strip() for x in f] else: labels_map = None cur_request_id = 0 next_request_id = 1 job_id = os.environ['PBS_JOBID'] #job_id = "12345" inf_progress_file_path = os.path.join(args.output_dir, 'i_progress_' + str(job_id) + '.txt') ren_progress_file_path = os.path.join(args.output_dir, 'v_progress_' + str(job_id) + '.txt') is_async_mode = True fps_sum = 0 frame_count = 0 read_time = 0 result_list = [] try: # Set up the capture stream input_stream = args.input cap = cv2.VideoCapture(input_stream) if cap.isOpened(): video_len = args.count log.info("Live stream running at {} fps".format(cv2.CAP_PROP_FPS)) initial_w = cap.get(3) initial_h = cap.get(4) cap.set(cv2.CAP_PROP_BUFFERSIZE, 3) log.info("Starting inference in async mode...") infer_time_start = time.time() while frame_count < video_len: ret, frame = cap.read() if not ret: break in_frame = cv2.resize(frame, (w, h)) in_frame = in_frame.transpose( (2, 0, 1)) # Change data layout from HWC to CHW in_frame = in_frame.reshape((n, c, h, w)) # Main sync point: # in the truly Async mode we start the NEXT infer request, while waiting for the CURRENT to complete # in the regular mode we start the CURRENT request and immediately wait for it's completion inf_start = time.time() if is_async_mode: exec_net.start_async(request_id=next_request_id, inputs={input_blob: in_frame}) else: exec_net.start_async(request_id=cur_request_id, inputs={input_blob: in_frame}) read_time_0 = time.time() if exec_net.requests[cur_request_id].wait(-1) == 0: inf_end = time.time() det_time = inf_end - inf_start #Parse detection results of the current request res = exec_net.requests[cur_request_id].outputs[out_blob] processBoxes(frame_count, res, labels_map, args.prob_threshold, frame, result_list, det_time) read_time += time.time() - read_time_0 frame_count += 1 #Write data to progress tracker if frame_count % 10 == 0: progressUpdate(inf_progress_file_path, time.time() - infer_time_start, frame_count, video_len) key = cv2.waitKey(1) if key == 27: break if (9 == key): is_async_mode = not is_async_mode log.info("Switched to {} mode".format( "async" if is_async_mode else "sync")) if is_async_mode: cur_request_id, next_request_id = next_request_id, cur_request_id ##End while loop / cap.release() log.info("{} seconds were spent reading".format(read_time)) if args.output_dir is None: cv2.destroyAllWindows() else: total_time = time.time() - infer_time_start with open( os.path.join(args.output_dir, 'stats_' + str(job_id) + '.txt'), 'w') as f: f.write(str(round(total_time, 1)) + '\n') f.write(str(frame_count) + '\n') o_video = os.path.join(args.output_dir, 'output_' + str(job_id) + '.mp4') post_process_t = time.time() postProcess(result_list, int(initial_w), int(initial_h), labels_map, o_video, is_async_mode, ren_progress_file_path) log.info("Post processing time: {0} sec".format(time.time() - post_process_t)) finally: del exec_net del ie
def main(): log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.INFO, stream=sys.stdout) args = build_argparser().parse_args() model_xml = args.model model_bin = os.path.splitext(model_xml)[0] + ".bin" # Plugin initialization for specified device and load extensions library if specified log.info("Initializing plugin for {} device...".format(args.device)) plugin = IEPlugin(device=args.device, plugin_dirs=args.plugin_dir) if args.cpu_extension and 'CPU' in args.device: log.info("Loading plugins for {} device...".format(args.device)) plugin.add_cpu_extension(args.cpu_extension) # Read IR log.info("Reading IR...") net = IENetwork(model=model_xml, weights=model_bin) if plugin.device == "CPU": supported_layers = plugin.get_supported_layers(net) not_supported_layers = [ l for l in net.layers.keys() if l not in supported_layers ] if len(not_supported_layers) != 0: log.error( "Following layers are not supported by the plugin for specified device {}:\n {}" .format(plugin.device, ', '.join(not_supported_layers))) log.error( "Please try to specify cpu extensions library path in sample's command line parameters using -l " "or --cpu_extension command line argument") sys.exit(1) assert len( net.inputs.keys()) == 1, "Sample supports only single input topologies" assert len( net.outputs) == 1, "Sample supports only single output topologies" input_blob = next(iter(net.inputs)) out_blob = next(iter(net.outputs)) log.info("Loading IR to the plugin...") exec_net = plugin.load(network=net, num_requests=2) # Read and pre-process input image if isinstance(net.inputs[input_blob], list): n, c, h, w = net.inputs[input_blob] else: n, c, h, w = net.inputs[input_blob].shape del net if args.input == 'cam': input_stream = 0 out_file_name = 'cam' else: input_stream = args.input assert os.path.isfile(args.input), "Specified input file doesn't exist" out_file_name = os.path.splitext(os.path.basename(args.input))[0] if args.output_dir: out_path = os.path.join(args.output_dir, out_file_name + '.mp4') if args.labels: with open(args.labels, 'r') as f: labels_map = [x.strip() for x in f] else: labels_map = None cap = cv2.VideoCapture(input_stream) video_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) cur_request_id = 0 next_request_id = 1 log.info("Starting inference in async mode...") log.info("To switch between sync and async modes press Tab button") log.info("To stop the sample execution press Esc button") job_id = os.environ['PBS_JOBID'] result_file = open( os.path.join(args.output_dir, 'output_' + str(job_id) + '.txt'), "w") progress_file_path = os.path.join(args.output_dir, 'i_progress_' + str(job_id) + '.txt') is_async_mode = True render_time = 0 fps_sum = 0 frame_count = 0 inf_list = [] res_list = [] try: infer_time_start = time.time() while cap.isOpened(): read_time = time.time() ret, frame = cap.read() if not ret: break initial_w = cap.get(3) initial_h = cap.get(4) in_frame = cv2.resize(frame, (w, h)) in_frame = in_frame.transpose( (2, 0, 1)) # Change data layout from HWC to CHW in_frame = in_frame.reshape((n, c, h, w)) # Main sync point: # in the truly Async mode we start the NEXT infer request, while waiting for the CURRENT to complete # in the regular mode we start the CURRENT request and immediately wait for it's completion inf_start = time.time() if is_async_mode: exec_net.start_async(request_id=next_request_id, inputs={input_blob: in_frame}) else: exec_net.start_async(request_id=cur_request_id, inputs={input_blob: in_frame}) if exec_net.requests[cur_request_id].wait(-1) == 0: inf_end = time.time() det_time = inf_end - inf_start #Parse detection results of the current request res = exec_net.requests[cur_request_id].outputs[out_blob] processBoxes(frame_count, res, labels_map, args.prob_threshold, frame, initial_w, initial_h, result_file, det_time) # frame_count += 1 #Write data to progress tracker if frame_count % 10 == 0: progressUpdate(progress_file_path, time.time() - infer_time_start, frame_count, video_len) key = cv2.waitKey(1) if key == 27: break if (9 == key): is_async_mode = not is_async_mode log.info("Switched to {} mode".format( "async" if is_async_mode else "sync")) if is_async_mode: cur_request_id, next_request_id = next_request_id, cur_request_id ##End while loop / cap.release() result_file.close() if args.output_dir is None: cv2.destroyAllWindows() else: total_time = time.time() - infer_time_start with open( os.path.join(args.output_dir, 'stats_' + str(job_id) + '.txt'), 'w') as f: f.write(str(round(total_time, 1)) + '\n') f.write(str(frame_count) + '\n') finally: del exec_net del plugin
def main(): """ Load the network and parse the output. :return: None """ global INFO global DELAY global POSE_CHECKED controller = MouseController() log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.INFO, stream=sys.stdout) args = args_parser().parse_args() logger = log.getLogger() if args.input == 'cam': input_stream = 0 else: input_stream = args.input assert os.path.isfile(args.input), "Specified input file doesn't exist" cap = cv2.VideoCapture(input_stream) initial_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) initial_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) video_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) out = cv2.VideoWriter(os.path.join(args.output_dir, "shopper.mp4"), cv2.VideoWriter_fourcc(*"MP4V"), fps, (initial_width, initial_height), True) frame_count = 0 job_id = 1 progress_file_path = os.path.join(args.output_dir, 'i_progress_' + str(job_id) + '.txt') infer_time_start = time.time() if input_stream: cap.open(args.input) # Adjust DELAY to match the number of FPS of the video file DELAY = 1000 / cap.get(cv2.CAP_PROP_FPS) if not cap.isOpened(): logger.error("ERROR! Unable to open video source") return # Initialise the class if args.cpu_extension: facedet = FaceDetection(args.facemodel, args.confidence, extensions=args.cpu_extension) posest = HeadPoseEstimation(args.posemodel, args.confidence, extensions=args.cpu_extension) landest = FaceLandmarksDetection(args.landmarksmodel, args.confidence, extensions=args.cpu_extension) gazeest = GazeEstimation(args.gazemodel, args.confidence, extensions=args.cpu_extension) else: facedet = FaceDetection(args.facemodel, args.confidence) posest = HeadPoseEstimation(args.posemodel, args.confidence) landest = FaceLandmarksDetection(args.landmarksmodel, args.confidence) gazeest = GazeEstimation(args.gazemodel, args.confidence) # Load the network to IE plugin to get shape of input layer facedet.load_model() posest.load_model() landest.load_model() gazeest.load_model() print("loaded models") ret, frame = cap.read() while ret: looking = 0 POSE_CHECKED = False ret, frame = cap.read() frame_count += 1 if not ret: print("checkpoint *BREAKING") break if frame is None: log.error("checkpoint ERROR! blank FRAME grabbed") break initial_width = int(cap.get(3)) initial_height = int(cap.get(4)) # Start asynchronous inference for specified request inf_start_fd = time.time() # Results of the output layer of the network coords, frame = facedet.predict(frame) if args.visualization == "fm": cv2.startWindowThread() cv2.namedWindow("preview") cv2.imshow("preview", frame) det_time_fd = time.time() - inf_start_fd if len(coords) > 0: [xmin, ymin, xmax, ymax] = coords[0] # use only the first detected face head_pose = frame[ymin:ymax, xmin:xmax] inf_start_hp = time.time() is_looking, pose_angles = posest.predict(head_pose) if args.visualization == "pm": cv2.startWindowThread() cv2.namedWindow("preview") p = "Pose Angles {}, is Looking? {}".format( pose_angles, is_looking) cv2.putText(frame, p, (50, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255), 1) cv2.imshow("preview", frame) if is_looking: det_time_hp = time.time() - inf_start_hp POSE_CHECKED = True print(is_looking) inf_start_lm = time.time() coords, f = landest.predict(head_pose) if args.visualization == "lm": cv2.startWindowThread() cv2.namedWindow("preview") cv2.imshow("preview", f) frame[ymin:ymax, xmin:xmax] = f det_time_lm = time.time() - inf_start_lm [[xlmin, ylmin, xlmax, ylmax], [xrmin, yrmin, xrmax, yrmax]] = coords left_eye_image = f[ylmin:ylmax, xlmin:xlmax] right_eye_image = f[yrmin:yrmax, xrmin:xrmax] output, gaze_vector = gazeest.predict(left_eye_image, right_eye_image, pose_angles) if args.visualization == "gm": cv2.startWindowThread() cv2.namedWindow("preview") p = "Gaze Vector {}".format(gaze_vector) cv2.putText(frame, p, (50, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255), 1) fl = draw_gaze(left_eye_image, gaze_vector) fr = draw_gaze(right_eye_image, gaze_vector) f[ylmin:ylmax, xlmin:xlmax] = fl f[yrmin:yrmax, xrmin:xrmax] = fr cv2.imshow("preview", f) if frame_count % 10 == 0: controller.move(output[0], output[1]) # Draw performance stats inf_time_message = "Face Inference time: {:.3f} ms.".format( det_time_fd * 1000) # if POSE_CHECKED: cv2.putText( frame, "Head pose Inference time: {:.3f} ms.".format( det_time_hp * 1000), (0, 35), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) cv2.putText(frame, inf_time_message, (0, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255), 1) out.write(frame) if frame_count % 10 == 0: demoutils.progressUpdate(progress_file_path, int(time.time() - infer_time_start), frame_count, video_len) if args.output_dir: total_time = time.time() - infer_time_start with open(os.path.join(args.output_dir, 'stats.txt'), 'w') as f: f.write(str(round(total_time, 1)) + '\n') f.write(str(frame_count) + '\n') facedet.clean() posest.clean() landest.clean() gazeest.clean() cap.release() cv2.destroyAllWindows() out.release()
def main(): # Plugin initialization for specified device and load extensions library global rolling_log #defaultTarget = TARGET_DEVICE env_parser() args_parser() check_args() parse_conf_file() # if TARGET_DEVICE not in acceptedDevices: # print ("Unsupporterd device " + TARGET_DEVICE + ". Defaulting to CPU") # TARGET_DEVICE = 'CPU' print("Initializing plugin for {} device...".format(TARGET_DEVICE)) #plugin = IEPlugin(device=TARGET_DEVICE) ie = IECore() if CPU_EXTENSION and 'CPU' == TARGET_DEVICE: #plugin.add_cpu_extension(CPU_EXTENSION) ie.add_extension(CPU_EXTENSION, "CPU") # Read IR print("Reading IR...") net = IENetwork(model=model_xml, weights=model_bin) assert len( net.inputs.keys()) == 1, "Sample supports only single input topologies" assert len( net.outputs) == 1, "Sample supports only single output topologies" input_blob = next(iter(net.inputs)) out_blob = next(iter(net.outputs)) # Load the IR print("Loading IR to the plugin...") #exec_net = plugin.load(network=net, num_requests=2) exec_net = ie.load_network(network=net, num_requests=2, device_name=TARGET_DEVICE) # Read and pre-process input image n, c, h, w = net.inputs[input_blob].shape del net minFPS = min([i.cap.get(cv2.CAP_PROP_FPS) for i in videoCaps]) minlength = min([i.cap.get(cv2.CAP_PROP_FRAME_COUNT) for i in videoCaps]) for vc in videoCaps: vc.rate = int(math.ceil(vc.length / minlength)) print(minFPS) waitTime = int( round(1000 / minFPS / len(videoCaps))) # wait time in ms between showing frames frames_sum = 0 for vc in videoCaps: vc.init_vw(h, w, minFPS) frames_sum += vc.length statsWidth = w if w > 345 else 345 statsHeight = h if h > (len(videoCaps) * 20 + 15) else ( len(videoCaps) * 20 + 15) statsVideo = cv2.VideoWriter(os.path.join(output_dir, 'Statistics.mp4'), cv2.VideoWriter_fourcc(*"AVC1"), minFPS, (statsWidth, statsHeight), True) if not statsVideo.isOpened(): print("Couldn't open stats video for writing") sys.exit(4) # Read the labels file if labels_file: with open(labels_file, 'r') as f: labels_map = [x.strip() for x in f] else: labels_map = None # Init a rolling log to store events rolling_log_size = int((h - 15) / 20) rolling_log = collections.deque(maxlen=rolling_log_size) # Init inference request IDs cur_request_id = 0 next_request_id = 1 # Start with async mode enabled is_async_mode = True if not UI_OUTPUT: # Arrange windows so they are not overlapping #arrange_windows(w, h) print("To stop the execution press Esc button") no_more_data = False for vc in videoCaps: vc.start_time = datetime.datetime.now() frame_count = 0 job_id = os.environ['PBS_JOBID'] progress_file_path = os.path.join(output_dir, 'i_progress_' + job_id + '.txt') infer_start_time = time.time() #Start while loop while True: # If all video captures are closed stop the loop if False not in [videoCap.closed for videoCap in videoCaps]: print("I broke here line 387") break no_more_data = False # loop over all video captures for idx, videoCapInfer in enumerate(videoCaps): # read the next frame #print("Video {0} has length {1} and fps {2}".format(idx, videoCapInfer.length, videoCapInfer.fps)) if not videoCapInfer.closed: #print("ID {0}".format(idx)) vfps = int(round(videoCapInfer.cap.get(cv2.CAP_PROP_FPS))) #for i in range(0, int(round(vfps / minFPS))): for i in range(videoCapInfer.rate): frame_count += 1 #print("i = {0}".format(i)) ret, frame = videoCapInfer.cap.read() videoCapInfer.cur_frame_count += 1 # If the read failed close the program if not ret: videoCapInfer.closed = True no_more_data = True break if videoCapInfer.closed: print("Video {0} is done".format(idx)) print("Video has {0} frames ".format( videoCapInfer.length)) break # Copy the current frame for later use videoCapInfer.cur_frame = frame.copy() videoCapInfer.initial_w = videoCapInfer.cap.get(3) videoCapInfer.initial_h = videoCapInfer.cap.get(4) # Resize and change the data layout so it is compatible in_frame = cv2.resize(videoCapInfer.cur_frame, (w, h)) in_frame = in_frame.transpose( (2, 0, 1)) # Change data layout from HWC to CHW in_frame = in_frame.reshape((n, c, h, w)) infer_start = datetime.datetime.now() if is_async_mode: exec_net.start_async(request_id=next_request_id, inputs={input_blob: in_frame}) # Async enabled and only one video capture if (len(videoCaps) == 1): videoCapResult = videoCapInfer # Async enabled and more than one video capture else: # Get previous index videoCapResult = videoCaps[idx - 1 if idx - 1 >= 0 else len(videoCaps) - 1] else: # Async disabled exec_net.start_async(request_id=cur_request_id, inputs={input_blob: in_frame}) videoCapResult = videoCapInfer if exec_net.requests[cur_request_id].wait(-1) == 0: infer_end = datetime.datetime.now() infer_duration = infer_end - infer_start current_count = 0 # Parse detection results of the current request res = exec_net.requests[cur_request_id].outputs[out_blob] for obj in res[0][0]: class_id = int(obj[1]) # Draw only objects when probability more than specified threshold if (obj[2] > PROB_THRESHOLD and videoCapResult.req_label in labels_map and labels_map.index( videoCapResult.req_label) == class_id - 1): current_count += 1 xmin = int(obj[3] * videoCapResult.initial_w) ymin = int(obj[4] * videoCapResult.initial_h) xmax = int(obj[5] * videoCapResult.initial_w) ymax = int(obj[6] * videoCapResult.initial_h) # Draw box cv2.rectangle(videoCapResult.cur_frame, (xmin, ymin), (xmax, ymax), (0, 255, 0), 4, 16) if videoCapResult.candidate_count is current_count: videoCapResult.candidate_confidence += 1 else: videoCapResult.candidate_confidence = 0 videoCapResult.candidate_count = current_count if videoCapResult.candidate_confidence is FRAME_THRESHOLD: videoCapResult.candidate_confidence = 0 if current_count > videoCapResult.last_correct_count: videoCapResult.total_count += current_count - videoCapResult.last_correct_count if current_count is not videoCapResult.last_correct_count: if UI_OUTPUT: currtime = datetime.datetime.now().strftime( "%H:%M:%S") fr = FrameInfo(videoCapResult.frames, current_count, currtime) videoCapResult.countAtFrame.append(fr) new_objects = current_count - videoCapResult.last_correct_count for _ in range(new_objects): str = "{} - {} detected on {}".format( time.strftime("%H:%M:%S"), videoCapResult.req_label, videoCapResult.cap_name) rolling_log.append(str) videoCapResult.frames += 1 videoCapResult.last_correct_count = current_count else: videoCapResult.frames += 1 videoCapResult.cur_frame = cv2.resize( videoCapResult.cur_frame, (w, h)) if not UI_OUTPUT: # Add log text to each frame log_message = "Async mode is on." if is_async_mode else \ "Async mode is off." cv2.putText(videoCapResult.cur_frame, log_message, (15, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) log_message = "Total {} count: {}".format( videoCapResult.req_label, videoCapResult.total_count) cv2.putText(videoCapResult.cur_frame, log_message, (10, h - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) log_message = "Current {} count: {}".format( videoCapResult.req_label, videoCapResult.last_correct_count) cv2.putText(videoCapResult.cur_frame, log_message, (10, h - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) cv2.putText( videoCapResult.cur_frame, 'Infer wait: %0.3fs' % (infer_duration.total_seconds()), (10, h - 70), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) # Display inferred frame and stats stats = numpy.zeros((statsHeight, statsWidth, 1), dtype='uint8') for i, log in enumerate(rolling_log): cv2.putText(stats, log, (10, i * 20 + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) #cv2.imshow(STATS_WINDOW_NAME, stats) if idx == 0: stats = cv2.cvtColor(stats, cv2.COLOR_GRAY2BGR) #Write statsVideo.write(stats) end_time = datetime.datetime.now() cv2.putText( videoCapResult.cur_frame, 'FPS: %0.2fs' % (1 / (end_time - videoCapResult.start_time).total_seconds()), (10, h - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) #cv2.imshow(videoCapResult.cap_name, videoCapResult.cur_frame) videoCapResult.start_time = datetime.datetime.now() #Write videoCapResult.video.write(videoCapResult.cur_frame) if frame_count % 10 == 0: progressUpdate(progress_file_path, time.time() - infer_start_time, frame_count, frames_sum) # Wait if necessary for the required time #key = cv2.waitKey(waitTime) key = cv2.waitKey(1) # Esc key pressed if key == 27: cv2.destroyAllWindows() del exec_net #del plugin del ie print("Finished") return # Tab key pressed if key == 9: is_async_mode = not is_async_mode print("Switched to {} mode".format( "async" if is_async_mode else "sync")) if is_async_mode: # Swap infer request IDs cur_request_id, next_request_id = next_request_id, cur_request_id # Loop video if LOOP_VIDEO = True and input isn't live from USB camera if LOOP_VIDEO and not videoCapInfer.is_cam: vfps = int(round(videoCapInfer.cap.get(cv2.CAP_PROP_FPS))) # If a video capture has ended restart it if (videoCapInfer.cur_frame_count > videoCapInfer.cap.get(cv2.CAP_PROP_FRAME_COUNT) - int(round(vfps / minFPS))): videoCapInfer.cur_frame_count = 0 videoCapInfer.cap.set(cv2.CAP_PROP_POS_FRAMES, 0) if no_more_data: progressUpdate(progress_file_path, time.time() - infer_start_time, frames_sum, frames_sum) break #End of while loop-------------------- no_more_data = True t2 = time.time() - infer_start_time for videos in videoCaps: print(videos.length) print(videos.closed) print("End loop") print("Total time {0}".format(t2)) print("Total frame count {0}".format(frame_count)) print("fps {0}".format(frame_count / t2)) with open(os.path.join(output_dir, 'stats.txt'), 'w') as f: f.write('{} \n'.format(round(t2))) f.write('{} \n'.format(frame_count)) for vc in videoCaps: print("Frames processed {}".format(vc.cur_frame_count)) print("Frames count {}".format(vc.length)) for vc in videoCaps: vc.video.release() vc.cap.release() if no_more_data: break
start_time = time.time() pred_mask = model.predict(img, verbose=0, steps=None) #print ("Time for prediction TF: ", '\033[1m %.0f \033[0m'%((time.time()-start_time)*1000),"ms") end_time = (time.time()-start_time)*1000 print(end_time) plotDiceScore(img_no,img,msk,pred_mask,plot_result, round(end_time)) return end_time indicies_validation = [40, 63, 43, 55, 99, 101, 19, 46] #[40] val_id = 1 infer_time_start = time.time() progress_file_path = os.path.join(png_directory, "i_progress.txt") infer_time = 0 for idx in indicies_validation: infer_time_idx = predict(idx, plot_result=True) if val_id > 2: infer_time += infer_time_idx #print((time.time()-infer_time_start)*1000/val_id) progressUpdate(progress_file_path, time.time()-infer_time_start, val_id, len(indicies_validation)-1) val_id += 1 total_time = time.time() - infer_time_start with open(os.path.join(png_directory, 'stats.txt'), 'w') as f: f.write(str(round(infer_time/1000, 4))+'\n') #f.write(str(round(total_time, 1))+'\n') f.write(str(val_id-2)+'\n') f.write("Frames processed per second = {} ".format(round((val_id-2)/ (infer_time/1000))))