在人工智能领域,计算机视觉(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)