使用 Java 和 DL4J 实现图像验证码识别系统
本项目展示如何用 Java 深度学习框架 DL4J 构建一个基础的图像验证码识别器。验证码图片依旧由 Python 脚本生成,而训练与预测则在 Java 中完成。
一、准备验证码数据(用 Python)
使用 captcha 库生成训练图像:
from captcha.image import ImageCaptcha
import string, os, random
characters = string.digits + string.ascii_uppercase
output_dir = "captcha_data"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
gen = ImageCaptcha(width=160, height=60)
更多内容访问ttocr.com或联系1436423940
for i in range(10000):
text = ''.join(random.choices(characters, k=4))
img = gen.generate_image(text)
img.save(f"{output_dir}/{text}_{i}.png")二、Java 项目配置(Maven)
添加 DL4J 和 ND4J 依赖到 pom.xml:
import org.datavec.api.split.FileSplit;
import org.datavec.image.loader.BaseImageLoader;
import org.datavec.image.recordreader.ImageRecordReader;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;
FileSplit files = new FileSplit(new File("captcha_data"), BaseImageLoader.ALLOWED_FORMATS, new Random(123));
ImageRecordReader rr = new ImageRecordReader(60, 160, 3, new CaptchaLabelGenerator());
rr.initialize(files);
DataSetIterator trainIter = new RecordReaderDataSetIterator(rr, 64, 1, 36);你需要实现一个 CaptchaLabelGenerator 类,从文件名中解析出标签,并转为向量。
四、构建神经网络模型
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.*;
import org.nd4j.linalg.learning.config.Adam;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
MultiLayerConfiguration config = new NeuralNetConfiguration.Builder()
.updater(new Adam(0.001))
.list()
.layer(new ConvolutionLayer.Builder(3, 3).nIn(3).nOut(32).activation(Activation.RELU).build())
.layer(new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2,2).build())
.layer(new ConvolutionLayer.Builder(3, 3).nOut(64).activation(Activation.RELU).build())
.layer(new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2,2).build())
.layer(new DenseLayer.Builder().nOut(128).activation(Activation.RELU).build())
.layer(new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation(Activation.SOFTMAX).nOut(36 * 4).build())
.setInputType(InputType.convolutionalFlat(60, 160, 3))
.build();
MultiLayerNetwork model = new MultiLayerNetwork(config);
model.init();五、训练模型
for (int i = 0; i < 10; i++) {
model.fit(trainIter);
}
model.save(new File("captcha_model.zip"));六、预测验证码
INDArray input = imageLoader.asMatrix(new File("captcha_data/AB1X_0.png"));
INDArray output = model.output(input);
int[] predIndices = output.argMax(1).toIntVector();
StringBuilder prediction = new StringBuilder();
for (int i = 0; i < 4; i++) {
prediction.append(chars.charAt(predIndices[i]));
}
System.out.println("Predicted: " + prediction);
浙公网安备 33010602011771号