您的当前位置:首页Core ML框架详细解析(六) —— 一个Core ML简单示

Core ML框架详细解析(六) —— 一个Core ML简单示

2024-12-11 来源:哗拓教育

版本记录

版本号 时间
V1.0 2018.08.17

前言

Using the Image Classifier - 使用图像分类器

Create ML GUI导出Core ML模型,然后您只需将模型拖到旧的Core ML项目中,在代码中更改一个单词,就可以了!

单击ImageClassifier旁边的显示符号以查看不同的选项集。 单击文本,然后将其更改为PetsClassifier。 将Where位置更改为starter文件夹,然后单击Save

starter文件夹中打开ClassificationImagesWithVisionAndCoreML项目。 这是Apple的2017年项目:我已将其更新为Swift 4.2,并修复了照片选择器调用。 它使用MobileNet.mlmodel,它是17.1 MB:

PetsClassifier.mlmodel拖到项目导航器中。 它是17 KB:

在项目中搜索MobileNet

let model code语句中,将MobileNet替换为PetsClassifier

let model = try VNCoreMLModel(for: PetsClassifier().model)

Build并运行。 单击相机图标以打开照片选取器,然后将一些狗和猫图像拖入Photos

选一个,应用程序通过显示每个标签的概率将其分类为狗或猫:


Turi Create Image Classifier - Turi Create图像分类器

import turicreate as tc

# 1. Load images (Note: you can ignore 'Not a JPEG file' errors)
data = tc.image_analysis.load_images('PetImages', with_path=True)

# 2. From the path-name, create a label column
data['label'] = data['path'].apply(lambda path: 'dog' if '/Dog' in path else 'cat')

# Note: If you have more than two classes, extract the folder names like this:
# train_data["label"] = train_data["path"].apply(lambda path: os.path.basename(os.path.split(path)[0]))

# 3. Make a train-test split
train_data, test_data = data.random_split(0.8)

# 4. Create the model
model = tc.image_classifier.create(train_data, target='label')

# 5. Save predictions to an SArray
predictions = model.predict(test_data)

# 6. Evaluate the model and save the results into a dictionary
metrics = model.evaluate(test_data)
print(metrics['accuracy'])

# 7. Save the model for later use in Turi Create
model.save('mymodel.model')

# 8. Export for use in Core ML
model.export_coreml('MyCustomImageClassifier.mlmodel')

这比你在playground上写的代码要多得多,但你很快就会发现它与Create ML文本分类器代码相似。

使用您在Create ML中执行的操作匹配步骤:

  • 步骤1到4对应于创建Training和Testing文件夹,然后将Training文件夹拖到视图上。 Turi Create必须从图像的路径中提取类标签,但步骤3随机地将20%的数据集分配给test_data,这样可以节省创建Training和Testing文件夹的工作,并且每次运行这段代码都可以获得不同的测试数据集。

注意:在第2步中,仅为两个类提取类标签是一种特殊情况。 我在上面的代码中添加了一个注释,以显示更一般的情况。 首先,os.path.split()将路径分成两部分:文件的名称(如42.jpg)以及导致它的所有内容。 然后os.path.basename()是最后一个文件夹的名称,它是具有类名的文件夹。

  • 步骤5和6对应于将Testing文件夹拖到视图上。 Jupyter笔记本可以像Create ML视图一样轻松地显示predictions数组。 您还可以过滤数组以查找错误的分类,而不是滚动测试图像。

  • 步骤7保存模型供以后使用,因此您可以再次加载它并在不同的测试数据集上运行它。

  • 步骤8导出Core ML模型。

图像分类是Create ML中的一个非常特殊的情况:MLImageClassifierBuilder GUI消除了编写代码的需要和机会。 在下一节中,您将看到其他Create ML模型也需要更多代码。


Text Classifier - 文本分类器

现在比较Create ML和Turi Create如何训练并测试文本分类器模型。 Turi Create模型需要将测试文本转换为一个单词包 - 这是一个直接的转换,它内置于Create ML模型中,因此它直接接受测试文本。

1. Create ML

import CreateML

// 1. Load data from a JSON file
let data = try? MLDataTable(contentsOf: URL(fileURLWithPath: "<#/path/to/read/data.json#>"))

// 2. Make a train-test split
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)

// 3. Create the model
let sentimentClassifier = try? MLTextClassifier(trainingData: trainingData,
  textColumn: "text", labelColumn: "label")
  
// 4. Training accuracy as a percentage
let trainingAccuracy = (1.0 - sentimentClassifier.trainingMetrics.classificationError) * 100

// 5. Validation accuracy as a percentage
let validationAccuracy = (1.0 - sentimentClassifier.validationMetrics.classificationError) * 100

// 6. Evaluation accuracy as a percentage
let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100

// 7. Add metadata
let metadata = MLModelMetadata(author: "John Appleseed",
  shortDescription: "A model trained to classify movie review sentiment", version: "1.0")

// 8. Export for use in Core ML
try? sentimentClassifier.write(to: URL(fileURLWithPath: "<#/path/to/save/SentimentClassifier.mlmodel#>"),
    metadata: metadata)
  • 1)步骤1将数据加载到包含文本text和标签label列的表中,其中label的值为正,负或中性。 视频显示了另一种使用单独文本文件在positivenegative命名的文件夹中加载文本数据的方法,类似于加载图像以训练图像分类器的方式。 这是Create ML中的一个特殊功能,它在Turi Create中不可用。

WWDC 2018 Session 703加载labeled文本数据的替代方法:

let trainDirectory = URL(fileURLWithPath: “/Users/createml/Desktop/train”)
let testDirectory = URL(fileURLWithPath: “/Users/createml/Desktop/test”)
// Create Model
let classifier = try MLTextClassifier(trainingData: .labeledDirectories(at: trainDirectory))

返回主文本分类器代码:

  • 2)第2步与Turi Createrandom_split()相同,随机地将20%的数据分配给testingData。 可选的seed参数设置随机数生成器的seed
  • 3)第3步与Turi Create的sentence_classifier.create()相同。
  • 4 ~ 6)步骤4-6计算训练,验证和评估准确度指标。
  • 7 ~ 8)步骤7和8使用一些元数据导出Core ML模型。

2. Turi Create

import turicreate as tc

# 1. Load data from a JSON file
data = tc.SFrame.read_json('corpus.json', orient='records')

# 2. Create the model
model = tc.sentence_classifier.create(data, 'author', features=['text'])

# 3. Export for use in Core ML
model.export_coreml('Poets.mlmodel')
  • 1)第1步:与Create ML一样,您可以从JSON或CSV文件加载数据。
  • 2)第2步训练模型。
  • 3)步骤3导出Core ML模型。

Turi Create文本分类器期望以单词和单词计数字典的形式输入。 Create ML文本分类器直接接受文本输入,并创建自己的单词包。


Turi Create Image Similarity - Turi Create图像相似度

现在深吸一口气 - 你正在进行Turi Create冒险!

Turi Create有五个以任务为中心的工具包。

  • 推荐系统
  • 图像相似度
  • 物体检测
  • 风格转移
  • 活动分类

看猫狗图片很有趣,所以你会训练模型找到类似的图像。

是的,你需要编写一些Python。 感觉最熟悉的开发环境是Jupyter笔记本 - 它就像一个Xcode playground,但它在你的浏览器中运行。

最简单的方法是使用Anaconda - 由ML社区创建,以整理所有版本的Python和ML库,并在不同的环境中管理它们。


Anaconda & Notebooks

如果显示您无法在那里安装它,请单击Install on a specific disk…按钮,然后单击返回到Home按钮 - 它应该更加令人满意:

1. Create Turi Create Environment - 创建Turi Create环境

使用Anaconda Navigator GUITerminal命令创建一个可以运行Turi Create代码的环境。

GUI:打开Anaconda Navigator,切换到Environments选项卡,然后导入starter / turienv.yaml - 只需单击文件夹图标,然后在Finder中找到该文件。 Anaconda Navigator将从文件中填写环境名称:

Terminal: 打开终端并输入以下命令:

conda env create -f <drag starter/turienv.yaml file from Finder>

2. Launch Jupyter Notebook

使用GUI或终端命令在turienv环境中启动Jupyter笔记本。

首先,在Finder中,创建一个名为notebooks的本地文件夹。

完整的Kaggle数据集包含25,000张图像,这需要很长时间才能在较旧的Mac上处理。 您可以随意使用Pets-1000文件夹,也可以创建自己的数据集。

GUI:如果您正在使用Anaconda Navigator,请切换到Home选项卡,检查turienv是否出现在Applications on字段中,然后单击jupyter Launch

将打开一个终端窗口以运行Jupyter服务器,然后浏览器窗口将显示您的主目录。 导航到您的notebooks文件夹。

终端:如果您正在使用终端,请输入此命令以加载turienv

source activate turienv

命令行提示现在以(turienv)开头。 输入此命令以启动notebooks文件夹中的Jupyter服务器,并显示浏览器窗口:

jupyter notebook <drag notebooks folder from the Finder>

Training the Model - 训练模型

创建一个新的Python 3.6 notebook

双击标题以重命名笔记本:

notebook包含一个空单元格。 在单元格中键入此行,然后按Shift-Enter运行单元格:

import turicreate as tc

注意:如果您只想运行一个代码语句,Shift-Enter也适用于Xcode playgrounds。

第一个下面出现了一个新的空单元格。 在其中键入以下内容,然后运行它:

reference_data = tc.image_analysis.load_images('./PetImages')
reference_data = reference_data.add_row_number()
reference_data.save('./kaggle-pets.sframe')

您正在将图像加载到表中,向表中添加行号,然后保存它以备将来使用。 忽略JPEG decode failure消息。

注意:在键入Python代码时,请使用Tab键进行自动完成。

在下一个单元格中,运行此语句以探索数据:

reference_data.explore()

将打开一个窗口,显示id,path和image列。 将光标悬停在一行中会显示图像:

下面,运行下面语句:

model = tc.image_similarity.create(reference_data)

这将需要一段时间 - In [*]中显示它正在运行。 在您等待的同时,请阅读有关unsupervised learning的内容。

注意:要在单元格完成之前停止单元格,请单击Stop按钮(工具栏中的Run旁边)。 随意删除PetImages中的图像,或者只是加载Pets-1000


Unsupervised Learning - 无监督学习

向图像分类器提供标记数据使其能够通过检查其对标签的预测来测量其准确度。 这是有监督的学习supervised learning


Querying the Model - 查询模型

模型准备好以后就运行下面这行代码:

query_results = model.query(reference_data[0:10], k=10)
query_results.head()

您传递的数组包含前10个reference_data图像,每个图像要求10个相似的图像,然后显示query_results的前10行。

假设您要查找第10张图像的类似图像。 首先,看看它是什么:

reference_data[9]['image'].show()

图像的加载顺序是不确定的,因此您的第10张图像可能是不同的。 重要的是它应该看起来像下一个单元格的输出。

所以运行这些行:

similar_rows = query_results[query_results['query_label'] == 9]['reference_label']
reference_data.filter_by(similar_rows, 'id').explore()

目标图像实际上是返回的第一个图像。 其他图像显示看起来相似和/或以类似方式定位位置不同的猫。


Shutting Down

退出jupyter浏览器窗口。

在运行jupyter服务器的终端窗口中,按Control-C-C以停止服务器。

如果命令行提示符以(turienv)开头,请输入以下命令退出:

source deactivate

如果您真的不想保留Anaconda,请输入以下命令:

rm -rf ~/anaconda3

关于本文章的内容就此结束了,下面说一下其他方面的。

后记

本篇主要讲述了一个Core ML简单示例,感兴趣的给个赞或者关注~~~

显示全文