CoreML基础教程与实践

在 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 的人脸检测、文本检测、轮廓检测组合。
  • 结果封装更高层:很多情况下输出是 VNClassificationObservationVNPixelBufferObservation,更直观。

缺点

  • 性能略低:因为 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 框架的额外封装,速度通常更快,内存占用更低。
  • 更灵活:你可以自己处理输入数据(比如 CVPixelBuffer resize、归一化),完全可控。

缺点

  • 需要手动处理前后处理:输入图片需要自己 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

常见问题:

  1. 安装完提示
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 工具,不需要写复杂的代码,只需准备好数据集即可。(官方支持的创建类型)

例如:

  • 图像分类:准备不同类别的图片文件夹。
  • 文本分类:准备带有标签的文本数据。
  • 声音识别:准备语音样本。

操作步骤:

  1. 打开 Create ML App 或在 Xcode 中新建 ML Project
  2. 导入数据集。
  3. 选择合适的任务(图像分类、文本分类等)。
  4. 点击训练并导出 .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.csvtest.csv 和“停用词”列表等辅助文件,方便直接用于文本分类任务 CSDN博客
  • Heywhale 垃圾短信数据集
    总计 10,929 条中文短信,包括 6,990 条正常和 3,939 条垃圾短信,格式已标注清晰,可直接下载使用 heywhale.com
  • 伪基站电信诈骗垃圾短信数据集
    来自真实伪基站,包含 14,000 条垃圾/诈骗短信,已分为多个类别,可用于提高模型识别诈骗短信的能力 哔哩哔哩
  • 阿里云天池——垃圾短信预测数据集
    提供训练集 train.txt 和测试集 test.csv,可用于模型训练与评估任务(具体数据字段可查看天池页面) 天池大数据众智平台
  • 开发者可以通过自己或者用户手动标记垃圾短信 → 作为反馈数据,逐渐扩充语料库。

2.2 使用 Create ML 训练

  1. 打开 Create ML App(位于 Xcode 工具目录)。
  2. 选择 新建项目 → Text Classifier
  3. 导入准备好的 CSV 数据。
  4. 配置:
    • 训练集 / 验证集比例(默认 80/20)。
    • 选择语言(中文或英文)。
  5. 点击 训练 (Train),等待完成。
  6. 导出得到一个 TextClassifier.mlmodel 文件。

2.3 集成到 Xcode

  1. 在 Xcode 项目中新建 Message Filter Extension
  • File → New → Target → Message Filter Extension。
  • 系统会生成一个扩展工程文件夹。
  1. TextClassifier.mlmodel 拖入扩展的工程中,Xcode 会自动生成对应 Swift 类。
  2. 在扩展中调用模型:
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)
    }
}

这样,系统在接收到新短信时,会调用我们的扩展,利用模型判断短信类别。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注