Результаты CreateML ужасны в приложении, в то время как они идеальны на детской площадке - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь обучить MLModel с классификацией изображений.Я создал приложение для создания изображений для использования в качестве обучающих данных (в конце тот же процесс будет использоваться для получения прогнозов).Я получаю CVPixelBuffer от AvCaptureSession, конвертирую его в UIImage и сохраняю в каталог документов в формате JPEG.Позже я маркирую их и тренирую MLModel с CreateML на игровой площадке.Результаты на игровой площадке составляют 100%, так как я собрал тысячи изображений.

Но когда я интегрирую эту модель в свое приложение и кормлю ее таким же образом, результаты ужасны.Я получаю CVPixelBuffer, конвертирую его в UIImage (для обрезки) и конвертирую обрезанное изображение в CVPixelBuffer и передаю его модели.Я должен преобразовать UIImage в CVPixelBuffer, потому что модель CoreML исключает только 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.

У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 23 февраля 2019

Тебе ничего не нужно.Давайте посмотрим на документы:

class VNCoreMLRequest : VNImageBasedRequest

Во-первых, VNImageBasedRequest содержит поле regionOfInterest: CGRect { get set }, где прямоугольник нормализован, а левый нижний - относительный. Так что вам не нужно обрезать!Просто укажите ROI.

Во-вторых, VNCoreMLRequest сам по себе имеет поле var imageCropAndScaleOption: VNImageCropAndScaleOption { get set }, где вы можете указать, как действовать, если соотношение высоты и ширины не соответствует ожидаемому (центр кадрирования, масштаб для подгонки / заполнения).

...