用 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

posted @ 2025-06-03 19:13  ttocr、com  阅读(315)  评论(0)    收藏  举报