使用Detecto构建目标检测模型

在人工智能领域,计算机视觉(CV)是一个研究领域,尝试使用图像或视频来解决一些问题,这些问题通常也可以轻易解决。但是,CV有助于提高解决问题的速度和范围。目标检测是计算机视觉中最流行的分支之一,它在制造、制药、航空、零售、电子商务等多个行业中都有应用。

项目概述

在现实世界中,需要在自定义数据集上训练目标检测模型。无论使用TensorFlow还是PyTorch框架,构建自定义训练的目标检测模型都不是一件简单的事情。本文将讨论如何使用Detecto这个Python包来开发自定义训练的目标检测模型,只需5行代码即可。Detecto基于PyTorch,使得整个过程变得非常简单。

项目步骤

将尝试开发一个模型,用于从汽车图像中检测汽车的轮子和前大灯。以下是项目的详细步骤:

任何目标检测模型的第一步是收集图像并进行标注。在这个项目中,从谷歌图片下载了50张“Maruti Car Images”。有一个名为simple_image_download的包,用于自动下载图像。以下是下载图像的代码示例:

from simple_image_download import simple_image_download as simp response = simp.simple_image_download lst=['Maruti car'] for rep in lst: response().download(rep, 50)

使用这段代码,将在工作目录的‘Maruti Car’文件夹中获得50张下载的图像。之后,将图像随机分成两部分,即训练集(35张图像)和测试集(15张图像)。接下来,需要对图像进行标注。有多种图像标注工具可供选择。在这个项目中,使用了MAKESENSE.AI,这是一个免费的在线标注工具,无需安装过程。通过链接,上传了汽车图像,并分别为训练和验证数据集进行了标注。

如前所述,Detecto是基于PyTorch构建的,因此首先需要安装PyTorch。在这个项目中使用了Google Colab。然后,需要检查是否支持GPU,使用以下代码:

import torch print(torch.cuda.is_available())

如果输出为‘True’,则表示可以使用GPU。如果为‘False’,请在笔记本设置中将‘Hardware Accelerator’更改为‘GPU’。现在,系统已准备好安装Detecto。使用以下魔术代码进行安装:

!pip install detecto

安装完成后,使用以下代码导入库:

from detecto import core, utils, visualize from detecto.visualize import show_labeled_image, plot_prediction_grid from torchvision import transforms import matplotlib.pyplot as plt import numpy as np

图像增强是通过创建图像的修改版本来人为扩展数据的过程。Detecto有一个内置函数来执行自定义转换,应用调整大小、翻转和饱和度增强。以下是增强图像数据集的代码:

custom_transforms = transforms.Compose([ transforms.ToPILImage(), transforms.Resize(900), transforms.RandomHorizontalFlip(0.5), transforms.ColorJitter(saturation=0.2), transforms.ToTensor(), utils.normalize_transform(), ])

现在,来到了最令人期待的步骤——模型训练。在这里,五行代码中发生了魔法。以下是代码示例:

Train_dataset=core.Dataset('Train/', transform=custom_transforms) #L1 Test_dataset = core.Dataset('Test/') #L2 loader=core.DataLoader(Train_dataset, batch_size=2, shuffle=True) #L3 model = core.Model(['Wheel', 'Head Light']) #L4 losses = model.fit(loader, Test_dataset, epochs=25, lr_step_size=5, learning_rate=0.001, verbose=True) #L5

在前两行代码(L1和L2)中,分配了训练和测试数据集。在L3中,为数据集创建了DataLoader。它有助于定义如何将图像批量输入模型进行训练。在L4中,提到了‘Labels’或‘classes’。最后,通过‘model.fit’在L5中开始模型训练。在这里,可以尝试不同的选项,如epochs、lr_step_size和learning_rate。默认模型是Faster R-CNN ResNet-50 FPN。已经为自定义数据集微调了此模型。

一旦对模型损失感到满意,就需要保存模型以供将来参考。这样,就可以随时随地加载它。以下是保存和加载模型的代码:

model.save('model_weights.pth') model = core.Model.load('model_weights.pth', ['Wheel', 'Head Light'])

加载模型后,希望使用它进行预测。让使用它对测试文件夹中的一个观察结果进行预测,并绘制带有边界框的图像。在这里,预测格式是标签、框和分数。以下是代码示例:

image = utils.read_image('Test/Maruti car_27.jpeg') predictions = model.predict(image) labels, boxes, scores = predictions show_labeled_image(image, boxes, labels)

在上述图片中有许多不需要的边界框。因此,需要删除它们。解决这个问题的最简单方法是通过提供分数的阈值。在这个项目中,为两个类别都设置了0.6的阈值。是通过不同的试验和错误得出这一点的。以下是设置边界框阈值和绘制它们的代码:

thresh=0.6 filtered_indices=np.where(scores>thresh) filtered_scores=scores[filtered_indices] filtered_boxes=boxes[filtered_indices] num_list = filtered_indices[0].tolist() filtered_labels = [labels[i] for i in num_list] show_labeled_image(image, filtered_boxes, filtered_labels)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485