Go 实现图像验证码识别系统(集成 Python 模型)
项目概述
本项目展示如何使用 Go 实现图像验证码的生成、处理和识别。我们将:
使用 Go 生成图像验证码(无需外部依赖)
搭建 Go HTTP 服务,上传验证码图片
将验证码图片发送到 Python 模型 API,获取识别结果
一、项目结构
captcha_recognizer/
├── go_server/
│ ├── main.go
│ └── static/
│ └── index.html
├── python_model/
│ ├── model.py
│ └── app.py
二、Python 模型识别服务(python_model/app.py)
假设你已有 PyTorch 训练好的模型,我们启动一个识别 API:
from flask import Flask, request, jsonify
from PIL import Image
from torchvision import transforms
import torch
from model import CRNN # 你的模型定义
import string
characters = string.digits + string.ascii_uppercase
app = Flask(name)
model = CRNN()
model.load_state_dict(torch.load("crnn_model.pth", map_location="cpu"))
model.eval()
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")
image = transform(image).unsqueeze(0)
with torch.no_grad():
output = model(image)
pred = torch.argmax(output, dim=2)[0]
text = ''.join([characters[i] for i in pred])
return jsonify({'result': text})
if name == "main":
app.run(port=5002)
三、Go 服务端实现
go_server/static/index.html
上传验证码图片
go_server/main.gopackage 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("/", index)
http.HandleFunc("/upload", uploadHandler)
fmt.Println("Go 服务启动:http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func index(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.ParseFiles("static/index.html")
tmpl.Execute(w, nil)
}
func uploadHandler(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)
}
运行:
更多内容访问ttocr.com或联系1436423940
go run main.go
访问:http://localhost:8080
四、验证码图片自动生成(可选)
可使用 github.com/mojocn/base64Captcha:
import "github.com/mojocn/base64Captcha"
或使用 Python:
from captcha.image import ImageCaptcha
image = ImageCaptcha()
image.write("A1B9", "A1B9.png")
浙公网安备 33010602011771号