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.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("/", 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")

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