Translate-Image / app.py
Omnibus's picture
Update app.py
c9672ed
raw
history blame
8.15 kB
import gradio as gr
import pandas as pd
import numpy as np
import easyocr
import torch
import cv2
import PIL
import sys
import os
from PIL import ImageFont, ImageDraw, Image
this=gr.Interface.load("spaces/Omnibus/Translate-100")
lang_id = {
"":"",
"Afrikaans": "af",
"Albanian": "sq",
"Amharic": "am",
"Arabic": "ar",
"Armenian": "hy",
"Asturian": "ast",
"Azerbaijani": "az",
"Bashkir": "ba",
"Belarusian": "be",
"Bulgarian": "bg",
"Bengali": "bn",
"Breton": "br",
"Bosnian": "bs",
"Burmese": "my",
"Catalan": "ca",
"Cebuano": "ceb",
"Chinese": "zh",
"Chinese (simplified)": "zh",
"Chinese (traditional)": "zh",
"Croatian": "hr",
"Czech": "cs",
"Danish": "da",
"Dutch": "nl",
"English": "en",
"Estonian": "et",
"Fulah": "ff",
"Finnish": "fi",
"French": "fr",
"Western Frisian": "fy",
"Gaelic": "gd",
"Galician": "gl",
"Georgian": "ka",
"German": "de",
"Greek": "el",
"Gujarati": "gu",
"Hausa": "ha",
"Hebrew": "he",
"Hindi": "hi",
"Haitian": "ht",
"Hungarian": "hu",
"Irish": "ga",
"Indonesian": "id",
"Igbo": "ig",
"Iloko": "ilo",
"Icelandic": "is",
"Italian": "it",
"Japanese": "ja",
"Javanese": "jv",
"Kazakh": "kk",
"Central Khmer": "km",
"Kannada": "kn",
"Korean": "ko",
"Luxembourgish": "lb",
"Ganda": "lg",
"Lingala": "ln",
"Lao": "lo",
"Lithuanian": "lt",
"Latvian": "lv",
"Malagasy": "mg",
"Macedonian": "mk",
"Malayalam": "ml",
"Mongolian": "mn",
"Marathi": "mr",
"Malay": "ms",
"Nepali": "ne",
"Norwegian": "no",
"Northern Sotho": "ns",
"Occitan": "oc",
"Oriya": "or",
"Panjabi": "pa",
"Persian": "fa",
"Polish": "pl",
"Pushto": "ps",
"Portuguese": "pt",
"Romanian": "ro",
"Russian": "ru",
"Sindhi": "sd",
"Sinhala": "si",
"Slovak": "sk",
"Slovenian": "sl",
"Spanish": "es",
"Somali": "so",
"Serbian": "sr",
"Serbian (cyrillic)": "sr",
"Serbian (latin)": "sr",
"Swati": "ss",
"Sundanese": "su",
"Swedish": "sv",
"Swahili": "sw",
"Tamil": "ta",
"Thai": "th",
"Tagalog": "tl",
"Tswana": "tn",
"Turkish": "tr",
"Ukrainian": "uk",
"Urdu": "ur",
"Uzbek": "uz",
"Vietnamese": "vi",
"Welsh": "cy",
"Wolof": "wo",
"Xhosa": "xh",
"Yiddish": "yi",
"Yoruba": "yo",
"Zulu": "zu",
}
ocr_id = {
"":"",
"Afrikaans": "af",
"Albanian": "sq",
"Arabic": "ar",
"Azerbaijani": "az",
"Belarusian": "be",
"Bulgarian": "bg",
"Bengali": "bn",
"Bosnian": "bs",
"Chinese (simplified)": "ch_sim",
"Chinese (traditional)": "ch_tra",
"Croatian": "hr",
"Czech": "cs",
"Danish": "da",
"Dutch": "nl",
"English": "en",
"Estonian": "et",
"French": "fr",
"German": "de",
"Irish": "ga",
"Hindi": "hi",
"Hungarian": "hu",
"Indonesian": "id",
"Icelandic": "is",
"Italian": "it",
"Japanese": "ja",
"Kannada": "kn",
"Korean": "ko",
"Lithuanian": "lt",
"Latvian": "lv",
"Mongolian": "mn",
"Marathi": "mr",
"Malay": "ms",
"Nepali": "ne",
"Norwegian": "no",
"Occitan": "oc",
"Polish": "pl",
"Portuguese": "pt",
"Romanian": "ro",
"Russian": "ru",
"Serbian (cyrillic)": "rs_cyrillic",
"Serbian (latin)": "rs_latin",
"Slovak": "sk",
"Slovenian": "sl",
"Spanish": "es",
"Swedish": "sv",
"Swahili": "sw",
"Tamil": "ta",
"Thai": "th",
"Tagalog": "tl",
"Turkish": "tr",
"Ukrainian": "uk",
"Urdu": "ur",
"Uzbek": "uz",
"Vietnamese": "vi",
"Welsh": "cy",
"Zulu": "zu",
}
def blur_im(img,bounds,target_lang,trans_lang):
im = cv2.imread(img)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
for bound in bounds:
if bound[2]>=0.3:
p0, p1, p2, p3 = bound[0]
x = int(p0[0])
y = int(p0[1])
w = int(p2[0]) - int(x)
h = int(p2[1]) - int(y)
kernel = np.ones((3, 3), np.uint8)
im[y:y+h, x:x+w] = cv2.dilate(im[y:y+h, x:x+w], kernel, iterations=3)
im[y:y+h, x:x+w] = cv2.GaussianBlur(im[y:y+h, x:x+w],(51,51),0)
else:
pass
im = Image.fromarray(im)
for bound in bounds:
if bound[2]>=0.3:
p0, p1, p2, p3 = bound[0]
x = int(p0[0])
y = int(p0[1])
w = int(p2[0]) - int(x)
h = int(p2[1]) - int(y)
draw = ImageDraw.Draw(im)
text = this(bound[1],target_lang,trans_lang)
'''
bw, bh = (w,h)
tw, th = draw.textsize(text)
drv_rat=(bw/tw)
if drv_rat >= 3:
rat = 0.1
elif drv_rat < 3 and drv_rat >= 2:
rat = 0.1
elif drv_rat < 2 and drv_rat >=1:
rat = 0.1
elif drv_rat < 1:
rat = 0.1
#print(drv_rat)
#print(rat)
#print(float(rat))
font_size=int(int(w)*float(rat))
'''
font_size=int(int(w)*0.1)
font = ImageFont.truetype("./fonts/unifont-15.0.01.ttf", int(font_size))
#font_o = ImageFont.truetype("./fonts/unifont-15.0.01.ttf", int(font_size_o))
#draw.text(((x-(bw-tw)/2),y), text, font=font, fill="red")
#if bw - tw > 0:
# draw.text(((x-(bw-tw)/2),y), text, font=font_o, fill=(0,0,0))
#elif bw - tw < 0:
# draw.text(((x+(bw-tw)/2),y), text, font=font_o, fill=(0,0,0))
#else:
# draw.text((x,y), text, font=font_o, fill=(0,0,0))
draw.text((x, y),text, font = font, fill=(0,0,0))
else:
pass
return im
def draw_boxes(image, bounds, width=1):
draw = ImageDraw.Draw(image)
for bound in bounds:
if bound[2]>=0.3:
color = "blue"
else:
color = "red"
p0, p1, p2, p3 = bound[0]
draw.line([*p0, *p1, *p2, *p3, *p0], fill=color, width=width)
return image
def detect(img, target_lang,trans_lang,target_lang2=None):
if target_lang2 != None and target_lang2 != "":
lang=f"{lang_id[target_lang]}"
lang2=f"{lang_id[target_lang2]}"
lang=[lang,lang2]
else:
lang=[f"{ocr_id[target_lang]}"]
pass
#global bounds
im_h = img.shape[0]
im_w = img.shape[1]
if im_w > im_h:
rato=im_h/im_w
img = cv2.resize(img, (1000,(int(1000*float(rato)))))
elif im_w < im_h:
rato=im_w/im_h
img = cv2.resize(img, (int(1000*float(rato)),1000))
elif im_w == im_h:
img = cv2.resize(img,(1000,1000))
reader = easyocr.Reader(lang)
bounds = reader.readtext(img)
im = PIL.Image.open(img)
im_out=draw_boxes(im, bounds)
#im.save('result.jpg')
blr_out=blur_im(img,bounds,target_lang,trans_lang)
return im_out,blr_out,pd.DataFrame(bounds),pd.DataFrame(bounds).iloc[:,1:]
with gr.Blocks() as robot:
with gr.Row():
with gr.Column():
im=gr.Image(type="filepath")
with gr.Column():
target_lang = gr.Dropdown(label="Detect language:", choices=list(ocr_id.keys()),value="English")
#target_lang2 = gr.Dropdown(label="Detect language2", choices=list(lang_id.keys()),value="")
trans_lang = gr.Dropdown(label="Translate to:", choices=list(lang_id.keys()),value="Chinese")
go_btn=gr.Button()
with gr.Row():
with gr.Column():
out_im=gr.Image()
with gr.Column():
trans_im=gr.Image()
with gr.Row():
out_txt=gr.Textbox(lines=8)
data_f=gr.Dataframe()
go_btn.click(detect,[im,target_lang,trans_lang],[out_im,trans_im,out_txt,data_f])
#go_btn.click(detect,[im,target_lang,target_lang2],[out_im,trans_im,out_txt,data_f])
robot.queue(concurrency_count=10).launch()