手把手教你如何快速解析.mlmodel文件

发布于:2021-06-24 16:39:46

把训练好的模型拖入工程
把.mlmodel文件拖入到 iOS程序后,点击.mlmodel文件他会显示这个界面


Model Class
这个是 Xcode 根据模型编译生成的接口类,应用程序需要 #import “imageClassifier.h”。点最右边那个箭头,就会打开这个头文件。 Model Evaluation Parameters
描述输入和输出,CoreML 接的机器学*模型是一个黑箱,我们只管从进料孔放原料进去,过一会儿,加工好的结果就会从输出口送出来了。每个模型解决的问题、处理的方法不同,需要的输入和产生的输出也各不相同。输入为images。
images的type为Image 表示接收一个图片,格式得是 RGB 的,大小得是 224x224 像素的。 输出的结果是两个参数,一个是 sceneLabel 表示图片中最有可能是什么场合,另一个是 sceneLabelProbs 是所有场景分别的可能性。
.mlmodel文件解析
第一部分input

/// Model Prediction Input Type
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) __attribute__((visibility("hidden")))
@interface ImageClassifierInput : NSObject

/// Input image to be classified as color (kCVPixelFormatType_32BGRA) image buffer, 299 pixels wide by 299 pixels high
@property (readwrite, nonatomic) CVPixelBufferRef image;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithImage:(CVPixelBufferRef)image;
@end

    CVPixelBufferRef:是一种像素图片类型,由于CV开头,所以它是属于 CoreVideo 模块的。

    参考文献:深入理解CVPixelBufferRef


第二部分output

/// Model Prediction Output Type
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) __attribute__((visibility("hidden")))
@interface ImageClassifierOutput : NSObject

/// Probability of each category as dictionary of strings to doubles
@property (readwrite, nonatomic, strong) NSDictionary * classLabelProbs;

/// Most likely image category as string value
@property (readwrite, nonatomic, strong) NSString * classLabel;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithClassLabelProbs:(NSDictionary *)classLabelProbs classLabel:(NSString *)classLabel;
@end

    classLabelProbs就是我在上面讲的输出结果其中之一,他表示是所有场景分别的可能性classLabel就是我在上面讲的输出结果其中之一,他表示图片中最有可能是什么场合

第三部分

/// Class for model loading and prediction
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) __attribute__((visibility("hidden")))
@interface ImageClassifier : NSObject
@property (readonly, nonatomic, nullable) MLModel * model;
- (nullable instancetype)init;
/*
这个方法用来初始化我们的mlmodel文件,其中url就是我们存放.mlmodel文件的地方
我们一般使用NSBundle来获取
官方文档给的解释:- (NSURL *)URLForResource:(NSString *)name withExtension:(NSString *)ext;
参数描述
name
The name of the resource file.
If you specify nil, the method returns the first resource file it finds with the specified extension.(如果指定nil,则该方法返回它使用指定扩展名找到的第一个资源文件。)

extension
The extension of the resource file.
If extension is an empty string or nil, the extension is assumed not to exist and the file URL is the first file encountered that exactly matches name.(如果extension是空字符串nil,则假定扩展名不存在,文件URL是遇到的第一个完全匹配的文件name。)
注意:文件扩展名不是在 Xcode 里看到的 .mlmodel,而是编译后的 .mlmodelc 。
*/
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError * _Nullable * _Nullable)error;
- (nullable instancetype)initWithConfiguration:(MLModelConfiguration *)configuration error:(NSError * _Nullable * _Nullable)error API_AVAILABLE(macos(10.14), ios(12.0), watchos(5.0), tvos(12.0)) __attribute__((visibility("hidden")));
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url configuration:(MLModelConfiguration *)configuration error:(NSError * _Nullable * _Nullable)error API_AVAILABLE(macos(10.14), ios(12.0), watchos(5.0), tvos(12.0)) __attribute__((visibility("hidden")));

/*
使用标准接口进行预测
@input:输入ImageClassifierInput的实例,用于预测
@error:如果发生错误,返回时包含一个描述问题的NSError对象。如果您对可能的错误不感兴趣,请传递NULL。
@返回值:将预测作为ImageClassifierOutput返回
*/

- (nullable ImageClassifierOutput *)predictionFromFeatures:(ImageClassifierInput *)input error:(NSError * _Nullable * _Nullable)error;

/*
使用标准接口进行预测
@input:ImageClassifierInput的实例,用于预测
@options:预测选项
@error:如果发生错误,返回时包含一个描述问题的NSError对象。如果您对可能的错误不感兴趣,请传递NULL。
@返回值:将预测作为ImageClassifierOutput返回
*/
- (nullable ImageClassifierOutput *)predictionFromFeatures:(ImageClassifierInput *)input options:(MLPredictionOptions *)options error:(NSError * _Nullable * _Nullable)error;

/*
使用易用借口进行预测
@image:图像输入图像分类为color (kCVPixelFormatType_32BGRA)图像缓冲区,299像素宽,299像素高:
@error:如果发生错误,返回时包含一个描述问题的NSError对象。如果您对可能的错误不感兴趣,请传递NULL。
@返回值:将预测作为ImageClassifierOutput返回
注意:因为这部分经常要跟 Video、GPU 打交道,所以参数不是 UIImage/CGImage 这类,而是一个 CVPixelBuffer 的引用。好在用 CoreImage 可以方便的将 UIImage 之类的放到一个 CVPixelBuffer 里。
*/
- (nullable ImageClassifierOutput *)predictionFromImage:(CVPixelBufferRef)image error:(NSError * _Nullable * _Nullable)error;

/*
批处理的预测
@inputArray:是ImageClassifierInput实例的数组,用于获取预测
@options:预测选项
@error:如果发生错误,返回时包含一个描述问题的NSError对象。如果您对可能的错误不感兴趣,请传递NULL。
@返回值:以NSArray的形式返回预测
*/
- (nullable NSArray *)predictionsFromInputs:(NSArray *)inputArray options:(MLPredictionOptions *)options error:(NSError * _Nullable * _Nullable)error API_AVAILABLE(macos(10.14), ios(12.0), watchos(5.0), tvos(12.0)) __attribute__((visibility("hidden")));
@end

相关推荐

最新更新

猜你喜欢