CoreML模型分析

2023-10-29

准备工作

  1. 首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程;
  2. 下载模型,如官方推荐的MobileNetV2
  3. 将模型导入到工程中,并添加到你的编译项目中
  4. 双击打开,会看到这么一个页面:

在这里插入图片描述
5. 然后点击

在这里插入图片描述
就可以进入到模型自动生成的头文件中:
在这里插入图片描述

模型分析

1.关键词@interface

通过搜索关键词interface,我们可以得到三个结果:

@interface MobileNetV2Input : NSObject
@interface MobileNetV2Output : NSObject
@interface MobileNetV2 : NSObject

其中MobileNetV2Input是模型输入的类,Output是输出类,它们都继承自NSObject,最后的MobileNetV2是模型类。

2.MLFeatureProvider

在这里插入图片描述
这个协议定义了一个属性featureNames以及一个从某个featureName获取featureValue的方法featureValueForName,需要注意的是,这里的featureNames是一个NSSet!这一点非常重要,涉及到CoreML多输出的实现方法。

3.MobileNetV2Input

在这里插入图片描述
对输入而言,最重要的就是构造和初始化,这里CoreML提供了很多初始化的方法,从最简的传入CVPixelBufferRef到其他各种图像URL等方法,目的就是要完成对各个属性的赋值。因为我们这个模型输入只要一个图像,所以就只需要对image赋值即可。

4.MobileNetV2Output

在这里插入图片描述
前面已经说过Input只需要给各个属性值赋值,Output则需要能够表示模型的输出,并提供获取模型输出的方法,即模型输出的表示和获取方法。

5.MobileNetV2

如注释所说,这个类主要负责模型的加载和计算过程。

initWithMLModel:(MLModel *)model

initWithConfiguration:(MLModelConfiguration *)configuration error:(NSError * _Nullable __autoreleasing * _Nullable)error

initWithContentsOfURL:(NSURL *)modelURL error:(NSError * _Nullable __autoreleasing * _Nullable)error

initWithContentsOfURL:(NSURL *)modelURL configuration:(MLModelConfiguration *)configuration error:(NSError * _Nullable __autoreleasing * _Nullable)error

loadWithConfiguration:(MLModelConfiguration *)configuration completionHandler:(void (^)(MobileNetV2 * _Nullable model, NSError * _Nullable error))handler

loadContentsOfURL(NSURL *)modelURL configuration:(MLModelConfiguration *)configuration completionHandler:(void (^)(MobileNetV2 * _Nullable model, NSError * _Nullable error))handler

这些函数的目的都是初始化一个MobileNetV2实例,从函数名和参数我们看出,CoreML提供了多种灵活的初始化方法,来应对不同的使用场景。可以直接从一个MLModel类创建一个新的MobileNetV2实例,也可以从.mlmodelc的URL来加载,还可以通过MLModelConfiguration来决定是否要对模型进行特殊配置,最后两个load开头的函数是异步加载。

predictionFromFeatures:(MobileNetV2Input *)input error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionFromFeatures:(MobileNetV2Input *)input options:(MLPredictionOptions *)options error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionFromImage:(CVPixelBufferRef)image error:(NSError * _Nullable __autoreleasing * _Nullable)error

predictionsFromInputs:(NSArray<MobileNetV2Input*> *)inputArray options:(MLPredictionOptions *)options error:(NSError * _Nullable __autoreleasing * _Nullable)error

这四个函数都是用来完成预测,得到模型预测结果,只不过传入的参数不一样。前面两个的主要参数都是MobileNetV2Input,区别是是否使用MLPredictionOptions来做一些预测配置;predictionsFromInputs的主要参数也是MobileNetV2Input,只不过是多个MobileNetV2Input组成的NSArray,来适配多输入场景。predictionFromImage可能是我们最常用的一个方法,输入是一个CVPixelBufferRef,根据模型其格式也会做相应的调整,比如MobileNetV2就是:

color (kCVPixelFormatType_32BGRA) image buffer, 224 pixels wide by 224 pixels high

6.MLModelConfiguration

在这里插入图片描述
模型初始化时传入的配置类,最重要的就是这个computeUnits属性,可以设置只使用CPU、CPU和GPU以及所有设备三个选项:

MLComputeUnitsCPUOnly = 0
使用这个选项,则模型只能使用CPU来进行计算。
MLComputeUnitsCPUAndGPU = 1
使用这个选项,则模型可以使用CPU和GPU,但是不包括neural engine。
MLComputeUnitsAll = 2
使用这个选项,系统会自动选择计算设备,包括neural engine。

7.MLPredictionOptions

在这里插入图片描述
模型预测时的配置,最重要的是可以通过usesCPUOnly属性来控制是否仅仅使用CPU来进行推断,实测有效!

8. MLPredictionOptions 和 MLModelConfiguration的关系

根据目前的测试结果,这两个config都是有效的,最大的区别在于,MLPredictionOptions是Core ML1.0的设计,且属性值usesCPUOnly默认是False,即Core ML1.0默认使用GPU来进行推断;而MLPredictionOptions是2.0新增的,在模型初始化的时候就传入参数来确定计算设备,更重要的是,现在可以控制除了CPU和GPU之外的neural engine,当设置为ALL时,系统会自动选择使用最佳设备。针对这两种功能相似的结构体,有一个判断原则,功能更多的一定是后来出现的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreML模型分析 的相关文章

随机推荐

  • 区块链-技术简介(*)

    1 什么是区块链 区块链技术是利用块链式数据结构来验证与存储数据 利用分布式节点共识算法来生成和更新数据 利用密码学的方式保证数据传输和访问的安全 利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式 简单
  • PTA(Basic Level) 1029_旧键盘 Python实现

    1029 旧键盘 Python实现 下面是题目信息 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及实际被输入的文字 请你列出肯定坏掉的那些键 输入格式 输入在 2 行中分别给出应该输入的文
  • 【AI PC端算法优化】二,一步步优化自然饱和度算法

    上一节的RGB转灰度图算法我又做了两个相关优化 加入了多线程以及去掉了上次SSE计算中的一些重复计算 现在相对于传统实现已经可以获得4倍加速 同时我也在做一个AVX2的优化 所以不久后我将发布一个RGB转灰度图算法优化的升级版 尝试触摸这一
  • 华为手机上的网上邻居怎么用_华为手机如何无线连接电脑

    不少朋友都会使用手机作为猫无线上网 那你知道如何用华为手机连接电脑3G上网 下面是小编给大家整理的一些有关华为手机连接电脑的方法 希望对大家有帮助 华为手机连接电脑的方法首先要确保已经安装了华为手机的驱动 接着在电脑的网上邻居那里点击右键
  • 浅谈对集群、分布式、分布式集群、微服务的理解

    我认为集群是个物理形态 分布式是个工作方式 分布式其实也是物理形态 这里相比较而言的 当集群中的服务器都做同样的事情时 集群就是一个集群 当集群中的服务器各司其职时 他就变成了分布式 所以说分布式中的每一个节点都可以是集群 但是集群并不一定
  • ES6的迭代器与迭代协议Symbol.iterator

    前言 ES6新增了两个协议 可迭代协议 对象必须具有Symbol Iterator属性 属性值为一个函数 当这个对象被迭代时 就会调用该函数 返回一个迭代器 迭代器协议 描述了迭代器对象的具体规则 迭代器 迭代器 它是用于访问集合类的标准访
  • 如何解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.

    出现如图所示 当直接输入python m pip install upgrade pip更新还报错的时候 输入命令 python m pip install pip 结果如图所示 亲测有效
  • mysql注解参数_MySQL主从复制参数注解

    MySQL主从复制参数注解 master所有参数 1 log bin mysql bin 1 控制master的是否开启binlog记录功能 2 二进制文件最好放在单独的目录下 这不但方便优化 更方便维护 3 重新命名二进制日志很简单 只需
  • String的intern()方法浅析

    简介 String intern 方法是一种手动将字符串加入常量池中的native方法 原理如下 如果在当前类的常量池中存在与调用intern 方法的字符串等值的字符串 就直接返回常量池中相应字符串的引用 否则在常量池中复制一份该字符串 J
  • 连续不等_从“Jensen不等式”导出几个著名不等式

    常用的著名不等式 从Jensen不等式出发导出其他一些知名不等式 加权AG不等式 对 有 证明 记 因为对数函数为凸函数 使用加权琴生不等式 可得 Young不等式 若 则 证明 利用上述 加权AG不等式有 记 带入整理可得Young不等式
  • 2.2设备树的规范(dts和dtb)——DTB格式

    本节讲述设备树的dtb格式 上节讲述了dts格式 回顾上节 在dts文件和dtsi文件中 可以使用C语言的define和include 使用方法和作用也同C语言相同 编写dts文件后 需要使用dtc工具将dts文件编译成dtb文件 dtc工
  • Linux应用开发程序测试

    文章目录 前言 一 通过SDK开发应用程序 创建工程 将该工程的 elf 文件运行在我们搭建的Linux上 3 SDK调试 小总结 1 打开SDK 创建Linux应用程序工程 2 编写代码 3 编译代码 4 将可执行文件拷贝到开发板根文件系
  • Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客 我们学习了如何利用Python OpenCV计算轮廓的中心 这一节学习仅运用轮廓的基本属性来检测其形状 三角形 正方形 矩形 五边形 圆 1 利用轮廓逼近 将曲线上的点数减少为更简单的近似版本的过程 2 基于该轮廓逼近 检查每种
  • 自学网络安全,学习路线图必不可少,【282G】初级网络安全学习资源分享!

    前言 在自学网络安全的时候 我们总会遇到一些问题 我们可以在网上看到很多关于前端的这些问题 你们都是怎么学网络安全web前端的 零基础 怎么自学好网络安全 网络安全需要学多久 都学哪些知识 想成为一名合格的网络安全工程师 需要掌握哪些技能
  • SpringBoot第 6 讲:SpringBoot+jersey跨域文件上传

    一 创建Maven项目 参考 SpringBoot第 1 讲 HelloWorld 秦毅翔的专栏 CSDN博客 二 修改pom xm
  • 爬虫保存cookies时重要的两个参数(ignore_discard和ignore_expires)的作用

    代码如下 由于临时做的实例采用登录云打码平台的cookies import requests from lxml html import etree from fake useragent import UserAgent from htt
  • golang rpcx记录一次解决 context deadline exceeded的问题

    测试同时并发一万个应用去调用另一个微服务应用结果出现了上下文切换超时的问题 默认的超时时间只有一秒时间 程序在高并发的场景下很容易触发这个错误 最简单的解决办法就是把超时时间调大一点 以前设置的是一秒 现在调成五秒 另一种解决办法就是优化自
  • FHD、4K、8K为何物

    转自 http www 4k123 com thread 145 1 1 html 近段时间 分辨率是一个很热的话题 4K与8K两个词频繁曝光于各大行业网站 8月23日 联合国旗下的国际电讯联盟通过以日本NHK电视台所建议的7680x432
  • Springboot2.0快速入门(第一章)

    目录 一 SpringBoot简介 1 1 回顾什么是Spring 1 2 Spring是如何简化Java开发的 1 3 什么是SpringBoot 二 Hello World 2 1 准备工作 2 2 创建基础项目说明 2 3 创建第一个
  • CoreML模型分析

    准备工作 首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程 下载模型 如官方推荐的MobileNetV2 将模型导入到工程中 并添加到你的编译项目中 双击打开 会看到这么一个页面 5 然后点击 就可以进入到模型