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。
要进行自定义预测模型训练,您需要准备要用于训练的图像。您需要按如下方式提供图像:
- 创建一个数据集文件夹并命名(如 pets)
- 在数据集文件中创建一个名称为 train 的子文件夹
- 在数据集文件中创建一个名称为 test 的子文件夹
- 在 train 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
- 在 test 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
- 把每个对象的图像放在 train 文件夹下对应名称的子文件夹,这些图像是用于训练模型的图像,为了训练出精准度较高的模型,我建议每个对象收集大约500张以上图像。
- 把每个对象用于测试的图像放在 test 文件夹下对应名称的子文件夹,为了训练出精准度较高的模型,我建议每个对象用于测试的图像在100~200张。
- 用于训练模型时在这些图像中识别出要训练的对象。按照上述步骤操作完成后,图像数据集文件夹的结构应如下所示:
然后您的训练代码如下:
代码语言: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:该参数用于指定是否在控制台中显示训练的过程。
当您开始训练时,您应该在控制台中看到类似的内容:
训练过程开始后,您将在控制台中看到如下结果:
让我们解释一下上面显示的细节:
- Epoch 1/100 这行表示正在进行第100个目标的第1次训练
- 1/25 >……………………….. - ETA: 52s - loss: 2.3026 - acc: 0.2500 表示本实验中正在训练的批次数
- 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)
测试结果: