Go 实战:生成验证码并调用 Python 模型识别图像内容

本篇教程将展示如何:

用 Go 生成图像验证码

将验证码图片发送给 Python 识别服务

获取识别结果并输出

我们实现的是一个轻量验证码识别系统,适合用于学习验证码生成、图像处理、语言间协作。

一、使用 Go 生成验证码图像
我们使用 github.com/mojocn/base64Captcha 来生成图片验证码:
更多内容访问ttocr.com或联系1436423940
go get github.com/mojocn/base64Captcha
创建 generate.go:

package main

import (
"encoding/base64"
"fmt"
"github.com/mojocn/base64Captcha"
"os"
)

func main() {
driver := base64Captcha.NewDriverString(60, 160, 0, base64Captcha.OptionShowHollowLine, 4, "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", nil, nil, nil)
c := base64Captcha.NewCaptcha(driver, nil)

id, b64s, answer := c.Generate()

fmt.Println("验证码文本:", answer)

// 将 base64 写入 png 文件
imgData, err := base64.StdEncoding.DecodeString(b64s)
if err != nil {
	panic(err)
}

err = os.WriteFile("captcha.png", imgData, 0644)
if err != nil {
	panic(err)
}

fmt.Println("保存图片 captcha.png 完成,验证码 ID:", id)

}
运行程序:

go run generate.go
将生成 captcha.png 和控制台输出的正确验证码文本。

二、Python 模型提供识别接口
使用 Flask 搭配 PyTorch,加载模型并接收 Go 发来的图片。

Flask 服务 serve.py:

from flask import Flask, request, jsonify
from PIL import Image
import torch
from torchvision import transforms
from model import CRNN # 引用你已有的模型类
import io

app = Flask(name)
model = CRNN()
model.load_state_dict(torch.load("crnn_model.pth"))
model.eval()

characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
transform = transforms.Compose([
transforms.Resize((60, 160)),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])

@app.route("/predict", methods=["POST"])
def predict():
file = request.files["image"]
image = Image.open(file.stream).convert("RGB")
x = transform(image).unsqueeze(0)
with torch.no_grad():
out = model(x)
pred = torch.argmax(out, dim=2)[0]
text = ''.join([characters[i] for i in pred])
return jsonify({"prediction": text})

if name == "main":
app.run(port=5002)
运行:

python serve.py
三、Go 调用 Python 模型识别验证码
创建 recognize.go:

package main

import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)

func main() {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)

file, err := os.Open("captcha.png")
if err != nil {
	panic(err)
}
defer file.Close()

part, _ := writer.CreateFormFile("image", "captcha.png")
io.Copy(part, file)
writer.Close()

resp, err := http.Post("http://localhost:5002/predict", writer.FormDataContentType(), body)
if err != nil {
	panic(err)
}
defer resp.Body.Close()

fmt.Println("识别结果:")
io.Copy(os.Stdout, resp.Body)

}
运行:

go run recognize.go
输出:

识别结果:

posted @ 2025-05-10 13:15  ttocr、com  阅读(15)  评论(0)    收藏  举报