Как конвертировать изображение в cvPixelImage в coreml Swift 4 - PullRequest
0 голосов
/ 19 марта 2019

Я хочу преобразовать изображение в размер изображения модели. Я получаю изображения с помощью API. вот код.

let model = GoogLeNetPlaces()
var selectImage: BaseModel!

override func viewDidLoad() {
    super.viewDidLoad()


    let url = URL(string: selectImage.fullURL)
    let imageData = NSData(contentsOf: url!)

    detailImageView.image = UIImage(data: imageData! as Data)

    if let imageToAnalyze = detailImageView.image {

        if let data = sceneLabel(forImage: imageToAnalyze) {
         imageLabel.text = data

        }
    }
}

func sceneLabel(forImage image:UIImage) -> String? {

    if let pixel = ImageProcessor.pixelBuffer(forImage: image.cgImage!){

        guard let scene = try? model.prediction(sceneImage: pixel) else { fatalError("error")}
        return scene.sceneLabel
    }
    return nil
}

и это код, который я использую для преобразования размера изображения.

struct ImageProcessor {

static func pixelBuffer (forImage image:CGImage) -> CVPixelBuffer? {


    let frameSize = CGSize(width: image.width, height: image.height)

    var pixelBuffer:CVPixelBuffer? = nil
    let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(frameSize.width), Int(frameSize.height), kCVPixelFormatType_32BGRA , nil, &pixelBuffer)

    if status != kCVReturnSuccess {
        return nil

    }

    CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags.init(rawValue: 0))
    let data = CVPixelBufferGetBaseAddress(pixelBuffer!)
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue)
    let context = CGContext(data: data, width: Int(frameSize.width), height: Int(frameSize.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer!), space: rgbColorSpace, bitmapInfo: bitmapInfo.rawValue)


    context?.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height))

    CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))

    return pixelBuffer

    }
}

Я получаю сообщение об ошибке для размера.

Размер изображения не преобразуется в размер изображения модели.

Может кто-нибудь помочь мне с этим?

Это ошибка, которую я получаю

[coreml] Error Domain = com.apple.CoreML Code = 1 "Входной элемент изображения sceneImage не соответствует описанию модели" UserInfo = {NSLocalizedDescription = Входной элемент изображения image sceneImage не соответствует описанию модели, NSUnderlyingError = 0x6000006a1d40 {Error Domain = com.apple.CoreML Code = 0 "Размер изображения 3829 x 2411 недопустим в наборе размеров изображений" UserInfo = {NSLocalizedDescription = Размер изображения 3829 x 2411 недопустим в наборе размеров изображений}}}

...