Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -471,6 +471,11 @@ footer {
|
|
| 471 |
.btn {
|
| 472 |
display: flex;
|
| 473 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 474 |
"""])
|
| 475 |
|
| 476 |
|
|
@@ -492,7 +497,6 @@ def easy_scaler(img):
|
|
| 492 |
return upscaler(img)
|
| 493 |
|
| 494 |
def handle_upscaler(img):
|
| 495 |
-
|
| 496 |
w, h = img.size
|
| 497 |
if w*h > 2 * (10 ** 6):
|
| 498 |
return hard_scaler(img)
|
|
@@ -538,7 +542,6 @@ def upscaler(
|
|
| 538 |
)
|
| 539 |
|
| 540 |
log(f'RET upscaler')
|
| 541 |
-
|
| 542 |
return enhanced_image
|
| 543 |
|
| 544 |
def get_tensor_length(tensor):
|
|
@@ -551,7 +554,7 @@ def get_tensor_length(tensor):
|
|
| 551 |
def _summarize(text):
|
| 552 |
log(f'CALL _summarize')
|
| 553 |
prefix = "summarize: "
|
| 554 |
-
toks = tokenizer.encode(
|
| 555 |
gen = model.generate(
|
| 556 |
toks,
|
| 557 |
length_penalty=0.1,
|
|
@@ -572,9 +575,7 @@ def summarize(text, max_words=100):
|
|
| 572 |
if words_length >= 510:
|
| 573 |
while words_length >= 510:
|
| 574 |
words = text.split()
|
| 575 |
-
|
| 576 |
-
" ".join(words[0:510])
|
| 577 |
-
) + " ".join(words[510:])
|
| 578 |
if summ == text:
|
| 579 |
return text
|
| 580 |
text = summ
|
|
@@ -597,7 +598,6 @@ def generate_random_string(length):
|
|
| 597 |
def add_text_above_image(img,top_title=None,bottom_title=None):
|
| 598 |
|
| 599 |
w, h = img.size
|
| 600 |
-
|
| 601 |
draw = ImageDraw.Draw(img,mode="RGBA")
|
| 602 |
|
| 603 |
labels_distance = 1/3
|
|
@@ -610,7 +610,15 @@ def add_text_above_image(img,top_title=None,bottom_title=None):
|
|
| 610 |
x = math.ceil((w - textwidth) / 2)
|
| 611 |
y = h - (textheight * rows / 2) - (h / 2)
|
| 612 |
y = math.ceil(y - (h / 2 * labels_distance))
|
| 613 |
-
draw.text(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 614 |
|
| 615 |
if bottom_title:
|
| 616 |
rows = len(bottom_title.split("\n"))
|
|
@@ -620,7 +628,15 @@ def add_text_above_image(img,top_title=None,bottom_title=None):
|
|
| 620 |
x = math.ceil((w - textwidth) / 2)
|
| 621 |
y = h - (textheight * rows / 2) - (h / 2)
|
| 622 |
y = math.ceil(y + (h / 2 * labels_distance))
|
| 623 |
-
draw.text(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 624 |
|
| 625 |
return img
|
| 626 |
|
|
@@ -769,10 +785,6 @@ class BaseError(Exception):
|
|
| 769 |
"""
|
| 770 |
|
| 771 |
def __init__(self, val, message):
|
| 772 |
-
"""
|
| 773 |
-
@param val: actual value
|
| 774 |
-
@param message: message shown to the user
|
| 775 |
-
"""
|
| 776 |
self.val = val
|
| 777 |
self.message = message
|
| 778 |
super().__init__()
|
|
@@ -866,7 +878,6 @@ class RequestError(Exception):
|
|
| 866 |
return self.message
|
| 867 |
|
| 868 |
|
| 869 |
-
|
| 870 |
class TooManyRequests(Exception):
|
| 871 |
"""
|
| 872 |
exception thrown if an error occurred during the request call, e.g a connection problem.
|
|
@@ -884,6 +895,7 @@ class TooManyRequests(Exception):
|
|
| 884 |
def __str__(self):
|
| 885 |
return self.message
|
| 886 |
|
|
|
|
| 887 |
class ServerException(Exception):
|
| 888 |
"""
|
| 889 |
Default YandexTranslate exception from the official website
|
|
@@ -913,14 +925,7 @@ def is_empty(text: str) -> bool:
|
|
| 913 |
|
| 914 |
def request_failed(status_code: int) -> bool:
|
| 915 |
"""Check if a request has failed or not.
|
| 916 |
-
A request is considered
|
| 917 |
-
|
| 918 |
-
Args:
|
| 919 |
-
status_code (int): status code of the request
|
| 920 |
-
|
| 921 |
-
Returns:
|
| 922 |
-
bool: indicates request failure
|
| 923 |
-
"""
|
| 924 |
if status_code > 299 or status_code < 200:
|
| 925 |
return True
|
| 926 |
return False
|
|
@@ -936,12 +941,10 @@ def is_input_valid(
|
|
| 936 |
@param text: text to translate
|
| 937 |
@return: bool
|
| 938 |
"""
|
| 939 |
-
|
| 940 |
if not isinstance(text, str):
|
| 941 |
raise NotValidPayload(text)
|
| 942 |
if max_chars and (not min_chars <= len(text) < max_chars):
|
| 943 |
raise NotValidLength(text, min_chars, max_chars)
|
| 944 |
-
|
| 945 |
return True
|
| 946 |
|
| 947 |
class BaseTranslator(ABC):
|
|
@@ -1037,7 +1040,7 @@ class BaseTranslator(ABC):
|
|
| 1037 |
"""
|
| 1038 |
check if the language is supported by the translator
|
| 1039 |
@param language: a string for 1 language
|
| 1040 |
-
@return: bool
|
| 1041 |
"""
|
| 1042 |
if (
|
| 1043 |
language == "auto"
|
|
@@ -1061,12 +1064,10 @@ class BaseTranslator(ABC):
|
|
| 1061 |
|
| 1062 |
def _read_docx(self, f: str):
|
| 1063 |
import docx2txt
|
| 1064 |
-
|
| 1065 |
return docx2txt.process(f)
|
| 1066 |
|
| 1067 |
def _read_pdf(self, f: str):
|
| 1068 |
import pypdf
|
| 1069 |
-
|
| 1070 |
reader = pypdf.PdfReader(f)
|
| 1071 |
page = reader.pages[0]
|
| 1072 |
return page.extract_text()
|
|
@@ -1090,7 +1091,6 @@ class BaseTranslator(ABC):
|
|
| 1090 |
|
| 1091 |
if ext == ".docx":
|
| 1092 |
text = self._read_docx(f=str(path))
|
| 1093 |
-
|
| 1094 |
elif ext == ".pdf":
|
| 1095 |
text = self._read_pdf(f=str(path))
|
| 1096 |
else:
|
|
@@ -1176,6 +1176,7 @@ class GoogleTranslator(BaseTranslator):
|
|
| 1176 |
element = soup.find(self._element_tag, self._alt_element_query)
|
| 1177 |
if not element:
|
| 1178 |
raise TranslationNotFound(text)
|
|
|
|
| 1179 |
if element.get_text(strip=True) == text.strip():
|
| 1180 |
to_translate_alpha = "".join(
|
| 1181 |
ch for ch in text.strip() if ch.isalnum()
|
|
@@ -1246,22 +1247,20 @@ def translate(txt,to_lang="en",from_lang="auto"):
|
|
| 1246 |
return translation.lower()
|
| 1247 |
|
| 1248 |
def handle_generation(h,w,d):
|
| 1249 |
-
|
| 1250 |
log(f'CALL handle_generate')
|
| 1251 |
-
|
| 1252 |
difficulty_points = 0
|
| 1253 |
|
| 1254 |
-
toks_len = get_tensor_length(tokenizer.encode(
|
| 1255 |
if toks_len > 500:
|
| 1256 |
-
difficulty_points
|
| 1257 |
elif toks_len > 50:
|
| 1258 |
-
difficulty_points
|
| 1259 |
|
| 1260 |
pxs = h*w
|
| 1261 |
if pxs > 2 * (10 ** 6):
|
| 1262 |
-
difficulty_points
|
| 1263 |
elif pxs > 1 * (10 ** 6):
|
| 1264 |
-
difficulty_points
|
| 1265 |
|
| 1266 |
if difficulty_points < 2:
|
| 1267 |
return easy_generation(h,w,d)
|
|
@@ -1283,7 +1282,6 @@ def hard_generation(h,w,d):
|
|
| 1283 |
return generation(h,w,d)
|
| 1284 |
|
| 1285 |
def generation(h,w,d):
|
| 1286 |
-
|
| 1287 |
if len(d) > 0:
|
| 1288 |
d = re.sub(r",( ){1,}",". ",d)
|
| 1289 |
d_lines = re.split(r"([\n]){1,}", d)
|
|
@@ -1295,12 +1293,11 @@ def generation(h,w,d):
|
|
| 1295 |
d = " ".join(d_lines)
|
| 1296 |
|
| 1297 |
d = re.sub(r"([ \t]){1,}", " ", d).lower().strip()
|
| 1298 |
-
d = d if d == "" else summarize(translate(d),max_words=50)
|
| 1299 |
d = re.sub(r"([ \t]){1,}", " ", d)
|
| 1300 |
d = re.sub(r"(\. \.)", ".", d)
|
| 1301 |
|
| 1302 |
neg = f"Textual, Text, Signs, Labels, Titles, Unreal, Exceptional, Irregular, Unusual, Blurry, Smoothed, Polished, Worst Quality, Worse Quality, Painted, Movies Quality."
|
| 1303 |
-
q = "\""
|
| 1304 |
pos = f'Accurate, Detailed, Realistic.{ "" if d == "" else " " + d }'
|
| 1305 |
|
| 1306 |
print(f"""
|
|
@@ -1321,15 +1318,15 @@ def generation(h,w,d):
|
|
| 1321 |
max_sequence_length=seq,
|
| 1322 |
generator=torch.Generator(device).manual_seed(random.randint(0, MAX_SEED))
|
| 1323 |
).images[0]
|
| 1324 |
-
|
| 1325 |
return img
|
| 1326 |
-
|
| 1327 |
# entry
|
| 1328 |
|
| 1329 |
if __name__ == "__main__":
|
| 1330 |
-
|
|
|
|
| 1331 |
gr.Markdown(f"""
|
| 1332 |
-
#
|
| 1333 |
""")
|
| 1334 |
gr.Markdown(f"""
|
| 1335 |
### Realistic. Upscalable. Multilingual.
|
|
@@ -1337,7 +1334,6 @@ if __name__ == "__main__":
|
|
| 1337 |
|
| 1338 |
with gr.Row():
|
| 1339 |
with gr.Column(scale=2):
|
| 1340 |
-
|
| 1341 |
height = gr.Slider(
|
| 1342 |
label="Height (px)",
|
| 1343 |
minimum=512,
|
|
@@ -1345,7 +1341,6 @@ if __name__ == "__main__":
|
|
| 1345 |
step=16,
|
| 1346 |
value=1024,
|
| 1347 |
)
|
| 1348 |
-
|
| 1349 |
width = gr.Slider(
|
| 1350 |
label="Width (px)",
|
| 1351 |
minimum=512,
|
|
@@ -1354,7 +1349,7 @@ if __name__ == "__main__":
|
|
| 1354 |
value=1024,
|
| 1355 |
)
|
| 1356 |
|
| 1357 |
-
run = gr.Button("Generate",elem_classes="btn")
|
| 1358 |
|
| 1359 |
top = gr.Textbox(
|
| 1360 |
placeholder="Top title",
|
|
@@ -1370,21 +1365,51 @@ if __name__ == "__main__":
|
|
| 1370 |
)
|
| 1371 |
|
| 1372 |
data = gr.Textbox(
|
| 1373 |
-
placeholder="Input data",
|
| 1374 |
value="",
|
| 1375 |
container=False,
|
| 1376 |
max_lines=100
|
| 1377 |
)
|
| 1378 |
|
| 1379 |
with gr.Column():
|
| 1380 |
-
cover = gr.Image(
|
| 1381 |
-
|
| 1382 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1383 |
|
|
|
|
| 1384 |
gr.on(
|
| 1385 |
triggers=[run.click],
|
| 1386 |
fn=handle_generation,
|
| 1387 |
-
inputs=[height,width,data],
|
| 1388 |
outputs=[cover]
|
| 1389 |
)
|
| 1390 |
upscale_now.click(
|
|
@@ -1394,7 +1419,7 @@ if __name__ == "__main__":
|
|
| 1394 |
)
|
| 1395 |
add_titles.click(
|
| 1396 |
fn=add_text_above_image,
|
| 1397 |
-
inputs=[cover,top,bottom],
|
| 1398 |
outputs=[cover]
|
| 1399 |
)
|
| 1400 |
|
|
|
|
| 471 |
.btn {
|
| 472 |
display: flex;
|
| 473 |
}
|
| 474 |
+
|
| 475 |
+
/* Added background gradient for a more colorful look */
|
| 476 |
+
.gradio-container {
|
| 477 |
+
background: linear-gradient(to right, #ffecd2, #fcb69f) !important;
|
| 478 |
+
}
|
| 479 |
"""])
|
| 480 |
|
| 481 |
|
|
|
|
| 497 |
return upscaler(img)
|
| 498 |
|
| 499 |
def handle_upscaler(img):
|
|
|
|
| 500 |
w, h = img.size
|
| 501 |
if w*h > 2 * (10 ** 6):
|
| 502 |
return hard_scaler(img)
|
|
|
|
| 542 |
)
|
| 543 |
|
| 544 |
log(f'RET upscaler')
|
|
|
|
| 545 |
return enhanced_image
|
| 546 |
|
| 547 |
def get_tensor_length(tensor):
|
|
|
|
| 554 |
def _summarize(text):
|
| 555 |
log(f'CALL _summarize')
|
| 556 |
prefix = "summarize: "
|
| 557 |
+
toks = tokenizer.encode(prefix + text, return_tensors="pt", truncation=False)
|
| 558 |
gen = model.generate(
|
| 559 |
toks,
|
| 560 |
length_penalty=0.1,
|
|
|
|
| 575 |
if words_length >= 510:
|
| 576 |
while words_length >= 510:
|
| 577 |
words = text.split()
|
| 578 |
+
summ = _summarize(" ".join(words[0:510])) + " ".join(words[510:])
|
|
|
|
|
|
|
| 579 |
if summ == text:
|
| 580 |
return text
|
| 581 |
text = summ
|
|
|
|
| 598 |
def add_text_above_image(img,top_title=None,bottom_title=None):
|
| 599 |
|
| 600 |
w, h = img.size
|
|
|
|
| 601 |
draw = ImageDraw.Draw(img,mode="RGBA")
|
| 602 |
|
| 603 |
labels_distance = 1/3
|
|
|
|
| 610 |
x = math.ceil((w - textwidth) / 2)
|
| 611 |
y = h - (textheight * rows / 2) - (h / 2)
|
| 612 |
y = math.ceil(y - (h / 2 * labels_distance))
|
| 613 |
+
draw.text(
|
| 614 |
+
(x, y),
|
| 615 |
+
top_title,
|
| 616 |
+
(255,255,255),
|
| 617 |
+
font=font,
|
| 618 |
+
spacing=2,
|
| 619 |
+
stroke_width=math.ceil(textheight/20),
|
| 620 |
+
stroke_fill=(0,0,0)
|
| 621 |
+
)
|
| 622 |
|
| 623 |
if bottom_title:
|
| 624 |
rows = len(bottom_title.split("\n"))
|
|
|
|
| 628 |
x = math.ceil((w - textwidth) / 2)
|
| 629 |
y = h - (textheight * rows / 2) - (h / 2)
|
| 630 |
y = math.ceil(y + (h / 2 * labels_distance))
|
| 631 |
+
draw.text(
|
| 632 |
+
(x, y),
|
| 633 |
+
bottom_title,
|
| 634 |
+
(0,0,0),
|
| 635 |
+
font=font,
|
| 636 |
+
spacing=2,
|
| 637 |
+
stroke_width=math.ceil(textheight/20),
|
| 638 |
+
stroke_fill=(255,255,255)
|
| 639 |
+
)
|
| 640 |
|
| 641 |
return img
|
| 642 |
|
|
|
|
| 785 |
"""
|
| 786 |
|
| 787 |
def __init__(self, val, message):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 788 |
self.val = val
|
| 789 |
self.message = message
|
| 790 |
super().__init__()
|
|
|
|
| 878 |
return self.message
|
| 879 |
|
| 880 |
|
|
|
|
| 881 |
class TooManyRequests(Exception):
|
| 882 |
"""
|
| 883 |
exception thrown if an error occurred during the request call, e.g a connection problem.
|
|
|
|
| 895 |
def __str__(self):
|
| 896 |
return self.message
|
| 897 |
|
| 898 |
+
|
| 899 |
class ServerException(Exception):
|
| 900 |
"""
|
| 901 |
Default YandexTranslate exception from the official website
|
|
|
|
| 925 |
|
| 926 |
def request_failed(status_code: int) -> bool:
|
| 927 |
"""Check if a request has failed or not.
|
| 928 |
+
A request is considered successful if the status code is in the 2** range."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 929 |
if status_code > 299 or status_code < 200:
|
| 930 |
return True
|
| 931 |
return False
|
|
|
|
| 941 |
@param text: text to translate
|
| 942 |
@return: bool
|
| 943 |
"""
|
|
|
|
| 944 |
if not isinstance(text, str):
|
| 945 |
raise NotValidPayload(text)
|
| 946 |
if max_chars and (not min_chars <= len(text) < max_chars):
|
| 947 |
raise NotValidLength(text, min_chars, max_chars)
|
|
|
|
| 948 |
return True
|
| 949 |
|
| 950 |
class BaseTranslator(ABC):
|
|
|
|
| 1040 |
"""
|
| 1041 |
check if the language is supported by the translator
|
| 1042 |
@param language: a string for 1 language
|
| 1043 |
+
@return: bool
|
| 1044 |
"""
|
| 1045 |
if (
|
| 1046 |
language == "auto"
|
|
|
|
| 1064 |
|
| 1065 |
def _read_docx(self, f: str):
|
| 1066 |
import docx2txt
|
|
|
|
| 1067 |
return docx2txt.process(f)
|
| 1068 |
|
| 1069 |
def _read_pdf(self, f: str):
|
| 1070 |
import pypdf
|
|
|
|
| 1071 |
reader = pypdf.PdfReader(f)
|
| 1072 |
page = reader.pages[0]
|
| 1073 |
return page.extract_text()
|
|
|
|
| 1091 |
|
| 1092 |
if ext == ".docx":
|
| 1093 |
text = self._read_docx(f=str(path))
|
|
|
|
| 1094 |
elif ext == ".pdf":
|
| 1095 |
text = self._read_pdf(f=str(path))
|
| 1096 |
else:
|
|
|
|
| 1176 |
element = soup.find(self._element_tag, self._alt_element_query)
|
| 1177 |
if not element:
|
| 1178 |
raise TranslationNotFound(text)
|
| 1179 |
+
|
| 1180 |
if element.get_text(strip=True) == text.strip():
|
| 1181 |
to_translate_alpha = "".join(
|
| 1182 |
ch for ch in text.strip() if ch.isalnum()
|
|
|
|
| 1247 |
return translation.lower()
|
| 1248 |
|
| 1249 |
def handle_generation(h,w,d):
|
|
|
|
| 1250 |
log(f'CALL handle_generate')
|
|
|
|
| 1251 |
difficulty_points = 0
|
| 1252 |
|
| 1253 |
+
toks_len = get_tensor_length(tokenizer.encode(d, return_tensors="pt", truncation=False))
|
| 1254 |
if toks_len > 500:
|
| 1255 |
+
difficulty_points += 2
|
| 1256 |
elif toks_len > 50:
|
| 1257 |
+
difficulty_points += 1
|
| 1258 |
|
| 1259 |
pxs = h*w
|
| 1260 |
if pxs > 2 * (10 ** 6):
|
| 1261 |
+
difficulty_points += 2
|
| 1262 |
elif pxs > 1 * (10 ** 6):
|
| 1263 |
+
difficulty_points += 1
|
| 1264 |
|
| 1265 |
if difficulty_points < 2:
|
| 1266 |
return easy_generation(h,w,d)
|
|
|
|
| 1282 |
return generation(h,w,d)
|
| 1283 |
|
| 1284 |
def generation(h,w,d):
|
|
|
|
| 1285 |
if len(d) > 0:
|
| 1286 |
d = re.sub(r",( ){1,}",". ",d)
|
| 1287 |
d_lines = re.split(r"([\n]){1,}", d)
|
|
|
|
| 1293 |
d = " ".join(d_lines)
|
| 1294 |
|
| 1295 |
d = re.sub(r"([ \t]){1,}", " ", d).lower().strip()
|
| 1296 |
+
d = d if d == "" else summarize(translate(d), max_words=50)
|
| 1297 |
d = re.sub(r"([ \t]){1,}", " ", d)
|
| 1298 |
d = re.sub(r"(\. \.)", ".", d)
|
| 1299 |
|
| 1300 |
neg = f"Textual, Text, Signs, Labels, Titles, Unreal, Exceptional, Irregular, Unusual, Blurry, Smoothed, Polished, Worst Quality, Worse Quality, Painted, Movies Quality."
|
|
|
|
| 1301 |
pos = f'Accurate, Detailed, Realistic.{ "" if d == "" else " " + d }'
|
| 1302 |
|
| 1303 |
print(f"""
|
|
|
|
| 1318 |
max_sequence_length=seq,
|
| 1319 |
generator=torch.Generator(device).manual_seed(random.randint(0, MAX_SEED))
|
| 1320 |
).images[0]
|
|
|
|
| 1321 |
return img
|
| 1322 |
+
|
| 1323 |
# entry
|
| 1324 |
|
| 1325 |
if __name__ == "__main__":
|
| 1326 |
+
# Changed the theme to a more colorful one and updated the title
|
| 1327 |
+
with gr.Blocks(theme=gr.themes.Soft(primary_hue="lime"), css=css) as demo:
|
| 1328 |
gr.Markdown(f"""
|
| 1329 |
+
# Multilingual Images
|
| 1330 |
""")
|
| 1331 |
gr.Markdown(f"""
|
| 1332 |
### Realistic. Upscalable. Multilingual.
|
|
|
|
| 1334 |
|
| 1335 |
with gr.Row():
|
| 1336 |
with gr.Column(scale=2):
|
|
|
|
| 1337 |
height = gr.Slider(
|
| 1338 |
label="Height (px)",
|
| 1339 |
minimum=512,
|
|
|
|
| 1341 |
step=16,
|
| 1342 |
value=1024,
|
| 1343 |
)
|
|
|
|
| 1344 |
width = gr.Slider(
|
| 1345 |
label="Width (px)",
|
| 1346 |
minimum=512,
|
|
|
|
| 1349 |
value=1024,
|
| 1350 |
)
|
| 1351 |
|
| 1352 |
+
run = gr.Button("Generate", elem_classes="btn")
|
| 1353 |
|
| 1354 |
top = gr.Textbox(
|
| 1355 |
placeholder="Top title",
|
|
|
|
| 1365 |
)
|
| 1366 |
|
| 1367 |
data = gr.Textbox(
|
| 1368 |
+
placeholder="Input data (text/prompt)",
|
| 1369 |
value="",
|
| 1370 |
container=False,
|
| 1371 |
max_lines=100
|
| 1372 |
)
|
| 1373 |
|
| 1374 |
with gr.Column():
|
| 1375 |
+
cover = gr.Image(
|
| 1376 |
+
interactive=False,
|
| 1377 |
+
container=False,
|
| 1378 |
+
elem_classes="image-container",
|
| 1379 |
+
label="Result",
|
| 1380 |
+
show_label=True,
|
| 1381 |
+
type='pil',
|
| 1382 |
+
show_share_button=False
|
| 1383 |
+
)
|
| 1384 |
+
upscale_now = gr.Button("Upscale x2", elem_classes="btn")
|
| 1385 |
+
add_titles = gr.Button("Add title(s)", elem_classes="btn")
|
| 1386 |
+
|
| 1387 |
+
gr.Markdown("---")
|
| 1388 |
+
|
| 1389 |
+
# Bottom row explanation or details
|
| 1390 |
+
gr.Markdown("""
|
| 1391 |
+
## ๊ธฐ๋ฅ ์ธ๋ถ ์ค๋ช
(Features)
|
| 1392 |
+
1. **ํ
์คํธ ์
๋ ฅ**: ๋ค์ํ ์ธ์ด๋ก ํ
์คํธ ์
๋ ฅ ์ ์๋ ๋ฒ์ญ ๋ฐ ์์ฝ ํ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
|
| 1393 |
+
2. **์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ **: ์ฌ๋ผ์ด๋๋ฅผ ํตํด ์์ฑ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
|
| 1394 |
+
3. **์ค๋ฒ๋ ์ด ํ
์คํธ**: ์ด๋ฏธ์ง ์์ ์๋จ/ํ๋จ ํ์ดํ์ ์ถ๊ฐํ์ฌ ๊ฐ๋จํ ๋ผ๋ฒจ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
|
| 1395 |
+
4. **๊ณ ํ์ง ์
์ค์ผ์ผ**: 'Upscale x2' ๋ฒํผ์ ํตํด ์ด๋ฏธ์ง ํ์ง์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
|
| 1396 |
+
5. **์๋ ์์ฑ ๋์ด๋ ์กฐ์ **: ์
๋ ฅ ํ
์คํธ์ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋ฐ๋ผ GPU ์ฌ์ฉ์๊ฐ์ด ์๋์ผ๋ก ์กฐ์ ๋ฉ๋๋ค.
|
| 1397 |
+
---
|
| 1398 |
+
""")
|
| 1399 |
+
|
| 1400 |
+
gr.Markdown("""
|
| 1401 |
+
### ์ด์ฉ ๊ฐ์ด๋
|
| 1402 |
+
1. ์ํ๋ ์ด๋ฏธ์ง ์ฌ์ด์ฆ์ ํ
์คํธ(๋ค๊ตญ์ด ๊ฐ๋ฅ)๋ฅผ ์
๋ ฅ ํ **Generate** ๋ฒํผ์ ํด๋ฆญํ์ธ์.
|
| 1403 |
+
2. ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ๋ค, **Upscale x2** ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ ๋์ ํด์๋๋ก ์
์ค์ผ์ผ ๋ฉ๋๋ค.
|
| 1404 |
+
3. **Add title(s)** ๋ฒํผ์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง ์์ ํ์ดํ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
|
| 1405 |
+
4. ๊ธฐ๋ฅ ์ธ๋ถ ์ค๋ช
์ ์๋จ์ ์
๋ ฅํญ๋ชฉ๋ค์ ํตํด ํ
์คํธํด ๋ณด์๋ฉด ๋ฉ๋๋ค.
|
| 1406 |
+
""")
|
| 1407 |
|
| 1408 |
+
# Event wiring
|
| 1409 |
gr.on(
|
| 1410 |
triggers=[run.click],
|
| 1411 |
fn=handle_generation,
|
| 1412 |
+
inputs=[height, width, data],
|
| 1413 |
outputs=[cover]
|
| 1414 |
)
|
| 1415 |
upscale_now.click(
|
|
|
|
| 1419 |
)
|
| 1420 |
add_titles.click(
|
| 1421 |
fn=add_text_above_image,
|
| 1422 |
+
inputs=[cover, top, bottom],
|
| 1423 |
outputs=[cover]
|
| 1424 |
)
|
| 1425 |
|