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閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容