用 Go 实现验证码识别系统(调用 Python 深度学习模型)

使用 Go 编写验证码图片生成工具

用户通过网页上传图片

Go 调用 Python 模型 API 识别验证码

显示最终识别结果

一、环境准备
安装必要工具:
Go 1.18+
更多内容访问ttocr.com或联系1436423940
Python 3.x

安装 Python 模型依赖:

pip install torch torchvision flask pillow
二、Python 模型识别服务(API)
你可以使用 PyTorch 训练的模型,并提供一个预测接口:

model_server.py:

from flask import Flask, request, jsonify
import torch
from torchvision import transforms
from PIL import Image
from model import CRNN # 自定义模型结构

app = Flask(name)
model = CRNN()
model.load_state_dict(torch.load("crnn_model.pth", map_location="cpu"))
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():
image = Image.open(request.files['image']).convert("RGB")
x = transform(image).unsqueeze(0)
with torch.no_grad():
y = model(x)
pred = torch.argmax(y, dim=2)[0]
result = ''.join([characters[i] for i in pred])
return jsonify({"prediction": result})

if name == "main":
app.run(port=5002)
启动服务:

python model_server.py
三、Go 实现:验证码生成 + 上传 + 模型调用

  1. HTML 页面(保存为 static/index.html):
验证码识别

上传验证码图片

2. Go 主程序 main.go:

package main

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

func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.HandleFunc("/", serveForm)
http.HandleFunc("/upload", handleUpload)

fmt.Println("服务器启动:http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))

}

func serveForm(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("static/index.html")
tmpl.Execute(w, nil)
}

func handleUpload(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(10 << 20)
file, _, err := r.FormFile("captcha")
if err != nil {
http.Error(w, "无法读取图片", 400)
return
}
defer file.Close()

var buf bytes.Buffer
writer := multipart.NewWriter(&buf)
part, _ := writer.CreateFormFile("image", "captcha.png")
io.Copy(part, file)
writer.Close()

resp, err := http.Post("http://localhost:5002/predict", writer.FormDataContentType(), &buf)
if err != nil {
	http.Error(w, "调用识别服务失败", 500)
	return
}
defer resp.Body.Close()

w.Header().Set("Content-Type", "application/json")
io.Copy(w, resp.Body)

}
启动 Go 服务:

go run main.go
打开浏览器访问 http://localhost:8080,上传一张验证码图片,即可获取识别结果。

四、验证码图片自动生成(可选)
你也可以用 Python 的 captcha 库生成样本:

from captcha.image import ImageCaptcha
import random
import string
import os

characters = string.digits + string.ascii_uppercase
generator = ImageCaptcha(width=160, height=60)

def generate_samples(n=10, path="samples"):
os.makedirs(path, exist_ok=True)
for i in range(n):
text = ''.join(random.choices(characters, k=4))
image = generator.generate_image(text)
image.save(f"{path}/{text}_{i}.png")

generate_samples()

posted @ 2025-05-16 11:53  ttocr、com  阅读(11)  评论(0)    收藏  举报