Spaces:
Runtime error
Runtime error
| import sys | |
| import time | |
| from pathlib import Path | |
| import cv2 | |
| from openvino.inference_engine import IECore | |
| import matplotlib.cm | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import streamlit as st | |
| from PIL import Image | |
| import tempfile | |
| DEMO_IMAGE = 'dog-new.jpg' | |
| DEMO_VIDEO = 'dance2.mp4' | |
| def normalize_minmax(data): | |
| return (data - data.min()) / (data.max() - data.min()) | |
| def convert_result_to_image(result, colormap="inferno"): | |
| cmap = matplotlib.cm.get_cmap(colormap) | |
| result = result.squeeze(0) | |
| result = normalize_minmax(result) | |
| result = cmap(result)[:, :, :3] * 255 | |
| result = result.astype(np.uint8) | |
| return result | |
| def to_rgb(image_data) -> np.ndarray: | |
| return cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB) | |
| st.title("Depth Estimation App") | |
| st.sidebar.title('Depth Estimation') | |
| st.sidebar.subheader('Parameters') | |
| DEVICE = "CPU" | |
| MODEL_FILE = "models/MiDaS_small.xml" | |
| model_xml_path = Path(MODEL_FILE) | |
| ie = IECore() | |
| net = ie.read_network(model=model_xml_path, weights=model_xml_path.with_suffix(".bin")) | |
| exec_net = ie.load_network(network=net, device_name=DEVICE) | |
| input_key = list(exec_net.input_info)[0] | |
| output_key = list(exec_net.outputs.keys())[0] | |
| network_input_shape = exec_net.input_info[input_key].tensor_desc.dims | |
| network_image_height, network_image_width = network_input_shape[2:] | |
| app_mode = st.sidebar.selectbox('Choose the App mode', | |
| ['Run on Image','Run on Video'],index = 0) | |
| if app_mode == "Run on Image": | |
| st.markdown('Running on Image') | |
| st.sidebar.text('Params for Image') | |
| st.markdown( | |
| """ | |
| <style> | |
| [data-testid="stSidebar"][aria-expanded="true"] > div:first-child { | |
| width: 400px; | |
| } | |
| [data-testid="stSidebar"][aria-expanded="false"] > div:first-child { | |
| width: 400px; | |
| margin-left: -400px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| img_file_buffer = st.sidebar.file_uploader("Upload an image", type=[ "jpg", "jpeg",'png']) | |
| if img_file_buffer is not None: | |
| image = np.array(Image.open(img_file_buffer)) | |
| else: | |
| demo_image = DEMO_IMAGE | |
| image = np.array(Image.open(demo_image)) | |
| st.sidebar.text('Original Image') | |
| st.sidebar.image(image) | |
| resized_image = cv2.resize(src=image, dsize=(network_image_height, network_image_width)) | |
| # reshape image to network input shape NCHW | |
| input_image = np.expand_dims(np.transpose(resized_image, (2, 0, 1)), 0) | |
| result = exec_net.infer(inputs={input_key: input_image})[output_key] | |
| # convert network result of disparity map to an image that shows | |
| # distance as colors | |
| result_image = convert_result_to_image(result=result) | |
| # resize back to original image shape. cv2.resize expects shape | |
| # in (width, height), [::-1] reverses the (height, width) shape to match this. | |
| result_image = cv2.resize(result_image, image.shape[:2][::-1]) | |
| st.subheader('Output Image') | |
| st.image(result_image,use_column_width= True) | |
| if app_mode =='Run on Video': | |
| st.markdown('Running on Video') | |
| video_file_buffer = st.sidebar.file_uploader("Upload a video", type=[ "mp4", "mov",'avi','asf', 'm4v' ]) | |
| tfflie = tempfile.NamedTemporaryFile(delete=False) | |
| stop_button = st.sidebar.button('Stop Processing') | |
| if stop_button: | |
| st.stop() | |
| if not video_file_buffer: | |
| vid = cv2.VideoCapture(DEMO_VIDEO) | |
| tfflie.name = DEMO_VIDEO | |
| else: | |
| tfflie.write(video_file_buffer.read()) | |
| vid = cv2.VideoCapture(tfflie.name) | |
| 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(*FLAGS.output_format) | |
| codec = cv2.VideoWriter_fourcc('X','V','I','D') | |
| out = cv2.VideoWriter('output_depth.mp4', codec, fps, (width, height)) | |
| start_time = time.perf_counter() | |
| total_inference_duration = 0 | |
| stframe = st.empty() | |
| SCALE_OUTPUT = 1 | |
| st.markdown("**Frame Rate**") | |
| kpi1_text = st.markdown("0") | |
| save_video = st.checkbox('Save video') | |
| while vid.isOpened(): | |
| ret, image = vid.read() | |
| new_time = time.time() | |
| input_video_frame_height, input_video_frame_width = image.shape[:2] | |
| target_frame_height = int(input_video_frame_height * SCALE_OUTPUT) | |
| target_frame_width = int(input_video_frame_width * SCALE_OUTPUT) | |
| if not ret: | |
| vid.release() | |
| break | |
| resized_image = cv2.resize(src=image, dsize=(network_image_height, network_image_width)) | |
| # reshape image to network input shape NCHW | |
| input_image = np.expand_dims(np.transpose(resized_image, (2, 0, 1)), 0) | |
| inference_start_time = time.perf_counter() | |
| result = exec_net.infer(inputs={input_key: input_image})[output_key] | |
| inference_stop_time = time.perf_counter() | |
| inference_duration = inference_stop_time - inference_start_time | |
| total_inference_duration += inference_duration | |
| result_frame = to_rgb(convert_result_to_image(result)) | |
| # Resize image and result to target frame shape | |
| result_frame = cv2.resize(result_frame, (target_frame_width, target_frame_height)) | |
| image = cv2.resize(image, (target_frame_width, target_frame_height)) | |
| # Put image and result side by side | |
| stacked_frame = np.hstack((image, result_frame)) | |
| if save_video: | |
| out.write(stacked_frame) | |
| stframe.image(stacked_frame,channels = 'BGR',use_column_width=True) | |
| fps = 1.0/(time.time() - new_time) | |
| kpi1_text.write(f"<h1 style='text-align: center; color: red;'>{'{:.1f}'.format(fps)}</h1>", unsafe_allow_html=True) | |
| vid.release() | |
| out.release() | |
| cv2.destroyAllWindows() | |
| st.success('Video is Processed') | |
| st.stop() |