Files
kefu/deploy/recognition-audit-20260916/run_real_ocr.py
T
2026-09-21 10:34:06 +08:00

42 lines
2.0 KiB
Python

"""Exercise installed local OCR on synthetic Chinese text; no screen capture/network."""
import argparse
import json
import socket
import sys
import time
from pathlib import Path
from unittest import mock
import numpy as np
from PIL import Image, ImageDraw, ImageFont
parser = argparse.ArgumentParser()
parser.add_argument('project')
parser.add_argument('output')
args = parser.parse_args()
sys.path.insert(0, str(Path(args.project).resolve()))
sys.dont_write_bytecode = True
from session_name import NameReader, normalize_name
started = time.monotonic()
cases = []
with mock.patch.object(socket.socket, 'connect', side_effect=RuntimeError('network blocked')):
reader = NameReader()
available = reader.available
if available:
for scale in (1, 2, 3):
for theme in ('light', 'dark'):
foreground, background = ((30, 245) if theme == 'light' else (240, 30))
font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', 16 * scale)
for text in ('客户甲@微信', '客户乙@微信', '高瑞@微信', '门店客服甲'):
image = Image.new('RGB', (250*scale, 42*scale), (background,)*3)
ImageDraw.Draw(image).text((10*scale, 8*scale), text, font=font, fill=(foreground,)*3)
value, confidence = reader.read_raw(np.asarray(image))
cases.append({'scale': scale, 'theme': theme, 'expected': text, 'actual': value,
'confidence': confidence, 'exact': normalize_name(value) == normalize_name(text)})
report = {'project': str(Path(args.project).resolve()), 'engine_available': available,
'cases': cases, 'total': len(cases), 'exact_matches': sum(case['exact'] for case in cases),
'seconds': round(time.monotonic()-started, 3),
'scope': 'Real installed RapidOCR; synthetic Microsoft YaHei images; no screenshots/customer data/remote model.'}
Path(args.output).write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding='utf-8')
print(json.dumps(report, ensure_ascii=False))