在 iOS 开发中,人工智能与机器学习的应用场景越来越广,从图片识别、文字处理到语音交互,随处可见。而苹果提供的 Core ML 框架,则让开发者能够将训练好的机器学习模型无缝集成到 App 中,实现智能化的用户体验。本文将带你从基础开始,逐步了解 Core ML 的使用方法、模型转换以及自定义模型创建,并通过一个实用的短信过滤案例,帮助你快速上手。
一、什么是 Core ML
Core ML 是苹果推出的一套机器学习框架,主要作用是将训练好的模型部署到 iOS、macOS、watchOS 和 tvOS 应用中,并利用设备本身的算力(CPU、GPU、Neural Engine)进行高效推理。
它的特点包括:
- 高性能:模型运行直接在设备端完成,避免了频繁的网络请求。
- 隐私安全:数据无需上传服务器,保护用户隐私。
- 低延迟:本地推理速度快,适合实时性强的应用。
- 统一接口:无论是图像、文本还是音频模型,都能用 Core ML 统一调用。
二、CoreML的基础使用
1. 苹果官方 Models
苹果在 Core ML Model Gallery 提供了大量开箱即用的模型,比如:
- 图像分类(MobileNetV2、ResNet50)
- 物体检测(YOLOv3、YOLOv5)
- 自然语言处理(Text Classifier)
- 风格迁移(Style Transfer)
这些模型可以直接下载为 .mlmodel 文件,并拖拽到 Xcode 项目中使用。
2. 在项目中集成 mlmodels
当你将 .mlmodel 文件添加到 Xcode 中时,它会自动生成一个 Swift 类,方便直接调用。以图像识别为例,有两种常用方式:
2.1 通过 VNCoreMLRequest 处理图片
这种方式结合 Vision 框架,适合处理图像、视频流等需要额外图像预处理的场景:
import Vision
import CoreML
guard let model = try? VNCoreMLModel(for: MobileNetV2().model) else { return }
let request = VNCoreMLRequest(model: model) { request, error in
if let results = request.results as? [VNClassificationObservation] {
for result in results.prefix(3) {
print("\(result.identifier): \(result.confidence)")
}
}
}
let handler = VNImageRequestHandler(cgImage: image.cgImage!)
try? handler.perform([request])
优点
- Vision 自动做输入预处理:比如 resize 到模型输入尺寸,RGB 通道匹配。
- 支持组合任务:可以和 Vision 的人脸检测、文本检测、轮廓检测组合。
- 结果封装更高层:很多情况下输出是
VNClassificationObservation或VNPixelBufferObservation,更直观。
缺点
- 性能略低:因为 Vision 多了一层封装和调度。
- 灵活性差:如果你想输入一个特殊的张量(不是图片),Vision 不太适合。
2.2 通过 prediction(input:) 直接处理
如果模型输入是固定格式(例如 CVPixelBuffer),可以直接调用模型生成的接口:
import CoreML
let model = MobileNetV2()
if let pixelBuffer = image.pixelBuffer() {
if let prediction = try? model.prediction(image: pixelBuffer) {
print(prediction.classLabel)
}
}
优点
- 简单直接:只要输入输出匹配,就能直接拿结果。
- 性能更高:没有 Vision 框架的额外封装,速度通常更快,内存占用更低。
- 更灵活:你可以自己处理输入数据(比如
CVPixelBufferresize、归一化),完全可控。
缺点
- 需要手动处理前后处理:输入图片需要自己 resize、颜色归一化;输出结果可能是
MLMultiArray,也要自己解码。 - 不支持 Vision 的额外功能(比如人脸检测、多模型 pipeline)
三、CoreML转换
很多时候,苹果官方提供的模型无法满足业务需求,这时我们需要从其他平台获取并转换模型。
1. Hugging Face 介绍
Hugging Face 是目前最流行的开源 AI 模型社区,涵盖了 NLP(自然语言处理)、CV(计算机视觉)、ASR(语音识别)等多个领域。开发者可以下载 PyTorch 或 TensorFlow 格式的模型。
2. 将 Hugging Face 上的模型转换成 mlmodel
苹果提供了 coremltools Python 库,可以将常见的模型格式(如 PyTorch .pt / .pth、TensorFlow .pb / .h5)转换为 .mlmodel。[参考资料]
转换前的准备
1. 确认 Python 是否安装
在终端里输入:
python3 --version
如果能看到版本号(比如 Python 3.11.9),说明系统自带了 Python。
2. 安装 pip
如果系统没有 pip,可以手动装:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
然后再确认:
pip3 --version
常见问题:
- 安装完提示
Installing collected packages:
pip WARNING: The scripts pip, pip3 and pip3.9 are installed in '/Users/iMac/Library/Python/3.9/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
解决办法:修复 pip3 脚本
#先看看 pip3 脚本内容:
head -n 1 /usr/local/bin/pip3
你会看到:
#!/usr/bin/python
执行下面命令进行修改:
sudo nano /usr/local/bin/pip3
把它改成:
#!/usr/bin/env python3
2. pip3 –version打印版本号报错
Traceback (most recent call last):
File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages/pkg_resources/__init__.py", line 568, in _build_master
ws.require(__requires__)
File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages/pkg_resources/__init__.py", line 886, in require
needed = self.resolve(parse_requirements(requirements))
File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages/pkg_resources/__init__.py", line 777, in resolve
raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.VersionConflict: (pip 25.2 (/Users/iMac/Library/Python/3.9/lib/python/site-packages), Requirement.parse('pip==9.0.3'))
这是 Xcode 自带 Python 和你安装 Python/pip 版本不同导致的问题。
解决办法: python3 -m pip代替pip
例如:
python3 -m pip --version
如果出现上面报错,第三步中正确安装torch的方式也需要修改:
# 创建隔离环境
python3 -m venv ~/torch2.5-env
source ~/torch2.5-env/bin/activate
# 安装 PyTorch 2.5 + torchvision/torchaudio 对应版本 + coremltools
pip install torch==2.5.0 torchvision==0.14.1 torchaudio==0.13.1 coremltools
3. 安装必须的依赖
有了 pip 之后,执行:
pip3 install torch torchvision coremltools
⚠️ PyTorch 比较大,下载时需要等一会。如果网速慢,可以换国内源,例如:
pip3 install torch torchvision coremltools -i https://pypi.tuna.tsinghua.edu.cn/simple
4. 运行转换脚本
安装完成后,就可以运行convert_to_coreml.py 脚本了:
python3 convert_to_coreml.py
示例:将 Hugging Face 上的文本分类模型转换:
import coremltools as ct
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 加载 Hugging Face 模型
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
model.eval()
# 转换为 TorchScript
example = torch.rand(1, 128, dtype=torch.int64)
traced_model = torch.jit.trace(model, example)
# 转换为 Core ML
mlmodel = ct.convert(
traced_model,
inputs=[ct.TensorType(name="input_ids", shape=example.shape)]
)
mlmodel.save("TextClassifier.mlmodel")
这样就可以把 NLP 模型放到 iOS App 中使用。
四、自己创建 CoreML
有时候,我们的应用需要的模型并不存在于现有库中,这时可以选择 Create ML 自己训练模型。[1]
1. 官方 Create ML 的方法
苹果在 Xcode 中提供 Create ML 工具,不需要写复杂的代码,只需准备好数据集即可。(官方支持的创建类型)
例如:
- 图像分类:准备不同类别的图片文件夹。
- 文本分类:准备带有标签的文本数据。
- 声音识别:准备语音样本。
操作步骤:
- 打开 Create ML App 或在 Xcode 中新建 ML Project。
- 导入数据集。
- 选择合适的任务(图像分类、文本分类等)。
- 点击训练并导出
.mlmodel文件。
2. 短信过滤 App 实战
下面我们以 短信过滤 为例,完整实现一个 Core ML 应用场景。
2.1 数据准备
短信过滤属于 文本分类,所以需要准备一个带标签的短信语料库。
- 数据格式:CSV 或 JSON,包含两列:
text(短信内容)label(类别,比如 “正常”、“过滤”)
示例 JSON:
[
{
"text": "【淘票票】您已中奖,点击领取现金红包",
"label": "过滤"
},
{
"text": "今天下午三点开会,请准时参加",
"label": "正常"
},
{
"text": "低息贷款,快速下款,联系我",
"label": "过滤"
},
{
"text": "Apple ID 登录验证码:123456",
"label": "正常"
}
]
- 数据量建议:每类至少 几千条,数据越多模型效果越好。
- 来源方式:
- 很多学术机构和开源社区已经整理了 垃圾短信/正常短信数据集,可以直接下载使用。常见的有:
- 中文短信数据集(带标签
包含 80万条中文短信,每条带标签(0 表示正常,1 表示垃圾)。同时提供train.csv、test.csv和“停用词”列表等辅助文件,方便直接用于文本分类任务 CSDN博客。 - Heywhale 垃圾短信数据集
总计 10,929 条中文短信,包括 6,990 条正常和 3,939 条垃圾短信,格式已标注清晰,可直接下载使用 heywhale.com。 - 伪基站电信诈骗垃圾短信数据集
来自真实伪基站,包含 14,000 条垃圾/诈骗短信,已分为多个类别,可用于提高模型识别诈骗短信的能力 哔哩哔哩。 - 阿里云天池——垃圾短信预测数据集
提供训练集train.txt和测试集test.csv,可用于模型训练与评估任务(具体数据字段可查看天池页面) 天池大数据众智平台。 - 开发者可以通过自己或者用户手动标记垃圾短信 → 作为反馈数据,逐渐扩充语料库。
2.2 使用 Create ML 训练
- 打开 Create ML App(位于 Xcode 工具目录)。
- 选择 新建项目 → Text Classifier。
- 导入准备好的 CSV 数据。
- 配置:
- 训练集 / 验证集比例(默认 80/20)。
- 选择语言(中文或英文)。
- 点击 训练 (Train),等待完成。
- 导出得到一个
TextClassifier.mlmodel文件。
2.3 集成到 Xcode
- 在 Xcode 项目中新建 Message Filter Extension:
- File → New → Target → Message Filter Extension。
- 系统会生成一个扩展工程文件夹。
- 将
TextClassifier.mlmodel拖入扩展的工程中,Xcode 会自动生成对应 Swift 类。 - 在扩展中调用模型:
import IdentityLookup
import CoreML
import NaturalLanguage
class MessageFilterExtension: ILMessageFilterExtension {
lazy var classifier: TextClassifier = {
return try! TextClassifier(configuration: MLModelConfiguration())
}()
override func handle(
_ queryRequest: ILMessageFilterQueryRequest,
context: ILMessageFilterExtensionContext,
completion: @escaping (ILMessageFilterQueryResponse) -> Void
) {
let response = ILMessageFilterQueryResponse()
if let message = queryRequest.messageBody {
// 调用模型预测
if let prediction = try? classifier.prediction(text: message) {
if prediction.label == "过滤" {
response.action = .junk // 标记为垃圾短信
} else {
response.action = .allow // 放行正常短信
}
}
}
completion(response)
}
}
这样,系统在接收到新短信时,会调用我们的扩展,利用模型判断短信类别。