Labelme 。能够对图像进行多边形、矩形、圆、折线,点形式的标注,主要用于目标检测,语义分割,图像分类等任务。
Labellmg 。通过创建矩形框及标签属性标签相应的区域内容,得到标注信息是矩形框的位置大小和标签属性的XML文件。
VGG 。支持在线或离线使用,能标注矩形、圆、椭圆、多边形、点和折线标注,并且发布图像标准工具,支持对象检测、图像语义分割与实例分割数据标注。
此外,还有 OpenCV、Labelbox、VOTT、PixelAnnotationTool、point-cloud-annotation-tool、AI-tagger等 也是标注数据集工具1。
链接: COCO-Annotator教程
以下是一个简单的示例,展示了如何使用Yolov5训练一个目标检测模型。请注意,此代码示例假定您已经正确安装了Yolov5和其他必要的依赖项,并且您的数据集已准备就绪。
import torch
import torchvision
# 加载数据集
train_dataset = torchvision.datasets.CocoDetection(root='./data', annFile='./data/annotations/instances_train2017.json', transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=4)
# 加载Yolov5模型和损失函数
model = torchvision.models.detection.yolov5s(pretrained=True)
criterion = torchvision.losses.FocalLoss()
# 开始训练
model = model.to(device) # 如果有GPU,请使用GPU
model.train()
for epoch in range(100): # 迭代次数
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, targets = data[0].to(device), data[1].to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999: # 每2000个小批次打印一次
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
首先,我们导入了一些必要的Python库,包括PyTorch和torchvision。torchvision是一个用于计算机视觉任务的库,它包含了众多常见的数据集、模型和损失函数。
然后,我们加载了准备好的数据集(train_dataset)。在这个例子中,我们使用了COCO数据集,它是一个常用的目标检测数据集。接着,我们使用torch.utils.data.DataLoader来创建一个数据加载器,它会将数据集划分为小批次并返回每个批次的数据。这里,我们设置了批次大小为16,并启用了随机打乱数据的选项(shuffle=True)。
接下来,我们加载了一个预训练的Yolov5模型(model)。Yolov5是一种流行的目标检测算法,它可以在各种任务上表现出色。在这里,我们使用了预训练的模型,这意味着该模型已经在大量数据上进行了训练,并且已经学会了一些通用的特征表示。
然后,我们定义了损失函数(criterion)。在目标检测任务中,常用的损失函数是Focal Loss,它可以帮助模型更好地关注难以分类的样本。
最后,我们开始训练模型。我们首先将模型和数据加载到设备上(如果有GPU的话,使用GPU),并设置模型为训练模式(model.train())。然后,我们使用一个循环来迭代训练数据集,每次迭代我们都将模型的参数更新以最小化损失函数。具体而言,我们首先将输入数据和目标标签传递给模型,然后计算模型的输出和损失,接着使用反向传播算法更新模型的参数以减小损失。
在每个epoch结束时,我们计算了平均损失(running_loss / 2000)并打印出来。这里的running_loss是用来累计这个epoch中所有小批次的损失。
最后,我们打印出训练完成的消息。此时,模型已经学习了如何进行目标检测,可以用于实际的任务中了。
请注意,这只是一个基本的示例,实际使用中可能需要进行更多的设置和优化。例如,您可能需要调整学习率、增加数据增强、使用更复杂的损失函数等等。
以上程序输出的训练模型名字是yolov5s。这个模型是Yolov5系列模型中的一个,它代表了一个相对轻量级的模型,适用于对计算资源有限制的场景。Yolov5还有其它变种模型如yolov5m和yolov5l等,它们在参数数量和计算能力上有所不同,可以根据实际需求进行选择。
以上程序输出的模型名字在以下代码行中定义:
model = torchvision.models.detection.yolov5s(pretrained=True)
在这行代码中,我们使用torchvision.models.detection.yolov5s来加载预训练的Yolov5模型,并将其赋值给变量model。因此,以上程序输出的训练模型名字是yolov5s。
train_dataset = torchvision.datasets.CocoDetection(root='./data', annFile='./data/annotations/instances_train2017.json', transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=4)
这段代码是使用Python语言和PyTorch库来定义一个训练数据集及其加载器。具体来说,torchvision.datasets.CocoDetection用于创建一个COCO目标检测数据集,该数据集的根目录为’./data’,标注文件路径为’./data/annotations/instances_train2017.json’,并对数据进行转换(ToTensor)。然后,torch.utils.data.DataLoader用于创建一个数据加载器,它将数据集划分为大小为16的批次,并随机打乱数据,同时使用4个工作线程来加载数据。
transform=torchvision.transforms.ToTensor()表示的是数据预处理步骤。这是在使用PyTorch库加载图像数据时常用的一种转换。ToTensor()方法将PIL图像或Numpy ndarray类型的数据转换为torch.Tensor,并对数据进行归一化,将像素的数值范围从0到255转换到0到1之间。这样的预处理步骤对于深度学习模型的训练非常必要,因为模型本身无法直接处理原始的图像数据。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 设定设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 定义网络结构
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 784)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 加载数据集
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
dataset1 = datasets.MNIST('../data', train=True, download=True, transform=transform)
dataset2 = datasets.MNIST('../data', train=False, transform=transform)
train_loader = torch.utils.data.DataLoader(dataset1)
test_loader = torch.utils.data.DataLoader(dataset2)
model = MLP().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 训练模型
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, labels = data[0].to(device), data[1].to(device)
optimizer.zero_grad()
# forward + backward + optimize
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
准备数据集:首先,您需要准备一个标记的数据集,其中包含一些带有标记框和类别标签的图像。您可以使用一些开源数据集,例如COCO或Pascal VOC,或者自己创建一个数据集。
下载YOLOv5模型:您可以从YOLOv5的官方网站下载预训练的模型。如果您要使用自己的数据集进行训练,则需要下载YOLOv5的Python实现,并使用PyTorch或TensorFlow等深度学习框架来训练模型。
加载模型和数据集:使用Python代码加载YOLOv5模型和数据集。您可以使用YOLOv5的Python API或自行编写代码。加载模型和数据集后,您可以使用适当的超参数对模型进行训练和调整。
运行目标检测:一旦加载了模型和数据集,您可以运行目标检测来识别图像中的老鼠。YOLOv5提供了一个前向传递函数,该函数将输入图像作为输入,并输出检测到的对象的边界框、类别标签和得分。
以下是一个使用YOLOv5进行老鼠目标检测的示例代码:
import torch
import cv2
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.models.experimental import attempt_load
from yolov5.utils.torch_utils import select_device
# 加载预训练模型
weights = 'yolov5s.pt'
model = attempt_load(weights, map_location=select_device('cpu'))
# 读取图像
img0 = cv2.imread('img.jpg')
# 将图像转换为RGB格式并缩放为模型输入尺寸
img = img0[:, :, ::-1].copy()
img = torch.from_numpy(img).to(device)
img = img.float() / 255.0 # 标准化图像
if img.ndimension() == 3:
img = img.unsqueeze(0)
# 进行目标检测
pred = model(img)[0]
pred = non_max_suppression(pred, conf_thres=0.5, iou_thres=0.5)
# 绘制检测结果
for det in pred[0]:
if det is not None and len(det):
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img0.shape).round()
for *xyxy, conf, cls in reversed(det):
c = int(cls)
label = f'{model.names[c]} {conf:.2f}'
plot_one_box(xyxy, img0, label=label, color=colors(c, True), line_thickness=3)
这段代码将加载一个名为’yolov5s.pt’的预训练模型,并对名为’img.jpg’的图像进行目标检测。检测结果将在原始图像上绘制出来。要使用自己的数据集进行训练,请更改超参数、数据集路径和文件名,并使用YOLOv5的Python API或自行编写代码来训练模型。
准备环境
首先,您需要安装Python和一些必要的库,例如NumPy、Pandas、Matplotlib以及深度学习框架PyTorch和Darknet。您还需要安装一些其他的库,例如OpenCV用于图像处理。
下载YOLOv5模型
在YOLOv5官方网站或者其他可信赖的源上下载预训练的YOLOv5模型。
加载模型和数据
使用Python代码加载YOLOv5模型和数据集。数据集需要包括带有标记框和类别标签的图像。您可以使用YOLOv5的Python API或自行编写代码来加载模型和数据。
进行目标检测
一旦加载了模型和数据集,您可以使用适当的超参数对模型进行训练和调整。然后,您可以使用YOLOv5的前向传递函数来对输入图像进行目标检测,该函数将输出检测到的物体的边界框、类别标签和得分。
下面是一个使用YOLOv5进行目标检测的Python代码示例:
import torch
import cv2
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.models.experimental import attempt_load
from yolov5.utils.torch_utils import select_device
# 加载预训练模型
weights = 'yolov5s.pt'
model = attempt_load(weights, map_location=select_device('cpu'))
# 读取图像
img0 = cv2.imread('img.jpg')
# 将图像转换为RGB格式并缩放为模型输入尺寸
img = img0[:, :, ::-1].copy()
img = torch.from_numpy(img).to(device)
img = img.float() / 255.0 # 标准化图像
if img.ndimension() == 3:
img = img.unsqueeze(0)
# 进行目标检测
pred = model(img)[0]
pred = non_max_suppression(pred, conf_thres=0.5, iou_thres=0.5)
# 绘制检测结果
for det in pred[0]:
if det is not None and len(det):
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img0.shape).round()
for *xyxy, conf, cls in reversed(det):
c = int(cls)
label = f'{model.names[c]} {conf:.2f}'
plot_one_box(xyxy, img0, label=label, color=colors(c, True), line_thickness=3)