用6行代码训练AI对象检测模型


本文分步介绍在自定义数据集上训练对象检测模型



对象检测是计算机视觉最前沿的方向之一,因为它要求你在图片或者视频中定位、标识、统计和跟踪任何需要关注的对象。对象检测广泛用于许多有趣的工作和研究领域,例如:

• 自动驾驶

安全方面

行人/人群检测

车牌号码和车辆检测

工业自动化(例如,物品拣选和分类)

• 机器人技术等等。


许多预先收集的对象检测数据集,诸如Pascal VOCMicrosoft的COCOGoogle的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文件夹中,创建imagesannotations子文件夹。将大约70-80%的数据集图像放入images文件夹中,并将这些图像的相应注释放入注释文件夹中

validation文件夹中,创建imagesannotations子文件夹。将其余的数据集图像放入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模型


!wgethttps://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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 目标检测必须要OpenCV?10行Python代码也能实现,亲测好用! 大数据文摘 发布时间:18-07-0212...
    锋_71dc阅读 3,762评论 0 0
  • 0.前言 本文为Darknet框架下,利用官方VOC数据集的yolov3模型训练,训练环境为: Ubuntu18....
    Sunflow007阅读 10,967评论 2 2
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,239评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,603评论 0 11
  • 在妖界我有个名头叫胡百晓,无论是何事,只要找到胡百晓即可有解决的办法。因为是只狐狸大家以讹传讹叫我“倾城百晓”,...
    猫九0110阅读 8,962评论 7 3

友情链接更多精彩内容