Как предварительно обработать изображение, прежде чем передать его в CoreML Model? - PullRequest
0 голосов
/ 26 октября 2018

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

image = tc.image_analysis.resize(reference_data[0]['image'], *reversed(model.input_image_shape))
image = PIL.Image.fromarray(image.pixel_data)
mlmodel.predict({'image':image})`

Однако при использовании модели в iOS в качестве VNCoreMLModel ни один тест эталонного изображения не вернулся с нулевым расстоянием, и большинство из них не было даже самым коротким расстоянием, то есть эталонное изображение 0 имело самое короткое расстояние до эталонного идентификатора 78. , Поскольку модель coreml работает на python, я решил, что это проблема предварительной обработки, поэтому я сам предварительно обработал изображение, прежде чем передать его в CoreMLModel. Выполнение этого дало мне последовательный вывод опорных идентификаторов, соответствующих опорным изображениям для кратчайшего расстояния - yay. Расстояние все еще не равно нулю, поэтому я попытался сделать все возможное, чтобы повлиять на изображение, чтобы получить некоторую разницу, но я не могу приблизить его к нулю. Код предварительной обработки:

+ (CVPixelBufferRef)pixelBufferForImage:(UIImage *)image sideLength:(CGFloat)sideLength {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(sideLength, sideLength), YES, image.scale);
    [image drawInRect:CGRectMake(0, 0, sideLength, sideLength)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CFStringRef keys[2] = {kCVPixelBufferCGImageCompatibilityKey, kCVPixelBufferCGBitmapContextCompatibilityKey};
    CFBooleanRef values[2] = {kCFBooleanTrue, kCFBooleanTrue};
    CFDictionaryRef attrs = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CVPixelBufferRef buffer;
    int status = CVPixelBufferCreate(kCFAllocatorDefault, (int)(sideLength), (int)(sideLength), kCVPixelFormatType_32ARGB, attrs, &buffer);
    if (status != kCVReturnSuccess) {
        return nil;
    }

    CVPixelBufferLockBaseAddress(buffer, kCVPixelBufferLock_ReadOnly);
    void *data = CVPixelBufferGetBaseAddress(buffer);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
    CGContextRef context = CGBitmapContextCreate(data, sideLength, sideLength, 8, CVPixelBufferGetBytesPerRow(buffer), colorSpace, kCGImageAlphaNoneSkipFirst);

    CGContextTranslateCTM(context, 0, sideLength);
    CGContextScaleCTM(context, 1.0, -1.0);

    UIGraphicsPushContext(context);
    [resizedImage drawInRect:CGRectMake(0, 0, sideLength, sideLength)];
    UIGraphicsPopContext();
    CVPixelBufferUnlockBaseAddress(buffer, kCVPixelBufferLock_ReadOnly);
    return buffer;
}

mlmodel берет RGB-изображение с размером: (224, 224)

Что еще я могу сделать с изображением, чтобы улучшить свои результаты?

...