|
import streamlit as st |
|
import streamlit.components.v1 as components |
|
import cv2 |
|
import numpy as np |
|
from PIL import Image, ExifTags |
|
|
|
|
|
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> |
|
""" |
|
|
|
|
|
components.html(ga_code, height=0) |
|
|
|
|
|
css = """ |
|
<style> |
|
.container { |
|
display: grid; |
|
grid-template-columns: 1fr 1fr; |
|
gap: 20px; |
|
align-items: center; |
|
justify-items: center; |
|
} |
|
|
|
.custom-caption-1, .custom-caption-2 { |
|
font-size: 20px; |
|
font-weight: bold; |
|
text-align: center; |
|
margin-top: 10px; |
|
color: white; |
|
} |
|
|
|
@media only screen and (max-width: 768px) { |
|
.container { |
|
grid-template-columns: 1fr; |
|
} |
|
|
|
.custom-caption-1, .custom-caption-2 { |
|
font-size: 16px; |
|
} |
|
} |
|
</style> |
|
""" |
|
|
|
|
|
st.markdown(css, unsafe_allow_html=True) |
|
|
|
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) |
|
|
|
def change_hair_to_blonde(image): |
|
|
|
image = np.array(image) |
|
|
|
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) |
|
|
|
|
|
lower_hair = np.array([0, 0, 0]) |
|
upper_hair = np.array([180, 255, 30]) |
|
|
|
|
|
mask = cv2.inRange(hsv, lower_hair, upper_hair) |
|
|
|
|
|
hsv[mask > 0] = (30, 255, 200) |
|
|
|
|
|
image_blonde = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB) |
|
return image_blonde |
|
|
|
def add_noise(image): |
|
|
|
image_np = np.array(image) |
|
|
|
noise = np.random.normal(0, 25, image_np.shape).astype(np.uint8) |
|
|
|
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("μ΄λ―Έμ§ μ²λ¦¬ μ€...") |
|
|
|
|
|
image_np = np.array(image) |
|
|
|
st.markdown('<div class="container">', unsafe_allow_html=True) |
|
|
|
st.markdown('<div>', unsafe_allow_html=True) |
|
st.image(image, use_column_width=True) |
|
st.markdown('<div class="custom-caption-1">μ
λ‘λν μ΄λ―Έμ§</div>', unsafe_allow_html=True) |
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
st.markdown('<div>', unsafe_allow_html=True) |
|
st.image(image, use_column_width=True) |
|
st.markdown('<div class="custom-caption-1">νν°λ₯Ό μ
ν μ΄λ―Έμ§</div>', unsafe_allow_html=True) |
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
button_clicked = st.button("μλ¨μ λ μ¬μ§μ λ₯νμ΄ν¬ λͺ¨λΈμ νμ΅μν€κΈ°") |
|
|
|
if button_clicked: |
|
st.markdown('<div class="container">', unsafe_allow_html=True) |
|
|
|
st.markdown('<div>', unsafe_allow_html=True) |
|
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) |
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
st.markdown('<div>', unsafe_allow_html=True) |
|
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) |
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
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) |
|
|