Результаты CreateML ужасны в приложении, в то время как они идеальны на детской площадке
Я пытаюсь обучить 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 ответ
Вам не нужно ничего из этого. Давайте посмотрим на документы:
class VNCoreMLRequest : VNImageBasedRequest
Во-первых, VNImageBasedRequest
содержит поле regionOfInterest: CGRect { get set }
где прямоугольник нормализован и нижний левый относительный. Так что вам не нужно обрезать! Просто укажите ROI.
Во-вторых, VNCoreMLRequest
само по себе имеет поле var imageCropAndScaleOption: VNImageCropAndScaleOption { get set }
где вы можете указать, как действовать, если соотношение высоты и ширины не соответствует ожидаемому (центральная обрезка, масштаб для подгонки / заполнения).