使用 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()
}
浙公网安备 33010602011771号