import neural_style import streamlit as st import os import random import numpy as np from PIL import Image, ImageEnhance from io import BytesIO import matplotlib.pyplot as plt import streamlit_ext as ste #for download button not to rerun from huggingface_hub import upload_file HF_TOKEN = os.environ.get("HF_TOKEN") st.set_page_config(layout="wide") st.markdown('

Afrodreams.AI

', unsafe_allow_html=True) st.subheader("This app takes in your image and styles it with a unique african art.") #Create two columns with different width col1, col2 = st.columns( [0.8, 0.2]) import time with col1: # To display the header text using css style st.markdown(""" """, unsafe_allow_html=True) st.markdown('

Upload your photo here...

', unsafe_allow_html=True) #Add file uploader to allow users to upload photos uploaded_file = st.file_uploader("", type=['jpg','png','jpeg']) # add slider to side bar style_weight = st.slider("Select Style Weight", min_value=10, max_value=100, value=12) img_size_slider= st.select_slider(label= 'Seleet Output Quality Level', options = ['Very Low', 'Low', 'Normal', 'High', 'Very High'], value='Normal') img_size_mapping = {'Very Low':128, 'Low':300, 'Normal':400, 'High':500, 'Very High':600} def get_random_subset(list_, num_imgs): return random.sample(list_, num_imgs) def display_random_images(five_rand_imgs, display_type, size= (15, 6)): fig = plt.figure(figsize=size) fig.subplots_adjust(wspace=0.2) for i in range(1, len(five_rand_imgs)+1): ith_image = Image.open(five_rand_imgs[i-1]) ax = fig.add_subplot(1, 5, i) ax.imshow(ith_image) ax.set_title(f'{display_type} {i}') plt.axis('off') st.pyplot(fig) path = 'stylesv2' #expander for style selection with st.expander("Expand to select style type"): img_names = [os.path.join(path, img) for img in os.listdir(path)] five_rand_imgs0 = get_random_subset(img_names, 5) if 'selected_image' not in st.session_state: st.session_state.selected_image = five_rand_imgs0 five_rand_imgs = st.session_state.selected_image display_random_images(five_rand_imgs, 'Style') chosen_style = st.selectbox( 'Select the style you want to use', options = five_rand_imgs, format_func = lambda x: "Style " + str(five_rand_imgs.index(x) + 1), key= 'expander1' ) #put notificaation #with st.empty(): #for seconds in range(5): #st.info('Please note that by using this app, you agree that your image be will be showcased on this app.') #time.sleep(1) #st.empty() #Add 'before' and 'after' columns if uploaded_file is not None: image = Image.open(uploaded_file) col1, col2 = st.columns( [0.5, 0.5]) with col1: st.markdown('

Before

',unsafe_allow_html=True) st.image(image,width=300) with col2: st.markdown('

After

',unsafe_allow_html=True) # add a button run = st.button('Generate Art') my_bar = st.progress(0) params = neural_style.TransferParams() params.gpu =0 #"c" params.backend = "mkl" params.image_size = img_size_mapping[img_size_slider] params.content_image = uploaded_file params.style_weight = style_weight keep_style = False if run==True: # run image selection if keep style is false if keep_style==False: styles = os.listdir(path) #params.style_image = path + '/' + random.choice(styles) params.style_image = chosen_style st.session_state.submitted = True with st.spinner('Wait for it...'): neural_style.transfer(params) #display image when done. with col2: if 'submitted' in st.session_state: result = Image.open('out.png') st.image(result, width=300) buf = BytesIO() result.save(buf, format="png") img_file_name = f"generated_samples/{str(len(os.listdir('generated_samples')))}.png" _ = upload_file(path_or_fileobj = 'out.png', path_in_repo = img_file_name, repo_id='AfrodreamsAI/afrodreams', repo_type='space', token=HF_TOKEN ) byte_im = buf.getvalue() run = ste.download_button("Download Image", data=byte_im, file_name="afrodreams.png") #if run==True: # selectiuing random iamges to be displayed img_names = [os.path.join('generated_samples', img) for img in os.listdir('generated_samples')] five_rand_imgs1 = get_random_subset(img_names, 5) st.subheader('\n\n\n\n\n\n\n\n\n Examples of some Generate Images') display_random_images(five_rand_imgs1, 'Generate image', size=(20, 15))