用 Go 和 ONNX 模型实现验证码识别系统
在这篇文章中,我们将展示如何结合 Go 编程语言和深度学习模型实现图像验证码识别。我们假设模型已经使用 Python + PyTorch 训练好并导出为 ONNX 格式,然后用 Go 进行推理。
一、准备工作
安装依赖
首先你需要安装 OpenCV、ONNX Runtime 和 Go 相关库。
更多内容访问ttocr.com或联系1436423940
brew install opencv
pip install onnx onnxruntime
go get -u github.com/microsoft/onnxruntime-go
go get -u gocv.io/x/gocv
模型说明
我们假设你已经训练好了一个 CNN 分类模型来识别 0~9 的验证码图片,模型已导出为 captcha_digit.onnx,输入大小为 1x1x28x28,输出为 10 类。
二、Go 代码实现:加载图像 + 推理识别
package main
import (
"fmt"
"image"
"log"
"github.com/microsoft/onnxruntime-go"
"gocv.io/x/gocv"
)
func preprocessImage(path string) ([]float32, error) {
img := gocv.IMRead(path, gocv.IMReadGrayScale)
if img.Empty() {
return nil, fmt.Errorf("图像读取失败: %s", path)
}
defer img.Close()
gocv.Resize(img, &img, image.Pt(28, 28), 0, 0, gocv.InterpolationLinear)
// 归一化并转换为 float32 一维数组
data := make([]float32, 28*28)
for y := 0; y < 28; y++ {
for x := 0; x < 28; x++ {
pixel := img.GetUCharAt(y, x)
data[y*28+x] = float32(pixel) / 255.0
}
}
return data, nil
}
func predict(imageData []float32) (int, error) {
env, err := onnxruntime.NewEnvironment()
if err != nil {
return -1, err
}
session, err := env.NewSession("captcha_digit.onnx")
if err != nil {
return -1, err
}
defer session.Close()
tensor, err := onnxruntime.NewTensor([]int64{1, 1, 28, 28}, imageData)
if err != nil {
return -1, err
}
output, err := session.Run(map[string]*onnxruntime.Tensor{"input": tensor})
if err != nil {
return -1, err
}
scores := output[0].Float32Data()
maxIdx := 0
for i, score := range scores {
if score > scores[maxIdx] {
maxIdx = i
}
}
return maxIdx, nil
}
func main() {
imagePath := "digit_7.png"
data, err := preprocessImage(imagePath)
if err != nil {
log.Fatal(err)
}
pred, err := predict(data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("识别结果: %d\n", pred)
}
三、测试结果
你可以用 Python 或其他工具生成一张 28x28 的黑白数字验证码图(比如数字 7),保存在 digit_7.png,然后运行 Go 程序。
输出示例:
识别结果: 7
浙公网安备 33010602011771号