Я создал модель сходства изображений и использовал изображения эталонных данных для проверки. Я протестировал модель 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)
Что еще я могу сделать с изображением, чтобы улучшить свои результаты?