neural-style / webcam_stream.py
dogeplusplus's picture
Removing model file. Making setup path agnostic
f161731
import os
import cv2
import time
import numpy as np
import streamlit as st
import tensorflow as tf
from threading import Thread
class WebcamVideoStream:
def __init__(self, src=0):
self.stream = cv2.VideoCapture(src)
self.grabbed, self.frame = self.stream.read()
self.stopped = False
def start(self):
Thread(target=self.update, args=()).start()
return self
def update(self):
while True:
if self.stopped:
return
self.grabbed, self.frame = self.stream.read()
def read(self):
return self.frame
def stop(self):
self.stopped = True
def style_transfer_direct(image, style_image, model, resize=None):
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
if resize:
image = cv2.resize(np.array(image, dtype=np.float32), (512, 512))
else:
image = np.array(image, dtype=np.float32)
image = tf.convert_to_tensor(image[np.newaxis, ...] / 255.)
resp = model(image, style_image)
stylized_image = resp[0]
return stylized_image.numpy()[0]
def get_style_dictionary():
style_lookup = {}
for file in os.listdir('assets/template_styles'):
with open(os.path.join('assets/template_styles', file), 'rb') as f:
style = f.read()
style_image = tf.io.decode_image(style)
style_image = np.array(style_image[np.newaxis, ...], dtype=np.float32) / 255.
style_image = tf.image.resize(style_image, (256, 256))
style_image = tf.convert_to_tensor(style_image)
style_lookup[file] = style_image
return style_lookup
@st.cache(persist=True)
def get_custom_style(image_bytes):
style_image = tf.io.decode_image(image_bytes)
style_image = np.array(style_image[np.newaxis, ...], dtype=np.float32) / 255.
style_image = tf.image.resize(style_image, (256, 256))
style_image = tf.convert_to_tensor(style_image)
return style_image
def main():
model = tf.saved_model.load('style/1')
st.title("Neural Style-Transfer Webcam")
st.subheader('Style Transfer')
webcam_flag = st.sidebar.checkbox('Enable Webcam', value=False)
style_flag = st.sidebar.checkbox('Enable Style Transfer', value=False)
with open('assets/bonk.png', 'rb') as f:
default_bytes = f.read()
placeholder_image = st.image(default_bytes)
style_dictionary = get_style_dictionary()
style_options = st.sidebar.selectbox(label='Example Styles', options=list(style_dictionary.keys()))
custom_style = st.sidebar.file_uploader('Upload Style:', type=['.jpg', '.jpeg', '.png'])
frame_rate = st.text(f'Frames per second: 0')
if webcam_flag:
video_capture = WebcamVideoStream(0)
start = time.time()
total_frames = 0
try:
video_capture.start()
if custom_style is not None:
custom_style_bytes = custom_style.getvalue()
style_image = get_custom_style(custom_style_bytes)
else:
style_image = style_dictionary[style_options]
st.sidebar.subheader("Style Image:")
st.sidebar.image(np.array(style_image.numpy()[0] * 255., dtype=np.uint8), use_column_width=True)
while webcam_flag:
content_image = video_capture.read()
if style_flag:
transfer = style_transfer_direct(content_image, style_image, model)
placeholder_image.image(transfer)
else:
placeholder_image.image(content_image, channels='BGR')
total_frames += 1
end = time.time()
frame_rate.text(f'Frames per second: {total_frames / (end - start)}')
finally:
video_capture.stop()
del video_capture
if __name__ == "__main__":
main()