basilshaji's picture
Upload 269 files
e68321e verified
raw
history blame
6.62 kB
import streamlit as st
import torch
from PIL import Image
from io import *
import glob
from datetime import datetime
import os
import wget
from video_predict import runVideo
# Configurations
CFG_MODEL_PATH = "models/yourModel.pt"
CFG_ENABLE_URL_DOWNLOAD = True
CFG_ENABLE_VIDEO_PREDICTION = True
if CFG_ENABLE_URL_DOWNLOAD:
# Configure this if you set cfg_enable_url_download to True
url = "https://archive.org/download/yoloTrained/yoloTrained.pt"
# End of Configurations
def imageInput(model, src):
if src == 'Upload your own data.':
image_file = st.file_uploader(
"Upload An Image", type=['png', 'jpeg', 'jpg'])
col1, col2 = st.columns(2)
if image_file is not None:
img = Image.open(image_file)
with col1:
st.image(img, caption='Uploaded Image',
use_column_width='always')
ts = datetime.timestamp(datetime.now())
imgpath = os.path.join('data/uploads', str(ts)+image_file.name)
outputpath = os.path.join(
'data/outputs', os.path.basename(imgpath))
with open(imgpath, mode="wb") as f:
f.write(image_file.getbuffer())
with st.spinner(text="Predicting..."):
# Load model
pred = model(imgpath)
pred.render()
# save output to file
for im in pred.ims:
im_base64 = Image.fromarray(im)
im_base64.save(outputpath)
# Predictions
img_ = Image.open(outputpath)
with col2:
st.image(img_, caption='Model Prediction(s)',
use_column_width='always')
elif src == 'From example data.':
# Image selector slider
imgpaths = glob.glob('data/example_images/*')
if len(imgpaths) == 0:
st.write(".")
st.error(
'No images found, Please upload example images in data/example_images', icon="")
return
imgsel = st.slider('Select random images from example data.',
min_value=1, max_value=len(imgpaths), step=1)
image_file = imgpaths[imgsel-1]
submit = st.button("Predict!")
col1, col2 = st.columns(2)
with col1:
img = Image.open(image_file)
st.image(img, caption='Selected Image', use_column_width='always')
with col2:
if image_file is not None and submit:
with st.spinner(text="Predicting..."):
# Load model
pred = model(image_file)
pred.render()
# save output to file
for im in pred.ims:
im_base64 = Image.fromarray(im)
im_base64.save(os.path.join(
'data/outputs', os.path.basename(image_file)))
# Display predicton
img_ = Image.open(os.path.join(
'data/outputs', os.path.basename(image_file)))
st.image(img_, caption='Model Prediction(s)')
def videoInput(model, src):
if src == 'Upload your own data.':
uploaded_video = st.file_uploader(
"Upload A Video", type=['mp4', 'mpeg', 'mov'])
pred_view = st.empty()
warning = st.empty()
if uploaded_video != None:
# Save video to disk
ts = datetime.timestamp(datetime.now()) # timestamp a upload
uploaded_video_path = os.path.join(
'data/uploads', str(ts)+uploaded_video.name)
with open(uploaded_video_path, mode='wb') as f:
f.write(uploaded_video.read())
# Display uploaded video
with open(uploaded_video_path, 'rb') as f:
video_bytes = f.read()
st.video(video_bytes)
st.write("Uploaded Video")
submit = st.button("Run Prediction")
if submit:
runVideo(model, uploaded_video_path, pred_view, warning)
elif src == 'From example data.':
# Image selector slider
videopaths = glob.glob('data/example_videos/*')
if len(videopaths) == 0:
st.error(
'No videos found, Please upload example videos in data/example_videos', icon="⚠️")
return
imgsel = st.slider('Select random video from example data.',
min_value=1, max_value=len(videopaths), step=1)
pred_view = st.empty()
video = videopaths[imgsel-1]
submit = st.button("Predict!")
if submit:
runVideo(model, video, pred_view, warning)
def main():
if CFG_ENABLE_URL_DOWNLOAD:
downloadModel()
else:
if not os.path.exists(CFG_MODEL_PATH):
st.error(
'Model not found, please config if you wish to download model from url set `cfg_enable_url_download = True` ', icon="⚠️")
# -- Sidebar
st.sidebar.title('⚙️ Options')
datasrc = st.sidebar.radio("Select input source.", [
'From example data.', 'Upload your own data.'])
if CFG_ENABLE_VIDEO_PREDICTION:
option = st.sidebar.radio("Select input type.", ['Image', 'Video'])
else:
option = st.sidebar.radio("Select input type.", ['Image'])
if torch.cuda.is_available():
deviceoption = st.sidebar.radio("Select compute Device.", [
'cpu', 'cuda'], disabled=False, index=1)
else:
deviceoption = st.sidebar.radio("Select compute Device.", [
'cpu', 'cuda'], disabled=True, index=0)
# -- End of Sidebar
st.header('📦 YOLOv5 Streamlit Deployment Example')
st.sidebar.markdown(
"https://github.com/thepbordin/Obstacle-Detection-for-Blind-people-Deployment")
if option == "Image":
imageInput(loadmodel(deviceoption), datasrc)
elif option == "Video":
videoInput(loadmodel(deviceoption), datasrc)
# Downlaod Model from url.
@st.cache_resource
def downloadModel():
if not os.path.exists(CFG_MODEL_PATH):
wget.download(url, out="models/")
@st.cache_resource
def loadmodel(device):
if CFG_ENABLE_URL_DOWNLOAD:
CFG_MODEL_PATH = f"models/{url.split('/')[-1:][0]}"
model = torch.hub.load('ultralytics/yolov5', 'custom',
path=CFG_MODEL_PATH, force_reload=True, device=device)
return model
if __name__ == '__main__':
main()