用 Go 和 TensorFlow Lite 实现验证码识别系统
在这篇文章中,我们将使用 Go 语言开发一个验证码图像识别程序,基于 TensorFlow Lite 推理引擎实现模型加载与预测。该系统可识别长度为 4 的图像验证码(支持数字和大写字母),并具备图像预处理、模型加载和预测输出功能。
一、准备工作
- 安装依赖
go get github.com/mattn/go-tflite
go get github.com/nfnt/resize
确保你已经准备好了:
一个经过训练的 TensorFlow Lite 模型(如 crnn.tflite)
验证码图像(如 sample.png)
- 字符集定义
验证码字符集为:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
共 36 个类别。
二、模型输入输出说明
输入维度:[1, 60, 160, 3],表示 1 张彩色图片(60 高 × 160 宽)
输出维度:4 个输出张量,每个为 [1, 36],表示每一位字符的概率分布
预测目标:选出每个位置上最大概率对应的字符索引
三、Go 代码实现
-
图像加载与预处理
更多内容访问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
} -
推理函数
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
浙公网安备 33010602011771号