【问题标题】:Using Handwritten Number Recognition by Yan Cheng, Cheok?使用Yan Cheng,Cheok的手写数字识别?
【发布时间】:2012-05-14 06:58:42
【问题描述】:

我正计划将(Yan Cheng, Cheok 的手写数字识别)用于我正在进行的项目,我应该使用他们的数据库进行数字识别,但文件不在他们的网站上,我应该使用正如他们在教程中所说,名为“LRTBHVtrainingdata.txtI=96H=200LR=0.9M=0.1C=2000.snet”的文件,但是我在他们的网站上找到的(http://yann.lecun.com/exdb/mnist/ ) 是四个文件,我不知道如何使用它们?那么关于在哪里获取他们的数据库或在哪里或使用它们的文件有什么帮助吗?

【问题讨论】:

    标签: neural-network ocr number-recognition


    【解决方案1】:

    您正在查看的文件是正确的文件。它们是以 20x20 框为中心的归一化灰度图像(0-白色,255-黑色)。该页面解释了文件的结构(只需向下滚动到底部)。

    这是我不久前用 Java 编写的一些代码,用于读取 MNIST 图像和标签文件:

    import net.vivin.digit.DigitImage;    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.ByteBuffer;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * User: vivin
     * Date: 11/11/11
     * Time: 10:07 AM
     */
    public class DigitImageLoadingService {
    
        private String labelFileName;
        private String imageFileName;
    
        /** the following constants are defined as per the values described at http://yann.lecun.com/exdb/mnist/ **/
    
        private static final int MAGIC_OFFSET = 0;
        private static final int OFFSET_SIZE = 4; //in bytes
    
        private static final int LABEL_MAGIC = 2049;
        private static final int IMAGE_MAGIC = 2051;
    
        private static final int NUMBER_ITEMS_OFFSET = 4;
        private static final int ITEMS_SIZE = 4;
    
        private static final int NUMBER_OF_ROWS_OFFSET = 8;
        private static final int ROWS_SIZE = 4;
        public static final int ROWS = 28;
    
        private static final int NUMBER_OF_COLUMNS_OFFSET = 12;
        private static final int COLUMNS_SIZE = 4;
        public static final int COLUMNS = 28;
    
        private static final int IMAGE_OFFSET = 16;
        private static final int IMAGE_SIZE = ROWS * COLUMNS;
    
    
        public DigitImageLoadingService(String labelFileName, String imageFileName) {
            this.labelFileName = labelFileName;
            this.imageFileName = imageFileName;
        }
    
        public List<DigitImage> loadDigitImages() throws IOException {
            List<DigitImage> images = new ArrayList<DigitImage>();
    
            ByteArrayOutputStream labelBuffer = new ByteArrayOutputStream();
            ByteArrayOutputStream imageBuffer = new ByteArrayOutputStream();
    
            InputStream labelInputStream = this.getClass().getResourceAsStream(labelFileName);
            InputStream imageInputStream = this.getClass().getResourceAsStream(imageFileName);
    
            int read;
            byte[] buffer = new byte[16384];
    
            while((read = labelInputStream.read(buffer, 0, buffer.length)) != -1) {
               labelBuffer.write(buffer, 0, read);
            }
    
            labelBuffer.flush();
    
            while((read = imageInputStream.read(buffer, 0, buffer.length)) != -1) {
                imageBuffer.write(buffer, 0, read);
            }
    
            imageBuffer.flush();
    
            byte[] labelBytes = labelBuffer.toByteArray();
            byte[] imageBytes = imageBuffer.toByteArray();
    
            byte[] labelMagic = Arrays.copyOfRange(labelBytes, 0, OFFSET_SIZE);
            byte[] imageMagic = Arrays.copyOfRange(imageBytes, 0, OFFSET_SIZE);
    
            if(ByteBuffer.wrap(labelMagic).getInt() != LABEL_MAGIC)  {
                throw new IOException("Bad magic number in label file!");
            }
    
            if(ByteBuffer.wrap(imageMagic).getInt() != IMAGE_MAGIC) {
                throw new IOException("Bad magic number in image file!");
            }
    
            int numberOfLabels = ByteBuffer.wrap(Arrays.copyOfRange(labelBytes, NUMBER_ITEMS_OFFSET, NUMBER_ITEMS_OFFSET + ITEMS_SIZE)).getInt();
            int numberOfImages = ByteBuffer.wrap(Arrays.copyOfRange(imageBytes, NUMBER_ITEMS_OFFSET, NUMBER_ITEMS_OFFSET + ITEMS_SIZE)).getInt();
    
            if(numberOfImages != numberOfLabels) {
                throw new IOException("The number of labels and images do not match!");
            }
    
            int numRows = ByteBuffer.wrap(Arrays.copyOfRange(imageBytes, NUMBER_OF_ROWS_OFFSET, NUMBER_OF_ROWS_OFFSET + ROWS_SIZE)).getInt();
            int numCols = ByteBuffer.wrap(Arrays.copyOfRange(imageBytes, NUMBER_OF_COLUMNS_OFFSET, NUMBER_OF_COLUMNS_OFFSET + COLUMNS_SIZE)).getInt();
    
            if(numRows != ROWS && numRows != COLUMNS) {
                throw new IOException("Bad image. Rows and columns do not equal " + ROWS + "x" + COLUMNS);
            }
    
            for(int i = 0; i < numberOfLabels; i++) {
                int label = labelBytes[OFFSET_SIZE + ITEMS_SIZE + i];
                byte[] imageData = Arrays.copyOfRange(imageBytes, (i * IMAGE_SIZE) + IMAGE_OFFSET, (i * IMAGE_SIZE) + IMAGE_OFFSET + IMAGE_SIZE);
    
                images.add(new DigitImage(label, imageData));
            }
    
            return images;
        }
    }
    

    【讨论】:

    • 感谢您的回答。所以在我阅读完图像后,我应该将它们保存为 txt 文件并将它们与他们的库一起使用,并用我的文件替换这个“LRTBHVtrainingdata.txtI=96H=200LR=0.9M=0.1C=2000.snet”或者我应该怎么做下一个?
    • 我不确定该文件应该包含什么。你使用什么样的算法?你在创建一个神经网络吗?
    • 不,我只需要将项目用作黑盒,只需给它图像并返回数字,我在他们的教程中看到了示例,他们使用了这个文件“LRTBHVtrainingdata.txtI=96H=200LR =0.9M=0.1C=2000.snet" 然后使用方法 .regocnize() 来获取结果......所以我只需要数据库文件
    • 啊,嗯。我不确定该文件是如何组织的。但是,您可能只能直接使用他们提供的文件。你试过用这些吗?
    • 它对我有用。非常感谢您抽出宝贵时间,我在 libnumrecognition_src_0.0​2.zip\libnumrecognition\database\ 中找到了该文件,这是该项目的旧版本,并且可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多