上传OCR切换:小果GLM-OCR-8bit优先,Tesseract降级

MoFin/server.py 的 _ocr_image 改为:
1. 优先调小果 gateway (192.168.1.122:18003) 的 GLM-OCR-8bit
2. 失败/无响应则自动降级到本地 Tesseract(预处理+chi_sim+eng)
3. fallback逻辑保留原预处理管道(放大/锐化/二值化)

ocr_client.py 模块独立可调用,兼作CLI工具
This commit is contained in:
知微
2026-06-24 13:48:40 +08:00
parent 605c3d71d9
commit 0ecdfbc861
4 changed files with 979 additions and 95 deletions
+879 -55
View File
File diff suppressed because it is too large Load Diff
+72 -24
View File
@@ -25,7 +25,9 @@
"rr_ratio": 0.06, "rr_ratio": 0.06,
"action_note": "⚠️盈亏比偏低(1:0.6),不建议加仓", "action_note": "⚠️盈亏比偏低(1:0.6),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 816.69,
"change_pct": 8.17
}, },
{ {
"code": "01478", "code": "01478",
@@ -52,7 +54,9 @@
"rr_ratio": 1.04, "rr_ratio": 1.04,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 7.75,
"change_pct": -1.65
}, },
{ {
"code": "600739", "code": "600739",
@@ -79,7 +83,9 @@
"rr_ratio": 1.44, "rr_ratio": 1.44,
"action_note": "⚠️盈亏比偏低(1:1.4),不建议加仓", "action_note": "⚠️盈亏比偏低(1:1.4),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 10.42,
"change_pct": -2.16
}, },
{ {
"code": "601899", "code": "601899",
@@ -106,7 +112,9 @@
"rr_ratio": 0.68, "rr_ratio": 0.68,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 27.66,
"change_pct": -0.32
}, },
{ {
"code": "688639", "code": "688639",
@@ -133,7 +141,9 @@
"rr_ratio": 1.12, "rr_ratio": 1.12,
"action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓", "action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 21.42,
"change_pct": -1.88
}, },
{ {
"code": "09988", "code": "09988",
@@ -160,7 +170,9 @@
"rr_ratio": 1.02, "rr_ratio": 1.02,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 100.1,
"change_pct": 1.26
}, },
{ {
"code": "688411", "code": "688411",
@@ -187,7 +199,9 @@
"rr_ratio": 0.96, "rr_ratio": 0.96,
"action_note": "⚠️盈亏比偏低(1:1.0),不建议加仓", "action_note": "⚠️盈亏比偏低(1:1.0),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 268.05,
"change_pct": -1.56
}, },
{ {
"code": "603259", "code": "603259",
@@ -214,7 +228,9 @@
"rr_ratio": 3.35, "rr_ratio": 3.35,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 115.8,
"change_pct": 8.95
}, },
{ {
"code": "688981", "code": "688981",
@@ -241,7 +257,9 @@
"rr_ratio": 1.89, "rr_ratio": 1.89,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 153.7,
"change_pct": 8.47
}, },
{ {
"code": "01888", "code": "01888",
@@ -268,7 +286,9 @@
"rr_ratio": 7.78, "rr_ratio": 7.78,
"action_note": "短炒强趋势持", "action_note": "短炒强趋势持",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 93.3,
"change_pct": 7.16
}, },
{ {
"code": "02202", "code": "02202",
@@ -295,7 +315,9 @@
"rr_ratio": 1.11, "rr_ratio": 1.11,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 2.36,
"change_pct": -2.08
}, },
{ {
"code": "02388", "code": "02388",
@@ -322,7 +344,9 @@
"rr_ratio": 2.93, "rr_ratio": 2.93,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 46.36,
"change_pct": -1.4
}, },
{ {
"code": "300750", "code": "300750",
@@ -349,7 +373,9 @@
"rr_ratio": 0.83, "rr_ratio": 0.83,
"action_note": "⚠️盈亏比偏低(1:0.8),不建议加仓", "action_note": "⚠️盈亏比偏低(1:0.8),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 395.02,
"change_pct": 0.65
}, },
{ {
"code": "01211", "code": "01211",
@@ -376,7 +402,9 @@
"rr_ratio": 1.01, "rr_ratio": 1.01,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 75.9,
"change_pct": 0.07
}, },
{ {
"code": "00981", "code": "00981",
@@ -403,7 +431,9 @@
"rr_ratio": 2.79, "rr_ratio": 2.79,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 85.5,
"change_pct": 10.02
}, },
{ {
"code": "00700", "code": "00700",
@@ -430,7 +460,9 @@
"rr_ratio": 0.95, "rr_ratio": 0.95,
"action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓", "action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 433.4,
"change_pct": 4.29
}, },
{ {
"code": "09868", "code": "09868",
@@ -457,7 +489,9 @@
"rr_ratio": 21.84, "rr_ratio": 21.84,
"action_note": "⚠️盈亏比偏低(1:1.0),不建议加仓", "action_note": "⚠️盈亏比偏低(1:1.0),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 49.98,
"change_pct": 1.22
}, },
{ {
"code": "300548", "code": "300548",
@@ -484,7 +518,9 @@
"rr_ratio": 5.82, "rr_ratio": 5.82,
"action_note": "短炒强趋势持", "action_note": "短炒强趋势持",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 282.5,
"change_pct": -1.24
}, },
{ {
"code": "02318", "code": "02318",
@@ -511,7 +547,9 @@
"rr_ratio": 15.44, "rr_ratio": 15.44,
"action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓", "action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 52.8,
"change_pct": -1.49
}, },
{ {
"code": "300035", "code": "300035",
@@ -538,7 +576,9 @@
"rr_ratio": 0.93, "rr_ratio": 0.93,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 16.1,
"change_pct": -1.47
}, },
{ {
"code": "518880", "code": "518880",
@@ -565,7 +605,9 @@
"rr_ratio": 0.54, "rr_ratio": 0.54,
"action_note": "深套持有", "action_note": "深套持有",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 8.49,
"change_pct": -0.57
}, },
{ {
"code": "000700", "code": "000700",
@@ -592,7 +634,9 @@
"rr_ratio": 3.35, "rr_ratio": 3.35,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 14.57,
"change_pct": -2.74
}, },
{ {
"code": "01088", "code": "01088",
@@ -619,7 +663,9 @@
"rr_ratio": 0.93, "rr_ratio": 0.93,
"action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓", "action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 41.84,
"change_pct": -0.43
}, },
{ {
"code": "600563", "code": "600563",
@@ -646,7 +692,9 @@
"rr_ratio": 3.54, "rr_ratio": 3.54,
"action_note": "", "action_note": "",
"timing_signal": "持有" "timing_signal": "持有"
} },
"price": 178.76,
"change_pct": 10.0
} }
], ],
"cash": 5667, "cash": 5667,
+7 -7
View File
@@ -108,7 +108,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 88.32, "high": 88.32,
"low": 82.78, "low": 82.78,
"close": 83.83 "close": 83.76
} }
], ],
"00700": [ "00700": [
@@ -836,7 +836,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 145.0, "high": 145.0,
"low": 130.0, "low": 130.0,
"close": 142.7 "close": 142.9
} }
], ],
"02388": [ "02388": [
@@ -1004,7 +1004,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 168.6, "high": 168.6,
"low": 160.0, "low": 160.0,
"close": 166.7 "close": 166.9
} }
], ],
"06869": [ "06869": [
@@ -1284,7 +1284,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 68.8, "high": 68.8,
"low": 65.74, "low": 65.74,
"close": 66.85 "close": 66.83
} }
], ],
"300548": [ "300548": [
@@ -2316,7 +2316,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 745.2, "high": 745.2,
"low": 660.01, "low": 660.01,
"close": 713.0 "close": 714.88
} }
], ],
"688802": [ "688802": [
@@ -2466,7 +2466,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 5.38, "high": 5.38,
"low": 4.86, "low": 4.86,
"close": 5.09 "close": 5.06
} }
], ],
"688630": [ "688630": [
@@ -2610,7 +2610,7 @@
"date": "2026-06-24", "date": "2026-06-24",
"high": 52.43, "high": 52.43,
"low": 49.03, "low": 49.03,
"close": 49.27 "close": 49.23
} }
], ],
"002171": [ "002171": [
+13 -1
View File
@@ -717,10 +717,22 @@ def upload_page():
def _ocr_image(image_path): def _ocr_image(image_path):
"""用Tesseract OCR提取图片中的文字(预处理优化中文表格识别)""" """优先用小果GLM-OCR-8bit识别,失败则降级到pytesseract"""
import sys
from PIL import Image, ImageEnhance, ImageFilter from PIL import Image, ImageEnhance, ImageFilter
import pytesseract import pytesseract
# 尝试小果OCRGLM-OCR-8bit
try:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "scripts"))
from ocr_client import ocr_image as xg_ocr
result = xg_ocr(image_path, "请识别这张图片中所有文字,包括股票名称、代码、价格、持股数、金额、百分比等。输出完整内容。")
if result.get("success") and len(result.get("text", "")) > 20:
return result["text"].strip()
except Exception:
pass # 降级到tesseract
# 降级:Tesseract(预处理优化中文表格识别)
img = Image.open(image_path) img = Image.open(image_path)
# 预处理:放大 + 锐化 + 二值化,提升小字识别率 # 预处理:放大 + 锐化 + 二值化,提升小字识别率