0

画像分類で MLModel をトレーニングしようとしています。トレーニング データとして使用する画像を作成するアプリを作成しました (最後に同じプロセスを使用して予測を取得します)。AvCaptureSession から CVPixelBuffer を取得し、UIImage に変換してドキュメント ディレクトリに JPEG として保存します。後でそれらにラベルを付け、プレイグラウンドで CreateML を使用して MLModel をトレーニングします。何千もの画像を収集したので、プレイグラウンドでの結果は %100 です。

しかし、このモデルをアプリに統合して同じ方法でフィードすると、結果はひどいものになります。CVPixelBuffer を取得し、それを UIImage に変換して (切り抜き)、切り取った画像を CVPixelBuffer に変換してモデルに渡します。CoreML モデルは CVPixelBuffer のみを除外するため、UIImage を CVPixelBuffer に変換する必要があります。このメソッドで UIImage を CVPixelBuffer に変換します。

func pixelBuffer(width: Int, height: Int) -> CVPixelBuffer? {
    var maybePixelBuffer: CVPixelBuffer?
    let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue,
                 kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue]
    let status = CVPixelBufferCreate(kCFAllocatorDefault,
                                     width,
                                     height,
                                     kCVPixelFormatType_32ARGB,
                                     attrs as CFDictionary,
                                     &maybePixelBuffer)

    guard status == kCVReturnSuccess, let pixelBuffer = maybePixelBuffer else {
        return nil
    }

    CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
    let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)

    guard let context = CGContext(data: pixelData,
                                  width: width,
                                  height: height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer),
                                  space: CGColorSpaceCreateDeviceRGB(),
                                  bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
        else {
            return nil
    }

    UIGraphicsPushContext(context)
    context.translateBy(x: 0, y: CGFloat(height))
    context.scaleBy(x: 1, y: -1)
    self.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
    UIGraphicsPopContext()

    CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
    return pixelBuffer
}

CoreML モデルが変換された CVPixelBuffer を好まないため、結果が悪いと思います。

誰か提案はありますか?

4

1 に答える 1