42 lines
2.0 KiB
Python
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))
|