前回まで
coremltoolを使った画像認識でsvm形式のモデルを利用する1
coremltoolを使った画像認識でsvm形式のモデルを利用する2
開発環境
- macOS 10.13
- Swift4
- XCode9
- Python2.7
最後に前回で作ったmlmodelを評価する簡易なペイントアプリのプロジェクトを用意してmlmodelをドラッグする
inputには784のDouble型の要素を持つ1次元配列。outputはInt64の数値が返ってくることになっているので、imageを784の配列に変換する必要がある。配列の中身は28x28のイメージを1pixelの色の濃淡を0〜1の間に表したものになる。
UIImageからCGImageを呼び出し、そこから各pixelのアドレスを呼び出し、色情報を取得する。
func getPixelBuffer() -> [Double]
{
guard let cgImage = self.cgImage else {
return []
}
let bytesPerRow = cgImage.bytesPerRow
let width = cgImage.width
let height = cgImage.height
let bytesPerPixel = 4
let pixelData = cgImage.dataProvider!.data! as Data
var buf : [Double] = []
for j in 0..<height {
for i in 0..<width {
let pixelInfo = bytesPerRow * j + i * bytesPerPixel
let r = CGFloat(pixelData[pixelInfo])
let g = CGFloat(pixelData[pixelInfo+1])
let b = CGFloat(pixelData[pixelInfo+2])
// let a = CGFloat(pixelData[pixelInfo+3]) / CGFloat(255.0)
let v = floor(Double(r + g + b)/3.0)/255.0
buf.append(v)
}
}
return buf
}
後は算出した配列をMLMultiArrayにセットしたものを、mlmodelの引数にセットすれば結果がかえってきます。
// 画像を配列で返す
let imageData = reIma.getPixelBuffer()
let count = imageData.count
let ncount = count as NSNumber
let mlarray = try! MLMultiArray(shape: [ncount], dataType: MLMultiArrayDataType.double )
for i in 0 ..< count {
mlarray[i] = imageData[i] as NSNumber
}
let model = my_model()
guard let output = try? model.prediction(input: mlarray) else {
fatalError("error")
}
print("label = \(output.target)")
let target = Int64(output.target)
・・・まあ体感的にはあまり精度良く無いのですが、手書きだとそんなものかなあという感じです。
参考
参考というかそのまま使わせてもらってます。