基于TT100k 数据集,交通标志识别工程,整个打包程序代码 交通标志识别 160多个类 python,yolov3 非matlab,cpp 准确率高,夜间白天灯光俯仰识别适应性好,标记输出做好,适合小白新手,可提供简单指导

在自动驾驶和智能交通领域,交通标志识别是至关重要的一环。今天咱们就来聊聊基于 TT100k 数据集,用 Python 和 Yolov3 搭建一个交通标志识别工程,而且这个工程涵盖了 160 多个交通标志类别,无论是白天黑夜,灯光变化还是视角俯仰等情况,都有不错的适应性,对小白新手也非常友好哦,还能给大家提供简单指导。

一、数据集准备

TT100k 数据集是这次项目的基石。这个数据集包含了丰富的交通标志图像,涵盖各种复杂场景。咱们首先要对数据集进行整理,将图像和对应的标注文件放在合适的目录结构下。一般来说,可以像这样组织:

data/
│
├── images/
│   ├── train/
│   │   ├── 0001.jpg
│   │   ├── 0002.jpg
│   │   └──...
│   └── val/
│       ├── 0501.jpg
│       └──...
│
└── labels/
    ├── train/
    │   ├── 0001.txt
    │   ├── 0002.txt
    │   └──...
    └── val/
        ├── 0501.txt
        └──...

标注文件(.txt)里记录了每个交通标志在图像中的位置和类别信息,格式遵循 Yolov3 的要求,比如每行是 class xcenter ycenter width height,坐标和宽高都是相对于图像尺寸的归一化值。

二、环境搭建

咱们用 Python 来实现这个工程,首先确保你安装了 Python 环境,推荐 Python 3.6 及以上版本。然后安装一些关键的库:

pip install torch torchvision
pip install opencv - python
pip install tqdm

Torch 和 Torchvision 是深度学习的核心库,OpenCV 用于图像处理,tqdm 则是一个方便的进度条库。

三、Yolov3 模型搭建

Yolov3 的网络结构相对复杂,但咱们可以借助 torchvision 里预训练的权重来简化操作。这里是一个简单的 Yolov3 模型加载代码示例:

import torch
import torchvision.models as models


def load_yolov3():
    model = models.detection.yolov3_d53(pretrained=False)
    num_classes = 160 + 1  # 160 个交通标志类别 + 1 个背景类
    in_features = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = models.detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes)
    return model

这段代码中,首先加载了预训练的 Yolov3 模型结构(但未加载权重),然后根据我们的 160 个交通标志类别,重新定义了最后一层分类器。这样模型就能针对我们的交通标志数据集进行训练了。

四、训练过程

训练过程是让模型学习交通标志特征的关键。这里简单展示一下训练循环的代码框架:

import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision.transforms import transforms
from tqdm import tqdm


# 假设我们已经定义好了数据集类 TT100kDataset
train_dataset = TT100kDataset('data/images/train', 'data/labels/train', transforms.Compose([
    transforms.Resize((416, 416)),
    transforms.ToTensor()
]))
train_loader = DataLoader(train_dataset, batch_size = 4, shuffle = True)

model = load_yolov3()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

optimizer = optim.Adam(model.parameters(), lr = 0.001)

num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for i, data in enumerate(tqdm(train_loader), 0):
        inputs, labels = data[0].to(device), data[1].to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = sum([output["loss"] for output in outputs])
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_loader)}')

在这个训练循环里,首先定义了训练数据集和数据加载器,将图像resize到 Yolov3 模型所需的尺寸(416x416)并转换为张量。然后加载模型并将其移动到 GPU(如果有 GPU 的话)。在每个 epoch 里,模型进行训练,计算损失并反向传播更新权重。

五、标记输出

训练好模型后,就要进行实际的预测和标记输出了。下面是一个简单的预测并在图像上绘制标记的代码:

import cv2
import numpy as np


def predict_and_draw(image_path, model):
    model.eval()
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)

    image = cv2.imread(image_path)
    original_height, original_width = image.shape[:2]
    transform = transforms.Compose([
        transforms.Resize((416, 416)),
        transforms.ToTensor()
    ])
    input_image = transform(image).unsqueeze(0).to(device)

    with torch.no_grad():
        outputs = model(input_image)

    for output in outputs:
        boxes = output["boxes"].cpu().numpy()
        labels = output["labels"].cpu().numpy()
        scores = output["scores"].cpu().numpy()

        for box, label, score in zip(boxes, labels, scores):
            if score > 0.5:
                x1, y1, x2, y2 = box
                x1 = int(x1 * original_width / 416)
                y1 = int(y1 * original_height / 416)
                x2 = int(x2 * original_width / 416)
                y2 = int(y2 * original_height / 416)
                cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
                cv2.putText(image, f'{label}:{score:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    cv2.imshow('Prediction', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

这段代码首先读取图像,对其进行预处理后输入模型进行预测。然后根据预测结果,将边界框和类别标签绘制在原始图像上并显示出来。

基于TT100k 数据集,交通标志识别工程,整个打包程序代码 交通标志识别 160多个类 python,yolov3 非matlab,cpp 准确率高,夜间白天灯光俯仰识别适应性好,标记输出做好,适合小白新手,可提供简单指导

这样,一个基于 TT100k 数据集的交通标志识别工程就基本搭建完成啦。新手朋友们如果在实现过程中有问题,欢迎留言,大家一起探讨,相信你也能轻松驾驭这个有趣的项目。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐