m2zm commited on
Commit
f40ddb8
·
verified ·
1 Parent(s): 5a3b713

Upload 6 files

Browse files
Files changed (4) hide show
  1. app.py +71 -44
  2. gitattributes +35 -0
  3. requirements.txt +6 -3
  4. runtime.txt +1 -0
app.py CHANGED
@@ -1,56 +1,83 @@
1
- import onnxruntime as onr
 
 
 
 
2
  import numpy as np
3
  import gradio as gr
4
- import glob, io
5
  from PIL import Image
6
- from cairosvg import svg2png
7
- #----- CONFIG ------
8
- img_height = 300
9
- img_width = 500
10
- max_length = 4
11
- characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
12
- 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
13
- 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
14
- 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
15
- 'y', 'z'
16
- ]
17
- model_path = 'model.onnx'
18
- #===== some code init =====
19
- Model = onr.InferenceSession(model_path)
20
 
21
- #===== some funcs =====
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  def get_result(pred):
23
- accuracy = 1
24
- last = None
25
- ans = []
26
- for item in pred[0]:
27
- char_ind = item.argmax()
28
- if char_ind != last and char_ind != 0 and char_ind != len(characters) + 1:
29
- ans.append(characters[char_ind - 1])
30
- accuracy *= item[char_ind]
31
- last = char_ind
32
- answ = "".join(ans)[:max_length]
33
- return answ, accuracy
34
- def predict(svgdata):
35
- if len(svgdata) > 50000:
36
- return
37
- img = Image.open(io.BytesIO(svg2png(svgdata)))
38
- img = img.convert('L')
39
- img = img.resize((img_width, img_height))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  img = np.array(img)
41
  img = np.expand_dims(img, axis=1)
42
  img = np.expand_dims(img, axis=-1)
43
  img = img.transpose([1,2,0,3])
44
  img = img.astype(np.float32) / 255.
45
- result_tensor = Model.run(None, {'image': img, 'label': np.random.default_rng().random((28, 28), dtype=np.float32)})[0]
46
- return (get_result(result_tensor)[0])
 
 
 
 
 
 
47
 
48
- title = "Made with love❤️❤️❤️❤️\nby Vermei x nof"
49
- description = "bruh2"
 
 
 
 
50
 
51
- iface = gr.Interface(fn=predict,
52
- inputs=gr.Textbox(),
53
- outputs=gr.Textbox(),
54
- title=title,
55
- description=description)
56
- iface.launch()
 
1
+ import base64
2
+ from io import BytesIO
3
+ import uuid
4
+ from cairosvg import svg2png
5
+ import cv2
6
  import numpy as np
7
  import gradio as gr
8
+ import onnxruntime as ort
9
  from PIL import Image
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ IMG_HEIGHT = 300
12
+ IMG_WIDTH = 500
13
+ MAX_LENGTH = 4
14
+ CHARACTERS = ['0','1','2','3','4','5','6','7','8','9',
15
+ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
16
+ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
17
+ MODEL_PATH = 'model.onnx'
18
+ session = ort.InferenceSession(MODEL_PATH, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
19
+
20
+ def preprocess_captcha(image):
21
+ pil = image.convert("RGB")
22
+ cv_img = cv2.cvtColor(np.array(pil), cv2.COLOR_RGB2BGR)
23
+ gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
24
+ _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
25
+ processed = Image.fromarray(thresh).convert("RGB")
26
+ return processed
27
+
28
  def get_result(pred):
29
+ accuracy = 1
30
+ last = None
31
+ ans = []
32
+ for item in pred[0]:
33
+ char_ind = item.argmax()
34
+ if char_ind != last and char_ind != 0 and char_ind != len(CHARACTERS) + 1:
35
+ ans.append(CHARACTERS[char_ind - 1])
36
+ accuracy *= item[char_ind]
37
+ last = char_ind
38
+ answ = "".join(ans)[:MAX_LENGTH]
39
+ return answ
40
+
41
+ def predict(svg_text):
42
+ request_id = str(uuid.uuid4())
43
+ print(f"Yeni istek geldi. ID: {request_id}")
44
+
45
+ text = svg_text.strip()
46
+ if not text:
47
+ print(f"OCR cevabı döndürüldü. ID: {request_id}, Cevap: Empty input")
48
+ return "Empty input"
49
+
50
+ if text.startswith('data:image/svg+xml;base64,'):
51
+ b = base64.b64decode(text.split(',')[-1])
52
+ else:
53
+ b = text.encode('utf-8')
54
+
55
+ png_bytes = svg2png(bytestring=b)
56
+ image = Image.open(BytesIO(png_bytes))
57
+
58
+ processed = preprocess_captcha(image)
59
+
60
+ img = processed.convert('L')
61
+ img = img.resize((IMG_WIDTH, IMG_HEIGHT))
62
  img = np.array(img)
63
  img = np.expand_dims(img, axis=1)
64
  img = np.expand_dims(img, axis=-1)
65
  img = img.transpose([1,2,0,3])
66
  img = img.astype(np.float32) / 255.
67
+
68
+ dummy_label = np.random.default_rng().random((28, 28), dtype=np.float32)
69
+ result_tensor = session.run(None, {'image': img, 'label': dummy_label})[0]
70
+
71
+ result = get_result(result_tensor)
72
+
73
+ print(f"OCR cevabı döndürüldü. ID: {request_id}, Cevap: {result}")
74
+ return result
75
 
76
+ demo = gr.Interface(
77
+ fn=predict,
78
+ inputs=gr.Textbox(label="SVG", lines=6, placeholder="SVG to PNG..."),
79
+ outputs=gr.Textbox(label="Solution"),
80
+ title="Captcha Solver",
81
+ )
82
 
83
+ demo.launch()
 
 
 
 
 
gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
requirements.txt CHANGED
@@ -1,3 +1,6 @@
1
- onnx==1.17.0
2
- onnxruntime==1.20.1
3
- cairosvg==2.7.1
 
 
 
 
1
+ onnxruntime
2
+ onnxruntime-gpu
3
+ cairosvg
4
+ opencv-python
5
+ pillow
6
+ numpy
runtime.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ python-3.11.8