import cv2 import os import numpy as np from skimage.filters import gaussian from test import evaluate import streamlit as st from PIL import Image, ImageColor def sharpen(img): img = img * 1.0 gauss_out = gaussian(img, sigma=5, multichannel=True) alpha = 1.5 img_out = (img - gauss_out) * alpha + img img_out = img_out / 255.0 mask_1 = img_out < 0 mask_2 = img_out > 1 img_out = img_out * (1 - mask_1) img_out = img_out * (1 - mask_2) + mask_2 img_out = np.clip(img_out, 0, 1) img_out = img_out * 255 return np.array(img_out, dtype=np.uint8) def hair(image, parsing, part=17, color=[230, 50, 20]): b, g, r = color #[10, 50, 250] # [10, 250, 10] tar_color = np.zeros_like(image) tar_color[:, :, 0] = b tar_color[:, :, 1] = g tar_color[:, :, 2] = r np.repeat(parsing[:, :, np.newaxis], 3, axis=2) image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) tar_hsv = cv2.cvtColor(tar_color, cv2.COLOR_BGR2HSV) if part == 12 or part == 13: image_hsv[:, :, 0:2] = tar_hsv[:, :, 0:2] else: image_hsv[:, :, 0:1] = tar_hsv[:, :, 0:1] changed = cv2.cvtColor(image_hsv, cv2.COLOR_HSV2BGR) if part == 17: changed = sharpen(changed) changed[parsing != part] = image[parsing != part] return changed DEMO_IMAGE = 'imgs/116.jpg' st.title('Virtual Makeup') st.sidebar.title('Virtual Makeup') st.sidebar.subheader('Parameters') table = { 'hair': 17, 'upper_lip': 12, 'lower_lip': 13, } 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)) demo_image = img_file_buffer else: demo_image = DEMO_IMAGE image = np.array(Image.open(demo_image)) #st.set_option('deprecation.showfileUploaderEncoding', False) new_image = image.copy() st.subheader('Original Image') st.image(image,use_column_width = True) cp = 'cp/79999_iter.pth' ori = image.copy() h,w,_ = ori.shape #print(h) #print(w) image = cv2.resize(image,(1024,1024)) parsing = evaluate(demo_image, cp) parsing = cv2.resize(parsing, image.shape[0:2], interpolation=cv2.INTER_NEAREST) parts = [table['hair'], table['upper_lip'], table['lower_lip']] hair_color = st.sidebar.color_picker('Pick the Hair Color', '#000') hair_color = ImageColor.getcolor(hair_color, "RGB") lip_color = st.sidebar.color_picker('Pick the Lip Color', '#edbad1') lip_color = ImageColor.getcolor(lip_color, "RGB") colors = [hair_color, lip_color, lip_color] for part, color in zip(parts, colors): image = hair(image, parsing, part, color) image = cv2.resize(image,(w,h)) st.subheader('Output Image') st.image(image,use_column_width = True)