訓(xùn)練一個機器學(xué)習(xí)模型來實現(xiàn)圖像分類。
1.概述
圖像分類器是一個被訓(xùn)練用來識別圖像的機器學(xué)習(xí)模型。當(dāng)你給他一個圖像,它針對這個圖像反饋一個文本。

通過顯示許多貼過標(biāo)簽的示例圖像來訓(xùn)練圖像分類器。例如,您可以通過顯示如大象、長頸鹿、獅子等多種圖像訓(xùn)練一個圖像分類器來識別野生動物。

2.準(zhǔn)備數(shù)據(jù)
首先準(zhǔn)備用于訓(xùn)練和評估分類器的數(shù)據(jù)。從每個標(biāo)簽的80%的圖像中創(chuàng)建一個訓(xùn)練數(shù)據(jù)集合。用剩下的圖片創(chuàng)建一個測試數(shù)據(jù)集。確保任何給定的圖像只存在于兩個集合的其中一個。
接下來,將磁盤上的數(shù)據(jù)組織為與MLImageClassifier.DataSource類型之一兼容。一個方法是創(chuàng)建一個名為Training Data的文件夾,另一個命名為Testing Data。在每個文件夾中,用您的標(biāo)簽作為名字創(chuàng)建子文件夾。然后將圖像排列到每個數(shù)據(jù)集的相應(yīng)子文件夾中。

確切的標(biāo)簽字符串并不重要,只要它們對您有意義。比如,可以使用“Cheetah”標(biāo)簽來表示所有獵豹的圖像。您不必用任何特定的方式命名圖像文件或者向其添加元數(shù)據(jù)。您只需要講他們放入正確標(biāo)簽的文件夾即可。每個標(biāo)簽至少使用10張圖像作為訓(xùn)練集,當(dāng)然越多越好。此外要平衡每個標(biāo)簽圖像的數(shù)量。比如,不要使用10張圖像用于"獵豹",而"大象"給了1000張。
圖像可以是統(tǒng)一格式標(biāo)志符符合“public.image”的任意格式。包括像JPEG和PNG這樣的常見格式。圖像不必統(tǒng)一相同的尺寸,也不用使用任何特定尺寸。但是,最好使用大于等于299x299像素的圖像。如果可以,使用與收集圖像進行預(yù)測相似的方式訓(xùn)練您收集的圖像。也就是說,如果您的應(yīng)用程序在室外設(shè)置中對從設(shè)備的相機拍攝的圖像進行分類,則使用類似相機在戶外拍攝的圖像訓(xùn)練您的模型。
提供多樣性的圖像。例如,使用顯示來自許多不同角度和不同光照條件的動物圖像。對于給定標(biāo)簽用差不多相同圖像訓(xùn)練出來的分類器,相比較于用更多樣化的圖像集訓(xùn)練出來的分類器,性能更差。
注
分類器使用“scene print feature extractor”來加速訓(xùn)練過程。這回影響適合訓(xùn)練圖像的種類。詳細(xì)可參考MLImageClassifier.FeatureExtractorType.scenePrint(revision:)
創(chuàng)建模型的兩種方式
方式一、在 Playground 中顯示 Image Classifier Builder(通過Playground創(chuàng)建)
準(zhǔn)備好您的數(shù)據(jù),使用Mac OS創(chuàng)建一個新的Xcode playground。使用playground創(chuàng)建MLImageClassifierBuilder實例并且在實時視圖中展示它:
// Import CreateMLUI to train the image classifier in the UI.
// For other Create ML tasks, import CreateML instead.
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
在Xcode中顯示助手編輯器,并運行playground。當(dāng)你運行它時,實時視圖會展示一個圖像分類器:

訓(xùn)練圖像分類器
將訓(xùn)練數(shù)據(jù)文件夾從Finder拖拽到實時視圖指定的位置。當(dāng)您這么做時,訓(xùn)練處理開始并且圖像分類器顯示其進度:

作為訓(xùn)練過程的一部分,圖片分類器自將自動將訓(xùn)練數(shù)據(jù)分成訓(xùn)練集和驗證集。它們都會影響訓(xùn)練,但方式不同。因為分離是隨機進行的,所以每次訓(xùn)練模型時會得到不同的結(jié)果。
當(dāng)訓(xùn)練結(jié)束時,實時視圖顯示訓(xùn)練和驗證的準(zhǔn)確度。這個反映了訓(xùn)練模型從相應(yīng)數(shù)據(jù)集分類圖像的效果如何。因為模型是在這些圖像上訓(xùn)練的,所以它通常能很好地對它們進行分類。

評估分類器的性能
接下來,用模型從沒有見過的圖形來測試它,以評估訓(xùn)練模型的性能。為此,使用開始訓(xùn)練之前創(chuàng)建的測試數(shù)據(jù)集。拖拽測試數(shù)據(jù)文件夾到實時視圖,就像拖拽訓(xùn)練數(shù)據(jù)時一樣。

該模型處理所有的圖像,并對每一個圖像做出預(yù)測。因為這是被標(biāo)記的數(shù)據(jù),該模型可以檢測它自己的預(yù)測結(jié)果。然后,它將總體評估精度作為UI中的最終度量。

如果評估性能不夠好,您可能需要更多的數(shù)據(jù)重新訓(xùn)練——例如,通過引入圖像增強——或者更改一些其他培訓(xùn)配置。有關(guān)如何進行更詳細(xì)的模型評估以及改進模型性能的策略的信息,請參閱Improving Your Model’s Accuracy
保存Core ML 模型
當(dāng)你的模型運行得足夠好時,將它保存下來,這樣你就可以在你的應(yīng)用程序中使用它了。
給分分類器起一個有意義的名字。在UI中用AnimalClassifier作為名字替換默認(rèn)的ImageClassifier。您也可以添加更多關(guān)于模型的信息,像作者和簡短描述。點擊展開三角按鈕來顯示元數(shù)據(jù)欄位并填寫詳細(xì)信息

點擊Save。該模型以.mlmodel格式的文件寫入到Where字段指定的目錄。
將模型添加到應(yīng)用
現(xiàn)在,將訓(xùn)練過的模型添加到現(xiàn)有支持Core ML的應(yīng)用程序中。您可以使用該模型替換來自Classifying Images with Vision and Core ML樣例代碼項目中附帶的模型。如果您這樣做了,該樣例app的工作原理與之前完全形同,只是它根據(jù)您定義的標(biāo)簽識別和分類動物。
在Xcode中打開樣例代碼項目并將您的模型文件拖入導(dǎo)航面板。一旦該模型成為項目的一部分,Xcode向您顯示模型元數(shù)據(jù)以及其他信息,比如Model Class。

使用新得模型,您只需要更改一行代碼。項目附帶的MobileNet模型在ImageClassificationViewController類的一個地方被實例化:
let model = try VNCoreMLModel(for: MobileNet().model)
將這一行改為使用新的模型類:
let model = try VNCoreMLModel(for: AnimalClassifier().model)
該模型可以被互換是因為他們都獲取一個圖像作為輸入并輸出一個標(biāo)簽。替換之后,樣例應(yīng)用程序與之前一樣對圖像進行分類,只是用了您的模型及其關(guān)聯(lián)的標(biāo)簽。
實現(xiàn)圖像分類器制作過程自動化
如果您在編程或機器學(xué)習(xí)方面沒什么經(jīng)驗,可以按照以上部分所述,使用MLImageClassifierBuilder實例來訓(xùn)練有用的圖像分類器。然而,如果需要用腳本編寫模型訓(xùn)練過程,請改為使用MLImageClassifier實例。這些步驟本質(zhì)上是一樣的:準(zhǔn)備數(shù)據(jù)、訓(xùn)練模型、評估性能并保存結(jié)果到Core ML模型文件中。不同之處在于,一切都是通過編程完成的。例如,您不是將測試數(shù)據(jù)拖到實時視圖來評估模型的表現(xiàn),而是初始化 MLImageClassifier.DataSource 實例并將它提供給分類器的 evaluation(on:) 方法。
方式二、Create an Image Classifier Project(通過Xcode工具創(chuàng)建)(Xcode升版本后可用)
用Create ML創(chuàng)建一個圖像分類項目。打開Xcode,按住Control建并單擊Xcode的Dock圖標(biāo),然后選擇Open Developer Tool> Create ML?;蛘?,從Xcode菜單中選擇Open Developer Tool> Create ML。
在Create ML中,選擇File->New以查看模型模板列表。選擇Image Classifier,然后單擊Next。

給分類器賦予一個有意義的名字。在UI上用AnimalClassifier替換默認(rèn)的MyImageClassifier作為項目名稱。您也可以已添加更多關(guān)于模型的信息,像作者和簡短描述。

配置訓(xùn)練輸入數(shù)據(jù)
將訓(xùn)練數(shù)據(jù)文件夾從Finder拖入到項目窗口的Traininig Data位置。

從Finder將測試數(shù)據(jù)文件夾拖到項目窗口中的
Testing Data位置。
自定義訓(xùn)練參數(shù)或者添加圖像增強(可選)

訓(xùn)練圖像分類器
在項目窗口工具欄上點擊播放按鈕開始訓(xùn)練。圖像分類器在從訓(xùn)練圖像中學(xué)習(xí)時顯示其進度。

了解培訓(xùn)和驗證過程
作為培訓(xùn)過程的一部分,Create ML會自動將您的培訓(xùn)數(shù)據(jù)分成訓(xùn)練集和驗證集。模型從訓(xùn)練集迭代地學(xué)習(xí),并且在每次迭代時,模型使用驗證集檢查其自身的準(zhǔn)確性。因為Create ML將數(shù)據(jù)隨機分成這兩組,所以每次訓(xùn)練模型時可能會得到不同的結(jié)果。
評估分類器的準(zhǔn)確性
培訓(xùn)結(jié)束后,Create ML顯示培訓(xùn)和驗證準(zhǔn)確性分?jǐn)?shù)。這些報告了訓(xùn)練模型對相應(yīng)集合中的圖像進行分類的程度。因為模型訓(xùn)練這些圖像,所以通??梢院芎玫貙λ鼈冞M行分類。在該示例中,訓(xùn)練的模型正確地識別訓(xùn)練集中的所有圖像和驗證集中的97%的圖像。

UI顯示了每次訓(xùn)練迭代時模型的準(zhǔn)確度進度圖表,以及每個圖像類別的精度和召回詳細(xì)信息。
精確度是真陽性的數(shù)量除以真陽性和假陽性的總和。召回是真陽性的數(shù)量除以真陽性和假陰性的總和。
測試分類器的性能
使用您的測試數(shù)據(jù)集Create ML測試您訓(xùn)練模型的性能,測試數(shù)據(jù)集包含模型以前從未見過的圖像。
該模型處理所有圖像并對每個圖像進行預(yù)測。Create ML將每個預(yù)測與正確的標(biāo)簽進行比較,并在UI中顯示整體測試準(zhǔn)確性。

如果評估績效不夠好,您可能需要重新培訓(xùn)更多不同的培訓(xùn)數(shù)據(jù)。例如,您可以為圖像分類器啟用圖像增強選項。有關(guān)如何進行更詳細(xì)的模型評估以及提高模型性能的策略的信息,請參閱提高模型的準(zhǔn)確性。
保存模型
當(dāng)您的模型運行良好時,請將其保存,以便您可以在應(yīng)用中使用它。將模型圖標(biāo)從Output選項卡拖動到Finder中的目錄,以將模型保存為.mlmodel格式的文件。

將模型添加到您的應(yīng)用程序
現(xiàn)在將訓(xùn)練的模型添加到使用Core ML的應(yīng)用程序。您可以使用此模型替換Vision with Vision和Core ML示例代碼項目附帶的模型。如果您這樣做,示例應(yīng)用程序的工作原理與之前完全相同,只是它根據(jù)您定義的標(biāo)簽識別和分類動物。
在Xcode中打開示例代碼項目,然后將模型文件拖到導(dǎo)航窗格中。一旦模型成為項目的一部分,Xcode就會顯示模型元數(shù)據(jù)以及模型類等其他信息。

要在代碼中使用新模型,只需要更改一行代碼即可。項目附帶的 MobileNet 模型僅在 ImageClassificationViewController 類中的一個位置進行實例化:
let model = try VNCoreMLModel(for: MobileNet().model)
請將這一行更改為使用新的模型類:
let model = try VNCoreMLModel(for: AnimalClassifier().model)
這些模型都以圖像為輸入并輸出標(biāo)簽,因此可以互換。替換后,示例 app 會像之前一樣對圖像進行分類,不同的地方是它會使用您的模型及關(guān)聯(lián)的標(biāo)簽。