热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

验证码识别系统以及人工智能总结神经网络encog图像识别入门

参考资料如下:图像处理之错切变换 适用于错切变换小于90度的情况,大于90度最后需要平移爬山算法模拟退火算法http:www.cnblogs.comhe

参考资料如下:

图像处理之错切变换 适用于错切变换小于90度的情况,大于90度最后需要平移

爬山算法 模拟退火算法  http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 

图像二值化----otsu(最大类间方差法、大津算法)http://blog.csdn.net/abcjennifer/article/details/6671288

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

二值图像膨胀腐蚀算法的几种实现方式 http://www.tuicool.com/articles/YNB3Mf

实现验证码变形 http://www.shangxueba.com/jingyan/103044.html

支持向量机通俗导论(理解SVM的三层境界)

支持向量机上课版(上) http://www.julyedu.com/video/play/?id=38&course=23

计算机图形学 http://www.icourse163.org/course/cau-45006?tid=263003#/info

Qi Qi Web portal - AI course  http://qiqi789.github.io/teaching/AI/  老师的人工智能课程

Web验证码的生成与识别_李颖  这篇论文给我很多帮助,这次也让我学会了如何利用论文,以前都是在百度看博文(并不是最佳的)。

 

 

 

不足之处:该系统比较局限,只能较好的处理无粘连有扭曲的图像,对粘连验证码的处理还需要继续研究。

 

svm

LIBSVM入门解读

Libsvm java版代码注释及详解 http://blog.sina.com.cn/s/blog_8095e51d010152xf.html

训练

package svm;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import utility.Tool;

public class InitModelData {    
    public static void main(String[] args) {
         init();
        // check();    

    }

    //训练数据存放
    static String path = "SVM/train.txt";

    private static void check() {
        String context = Tool.inputFile(path);
        System.out.println(context);
    }

    private static void init() {
        File file = new File("train");
        File[] trainList = file.listFiles();
        String identity;
        String content = "";
        for (int i = 0; i ) {
            try {
                if (!trainList[i].isFile()) {
                    continue;
                }
                BufferedImage codeImg = ImageIO.read(trainList[i]);
                identity = trainList[i].getName().split("-")[0];
                content += dataTemplate(identity, codeImg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Tool.outputFile(content, path);
        System.out.print(content);
        initModel();
    }
    
    /**
     * 利用训练数据模板生成模型数据
     */
    private static void initModel() {
        /*"-v","20" ,"-c","500", */
        String[] arg = {"-v","20" ,//模型参数设置
                "svm/train.txt", //存放SVM训练模型用的数据的路径
                "svm/model.txt" }; //存放SVM模型数据
        // 创建一个训练对象
        svm_train t = new svm_train();
        try {
            t.main(arg);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // 调用
    }
    /**
     * svm数据模板
     * @param charString
     * @param codeImg
     * @return
     */
    public static String dataTemplate(String charString, BufferedImage codeImg) {
        String content = "";
        content += charString + " ";
        int width = codeImg.getWidth();
        for (int x = 0; x ) {
            for (int y = 0; y ) {
                int num = x * width + y;
                content += num + ":";
                int isBlack = Tool.isBlack(codeImg.getRGB(x, y)) ? 1 : 0;
                content += isBlack + " ";
            }
        }
        content += "\n";
        return content;
    }

}

识别

    private static String svmProcess(List charImgs) {

        String content = "";
        for (BufferedImage bufferedImage : charImgs) {
            content += InitModelData.dataTemplate("1", bufferedImage);
        }
        System.out.println(content);
        // 输出测试文件
        Tool.outputFile(content, "SVM/test.txt");
        return svmMatch();
    }

    private static String svmMatch() {

        String[] parg = { "SVM/test.txt", // 这个是存放测试数据
                "SVM/model.txt", // 调用的是训练以后的模型
                "SVM/result.txt" }; // 生成的结果的文件的路径
        svm_predict p = new svm_predict();
        try {
            p.main(parg);
        } catch (IOException e) {
            e.printStackTrace();
        } // 调用
        String cOntent= Tool.inputFile("SVM/result.txt");
//        content把小数1.02.0 小数点和小数点后的0消除
        cOntent= content.replaceAll(".\\d", "");
        return content;
    }

 

 

2016/4/1更新

利用encog神经网络图像识别验证码

encog搜索过没有中文资料,只能从官网给的资料学习。

 

https://files.cnblogs.com/files/linkarl/Encog3Java-User.pdf

学习这本书的关于图像识别部分

chapter 2 obtaining data for encog

chapter 4 constructing neural networks in java

chapter 5 propagation traing 

chapter 9 using image data 

 

 

import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

import javax.imageio.ImageIO;

import org.encog.ml.data.MLData;
import org.encog.ml.data.basic.BasicMLData;
import org.encog.ml.train.strategy.ResetStrategy;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;
import org.encog.persist.EncogDirectoryPersistence;
import org.encog.platformspecific.j2se.TrainingDialog;
import org.encog.platformspecific.j2se.data.image.ImageMLData;
import org.encog.platformspecific.j2se.data.image.ImageMLDataSet;
import org.encog.util.downsample.SimpleIntensityDownsample;
import org.encog.util.simple.EncogUtility;

public class TrainProcess {
    private static ImgList imgList = new ImgList();
    private static ImageMLDataSet trainDataSet;
    private static BasicNetwork network;
    private static int downsampleHeight = 100;
    private static int downsampleWidth = 100;
    // RGB彩色图片
    // RGBDownsample downsample=new RGBDownsample();
    // 采样
    private static SimpleIntensityDownsample downsample = new SimpleIntensityDownsample();
    public static final String FILENAME = "encogexample.eg";

    public static void main(String[] args) {
        inputTrain();
        processNetwork();
        networkConfig();
        trainNetwork();
        System.out.println("Saving network");
        EncogDirectoryPersistence.saveObject(new File(FILENAME), network)
    }

    private static void trainNetwork() {
        // 图形界面
        String mode = "gui";
        // The number of minutes to train for.
        int minutes = 1;
        // the minimum error must achieve
        double strategyError = 0.1;
        // the number of cycles achieve the error rate
        int strategyCycles = 20;
        // Resilient弹性
        final ResilientPropagation train = new ResilientPropagation(network,
                trainDataSet);
        train.addStrategy(new ResetStrategy(strategyError, strategyCycles));
        // strategies
        // Greedy HybridStrategy ResetStrategy
        // SmartLearningRate SmartMomentum
        // StopTrainingStrategy

        // gui界面
        TrainingDialog.trainDialog(network, trainDataSet);

        // 或者 console界面
        // EncogUtility.trainConsole(train, network, training, minutes);
        System.out.println("train end");
    }

    private static void networkConfig() {
        // 第一隐藏层神经元数目
        int hidden1 = 30;
        // 第二隐藏层神经元数目
        int hidden2 = 30;
        // true:use a hyperbolic tangent activation function.
        network = EncogUtility.simpleFeedForward(trainDataSet.getInputSize(),
                hidden1, hidden2, trainDataSet.getIdealSize(), true);
        System.out.println("Created network:" + network.toString());
    }

    /**
     * 用训练数据设置网络
     */
    private static void processNetwork() {
        trainDataSet = new ImageMLDataSet(downsample, false, 1, 0);
        // processNetwork
        for (final ImagePair pair : imgList) {
            try {
                final MLData idealOutputData = returnIdealOutputData(pair);
                Image img = ImageIO.read(pair.getFile());
                final ImageMLData actualInputdata = new ImageMLData(img);
                // The ideal output should be specified when using supervised
                // 1:actual input data 2:ideal output data.
                trainDataSet.add(actualInputdata, idealOutputData);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        trainDataSet.downsample(downsampleHeight, downsampleWidth);
    }

    /**
     * 设置该标识对应输出神经元为1,其余的为0的理想数据(设置情况) ideal output data.
     * 
     * @param pair
     * @return
     */
    private static MLData returnIdealOutputData(final ImagePair pair) {
        // hold the ideal output for each output neuron
        int outputCount = ImgList.outputCount;
        final MLData ideal = new BasicMLData(outputCount);
        int indexOutputNeuron = pair.getIndexOutputNeuron();
        // corresponds to the identity of the image currently being trained
        // will be set to 1
        for (int i = 0; i ) {
            if (i == indexOutputNeuron) {
                ideal.setData(i, 1);
            } else {
                ideal.setData(i, -1);
            }
        }
        return ideal;
    }

    /**
     * 输入训练数据
     */
    private static void inputTrain() {
        File[] trainList = new File("trainData").listFiles();
        for (File file : trainList) {
            if (!file.isFile()) {
                continue;
            }
            String identity = file.getName().split("-")[0];
            imgList.add(file, identity);
            System.out.println(identity);
        }
        outputImgList();
    }

    /**
     * 序列化imgList对象保存
     */
    private static void outputImgList() {
                try {
            ObjectOutputStream outputStream = new ObjectOutputStream(
                    new FileOutputStream("imgList.object"));
            outputStream.writeObject(imgList);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class ImgList extends ArrayList implements Serializable {
    public final Map identity2neuron = new HashMap();
    public final Map neuron2identity = new HashMap();
    public static int outputCount = 0;

    public void add(File file, String identity) {
        int indexOutputNeuron = assignIdentity(identity);
        this.add(new ImagePair(file, indexOutputNeuron));
    }

    private int assignIdentity(final String identity) {
        String lowerCase = identity.toLowerCase();
        if (identity2neuron.containsKey(lowerCase)) {
            return identity2neuron.get(lowerCase);
        }
        final int result = outputCount++;
        identity2neuron.put(lowerCase, result);
        neuron2identity.put(result, lowerCase);
        return result;
    }
}

 

import java.io.File;
import java.io.Serializable;

/**
 * links the image to its output neuron index number.
 * 
 * @author Administrator
 *
 */
public class ImagePair implements Serializable {
    private final File file;
    private final int indexOutputNeuron;

    public ImagePair(File file, int indexOutputNeuron) {
        super();
        this.file = file;
        this.indexOutputNeuron = indexOutputNeuron;
    }

    public File getFile() {
        return file;
    }

    public int getIndexOutputNeuron() {
        return indexOutputNeuron;
    }

}

 

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

import javax.imageio.ImageIO;

import org.encog.neural.networks.BasicNetwork;
import org.encog.persist.EncogDirectoryPersistence;
import org.encog.platformspecific.j2se.data.image.ImageMLData;
import org.encog.util.downsample.SimpleIntensityDownsample;

public class RecognizeProcess {
    public static final String FILENAME = "encogexample.eg";
    private static int downsampleHeight = 20;
    private static int downsampleWidth = 20;
    private static SimpleIntensityDownsample downsample = new SimpleIntensityDownsample();

    public static void main(String[] args) {
        ImgList imgList = inputImgList();
        BasicNetwork network = (BasicNetwork) EncogDirectoryPersistence
                .loadObject(new File(FILENAME));
        File[] files = new File("recognise").listFiles();
        int num = 0;
        for (File file : files) {
            if (!file.isFile()) {
                continue;
            }
            try {
                Image img = ImageIO.read(file);
                ImageMLData input = new ImageMLData(img);
                input.downsample(downsample, false, downsampleHeight,
                        downsampleWidth, 1, -1);
                final int winner = network.winner(input);
                String name = file.getName().split("[\\.-]")[2];
                String result = imgList.neuron2identity.get(winner);
                System.out.println(name + "   " + result);
                if (name.equals(result)) {
                    num++;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(num);
    }

    /**
     * 反序列化imgList对象
     * 
     * @return
     */
    private static ImgList inputImgList() {
        ImgList imgList = null;
        try {
            ObjectInputStream inputStream = new ObjectInputStream(
                    new FileInputStream("imgList.object"));
            imgList = (ImgList) inputStream.readObject();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return imgList;
    }
}

 

2016-7-20 更新

最后总结:我因为熟悉java而使用java来开发,但发现java并不适合这种桌面软件开发,android可能需要这样的java本地sdk,不然速度太慢了,c++虽然学过但是忘记很多了,准备转战c#开发一个完善桌面软件


推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 杭州PHP大厂有哪些(2023年最新分享)
    导读:今天编程笔记来给各位分享关于杭州PHP大厂有哪些的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: ... [详细]
author-avatar
莫名2602913353
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有