本文分步介绍在自定义数据集上训练对象检测模型
对象检测是计算机视觉最前沿的方向之一,因为它要求你在图片或者视频中定位、标识、统计和跟踪任何需要关注的对象。对象检测广泛用于许多有趣的工作和研究领域,例如:
• 自动驾驶
• 安全方面
• 行人/人群检测
• 车牌号码和车辆检测
• 工业自动化(例如,物品拣选和分类)
• 机器人技术等等。
许多预先收集的对象检测数据集,诸如Pascal VOC,Microsoft的COCO,Google的Open Images,以及经过他们预先训练的模型,都可以使用,它们仅用于检测和识别一组特定的对象。
但是,使用这些公共数据集和预先训练的模型所面临的挑战是,它们不能为您提供便捷的方法来轻松训练新的物体检测模型以检测和识别你需要识别的物体。自从我发表第一篇“对象检测”和“用10行代码进行对象检测”以来,我收到了来自开发人员,团队,学生和研究人员的数千个希望检测自己感兴趣的图像和视频对象的请求,超出了COCO数据集中提供的80个类别和Open Images数据集中提供的600个类别。
我非常高兴地宣布,在最新版本的ImageAI v2.1.0中,现已完全支持对训练您的自定义YOLOv3模型进行检测并实现检测几乎任何种类和数量的对象的要求。这里我们将指导您进行的实际的操作,让我们开始吧。
OlafenwaMoses/ImageAI(https://github.com/OlafenwaMoses/ImageAI)
出于这个教程的目的,我们将使用Google Colab来训练我们已经提供的一个样本数据集,步骤如下。
步骤一:准备数据集
对于您的自定义检测训练,您必须提供用来训练模型的样本图像(图像数据集),并在训练后进行准确性验证。ImageAI检测训练支持自定义数据集的Pascal VOC格式。在本教程中,我们提供了Hololens混合现实头具的样本数据集,我们将在其上训练一个模型,该模型可以检测和识别图片和视频中的Hololens。您可以通过下面的链接下载样本数据集。
https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/headset.zip
如果要针对自己的自定义对象训练自己的图像,请按照以下说明进行操作。
• 确定要检测的对象类型,并为每个对象收集大约200张(推荐的底限数量),越多越好。
• 收集图像后,需要标注图像中的对象。ImageAI使用Pascal VOC格式进行图像标注。您可以按照我们通过下面的链接提供的分步教程为图像生成此标注信息。
参考文章:对象检测训练——准备你自定义的数据集
(https://medium.com/deepquestai/object-detection-training-preparing-your-custom-dataset-6248679f0d1d)
• 完成有图像的标注后,为数据集创建一个文件夹(例如headset),并在此父文件夹中创建子文件夹训练和验证的子文件夹train和validations。
• 在train文件夹中,创建images和annotations子文件夹。将大约70-80%的数据集图像放入images文件夹中,并将这些图像的相应注释放入注释文件夹中
• 在validation文件夹中,创建images和annotations子文件夹。将其余的数据集图像放入images文件夹中,并将这些图像的相应注释放入annotations文件夹中
• 完成此操作后,图像数据集文件夹的结构应类似于以下示例:
>>train>>images>> img_1.jpg
>>images>> img_2.jpg
>>images>> img_3.jpg
>>annotations>> img_1.xml
>>annotations>> img_2.xml
>>annotations>> img_3.xml
>>validations>>images>> img_151.jpg
>>images>> img_152.jpg
>>images>> img_153.jpg
>>annotations>> img_151.xml
>>annotations>> img_152.xml
>>annotations>> img_153 .xml
步骤二:安装ImageAI和依赖项
转到https://colab.research.google.com并创建一个新笔记本。将新笔记本的运行时更改为GPU。然后:
• 运行以下命令以下载示例hololens数据集
!wget
https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/hololens.zip
• 解压缩hololens数据集的zip文件
!unzip hololens.zip
出于训练的目的,安装 Tensorflow GPU版本1.13.1。这是因为安装在你新笔记本上默认的Tensorflow GPU版本,当你训练你的模型的时候,会生成‘_TfDeviceCaptureOp’ 错误,物体目标没有这个属性‘_set_device_from_string’。如果你的新笔记本在安装以后收到一个要重新启动的提示,那就按照指示重新启动。
!pip3 install tensorflow-gpu==1.13.1
然后从PIP安装最近版本的ImageAI
!pip3 install imageai --upgrade
步骤三:开始您的检测模型训练
为了确保我们训练的自定义模型具有更好的检测准确性,我们将在训练中使用来自预先训练的YOLOv3模型的转移学习。ImageAI提供了在有和没有转移学习的情况下进行训练的选项。我强烈建议您使用转移学习,除非您的数据集中有数千个对象样本。
• 下载预训练的YOLOv3模型
!wget
https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/pretrained-yolov3.h5
• 然后运行培训代码,如下所示
from imageai.Detection.Custom import DetectionModelTrainer
trainer = DetectionModelTrainer()
trainer.setModelTypeAsYOLOv3()
trainer.setDataDirectory(data_directory="hololens")
trainer.setTrainConfig(object_names_array=["hololens"], batch_size=4, num_experiments=100, train_from_pretrained_model="pretrained-yolov3.h5")
trainer.trainModel()
很简单吧!上面的6行代码是您开始对自定义数据集进行训练所需的全部代码。现在让我们将代码分解为一部分:
• 在第一行中,我们从ImageAI导入“DetectionModelTrainer”类
• 在第二行和第三行中,我们创建了该类的实例,并将模型类型设置为YOLOv3
• 在第4行中,我们将路径设置为自定义数据集
• 在第5行中,我们指定了以下参数:
—objectnamesarray:这是数据集中所有对象名称的数组。请注意,如果您的自定义数据集批注包含多个对象,请按照以下示例所示简单地设置所需数值
object_names_array = [“ hololens”,“ google-glass”,“ oculus”]
—batch_size:这是训练的批次大小。请注意,批次大小越大,保存的模型的检测精度越好。但是,由于Colab上Nvidia K80 GPU的内存限制,我们必须将此值保持为4。批次大小可以为8、16等。
—num_experiments:这是我们训练代码在自定义数据集上迭代的次数。
—trainfrompretrained_model:这用于使用我们先前下载的预训练的YOLOv3模型来利用转移学习。
训练开始之后,
• ImageAI将在hololens / json文件夹中生成detection_config.json文件。此JSON文件将在检测图像和视频中的对象期间使用
• ImageAI将创建hololens / models文件夹,在该文件夹中将保存所有生成的模型
• 您将在日志中看到类似下面的示例详细信息。
Using TensorFlow backend.
Generating anchor boxes for training images and annotation...
Average IOU for 9 anchors: 0.78
Anchor Boxes generated.
Detection configuration saved in hololens/json/detection_config.json
Training on: ['hololens']
Training with Batch Size: 4
Number of Experiments: 200
Epoch 1/200
- 733s - loss: 34.8253 - yolo_layer_1_loss: 6.0920 - yolo_layer_2_loss: 11.1064 - yolo_layer_3_loss: 17.6269 - val_loss: 20.5028 - val_yolo_layer_1_loss: 4.0171 - val_yolo_layer_2_loss: 7.5175 - val_yolo_layer_3_loss: 8.9683
Epoch 2/200
- 648s - loss: 11.1396 - yolo_layer_1_loss: 2.1209 - yolo_layer_2_loss: 4.0063 - yolo_layer_3_loss: 5.0124 - val_loss: 7.6188 - val_yolo_layer_1_loss: 1.8513 - val_yolo_layer_2_loss: 2.2446 - val_yolo_layer_3_loss: 3.5229
Epoch 3/200
- 674s - loss: 6.4360 - yolo_layer_1_loss: 1.3500 - yolo_layer_2_loss: 2.2343 - yolo_layer_3_loss: 2.8518 - val_loss: 7.2326 - val_yolo_layer_1_loss: 1.8762 - val_yolo_layer_2_loss: 2.3802 - val_yolo_layer_3_loss: 2.9762
Epoch 4/200
- 634s - loss: 5.3801 - yolo_layer_1_loss: 1.0323 - yolo_layer_2_loss: 1.7854 - yolo_layer_3_loss: 2.5624 - val_loss: 6.3730 - val_yolo_layer_1_loss: 1.4272 - val_yolo_layer_2_loss: 2.0534 - val_yolo_layer_3_loss: 2.8924
Epoch 5/200
- 645s - loss: 5.2569 - yolo_layer_1_loss: 0.9953 - yolo_layer_2_loss: 1.8611 - yolo_layer_3_loss: 2.4005 - val_loss: 6.0458 - val_yolo_layer_1_loss: 1.7037 - val_yolo_layer_2_loss: 1.9754 - val_yolo_layer_3_loss: 2.3667
Epoch 6/200
- 655s - loss: 4.7582 - yolo_layer_1_loss: 0.9959 - yolo_layer_2_loss: 1.5986 - yolo_layer_3_loss: 2.1637 - val_loss: 5.8313 - val_yolo_layer_1_loss: 1.1880 - val_yolo_layer_2_loss: 1.9962 - val_yolo_layer_3_loss: 2.6471
Epoch 7/200
步骤四:评估模型
在上面显示的样本日志中,基于验证损失的减少(例如,损失:5.2569)保存新模型。在大多数情况下,损耗越小,模型将更准确地检测图像和视频中的对象。但是,某些模型可能会过度拟合,但损失仍然较低。为了确保为您的自定义检测选择最佳模型,ImageAI允许您评估hololens / models文件夹中保存的所有经过训练的模型的mAP。
mAP越高,模型的检测精度越好。
在训练期间保存的模型上直接运行以下代码:
from imageai.Detection.Custom import DetectionModelTrainer
trainer = DetectionModelTrainer()
trainer.setModelTypeAsYOLOv3()
trainer.setDataDirectory(data_directory="hololens")
trainer.evaluateModel(model_path="hololens/models", json_path="hololens/json/detection_config.json", iou_threshold=0.5, object_threshold=0.3, nms_threshold=0.5)
当您运行上面的代码时,您将获得类似于以下示例的结果。
Model File: hololens/models/detection_model-ex-07--loss-4.42.h5
Using IoU : 0.5
Using Object Threshold : 0.3
Using Non-Maximum Suppression : 0.5
hololens: 0.9231
mAP: 0.9231
Model File: hololens/models/detection_model-ex-10--loss-3.95.h5
Using IoU : 0.5
Using Object Threshold : 0.3
Using Non-Maximum Suppression : 0.5
hololens: 0.9725
mAP: 0.9725
Model File: hololens/models/detection_model-ex-05--loss-5.26.h5
Using IoU : 0.5
Using Object Threshold : 0.3
Using Non-Maximum Suppression : 0.5
hololens: 0.9204
mAP: 0.9204
让我们细分评估代码:
• 在前4行中,我们导入相同的训练类,创建类实例,设置检测模型类型,并设置数据集目录的路径。
• 在第5行中,我们调用了.evaluateModel函数,并在下面指定了参数
—model_path:这是包含我们的模型的文件夹的路径。它也可以是特定模型的文件路径。
—json_file:这是训练期间保存的detection_config.json文件的路径。
—iou_threshold:这是我们为mAP计算所需的最小“Intersection over Union”。可以将其设置为0.0到1.0之间的值
—object_threshold:这是我们为mAP计算所需的minimum class score。可以将其设置为0.0到1.0之间的值。
—nms_threshold:这是我们为mAP计算所需的Non-maximum suppression(非极大值抑制)。
步骤五:检测图像中的自定义对象
现在我们已经训练了自定义模型来检测Hololens头具,我们将使用已保存的最优模型以及生成的用于检测图像中对象的detection_config.json文件。
• 让我们以上面的示例图像来测试我们训练的定制hololens检测模型。
• 我们提供了已经训练的Hololens检测模型供您测试。通过下面的链接下载模型和相应的detection_config.json文件。
https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/hololens-ex-60–loss-2.76.h5
https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/detection_config.json
• 现在,让我们运行我们的自定义Hololens检测代码,如下所示。
from imageai.Detection.Custom import CustomObjectDetection
detector = CustomObjectDetection()
detector.setModelTypeAsYOLOv3()
detector.setModelPath("hololens-ex-60--loss-2.76.h5")
detector.setJsonPath("detection_config.json")
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image="holo3.jpg", output_image_path="holo3-detected.jpg")
for detection in detections:
print(detection["name"], " : ", detection["percentage_probability"], " : ", detection["box_points"])
当我们运行上面的代码时,我们得到的结果如下。
—识别结果—
hololens:34.01297628879547:[27,79,348,248]
hololens:58.56814980506897:[317,171,498,260]
hololens:73.11487197875977:[725,208,863,303]
瞧瞧!现在我们已经能够在Hololens Mixed Reality headset数据集上成功地训练一个新的检测模型用于检测。
如果您喜欢这篇文章,请尽可能多地鼓掌,还可以与朋友和同事分享。
Colan Notebook包含了这个教程所需的所有代码,你可以通过下方的链接获取。
Google Colaboratory:
https://colab.research.google.com/drive/1R6t5MfFc3JnhZB-UmTjWLbEetBZ22agg
最后,ImageAI同时也允许你使用你自定义的检测模型在视频里进行物体检测并进行视频分析。请参阅下面提供的文档和实例代码链接。
OlafenwaMoses/ImageAI:
https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTION.md
视频检测文档:OlafenwaMoses/ImageAI:
https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTION.md
示例代码:OlafenwaMoses/ImageAI:
https://github.com/OlafenwaMoses/ImageAI/tree/master/examples
物体检测指南
https://www.fritz.ai/object-detection/
关于DeepQuest AI:
https://deepquestai.com/about
原文链接:https://medium.com/deepquestai/train-object-detection-ai-with-6-lines-of-code-6d087063f6ff
- End -
更多AI最新消息,请关注《派派AI学院》👇
https://www.pypyai.com/