機械学習などに使用されるデータCIFAR-100をピクチャーボックスに表示する方法を記載します。
CIFAR-100のデータ構造は、
粗いラベル:1バイト 細かいラベル:1バイト R:1024 G:1024 B:1024
の順番で1+1+1024+1024+1024=3074バイト
を1レコード(1画像データ)としたデータで構成されています。
CIFAR-100を画面に表示するには、ビットマップデータに変換する必要があります。
CIFAR-100を画面に表示させる
データは、CIFAR-100 binary version を使用します。
<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure CIFAR100
<VBFixedArray(1 - 1)> Public coarse() As Byte '粗いラベル
<VBFixedArray(1 - 1)> Public fine() 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 Button1.Click
Dim FilePath As String = "C:\work\cifar-100-binary\train.bin"
'レコード長を取得する
Dim recordLen As Long = Len(New CIFAR100())
Dim cifar As CIFAR100 = New CIFAR100()
'ファイルをオープンする
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 = CIFAR100ToBitmap(cifar)
PictureBox1.Image = bmp
PictureBox1.Refresh()
Label1.Text = String.Format("{0} {1}", BitConverter.ToString(cifar.coarse), BitConverter.ToString(cifar.fine))
Label1.Refresh()
System.Threading.Thread.Sleep(100)
Next
FileSystem.FileClose(FileNo)
End Sub
'CIFAR100からビットマップを作成する
Private Function CIFAR100ToBitmap(cifar As CIFAR100)
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