最近有时间玩下苹果新出的CoreML框架,这个框架的作用是可以将训练好的模型用在app中,只要简单的几行代码就能集成,非常的简单和方便。
1、首先去官网下载xcode9beta版本记得系统版本需要10.12.5及以上不然安装不了xcode9。
2、然后就是去ML官网下载VGG16图像分类模型。
3、新建一个工程,将下载好的模型文件导入工程中。
4、简单应用
4.1、VGG16模型的初始化
VGG16 *model = [[VGG16 alloc] init];```
4.2、VGG16Input的初始化(用来输入需要分类的图片)
UIImage *scaledImage = [image scaleToSize:CGSizeMake(224, 224)];
CVPixelBufferRef buffer = [image pixelBufferFromCGImage:scaledImage];
VGG16Input *input = [[VGG16Input alloc] initWithImage:buffer];
4.3、使用VGG16模型来判断输入图片的类型
VGG16Output *output = [model predictionFromFeatures:input error:&error];
NSLog(@"----output ====%@",output.classLabelProbs);
我拿了几张图片进行测试,发现准确率还是蛮高的,不过用了识别人物貌似不太行,优先会被识别图片中物体。这样就能集成到应用了去了,是不是特别的简单。注意上面有两个方法是UIImage添加分类方法
- (UIImage)scaleToSize:(CGSize)size {
UIGraphicsBeginImageContext(size);
[selfdrawInRect:CGRectMake(0,0, size.width, size.height)];
UIImage scaledImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnscaledImage;
}
- (CVPixelBufferRef)pixelBufferFromCGImage:(UIImage)originImage {
CGImageRefimage = originImage.CGImage;
NSDictionaryoptions = [NSDictionarydictionaryWithObjectsAndKeys:
[NSNumbernumberWithBool:YES],kCVPixelBufferCGImageCompatibilityKey,
[NSNumbernumberWithBool:YES],kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRefpxbuffer =NULL;
CGFloatframeWidth =CGImageGetWidth(image);
CGFloatframeHeight =CGImageGetHeight(image);
CVReturnstatus =CVPixelBufferCreate(kCFAllocatorDefault,
frameWidth,
frameHeight,
kCVPixelFormatType_32ARGB,
(__bridgeCFDictionaryRef) options,
&pxbuffer);
NSParameterAssert(status ==kCVReturnSuccess&& pxbuffer !=NULL);
CVPixelBufferLockBaseAddress(pxbuffer,0);
void*pxdata =CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata !=NULL);
CGColorSpaceRefrgbColorSpace =CGColorSpaceCreateDeviceRGB();
CGContextRefcontext =CGBitmapContextCreate(pxdata,
frameWidth,
frameHeight,
8,
CVPixelBufferGetBytesPerRow(pxbuffer),
rgbColorSpace,
(CGBitmapInfo)kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextConcatCTM(context,CGAffineTransformIdentity);
CGContextDrawImage(context,CGRectMake(0,
0,
frameWidth,
frameHeight),
image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer,0);
returnpxbuffer;
}
**5、另外还可以使用其他训练好的模型,可以通过苹果的的转化工具转为改框架支持的格式**
**6蛋筒的事情是如果模型文件太大了,打包的app也会很大,模型文件500多m,打包后也有500m.
网友评论