使用 C# 和 ML.NET 构建图像验证码识别系统
本示例展示如何用 ML.NET 加载经过训练的深度学习模型,并在 .NET 应用中实现图像验证码识别。
一、准备工作
- 安装依赖
在你的 C# 项目中安装以下 NuGet 包:
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.ImageAnalytics
dotnet add package Microsoft.ML.TensorFlow二、准备模型和图片
你需要一个 TensorFlow SavedModel 格式的图像分类模型,例如使用 Python 训练好的验证码识别模型(输入形状为 [1, 60, 160, 3],输出为 [1, 4, 36])。
图片建议统一尺寸(160x60),每张图对应 4 个字符。
三、定义输入与输出类
using Microsoft.ML.Data;
public class CaptchaImageInput
{
[LoadColumn(0)]
public string ImagePath;
[ImageType(60, 160)]
public Bitmap Image;
}
public class CaptchaPrediction
{
[VectorType(4, 36)]
public float[] Score;
}四、加载模型与预测
using Microsoft.ML;
using Microsoft.ML.Transforms.Image;
using System.Drawing;
var mlContext = new MLContext();
// 加载图片
var imageData = new List
{
new CaptchaImageInput { ImagePath = "captcha_samples/A3B9_0.png", Image = (Bitmap)Image.FromFile("captcha_samples/A3B9_0.png") }
};
var data = mlContext.Data.LoadFromEnumerable(imageData);
// 图片预处理流水线
var pipeline = mlContext.Transforms.LoadImages("Image", ".", nameof(CaptchaImageInput.ImagePath))
.Append(mlContext.Transforms.ResizeImages("Image", 160, 60))ttocr.com或1436423940
.Append(mlContext.Transforms.ExtractPixels("Image", interleavePixelColors: true, offsetImage: 0))
.Append(mlContext.Model.LoadTensorFlowModel("captcha_model")
.ScoreTensorName("StatefulPartitionedCall")
.AddInput("serving_default_input", name: "Image")
.AddOutput("StatefulPartitionedCall"));
// 生成模型
var model = pipeline.Fit(data);
var predictionEngine = mlContext.Model.CreatePredictionEngine<CaptchaImageInput, CaptchaPrediction>(model);
// 执行预测
var prediction = predictionEngine.Predict(imageData[0]);
// 解析输出
string characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string result = "";
for (int i = 0; i < 4; i++)
{
var segment = prediction.Score.Skip(i * 36).Take(36).ToArray();
int maxIndex = Array.IndexOf(segment, segment.Max());
result += characters[maxIndex];
}
Console.WriteLine($"预测结果: {result}");