Go 调用 Python 模型服务实现验证码识别系统
本篇将介绍如何使用 Go 编写图像验证码识别系统的业务逻辑,并通过 HTTP 接口调用用 Python 实现的深度学习模型服务,完成前后端解耦的识别任务。
一、系统结构
本系统包括两部分:
更多内容访问ttocr.com或联系1436423940
模型服务(Python + Flask):接收验证码图片,返回识别结果
业务服务(Go):生成验证码、上传至模型服务识别并处理结果
结构图:
Go 应用 ——> Python 模型服务(Flask + PyTorch + ONNX)
↑ ↓
生成验证码 返回识别结果(字符串)
二、Go:生成验证码并调用识别接口
package main
import (
"bytes"
"fmt"
"image/color"
"math/rand"
"mime/multipart"
"net/http"
"os"
"time"
"github.com/fogleman/gg"
)
const charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
func generateCode(n int) string {
rand.Seed(time.Now().UnixNano())
code := make([]byte, n)
for i := range code {
code[i] = charset[rand.Intn(len(charset))]
}
return string(code)
}
func createCaptcha(code string, filename string) error {
const W, H = 160, 60
dc := gg.NewContext(W, H)
dc.SetColor(color.White)
dc.Clear()
dc.SetRGB(0, 0, 0)
err := dc.LoadFontFace("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 36)
if err != nil {
return err
}
dc.DrawStringAnchored(code, W/2, H/2, 0.5, 0.5)
return dc.SavePNG(filename)
}
func sendToModelService(filename string) (string, error) {
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("image", filename)
if err != nil {
return "", err
}
_, err = io.Copy(part, file)
writer.Close()
resp, err := http.Post("http://localhost:5000/predict", writer.FormDataContentType(), body)
if err != nil {
return "", err
}
defer resp.Body.Close()
result, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(result), nil
}
func main() {
code := generateCode(4)
filename := "captcha.png"
if err := createCaptcha(code, filename); err != nil {
fmt.Println("生成失败:", err)
return
}
fmt.Println("已生成验证码:", code)
result, err := sendToModelService(filename)
if err != nil {
fmt.Println("识别失败:", err)
return
}
fmt.Println("模型识别结果:", result)
}
三、Python 模型服务(简略版)
你可以用下面的 Python Flask 服务接收图片并返回识别结果:
from flask import Flask, request
import torch
from torchvision import transforms
from PIL import Image
app = Flask(name)
model = torch.load("captcha_model.pth", map_location='cpu')
model.eval()
transform = transforms.Compose([
transforms.Resize((60, 160)),
transforms.ToTensor(),
])
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def predict(img):
img = transform(img).unsqueeze(0)
with torch.no_grad():
out = model(img)
pred = out.view(4, -1).argmax(dim=1)
return ''.join([chars[i] for i in pred])
@app.route("/predict", methods=["POST"])
def predict_endpoint():
file = request.files['image']
img = Image.open(file.stream).convert("RGB")
result = predict(img)
return result
if name == 'main':
app.run(port=5000)
四、运行效果
启动 Python 模型服务:
python model_service.py
执行 Go 代码:
go run main.go
输出示例:
已生成验证码: G9H2
模型识别结果: G9H2
浙公网安备 33010602011771号