gpt4 book ai didi

python - 如何在将图像提供给 CoreML 模型之前对其进行预处理?

转载 作者:行者123 更新时间:2023-12-01 16:22:16 32 4
gpt4 key购买 nike

我创建了一个图像相似性模型,并使用引用数据图像对其进行了测试。我测试了 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 与引用 id 78 的距离最短。
由于 coreml 模型在 python 中工作,我认为这是一个预处理问题,所以我在将图像传递给 CoreMLModel 之前自己对图像进行了预处理。这样做给了我一个与引用图像匹配最短距离的引用 id 的一致输出——是的。距离仍然不是零,所以我试图做任何我能想到的来影响图像以获得一些差异,但我不能让它更接近于零。
预处理代码:
+ (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 采用大小为 (224, 224) 的 RGB 图像

我还能对图像做些什么来改善我的结果?

最佳答案

我和你在同一条船上。由于图像预处理涉及到模糊的使用、从 RGB 到灰度的转换等步骤。使用 Objective C++ 包装器会更容易。下面的链接很好地理解了如何使用头类进行链接。

https://www.timpoulsen.com/2019/using-opencv-in-an-ios-app.html



希望能帮助到你!

Image Credits :https://medium.com/@borisohayon/ios-opencv-and-swift-1ee3e3a5735b



Credits:https://medium.com/@borisohayon/ios-opencv-and-swift-1ee3e3a5735b

关于python - 如何在将图像提供给 CoreML 模型之前对其进行预处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53015045/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com