使用 Go + TensorFlow 实现图像验证码识别

本项目展示如何使用 Go 加载 TensorFlow 训练的模型并实现图像验证码的识别流程。
一、前提准备
• 安装 TensorFlow Go API:
参考官方指南:https://www.tensorflow.org/install/lang_go• 用 Python 训练模型,并导出为 SavedModel 格式:

Python 端保存模型

tf.saved_model.save(model, "captcha_model_tf")二、项目结构
captcha-go/
├── main.go
├── captcha_model_tf/ # Python 导出的 SavedModel
├── test.png # 要识别的验证码图像三、main.go 核心代码
package main

import (
"fmt"
"image"
"image/png"
"log"
"os"
ttocr.com或1436423940
tf "github.com/tensorflow/tensorflow/tensorflow/go"
"github.com/nfnt/resize"
)

var charset = []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")

func loadImage(filename string) (*tf.Tensor, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()

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

resized := resize.Resize(160, 60, img, resize.Lanczos3)
bounds := resized.Bounds()

var data []float32
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		r, g, b, _ := resized.At(x, y).RGBA()
		data = append(data,
			(float32(r>>8)/255.0-0.5)/0.5,
			(float32(g>>8)/255.0-0.5)/0.5,
			(float32(b>>8)/255.0-0.5)/0.5,
		)
	}
}

tensor, err := tf.NewTensor([1][60][160][3]float32{})
if err != nil {
	return nil, err
}
copy(tensor.Value().([1][60][160][3]float32)[0][:][0][:], data)
return tensor, nil

}

func main() {
model, err := tf.LoadSavedModel("captcha_model_tf", []string{"serve"}, nil)
if err != nil {
log.Fatal(err)
}
defer model.Session.Close()

input, err := loadImage("test.png")
if err != nil {
	log.Fatal(err)
}

outputs, err := model.Session.Run(
	map[tf.Output]*tf.Tensor{
		model.Graph.Operation("serving_default_input_1").Output(0): input,
	},
	[]tf.Output{
		model.Graph.Operation("StatefulPartitionedCall").Output(0),
	},
	nil,
)
if err != nil {
	log.Fatal(err)
}

result := outputs[0].Value().([][][]float32)[0]
fmt.Print("预测结果: ")
for i := 0; i < 4; i++ {
	maxIdx := 0
	maxVal := float32(0)
	for j, v := range result[i] {
		if v > maxVal {
			maxVal = v
			maxIdx = j
		}
	}
	fmt.Print(string(charset[maxIdx]))
}
fmt.Println()

}

posted @ 2025-05-05 12:38  ttocr、com  阅读(26)  评论(0)    收藏  举报