ImageAI:自定義預(yù)測(cè)模型訓(xùn)練
ImageAI 提供4種不同的算法及模型來(lái)執(zhí)行自定義預(yù)測(cè)模型訓(xùn)練虱颗,通過(guò)以下簡(jiǎn)單幾個(gè)步驟即可實(shí)現(xiàn)自定義預(yù)測(cè)模型訓(xùn)練。提供用于自定義預(yù)測(cè)模型訓(xùn)練的4種算法包括 SqueezeNet,ResNet,InceptionV3 和 DenseNet。您可以將其中一種算法加載到imageai.Prediction.Custom.CustomImagePrediction類(lèi)中猬膨,這允許您在任何對(duì)象/人的圖像集上訓(xùn)練您自己的模型。訓(xùn)練過(guò)程生成一個(gè) JSON 文件呛伴,用于映射圖像數(shù)據(jù)集和許多模型中的對(duì)象類(lèi)型勃痴。然后,您就可以使用生成的 JSON 文進(jìn)行高精度自定義圖像預(yù)測(cè)热康。
由于視頻模型訓(xùn)練是非常消耗硬件資源的任務(wù)沛申,所以我們建議您使用安裝了 NVIDIA GPU 和 GPU 版 Tensorflow 的計(jì)算機(jī)來(lái)完成此實(shí)驗(yàn)。因?yàn)樵?CPU 上執(zhí)行模型培訓(xùn)將需要數(shù)小時(shí)或數(shù)天姐军,但使用安裝了 NVIDIA GPU 的計(jì)算機(jī)可能只需幾個(gè)小時(shí)污它。您也可以使用 Google Colab 進(jìn)行此實(shí)驗(yàn),因?yàn)樗哂锌捎玫?NVIDIA K80 GPU。
要進(jìn)行自定義預(yù)測(cè)模型訓(xùn)練衫贬,您需要準(zhǔn)備要用于訓(xùn)練的圖像德澈。您需要按如下方式提供圖像:
- 創(chuàng)建一個(gè)數(shù)據(jù)集文件夾并命名(如 pets)
- 在數(shù)據(jù)集文件中創(chuàng)建一個(gè)名稱(chēng)為 train 的子文件夾
- 在數(shù)據(jù)集文件中創(chuàng)建一個(gè)名稱(chēng)為 test 的子文件夾
- 在 train 文件夾中,為每個(gè)你要訓(xùn)練的對(duì)象創(chuàng)建文件夾并命名(如 dog固惯,cat梆造,squirrel,snake)
- 在 test 文件夾中葬毫,為每個(gè)你要訓(xùn)練的對(duì)象創(chuàng)建文件夾并命名(如 dog镇辉,cat,squirrel贴捡,snake)
- 把每個(gè)對(duì)象的圖像放在 train 文件夾下對(duì)應(yīng)名稱(chēng)的子文件夾忽肛,這些圖像是用于訓(xùn)練模型的圖像,為了訓(xùn)練出精準(zhǔn)度較高的模型烂斋,我建議每個(gè)對(duì)象收集大約500張以上圖像屹逛。
- 把每個(gè)對(duì)象用于測(cè)試的圖像放在 test 文件夾下對(duì)應(yīng)名稱(chēng)的子文件夾,為了訓(xùn)練出精準(zhǔn)度較高的模型汛骂,我建議每個(gè)對(duì)象用于測(cè)試的圖像在100~200張罕模。
-
用于訓(xùn)練模型時(shí)在這些圖像中識(shí)別出要訓(xùn)練的對(duì)象。按照上述步驟操作完成后帘瞭,圖像數(shù)據(jù)集文件夾的結(jié)構(gòu)應(yīng)如下所示:
然后您的訓(xùn)練代碼如下:
from imageai.Prediction.Custom import ModelTraining
model_trainer=ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("pets")
model_trainer.trainModel(num_objects=4,num_experiments=100,enhance_data=True,batch_size=32,show_network_summary=True)
沒(méi)錯(cuò)! 只需 5 行代碼淑掌,就可以在您的數(shù)據(jù)集上使用所支持的4種深度學(xué)習(xí)算法來(lái)訓(xùn)練自定義模型。現(xiàn)在讓我們來(lái)看看上面的代碼是如何工作的:
from imageai.Prediction.Custom import ModelTraining
model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("pets")
在上面的代碼中蝶念,第一行導(dǎo)入 ImageAI 的ModelTraining類(lèi)抛腕,第二行創(chuàng)建了ModelTraining類(lèi)的新實(shí)例,第三行將模型類(lèi)型設(shè)置為ResNet媒殉,第四行設(shè)置我們想要訓(xùn)練的數(shù)據(jù)集的路徑兽埃。
model_trainer.trainModel(num_objects=4,num_experiments=100,enhance_data=True,batch_size=32,show_network_summary=True)
在上面的代碼中,我們開(kāi)始了模型訓(xùn)練适袜,參數(shù)如下:
- num_objects:該參數(shù)用于指定圖像數(shù)據(jù)集中對(duì)象的數(shù)量
- num_experiments:該參數(shù)用于指定將對(duì)圖像訓(xùn)練的次數(shù),也稱(chēng)為
- epochsenhance_data(可選):該參數(shù)用于指定是否生成訓(xùn)練圖像的副本以獲得更好的性能舷夺。
- batch_size:該參數(shù)用于指定批次數(shù)量苦酱。由于內(nèi)存限制,需要分批訓(xùn)練给猾,直到所有批次訓(xùn)練集都完成為止疫萤。
- show_network_summary:該參數(shù)用于指定是否在控制臺(tái)中顯示訓(xùn)練的過(guò)程。
當(dāng)您開(kāi)始訓(xùn)練時(shí)敢伸,您應(yīng)該在控制臺(tái)中看到類(lèi)似的內(nèi)容:
訓(xùn)練過(guò)程開(kāi)始后扯饶,您將在控制臺(tái)中看到如下結(jié)果:
讓我們解釋一下上面顯示的細(xì)節(jié):
- Epoch 1/100 這行表示正在進(jìn)行第100個(gè)目標(biāo)的第1次訓(xùn)練
- 1/25 [>………………………..] - ETA: 52s - loss: 2.3026 - acc: 0.2500 表示本實(shí)驗(yàn)中正在訓(xùn)練的批次數(shù)
- Epoch 00000: saving model to C:\Users\Moses\Documents\Moses\W7\AI\Custom Datasets\IDENPROF\idenprof-small-test\idenprof\models\model_ex-000_acc-0.100000.h5是指本實(shí)驗(yàn)后保存的模型文件。該 ex_000 表示實(shí)驗(yàn)的階段,而 acc_0.100000 和 val_acc:0.1000 表示本實(shí)驗(yàn)完成后測(cè)試圖像上模型的精準(zhǔn)度(最大精準(zhǔn)度為1.0)尾序。此結(jié)果有助于了解可用于自定義圖像預(yù)測(cè)的最佳模型钓丰。
完成自定義模型的訓(xùn)練后,可以使用CustomImagePrediction類(lèi)對(duì)自定義模型執(zhí)行圖像預(yù)測(cè)每币。
訓(xùn)練完成后携丁,在pets下會(huì)生成兩個(gè)文件夾json和models:
json文件下有個(gè)model_class.json
models文件下生個(gè)了個(gè)model_ex-001_acc-0.523810.h5
測(cè)試圖:
測(cè)試代碼:
from imageai.Prediction.Custom import CustomImagePrediction
import os
execution_path = os.getcwd()
prediction = CustomImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "model_ex-001_acc-0.523810.h5"))
prediction.setJsonPath(os.path.join(execution_path, "model_class.json"))
prediction.loadModel(num_objects=10)
predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5)
for eachPrediction, eachProbability in zip(predictions, probabilities):
print(eachPrediction + " : " + eachProbability)
測(cè)試結(jié)果: