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

参考资料如下:

图像处理之错切变换 适用于错切变换小于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 < trainList.length; 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 < width; x++) {
            for (int y = 0; y < codeImg.getHeight(); 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<BufferedImage> 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搜索过没有中文资料,只能从官网给的资料学习。

 

http://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 < outputCount; 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<ImagePair> implements Serializable {
    public final Map<String, Integer> identity2neuron = new HashMap<String, Integer>();
    public final Map<Integer, String> neuron2identity = new HashMap<Integer, String>();
    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#开发一个完善桌面软件

转载于:https://www.cnblogs.com/linkarl/p/5063878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值