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

版本记录

版本号 时间
V1.0 2018.08.17

前言

目前世界上科技界的所有大佬一致认为人工智能是下一代科技革命,苹果作为科技界的巨头,当然也会紧跟新的科技革命的步伐,其中ios API 就新出了一个框架Core ML。ML是Machine Learning的缩写,也就是机器学习,这正是现在很火的一个技术,它也是人工智能最核心的内容。感兴趣的可以看我写的下面几篇。
1. Core ML框架详细解析(一) —— Core ML基本概览
2. Core ML框架详细解析(二) —— 获取模型并集成到APP中
3. Core ML框架详细解析(三) —— 利用Vision和Core ML对图像进行分类
4. Core ML框架详细解析(四) —— 将训练模型转化为Core ML
5. Core ML框架详细解析(五) —— 一个Core ML简单示例(一)

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图像分类器

以下是同一数据集的Turi Create image classifier example中的代码 - 完整的25,000图像数据集:

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模型。

所以Turi Create的图像分类更加手动,但比Create ML更灵活。 turicreate.create() documentation列出了几个可选参数。 您可以指定基础model以匹配Create ML。 请注意Core ML型号的尺寸差异! 如果您创建了一个真正代表您的真实测试数据并且不希望模型使用您的训练数据中的随机选择,您还可以提供固定的validation_set

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


Text Classifier - 文本分类器

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

1. Create ML

这里是代码Create ML text classifier example

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的值为正,负或中性。 WWDC 2018 Session 703 video视频显示了另一种使用单独文本文件在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

此代码来自Natural Language Processing on iOS with Turi Create教程。 它用10位诗人的诗歌训练句子分类器,以预测测试文本的作者。

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教程材料包括一个iOS应用程序,您可以在其中测试粘贴到textview中的文本的模型。 该应用程序使用wordCounts(text :)辅助函数,类似于 Turi Create text classification example底部的单词函数包。

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


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

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

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

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

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

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

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


Anaconda & Notebooks

下载Python 3.6 version of Anaconda for macOS,在home directory中安装而不是在根目录文件夹中安装。

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

注意:安装Anaconda并创建Turi Create环境可能需要几分钟时间。 在您等待的同时,浏览Michael Kennedy 2014年11月的Comparison of Python and Swift Syntax以及Jason Brownlee 2016年5月的 Crash Course in Python for Machine Learning Developers。 Brownlee的文章包括使用数据科学库NumPyMatplotlibPandas的例子。 Swift和Python语法之间的最大区别在于您使用缩进而不是{...}来定义闭包,函数和类。

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的本地文件夹。

如果你有一个非常强大的新Mac,下载并取消归档 Kaggle Cats and Dogs Dataset,然后将PetImages文件夹移动到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

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

注意:此示例与Apple的 Image similarity示例相同,但使用Cat和Dog数据集。

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

虽然您为此图像相似性训练器提供了相同的标记数据集,但它不使用标签:此模型使用无监督学习。 底层模型查看了大量图像,并自学了哪些像素值排列构成了可用于聚类“相似”图像的特征。 因此,就像图像分类器一样,大部分训练时间用于从数据集中提取这些特征。 然后它做"brute force" nearest neighbors:对于每个图像,它计算它与每个其他图像的距离,并将其他图像排列成半径带。 同样,与特征提取相比,这一步骤很快。


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

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

探索Create ML及其文档,但也花一些时间浏览Turi Create User Guide,即使您不想编写Python。

后记

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容