機械学習などに使用されるデータ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