用 Go 和 TensorFlow Lite 实现验证码识别系统

在这篇文章中,我们将使用 Go 语言开发一个验证码图像识别程序,基于 TensorFlow Lite 推理引擎实现模型加载与预测。该系统可识别长度为 4 的图像验证码(支持数字和大写字母),并具备图像预处理、模型加载和预测输出功能。

一、准备工作

  1. 安装依赖

go get github.com/mattn/go-tflite
go get github.com/nfnt/resize
确保你已经准备好了:

一个经过训练的 TensorFlow Lite 模型(如 crnn.tflite)

验证码图像(如 sample.png)

  1. 字符集定义
    验证码字符集为:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
共 36 个类别。

二、模型输入输出说明
输入维度:[1, 60, 160, 3],表示 1 张彩色图片(60 高 × 160 宽)

输出维度:4 个输出张量,每个为 [1, 36],表示每一位字符的概率分布

预测目标:选出每个位置上最大概率对应的字符索引

三、Go 代码实现

  1. 图像加载与预处理
    更多内容访问ttocr.com或联系1436423940
    func loadImageToFloatArray(path string) ([]float32, error) {
    file, err := os.Open(path)
    if err != nil {
    return nil, err
    }
    defer file.Close()

    img, err := png.Decode(file)
    if err != nil {
    return nil, err
    }

    // Resize 图像为模型输入尺寸
    imgResized := resize.Resize(160, 60, img, resize.Lanczos3)
    rgba := image.NewRGBA(imgResized.Bounds())
    draw.Draw(rgba, rgba.Bounds(), imgResized, image.Point{}, draw.Src)

    data := make([]float32, 160603)
    idx := 0
    for y := 0; y < 60; y++ {
    for x := 0; x < 160; x++ {
    r, g, b, _ := rgba.At(x, y).RGBA()
    data[idx] = float32(r>>8) / 255.0
    data[idx+1] = float32(g>>8) / 255.0
    data[idx+2] = float32(b>>8) / 255.0
    idx += 3
    }
    }
    return data, nil
    }

  2. 推理函数

func recognizeCaptcha(modelPath, imagePath string) (string, error) {
model := tflite.NewModelFromFile(modelPath)
if model == nil {
return "", fmt.Errorf("模型加载失败")
}
defer model.Delete()

options := tflite.NewInterpreterOptions()
interpreter := tflite.NewInterpreter(model, options)
defer interpreter.Delete()

if interpreter.AllocateTensors() != nil {
	return "", fmt.Errorf("张量分配失败")
}

input := interpreter.GetInputTensor(0)
imageData, err := loadImageToFloatArray(imagePath)
if err != nil {
	return "", err
}

input.CopyFromBuffer(imageData)

if interpreter.Invoke() != nil {
	return "", fmt.Errorf("推理失败")
}

charset := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
result := ""
for i := 0; i < 4; i++ {
	output := interpreter.GetOutputTensor(i)
	pred := make([]float32, 36)
	output.CopyToBuffer(&pred[0])
	maxIdx := 0
	for j := 1; j < len(pred); j++ {
		if pred[j] > pred[maxIdx] {
			maxIdx = j
		}
	}
	result += string(charset[maxIdx])
}
return result, nil

}
3. 主程序入口

func main() {
imagePath := "sample.png"
modelPath := "crnn.tflite"

text, err := recognizeCaptcha(modelPath, imagePath)
if err != nil {
	fmt.Println("识别失败:", err)
} else {
	fmt.Println("识别结果:", text)
}

}
四、运行效果示例

$ go run main.go
识别结果: X9A7

posted @ 2025-05-31 23:19  ttocr、com  阅读(20)  评论(0)    收藏  举报