| #!/usr/bin/env python3 | |
| """用原始图训练的 ONNX 模型识别验证码。预处理: RGB 160x64 /255 -> (1,3,64,160) -> 4位数字 | |
| """ | |
| import json | |
| import os | |
| import sys | |
| import numpy as np | |
| import onnxruntime as ort | |
| from PIL import Image | |
| MODEL = os.path.expanduser("~/sp_captcha_assets/models/captcha_1000_raw.onnx") | |
| _sess = None | |
| def _get_sess(): | |
| global _sess | |
| if _sess is None: | |
| _sess = ort.InferenceSession(MODEL, providers=["CPUExecutionProvider"]) | |
| return _sess | |
| def predict(path): | |
| im = Image.open(path).convert("RGB").resize((160, 64), Image.BILINEAR) | |
| a = np.asarray(im, dtype=np.float32) / 255.0 | |
| x = a.transpose(2, 0, 1)[None] | |
| out = _get_sess().run(None, {"input": x})[0] | |
| return "".join(str(int(out[0, p].argmax())) for p in range(4)) | |
| def main(): | |
| out = {} | |
| for f in sys.argv[1:]: | |
| try: | |
| out[f] = {"onnx": predict(f)} | |
| except Exception as e: | |
| out[f] = {"onnx": "", "err": str(e)} | |
| print(json.dumps(out, ensure_ascii=False)) | |
| if __name__ == "__main__": | |
| main() | |