Vectoriser et imager les données d'images numériques manuscrites MNIST avec Java

Tout d'abord, après avoir expliqué les spécifications des données d'images numériques manuscrites MNIST, elles sont vectorisées et affichées / enregistrées sous forme d'image [code Java](https :: //github.com/kinmojr/MNIST_Java) est expliqué.

Qu'est-ce que l'ensemble de données d'images numériques manuscrites de MNIST?

Il s'agit d'un ensemble de données d'images numériques manuscrites de 0 à 9 publiées sur le net. La taille de chaque image est de 28 pixels carrés et la couleur est une échelle de gris de 255 gradations. Il est souvent utilisé pour l'apprentissage et l'évaluation de l'apprentissage automatique.

Spécifications des données

Cette section décrit les spécifications des données numériques manuscrites MNIST.

Ensemble de données de formation

Il y a 60 000 données d'image de 0 à 9 et des données d'étiquette correctes utilisées pour la formation (apprentissage).

Données d'image pour l'entraînement

train-images-idx3-ubyte.gz Les données d'image d'entraînement sont stockées dans un format binaire unique.

décalage Type de données valeur La description
0 Entier 32 bits 2051 nombre magique(MSB First)
4 Entier 32 bits 60000 Nombre d'images
8 Entier 32 bits 28 Nombre de pixels verticaux dans l'image
12 Entier 32 bits 28 Nombre de pixels à côté de l'image
16 Octets non signés 0 à 255 Valeur en niveaux de gris du pixel de la 1ère ligne et de la 1ère colonne de la 1ère image
17 Octets non signés 0 à 255 Valeur en niveaux de gris du pixel dans la 1ère ligne et la 2ème colonne de la 1ère image
・ ・ ・ Octets non signés 0 à 255 Valeur en niveaux de gris du pixel de la 28e ligne et de la 28e colonne de la 60 000e image

Corriger les données d'étiquette de réponse pour la formation

train-labels-idx1-ubyte.gz L'étiquette correcte des données d'entraînement est stockée dans un format binaire unique.

décalage Type de données valeur La description
0 Entier 32 bits 2049 nombre magique(MSB First)
4 Entier 32 bits 60000 Nombre d'images
8 Octets non signés 0-9 Libellé correct pour la première image
9 Octets non signés 0-9 Libellé correct pour la deuxième image
・ ・ ・ Octets non signés 0-9 Libellé correct pour la 60 000e image

Jeu de données de test

Il y a 10 000 données d'image de 0 à 9 et des données d'étiquette correctes utilisées pour le test (évaluation).

Test des données d'image

t10k-images-idx3-ubyte.gz Les données d'image de test sont stockées dans un format binaire unique.

décalage Type de données valeur La description
0 Entier 32 bits 2051 nombre magique(MSB First)
4 Entier 32 bits 10000 Nombre d'images
8 Entier 32 bits 28 Nombre de pixels verticaux dans l'image
12 Entier 32 bits 28 Nombre de pixels à côté de l'image
16 Octets non signés 0 à 255 Valeur en niveaux de gris du pixel de la 1ère ligne et de la 1ère colonne de la 1ère image
17 Octets non signés 0 à 255 Valeur en niveaux de gris du pixel dans la 1ère ligne et la 2ème colonne de la 1ère image
・ ・ ・ Octets non signés 0 à 255 Valeur en niveaux de gris des pixels de la 28e ligne et de la 28e colonne de la 10 000e image

Étiquette de réponse correcte pour le test

t10k-labels-idx1-ubyte.gz L'étiquette correcte des données de test est stockée dans un format binaire unique.

décalage Type de données valeur La description
0 Entier 32 bits 2049 nombre magique(MSB First)
4 Entier 32 bits 10000 Nombre d'images
8 Octets non signés 0-9 Libellé correct pour la première image
9 Octets non signés 0-9 Libellé correct pour la deuxième image
・ ・ ・ Octets non signés 0-9 Libellé correct pour la 10 000e image

Vectorisation et imagerie par Java

Code source sur GitHub Voir README.md pour une utilisation facile.

Lecture des données d'image

Lisez les données à l'aide de DataInputStream. Utilisez readInt pour lire le nombre magique, le nombre d'images, le nombre de pixels verticaux de l'image et le nombre de pixels horizontaux de l'image. Le nombre de dimensions est 28 * 28 = 784. Lire les données d'image dans readUnsignedByte dans les entités de tableau 2D de type double. La première dimension est l'index d'image et la deuxième dimension est l'index de dimension. La valeur est divisée par 255,0 pour la normaliser pour une utilisation dans l'apprentissage automatique.

ImageDataSet.java


    private void loadFeatures() throws IOException {
        System.out.println("Loading feature data from " + fileName + " ...");
        DataInputStream is = new DataInputStream(new GZIPInputStream(new FileInputStream(Const.BASE_PATH + fileName)));
        is.readInt();
        numImages = is.readInt();
        numDimensions = is.readInt() * is.readInt();

        features = new double[numImages][numDimensions];
        for (int i = 0; i < numImages; i++) {
            for (int j = 0; j < numDimensions; j++) {
                features[i][j] = (double) is.readUnsignedByte() / 255.0;
            }
        }
    }

Lecture des données d'étiquette

Lisez les données à l'aide de DataInputStream. Lisez le nombre magique et le nombre d'images avec readInt. Lisez l'étiquette de réponse correcte avec readUnsignedByte dans les étiquettes de tableau de type int.

LabelDataSet.java


    private void loadLabels() throws IOException {
        System.out.println("Loading label data from " + fileName + " ...");
        DataInputStream is = new DataInputStream(new GZIPInputStream(new FileInputStream(Const.BASE_PATH + fileName)));

        is.readInt();
        numLabels = is.readInt();

        labels = new int[numLabels];
        for (int i = 0; i < numLabels; i++) {
            labels[i] = is.readUnsignedByte();
        }
    }

Affichage de l'image

Afficher dans le texte

Spécifiez l'index de l'image comme argument pour afficher le contour de l'image sous forme de texte sur la console.

ImageViewer.java


    public void showImageAsText(int index) {
        System.out.println("Label: " + labels[index]);
        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 28; j++) {
                double value = images[index][i * 28 + j];
                if (value > 0.0) {
                    System.out.print("**");
                } else {
                    System.out.print("  ");
                }
            }
            System.out.println();
        }
    }

Créer BufferedImage

Restaurez les données d'image vectorisées pour créer une BufferedImage. La valeur est normalisée, multipliez-la par 255,0 pour la ramener à sa valeur d'origine en niveaux de gris.

ImageViewer.java


    private BufferedImage makeImage(int index) {
        BufferedImage image =
                new BufferedImage(28, 28, BufferedImage.TYPE_INT_RGB);

        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 28; j++) {
                int value = (int) (images[index][i * 28 + j] * 255.0);
                image.setRGB(j, i, 0xff000000 | value << 16 | value << 8 | value);
            }
        }

        return image;
    }

Afficher dans la boîte de dialogue

La BufferedImage chargée par makeImage est affichée dans la boîte de dialogue.

ImageViewer.java


    public void showImage(int index) {
        BufferedImage image = makeImage(index);
        Icon icon = new ImageIcon(image);
        JOptionPane.showMessageDialog(null, labels[index], "MnistImageViewer", JOptionPane.PLAIN_MESSAGE, icon);
    }

Enregistrer dans un fichier image

Enregistrez la BufferedImage chargée par makeImage dans un fichier gif.

ImageViewer.java


    public void saveImage(String dir, String prefix, int index) throws IOException {
        BufferedImage image = makeImage(index);
        File file = new File(dir + "/" + prefix + "_" + String.format("%05d", index) + "_" + labels[index] + ".gif");
        if (file.exists()) file.delete();
        ImageIO.write(image, "gif", file);
    }

Recommended Posts

Vectoriser et imager les données d'images numériques manuscrites MNIST avec Java
Programmation Java (variables et données)
Importer des données Excel avec Java 2
Importer des données Excel avec Java
Importer des données Excel avec Java 3
Insertion Java Excel et extraction d'images
Afficher les données Firestore dans RecyclerView [Java]
Exemple d'encodage et de décodage en Java
Types de données de base et types de référence (Java)
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
Types de données de base et types de référence Java
Bonjour tout le monde en Java et Gradle
Créer des données binaires de longueur variable en Java
Différence entre final et immuable en Java
Paramètres Java Excel Couleur d'arrière-plan et image d'arrière-plan
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
J'ai reçu les données du voyage (application agenda) en Java et j'ai essayé de les visualiser # 001
Concernant les modificateurs transitoires et la sérialisation en Java
Détecter des vidéos similaires dans Java et OpenCV rev.2
À propos des types de données Java (en particulier des types primitifs) et des littéraux
Traitement parallèle et parallèle dans divers langages (édition Java)
Différence entre next () et nextLine () dans Java Scanner
Différences dans l'écriture des classes Java, C # et Javascript
[Traitement × Java] Type de données et programmation orientée objet
Capture et sauvegarde de l'installation de sélénium en Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Vérifier le comportement statique et public dans les méthodes Java
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Mémo organisé dans la tête (Java - type de données)
Distinguer les nombres positifs et négatifs en Java
Java ajoute et supprime les filigranes dans les documents Word
Détecter des vidéos similaires dans Java et OpenCV rev.1
Représente le «jour suivant» et le «jour précédent» en Java / Android
Questions sur la gestion des exceptions Java throw et try-catch
Télécharger et télécharger des notes en java sur S3
Crypter / décrypter avec AES256 en PHP et Java
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!