機械学習などに使用されるデータCIFAR-10をピクチャーボックスに表示する方法を記載します。

CIFAR-10のデータ構造は、

ラベル:1バイト R:1024 G:1024 B:1024

の順番で1+1024+1024+1024=3073バイト

を1レコード(1画像データ)としたデータで構成されています。

 

CIFAR-10を画面に表示するには、ビットマップデータに変換する必要があります。

CIFAR-10を画面に表示させる

データは、CIFAR-10 binary version を使用します。

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure CIFAR10
    <VBFixedArray(1 - 1)> Public label() As Byte        'ラベル
    <VBFixedArray(1024 - 1)> Public R() As Byte         '赤
    <VBFixedArray(1024 - 1)> Public G() As Byte         '緑
    <VBFixedArray(1024 - 1)> Public B() As Byte         '青
End Structure

Const channelLength = 1024                              '1チャネルあたりのバイト数
Const channelCount = 3                                  'チャネル数(赤・緑・青)
Const imageSize = 32                                    'イメージのザイズ

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim FilePath As String = "C:\work\cifar-10-batches-bin\data_batch_1.bin"

    'レコード長を取得する
    Dim recordLen As Long = Len(New CIFAR10())

    Dim cifar As CIFAR10 = New CIFAR10()

    'ファイルをオープンする
    Dim FileNo As Integer = FileSystem.FreeFile
    FileSystem.FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Default, recordLen)

    '全レコード数を取得する
    Dim recordMax As Long = FileSystem.LOF(FileNo) \ recordLen

    For rec = 1 To recordMax
        FileSystem.FileGet(FileNo, cifar, rec)

        Dim bmp = CIFAR10ToBitmap(cifar)
        PictureBox1.Image = bmp
        PictureBox1.Refresh()

        Label1.Text = String.Format("{0}", BitConverter.ToString(cifar.label))
        Label1.Refresh()

        System.Threading.Thread.Sleep(100)
    Next

    'ファイルをクローズする
    FileSystem.FileClose(FileNo)
End Sub

'CIFAR10からビットマップを作成する
Private Function CIFAR10ToBitmap(cifar As CIFAR10)
    Dim Data As Byte() = New Byte(channelLength * channelCount - 1) {}

    For i = 0 To channelLength - 1
        Data(i * 3 + 2) = cifar.R(i)
        Data(i * 3 + 1) = cifar.G(i)
        Data(i * 3 + 0) = cifar.B(i)
    Next

    Dim bmp As Bitmap = New Bitmap(imageSize, imageSize, PixelFormat.Format24bppRgb)
    Dim rect = New Rectangle(0, 0, imageSize, imageSize)

    Dim bitmapData = bmp.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb)
    Marshal.Copy(Data, 0, bitmapData.Scan0, Data.Length)
    bmp.UnlockBits(bitmapData)

    Return bmp
End Function