使用深度学习检测安全帽

在工业环境中,确保工人佩戴适当的安全设备是至关重要的。本文将介绍如何使用OpenCV和ImageAI这两个强大的库来训练一个能够检测工人是否佩戴安全帽的AI模型。这不仅是一个学术练习,而是一个可以在现实世界中应用的端到端解决方案。

安装OpenCV和ImageAI进行对象检测

在开始之前,需要安装OpenCVImageAI。这两个库将是训练AI模型的基础。

寻找训练数据

为了训练模型,需要收集和准备训练数据。这包括将数据集分为训练集和验证集。

使用预训练模型检测对象

在开始训练自己的模型之前,可以使用OpenCV和ImageAI提供的预训练模型来检测对象。这可以帮助理解模型是如何工作的,并为自己的训练提供参考。

准备图像进行对象检测

在训练模型之前,需要对图像进行预处理。这包括调整图像大小、归一化和增强图像,以提高模型的性能。

训练自定义模型

现在可以开始创建自定义的对象检测模型了。训练自定义检测模型的一般步骤如下:

  • 训练模型
  • 验证模型;如果验证效果不佳,调整并重新训练
  • 直观地测试模型及其结果
  • 部署模型

训练模型

让直接开始训练模型。创建一个新的代码块并输入以下内容:

from imageai.Detection.Custom import DetectionModelTrainer trainer = DetectionModelTrainer() trainer.setModelTypeAsYOLOv3() trainer.setDataDirectory(data_directory="hardhat") trainer.setTrainConfig(object_names_array=["person hardhat"], batch_size=4, num_experiments=20, train_from_pretrained_model="yolo.h5") trainer.trainModel()

这段代码使用了ImageAI检测类中的一个新方法,DetectionModelTrainer。训练任何模型的过程如下:

  • 定义一个新的DetectionModelTrainer()方法。
  • 将模型类型设置为YOLOv3。目前,YOLOv3是唯一可以使用ImageAI训练的模型类型。
  • 设置包含数据的目录。注意,这个文件夹必须包含一个名为"train"的文件夹和一个名为"validation"的文件夹。这些文件夹必须每个都包含一个名为"images"的文件夹和另一个名为"annotations"的文件夹。
  • 设置训练器的配置如下:
    • 指定图像中使用的注释的名称。在例子中,只使用"person hardhat"。
    • 定义批次大小,例子中为4。这决定了模型每次训练将处理多少图像。批次大小越大,模型训练得越好,但请记住,需要更强大的GPU。
    • 指定要进行的模型迭代次数,num_experiments。迭代次数越多,最终结果越好,但训练时间也越长。
    • 如果需要,指定一个预训练模型来进行迁移学习,以更快地获得更好的结果。
    • 使用trainModel()开始模型训练过程。

模型将开始训练,并为每个周期(或epoch)输出状态。对于这些周期中的每一个,都会报告一个损失,以确定模型是否比前一个周期更好。如果是这样,那么该模型将被保存,因此请确保有足够的磁盘空间!

验证模型

训练模型可能需要很长时间。这个模型,经过20次迭代,大约需要四个多小时来训练。一些建议训练模型的建议超过200小时。在让电脑训练模型几天之前,让看看模型在经过20次迭代后创建了什么。

在"hardhat"目录中,将看到已经创建了一些额外的目录:"cache"、"json"、"logs"和"models"。这里两个重要的目录是"json"和"models"。"json"目录包含使用模型所需的JSON配置文件。"model"目录包含一些相当大的模型文件,每个文件都有递增的数字。每个文件都是模型训练迭代的结果,比上一个更好。

所以有很多理论上越来越好的模型,取决于周期编号。让通过验证它们来测试这些。开始一个新的代码块并输入以下内容:

trainer.evaluateModel(model_path="hardhat\models\detection_model-ex-020--loss-0008.462.h5", json_path="hardhat\json\detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5)

需要更改的唯一内容是带有字符串的模型路径:

hardhat\models\detection_model-ex-020--loss-0008.462.h5

因为每次训练运行都会有所不同。此方法接受以下参数:

  • model_path – 指定希望运行验证的模型
  • json_path – 指定模型训练的配置文件
  • iou_threshold – 表示预测和实际边界框的交集和并集的比率
  • object_threshold – 移除检测的置信度水平
  • nms_threshold – 当检测到多个边界框时的置信度水平

当对20次迭代的模型进行此验证时,得到了大约84%的平均精度,这还不错。但是与其他人相比呢?让将代码块扩展到以下内容:

model05 = trainer.evaluateModel(model_path="hardhat\models\detection_model-ex-005--loss-0014.238.h5", json_path="hardhat\json\detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5) model10 = trainer.evaluateModel(model_path="hardhat\models\detection_model-ex-010--loss-0011.053.h5", json_path="hardhat\json\detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5) model15 = trainer.evaluateModel(model_path="hardhat\models\detection_model-ex-015--loss-0009.620.h5", json_path="hardhat\json\detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5) model20 = trainer.evaluateModel(model_path="hardhat\models\detection_model-ex-020--loss-0008.462.h5", json_path="hardhat\json\detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5) print('-----------------------------------------------------') print('Iteration 05:', model05[0]['average_precision']['person hardhat']) print('Iteration 10:', model10[0]['average_precision']['person hardhat']) print('Iteration 15:', model15[0]['average_precision']['person hardhat']) print('Iteration 20:', model20[0]['average_precision']['person hardhat']) print('-----------------------------------------------------')

这段代码需要一些时间来运行,因为它需要加载4个不同的模型,验证它们,并保存结果,所以如果运行它,请稍等一会儿。当这段代码块最终完成后,最后几行将给出结果:

  • 5次迭代 – 71%
  • 10次迭代 – 78%
  • 15次迭代 – 83%
  • 20次迭代 – 84%
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485