Spaces:
Runtime error
Runtime error
| from keras.models import load_model | |
| from aiohttp import ClientSession | |
| from numpy import expand_dims as np_expand_dims | |
| from captcha_processor import CaptchaProcessor | |
| from asyncio import get_running_loop | |
| from asyncio import sleep as asyncsleep | |
| from random import randint | |
| import aiofiles | |
| import os | |
| model = load_model("model.h5") | |
| proxies = [ | |
| str(os.environ.get("HTTP_PROXY")) | |
| ] | |
| async def get_binary_from_link(link: str) -> bytes: | |
| async with ClientSession() as session: | |
| for _ in range(20): | |
| try: | |
| a = await session.get(link, proxy=proxies[randint(0, len(proxies)-1)]) | |
| if int(a.status) == 200: | |
| print("Got binary") | |
| return await a.read() | |
| else: | |
| await asyncsleep(0.125) | |
| except Exception as e: | |
| print(e) | |
| return randint(100000, 999999) | |
| async def predict(url: str, recursion: int = 0, fnfnfn: int = randint(1, 10000000)) -> dict: | |
| binary = await get_binary_from_link(url) | |
| if type(binary) == type(0): | |
| return { | |
| "WARNING": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "prediction": binary, | |
| "letters_predictions": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "full_prediction": binary, | |
| "recursion": recursion | |
| } | |
| async with aiofiles.open(f"temp/{fnfnfn}.png", "wb") as outfile: | |
| print(f"Trying to do smth with {fnfnfn}") | |
| await outfile.write(binary) | |
| try: | |
| processor = CaptchaProcessor(binary) | |
| except Exception as e: | |
| if recursion > 10: | |
| return { | |
| "WARNING": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "prediction": binary, | |
| "letters_predictions": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "full_prediction": binary, | |
| "recursion": recursion | |
| } | |
| else: | |
| print(f"1, {recursion}, {str(e)}") | |
| return await predict(url, recursion + 1, fnfnfn) | |
| try: | |
| processor.replace_color(processor.get_background_color(), processor.WHITE_RGB) | |
| processor.replace_colors(processor.get_letters_color(), processor.WHITE_RGB) | |
| except Exception as e: | |
| if recursion > 10: | |
| return { | |
| "WARNING": "SOMETHING WENT WRONG. CONTACT OWNER IMMEDIATLY.", | |
| "prediction": binary, | |
| "letters_predictions": "SOMETHING WENT WRONG. CONTACT OWNER IMMEDIATLY.", | |
| "full_prediction": binary, | |
| "recursion": recursion | |
| } | |
| else: | |
| print(f"2, {recursion}, {str(e)}") | |
| return await predict(url, recursion + 1, fnfnfn) | |
| try: | |
| processor.convert_color_space(6) | |
| except Exception as e: | |
| if recursion > 10: | |
| return { | |
| "WARNING": "SOMETHING WENT WRONG. CONTACT OWNER IMMEDIATLY.", | |
| "prediction": binary, | |
| "letters_predictions": "SOMETHING WENT WRONG. CONTACT OWNER IMMEDIATLY.", | |
| "full_prediction": binary, | |
| "recursion": recursion | |
| } | |
| else: | |
| print(f"3, {recursion}, {str(e)}") | |
| return await predict(url, recursion + 1, fnfnfn) | |
| try: | |
| processor.threshold() | |
| except Exception as e: | |
| if recursion > 10: | |
| return { | |
| "WARNING": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "prediction": binary, | |
| "letters_predictions": "PROXY RETURNING INVALID IMAGE. CONTACT OWNER IMMEDIATLY.", | |
| "full_prediction": binary, | |
| "recursion": recursion | |
| } | |
| else: | |
| print(f"4, {recursion}, {str(e)}") | |
| return await predict(url, recursion + 1, fnfnfn) | |
| try: | |
| processor.increase_letters_size(2) | |
| except IndexError: | |
| return await predict(url, recursion + 1, fnfnfn) | |
| letters = processor.slice_letters() | |
| if len(letters) != 6: return await predict(url, recursion + 1, fnfnfn) | |
| shorts = [] | |
| final = "" | |
| letters_solving = [ | |
| get_running_loop().run_in_executor(None, model.predict, np_expand_dims(letter, axis=0)) | |
| for letter in letters | |
| ] | |
| letters_solving = [await result for result in letters_solving] | |
| fulls = [list(map(lambda x: float(x), letter[0])) for letter in letters_solving] | |
| for prediction in fulls: shorts.append(prediction.index(max(*prediction))) | |
| for short in shorts: final += str(short) | |
| return { | |
| "prediction": final, | |
| "letters_predictions": shorts, | |
| "full_prediction": fulls, | |
| "recursion": recursion | |
| } | |