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
输出:
识别结果:
浙公网安备 33010602011771号