File size: 9,211 Bytes
bbe1ed5 f586132 c98abc8 f586132 f5f4f69 f586132 f8f00d1 e1371e7 f8f00d1 11301ec f8f00d1 e1371e7 f8f00d1 f586132 03db935 f8f00d1 fc729f5 f8f00d1 03db935 f8f00d1 03db935 f586132 03db935 1a1812a 03db935 f586132 f8f00d1 a2ec5a9 03db935 a2ec5a9 fc729f5 03db935 a2ec5a9 03db935 f586132 6b14869 03db935 6b14869 03db935 f8f00d1 03db935 f8f00d1 03db935 f8f00d1 03db935 1a1812a f586132 03db935 fc729f5 03db935 f586132 f8f00d1 bbe1ed5 e1f10a7 f586132 e1f10a7 f586132 d34cf4e e1f10a7 f586132 ae4d776 f586132 ae4d776 f586132 03db935 8b878c9 f586132 03db935 e1371e7 a3956de f586132 11301ec 8b878c9 a2ed5c3 11301ec a3956de 11301ec f5f4f69 11301ec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
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")
# λλ¨Έμ§ 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("")
st.markdown("<span style='font-size: 18px;'>μ§ν κ³Όμ 1. μ¬λ μ΄λ―Έμ§λ₯Ό μ
λ‘λνλ©΄, μ¬μ λ°©μ§ νν°κ° μ μ©λ μ΄λ―Έμ§λ₯Ό 보μ¬λ립λλ€.</span>", unsafe_allow_html=True)
st.markdown("<span style='font-size: 18px;'>μ§ν κ³Όμ 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;'> *μ¬μ λ°©μ§ νν°λ: μ¬μ§μ λ―ΈμΈν λ³νλ₯Ό μ£Όμ΄ λ₯νμ΄ν¬ λͺ¨λΈμ νμ΅λμ§ λͺ»νλλ‘ λ°©ν΄νλ νν°.</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,
.custom-caption-3,
.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;
}
.custom-caption-3 {
font-size: 30px;
# 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;
}
.custom-caption-3 {
font-size: 20px;
padding: 0 0 20px 0;
}
.stButton button {
width: 100%;
font-size: 18px;
}
}
</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)
st.markdown('<div class="custom-caption-1">νν°λ₯Ό μ
ν μ΄λ―Έμ§λ μ‘μμΌλ‘ λ΄€μλ, ν° μ°¨μ΄κ° μμ</div>', unsafe_allow_html=True)
button_clicked = st.button("λ₯νμ΄ν¬ μ μ©νκΈ°")
col3, col4 = st.columns(2)
if button_clicked:
processed_image = change_hair_to_blonde(image)
deepfake_image = add_noise(image)
else:
processed_image = None
deepfake_image = None
if processed_image is not None and deepfake_image is not None:
with col3:
st.image(processed_image, use_column_width=True)
st.markdown('<div class="custom-caption-2">μλ³Έ μ΄λ―Έμ§λ‘ λ₯νμ΄ν¬λ₯Ό μ μν κ²½μ°</div>', unsafe_allow_html=True)
st.markdown('<div class="custom-caption-3">μ΄ν΄λ₯Ό λκΈ° μν΄ μ¬μ§μ λ
Έλμμ μ
νλ λ₯νμ΄ν¬ μκ³ λ¦¬μ¦ μ μ©. μλ³Έ μ΄λ―Έμ§λ λ₯νμ΄ν¬ μκ³ λ¦¬μ¦μ μν₯μ λ°μ.</div>', unsafe_allow_html=True)
with col4:
st.image(deepfake_image, use_column_width=True)
st.markdown('<div class="custom-caption-2">λ°©μ§ νν° μ΄λ―Έμ§λ‘ λ₯νμ΄ν¬λ₯Ό μ μν κ²½μ°</div>', unsafe_allow_html=True)
st.markdown('<div class="custom-caption-3">λ°©μ§ νν°λ₯Ό μ
ν μ΄λ―Έμ§λ λ₯νμ΄ν¬μ μν₯μ λ°μ§ μκ³ μμ보기 νλ μ¬μ§μ μΆλ ₯ν¨μΌλ‘μ¨ μ΄λ―Έμ§λ₯Ό 보νΈν¨.</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) |