ImageAI:自定义预测模型训练

2021-04-01 10:07:34 浏览数 (2)

ImageAI:自定义预测模型训练

ImageAI 提供4种不同的算法及模型来执行自定义预测模型训练,通过以下简单几个步骤即可实现自定义预测模型训练。提供用于自定义预测模型训练的4种算法包括 **SqueezeNet**,**ResNet**,**InceptionV3** 和 **DenseNet**。您可以将其中一种算法加载到imageai.Prediction.Custom.CustomImagePrediction类中,这允许您在任何对象/人的图像集上训练您自己的模型。训练过程生成一个 JSON 文件,用于映射图像数据集和许多模型中的对象类型。然后,您就可以使用生成的 JSON 文进行高精度自定义图像预测。

由于视频模型训练是非常消耗硬件资源的任务,所以我们建议您使用安装了 NVIDIA GPU 和 GPU 版 Tensorflow 的计算机来完成此实验。因为在 CPU 上执行模型培训将需要数小时或数天,但使用安装了 NVIDIA GPU 的计算机可能只需几个小时。您也可以使用 Google Colab 进行此实验,因为它具有可用的 NVIDIA K80 GPU。

要进行自定义预测模型训练,您需要准备要用于训练的图像。您需要按如下方式提供图像:

  1. 创建一个数据集文件夹并命名(如 pets)
  2. 在数据集文件中创建一个名称为 train 的子文件夹
  3. 在数据集文件中创建一个名称为 test 的子文件夹
  4. 在 train 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
  5. 在 test 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
  6. 把每个对象的图像放在 train 文件夹下对应名称的子文件夹,这些图像是用于训练模型的图像,为了训练出精准度较高的模型,我建议每个对象收集大约500张以上图像。
  7. 把每个对象用于测试的图像放在 test 文件夹下对应名称的子文件夹,为了训练出精准度较高的模型,我建议每个对象用于测试的图像在100~200张。
  8. 用于训练模型时在这些图像中识别出要训练的对象。按照上述步骤操作完成后,图像数据集文件夹的结构应如下所示:

然后您的训练代码如下:

代码语言:txt复制
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) 

没错! 只需 5 行代码,就可以在您的数据集上使用所支持的4种深度学习算法来训练自定义模型。现在让我们来看看上面的代码是如何工作的:

代码语言:txt复制
from imageai.Prediction.Custom import ModelTraining 

model_trainer = ModelTraining() 

model_trainer.setModelTypeAsResNet() 

model_trainer.setDataDirectory("pets") 

在上面的代码中,第一行导入 ImageAI 的ModelTraining类,第二行创建了ModelTraining类的新实例,第三行将模型类型设置为ResNet,第四行设置我们想要训练的数据集的路径。

代码语言:txt复制
model_trainer.trainModel(num_objects=4,num_experiments=100,enhance_data=True,batch_size=32,show_network_summary=True) 

在上面的代码中,我们开始了模型训练,参数如下:

* num_objects:该参数用于指定图像数据集中对象的数量

* num_experiments:该参数用于指定将对图像训练的次数,也称为

* epochsenhance_data(可选):该参数用于指定是否生成训练图像的副本以获得更好的性能。

* batch_size:该参数用于指定批次数量。由于内存限制,需要分批训练,直到所有批次训练集都完成为止。

* show_network_summary:该参数用于指定是否在控制台中显示训练的过程。

当您开始训练时,您应该在控制台中看到类似的内容:

训练过程开始后,您将在控制台中看到如下结果:

让我们解释一下上面显示的细节:

  1. Epoch 1/100 这行表示正在进行第100个目标的第1次训练
  2. 1/25 >……………………….. - ETA: 52s - loss: 2.3026 - acc: 0.2500 表示本实验中正在训练的批次数
  3. Epoch 00000: saving model to C:UsersMosesDocumentsMosesW7AICustom DatasetsIDENPROFidenprof-small-testidenprofmodelsmodel_ex-000_acc-0.100000.h5是指本实验后保存的模型文件。该 ex_000 表示实验的阶段,而 acc_0.100000 和 val_acc:0.1000 表示本实验完成后测试图像上模型的精准度(最大精准度为1.0)。此结果有助于了解可用于自定义图像预测的最佳模型。

完成自定义模型的训练后,可以使用CustomImagePrediction类对自定义模型执行图像预测。

训练完成后,在pets下会生成两个文件夹json和models:

json文件下有个**model_class.json**

models文件下生个了个**model_ex-001_acc-0.523810.h5**

测试图:

测试代码:

代码语言:txt复制
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) 

测试结果:

0 人点赞