Spaces:
Sleeping
Sleeping
import streamlit as st | |
import streamlit.components.v1 as components | |
import cv2 | |
import numpy as np | |
from PIL import Image, ExifTags | |
# κ°μ₯ λ¨Όμ set_page_config() νΈμΆ | |
st.set_page_config(page_title="λ₯νμ΄ν¬ μ¬μ λ°©μ§ νν°(ν μ€νΈ)", layout="wide") | |
ga_code = """ | |
<!-- Global site tag (gtag.js) - Google Analytics --> | |
<script async src="https://www.googletagmanager.com/gtag/js?id=G-PZPBGNENQG"></script> | |
<script> | |
window.dataLayer = window.dataLayer || []; | |
function gtag(){dataLayer.push(arguments);} | |
gtag('js', new Date()); | |
gtag('config', 'G-PZPBGNENQG'); | |
</script> | |
""" | |
# Streamlitμ GA μ½λ μ½μ | |
components.html(ga_code, height=0) | |
# λλ¨Έμ§ Streamlit μ½λ | |
st.title("λ₯νμ΄ν¬ μ¬μ λ°©μ§ νν°(ν μ€νΈ)") | |
st.markdown("") | |
st.markdown("<span style='font-size: 18px;'>μλ νμΈμ! μ ν¬λ λ₯νμ΄ν¬λ‘λΆν° μ¬λ¬λΆμ μ¬μ§μ 보νΈνλ μ루μ μ κ°λ°νκ³ μμ΅λλ€.</span>", unsafe_allow_html=True) | |
st.markdown("<span style='font-size: 18px;'>μ ν¬μ λͺ©νλ μ¨λΌμΈμ κ²μλ κ°μΈμ μ¬μ§μ΄ μ μ± λ₯νμ΄ν¬ μμμ μ¬μ©λμ§ μλλ‘ νλ κ²μ λλ€. νμ¬λ κ°λ°μ λ§λ¬΄λ¦¬νκ³ μλΉμ€ν νκΈ° μ , μ¬λ¬λΆμ μ견μ λ£κΈ° μν΄ κ°λ¨ν ν μ€νΈλ₯Ό μ§ννκ³ μμ΅λλ€.</span>", unsafe_allow_html=True) | |
st.markdown("<span style='font-size: 18px;'>μ΅κ·Ό SNSμ μ λ‘λλ μ΄λ―Έμ§κ° λ₯νμ΄ν¬ ν¬λ₯΄λ Έλ¬Όμ μ μ©λλ μ¬λ‘κ° λ§€μΌ λ³΄κ³ λκ³ μμ΅λλ€. λ°λΌμ ν΄κ²°μ± μ κ°κ΅¬νκΈ° μν΄, μ¬λ¬λΆμ μμ€ν μκ²¬μ΄ νμν©λλ€.</span>", unsafe_allow_html=True) | |
st.markdown("<span style='font-size: 18px;'>μλ λ§ν¬λ₯Ό ν΅ν΄ μ ν¬ μλΉμ€λ₯Ό μ΄μ©ν΄ 보μ ν, μΈν°λ·°μ μ°Έμ¬ν΄ μ£Όμλ©΄ ν° λμμ΄ λκ² μ΅λλ€. μ¬λ¬λΆμ νΌλλ°±μ μλΉμ€ κ°μ μ κ·μ€ν μλ£κ° λ κ²μ λλ€.</span>", unsafe_allow_html=True) | |
st.markdown("") | |
st.markdown("<span style='font-size: 18px;'>λμ μ리 : 1. μ΄λ―Έμ§λ₯Ό μ λ‘λνλ©΄, μ¬μ λ°©μ§ νν°κ° μ μ©λ μ΄λ―Έμ§λ₯Ό 보μ¬λ립λλ€. 2. νλ¨μ ν° λ²νΌμ ν΄λ¦νλ©΄ λ₯νμ΄ν¬ λͺ¨λΈμ ν΅ν΄ μμ±λ κ²°κ³Όλ₯Ό νμΈν μ μμ΅λλ€.</span>", unsafe_allow_html=True) | |
st.markdown("<span style='font-size: 18px;'>μ¬λ¬λΆμ μ°Έμ¬μ κ°μ¬λ립λλ€!</span>", unsafe_allow_html=True) | |
st.markdown("<span style='font-size: 14px;'> *μ¬μ λ°©μ§ νν°λ: μ¬λ¬λΆμ μ¬μ§μ΄ λ₯νμ΄ν¬ λͺ¨λΈμ νμ΅λμ§ λͺ»νλλ‘ λ°©ν΄νλ λ Έμ΄μ¦(noise)ννμ νν°.</span>", unsafe_allow_html=True) | |
st.markdown( | |
""" | |
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet"> | |
<style> | |
/* κ³΅ν΅ μ€νμΌ */ | |
.stFileUploader label, | |
.stRadio label, | |
.stRadio div, | |
.custom-caption-1, | |
.custom-caption-2, | |
.button-container, | |
.stButton button, | |
.survey, | |
.survey-1, | |
.survey-2, | |
.a-tag, | |
a { | |
transition: all 0.3s ease; | |
} | |
.stFileUploader label { | |
font-size: 20px; | |
font-weight: 500; | |
color: #1f77b4; | |
} | |
.stRadio label { | |
font-size: 20px; | |
font-weight: 500; | |
color: #1f77b4; | |
} | |
.stRadio div { | |
display: flex; | |
gap: 20px; | |
} | |
.custom-caption-1 { | |
font-size: 36px; | |
font-weight: bold; | |
text-align: center; | |
margin-top: 10px; | |
padding: 0 0 200px 0; | |
} | |
.custom-caption-2 { | |
font-size: 36px; | |
font-weight: bold; | |
text-align: center; | |
margin-top: 10px; | |
padding: 0 0 30px 0; | |
} | |
.button-container { | |
text-align: center; | |
margin-top: 30px; | |
} | |
.stButton button { | |
width: 50%; | |
font-size: 25px; | |
padding: 10px 20px; | |
background-color: #FFFFFF; | |
font-weight: bold; | |
color: black; | |
opacity: 0.8; | |
border: 3px solid black; | |
border-radius: 5px; | |
cursor: pointer; | |
margin: 0 auto 50px auto; | |
display: block; | |
} | |
.stButton button:hover { | |
background-color: #FFFFFF; | |
border: 3px solid #FF0080; | |
color: #FF0080; | |
opacity: 1; | |
} | |
.survey { | |
text-align: center; | |
margin-top: 10px | |
} | |
.survey-1 { | |
font-size: 25px; | |
text-align: center; | |
margin-top: 10px | |
font-weight: bold; | |
} | |
.survey-2 { | |
text-align: center; | |
margin-top: 10px | |
font-weight: bold; | |
padding 0 auto 50px auto | |
} | |
.a-tag { | |
color: #FF0080; | |
text-decoration: none; | |
} | |
a:hover { | |
color: #FF0080; | |
text-decoration: none; | |
} | |
/* μ€λ§νΈν° νλ©΄ μ€νμΌ */ | |
@media only screen and (max-width: 600px) { | |
.stFileUploader label, | |
.stRadio label, | |
.stButton button, | |
.survey-1 { | |
font-size: 16px; | |
} | |
.custom-caption-1, | |
.custom-caption-2 { | |
font-size: 24px; | |
padding: 0 0 20px 0; | |
} | |
.stButton button { | |
width: 100%; | |
font-size: 18px; | |
} | |
} | |
/* νλΈλ¦Ώ νλ©΄ μ€νμΌ */ | |
@media only screen and (min-width: 601px) and (max-width: 1024px) { | |
.stFileUploader label, | |
.stRadio label, | |
.stButton button, | |
.survey-1 { | |
font-size: 18px; | |
} | |
.custom-caption-1, | |
.custom-caption-2 { | |
font-size: 28px; | |
padding: 0 0 40px 0; | |
} | |
.stButton button { | |
width: 75%; | |
font-size: 20px; | |
} | |
} | |
/* λ°μ€ν¬ν± νλ©΄ μ€νμΌ */ | |
@media only screen and (min-width: 1025px) { | |
.stFileUploader label, | |
.stRadio label, | |
.stButton button, | |
.survey-1 { | |
font-size: 20px; | |
} | |
.custom-caption-1, | |
.custom-caption-2 { | |
font-size: 36px; | |
padding: 0 0 200px 0; | |
} | |
.stButton button { | |
width: 50%; | |
font-size: 25px; | |
} | |
} | |
</style> | |
""", | |
unsafe_allow_html=True, | |
) | |
def change_hair_to_blonde(image): | |
# Convert to OpenCV format | |
image = np.array(image) | |
# Convert the image to HSV color space | |
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) | |
# Define the range for hair color (dark colors) | |
lower_hair = np.array([0, 0, 0]) | |
upper_hair = np.array([180, 255, 30]) | |
# Create a mask for hair | |
mask = cv2.inRange(hsv, lower_hair, upper_hair) | |
# Change hair color to blonde (light yellow) | |
hsv[mask > 0] = (30, 255, 200) | |
# Convert back to RGB color space | |
image_blonde = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) | |
return image_blonde | |
def add_noise(image): | |
# Convert to OpenCV format | |
image_np = np.array(image) | |
# Generate random noise | |
noise = np.random.normal(0, 25, image_np.shape).astype(np.uint8) | |
# Add noise to the image | |
noisy_image = cv2.add(image_np, noise) | |
return noisy_image | |
def correct_image_orientation(image): | |
try: | |
for orientation in ExifTags.TAGS.keys(): | |
if ExifTags.TAGS[orientation] == 'Orientation': | |
break | |
exif = image._getexif() | |
if exif is not None: | |
orientation = exif.get(orientation, 1) | |
if orientation == 3: | |
image = image.rotate(180, expand=True) | |
elif orientation == 6: | |
image = image.rotate(270, expand=True) | |
elif orientation == 8: | |
image = image.rotate(90, expand=True) | |
except (AttributeError, KeyError, IndexError): | |
pass | |
return image | |
uploaded_file = st.file_uploader("μ΄λ―Έμ§λ₯Ό μ λ‘λνμΈμ...", type=["jpg", "png", "jpeg"]) | |
if uploaded_file is not None: | |
image = Image.open(uploaded_file) | |
image = correct_image_orientation(image) | |
st.write("μ΄λ―Έμ§ μ²λ¦¬ μ€...") | |
# Save the original image as a numpy array | |
image_np = np.array(image) | |
col1, col2 = st.columns(2) | |
with col1: | |
st.image(image, use_column_width=True) | |
st.markdown('<div class="custom-caption-1">μ λ‘λν μ΄λ―Έμ§</div>', unsafe_allow_html=True) | |
with col2: | |
st.image(image, use_column_width=True) | |
st.markdown('<div class="custom-caption-1">νν°λ₯Ό μ ν μ΄λ―Έμ§</div>', unsafe_allow_html=True) | |
button_clicked = st.button("μλ¨μ λ μ¬μ§μ λ₯νμ΄ν¬ λͺ¨λΈμ νμ΅μν€κΈ°") | |
st.markdown('<p class="survey">μ μλΉμ€λ₯Ό μ¬μ©ν΄ λ³΄μ ¨κ±°λ, μ ν¬ κΈ°μ μ μ리μ κ΄μ¬μ΄ μμΌμ λΆλ€κ»μ μλμ κ°λ¨ν μΈν°λ·°μ μ°Έμ¬ν΄ μ£Όμλ©΄ μ§μ¬μΌλ‘ κ°μ¬λλ¦¬κ² μ΅λλ€.</p>', unsafe_allow_html=True) | |
st.markdown('<p class="survey-1"><a href="https://docs.google.com/forms/d/e/1FAIpQLSdzRtuvQyp3CQDhlxEag40v2yDM7u9NYpJ2gv5kgwuNbo1gUA/viewform?usp=sf_link" target="_blank" class="a-tag">μ¬κΈ°λ₯Ό ν΄λ¦νμ¬ μΈν°λ·°μ μν΄ μ£Όμ λ€λ©΄ ν° λμμ΄ λ κ² κ°μ΅λλ€!!</a></p>', unsafe_allow_html=True) | |
st.markdown('<p class="survey-2">μλΉμ€λ₯Ό μ΄μ©ν΄ μ£Όμ μ κ°μ¬ν©λλ€! μ’μ ν루 보λ΄μΈμ!</p>', unsafe_allow_html=True) | |
if button_clicked: | |
with col1: | |
processed_image = change_hair_to_blonde(image) | |
st.image(processed_image, use_column_width=True) | |
st.markdown('<div class="custom-caption-2">μλ³Έ μ΄λ―Έμ§λ₯Ό λ₯νμ΄ν¬ λͺ¨λΈμ λ£μμ κ²½μ°</div>', unsafe_allow_html=True) | |
st.markdown("<span>μ΄ν΄λ₯Ό λκΈ° μν΄ μ¬μ§μ λ Έλμμ μ νλ λ₯νμ΄ν¬ μκ³ λ¦¬μ¦ μ μ©. μλ³Έ μ΄λ―Έμ§λ λ₯νμ΄ν¬ μκ³ λ¦¬μ¦μ μν₯μ λ°μ.</span>", unsafe_allow_html=True) | |
with col2: | |
deepfake_image = add_noise(image) | |
st.image(deepfake_image, use_column_width=True) | |
st.markdown('<div class="custom-caption-2">μ¬μ λ°©μ§ νν° μ΄λ―Έμ§λ₯Ό λ₯νμ΄ν¬ λͺ¨λΈμ λ£μμ κ²½μ°</div>', unsafe_allow_html=True) | |
st.markdown("<span>μ¬μ λ°©μ§ νν°λ₯Ό μ ν μ΄λ―Έμ§λ λ₯νμ΄ν¬ μκ³ λ¦¬μ¦μ μν₯μ λ°μ§ μκ³ λ Έμ΄μ¦ μ²λ¦¬κ° λμ΄ μμ보기 νλ μ¬μ§μ μΆλ ₯. μ¦, λ₯νμ΄ν¬ μ¬μ§ ν©μ±μ λ°©ν΄ν¨.</span>", unsafe_allow_html=True) | |