用 Go 构建验证码识别服务(调用深度学习模型 API)
本篇介绍如何使用 Go 编写一个 Web 服务,通过 HTTP 接收验证码图像,然后将图像转发给后端深度学习模型(如 TensorFlow Serving、FastAPI、Flask 等部署的模型服务)进行识别,并返回最终的预测文本。
一、场景说明
你可能已经训练好了一个 CNN 或 CRNN 模型,并通过 Python(如 Flask/FastAPI)或 TensorFlow Serving 部署成了 RESTful 推理服务。接下来我们用 Go 编写一个前端中转层:
提供上传图像的 API
将图像转发给模型服务
获取识别结果并返回客户端
二、服务结构
[ Client ] → [ Go Web API ] → [ 模型推理服务(如 Python FastAPI)] → [ 识别结果 ]
三、Go 服务端代码
依赖包安装
更多内容访问ttocr.com或联系1436423940
go get github.com/gin-gonic/gin
go get github.com/go-resty/resty/v2
main.go
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2"
)
const modelURL = "http://localhost:5000/predict" // 你的模型 API 地址
func main() {
router := gin.Default()
router.POST("/recognize", func(c *gin.Context) {
file, err := c.FormFile("image")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "图片上传失败"})
return
}
tmpPath := filepath.Join(os.TempDir(), file.Filename)
if err := c.SaveUploadedFile(file, tmpPath); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "图片保存失败"})
return
}
// 调用模型服务
result, err := callModelAPI(tmpPath)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "模型调用失败"})
return
}
c.JSON(http.StatusOK, gin.H{"result": result})
})
router.Run(":8080")
}
// 调用 Python 推理服务
func callModelAPI(imagePath string) (string, error) {
client := resty.New()
file, err := os.Open(imagePath)
if err != nil {
return "", err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("image", filepath.Base(imagePath))
if err != nil {
return "", err
}
_, err = io.Copy(part, file)
writer.Close()
resp, err := client.R().
SetHeader("Content-Type", writer.FormDataContentType()).
SetBody(body.Bytes()).
Post(modelURL)
if err != nil {
return "", err
}
return string(resp.Body()), nil
}
四、Python 模型服务示例(可选参考)
FastAPI 示例:
from fastapi import FastAPI, File, UploadFile
from PIL import Image
import torch
from io import BytesIO
app = FastAPI()
@app.post("/predict")
async def predict(image: UploadFile = File(...)):
img = Image.open(BytesIO(await image.read())).convert("RGB")
# 模型加载与预测(略)
# pred = model(img_tensor)
return {"result": "A3B9"}
五、使用方式
启动 Go 服务:
go run main.go
调用接口:
curl -X POST -F "image=@test.png" http://localhost:8080/recognize
输出示例:
{"result": "7KQ9"}
浙公网安备 33010602011771号