深度学习交通标志识别,数据集+源码+界面系统 ,对TT100K数据集做了类别清洗,将属于同一类标志的不同小类进行了归类处理,最终得到一个包含19大类交通标志的新TT100K数据集用于训练 算法可定制:yolov3,v4,v5,ssd,Faster rcnn等,均可添加qt界面

交通标志识别这事儿听起来简单,实际落地时踩的坑比马路上的减速带还多。先说说数据集处理这个老大难问题——原版TT100K数据集有221个小类,但实际应用中"前方学校"和"注意儿童"这种标志根本不需要细分。我直接掏出Python脚本把同类项合并,结果发现有些标注框重叠得像俄罗斯方块,得用OpenCV的NMS处理。

def merge_classes(annotations):
    class_mapping = {
        'pl50': 'speed_limit',
        'pl60': 'speed_limit',
        'ph3': 'height_limit',
        # ...其他类别映射
    }
    for img_id, labels in annotations.items():
        new_labels = []
        for label in labels:
            cls = label['class']
            if cls in class_mapping:
                label['class'] = class_mapping[cls]
            # 处理标注框重叠
            if not is_overlap(label, new_labels):
                new_labels.append(label)
        annotations[img_id] = new_labels
    return annotations

模型选择方面我倾向YOLOv5,毕竟部署灵活。不过项目里留了hook接口,想换Faster R-CNN的朋友改个配置文件就行。这里有个训练时的小技巧:交通标志普遍存在小目标问题,得在数据增强里加Mosaic和随机缩放。看这个损失函数曲线,加了自适应锚框后mAP涨了7个百分点不是吹的。

# YOLOv5模型配置示例
model_params = {
    'anchors': [[10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326]],
    'backbone': 'CSPDarknet53',
    'neck': 'PANet',
    'head': 'YOLOHead',
    'img_size': 640,
    'classes': 19
}

说到界面开发,PyQt5的QThread和信号槽机制真是救星。把检测模型封装成Worker对象,视频流处理再也不会卡界面。这里注意OpenCV的BGR转RGB要在QImage构造前完成,不然显示出来的颜色比彩虹糖还离谱。

# Qt检测线程关键代码
class DetectionThread(QThread):
    result_signal = pyqtSignal(np.ndarray)

    def __init__(self, model):
        super().__init__()
        self.model = model

    def run(self):
        while True:
            frame = self.capture.read()
            detections = self.model.predict(frame)
            rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.result_signal.emit(rgb_frame)

实测发现雨天场景下反光问题最要命,后来在预处理里加了CLAHE直方图均衡化才算解决。现在系统在1080p视频上能跑到35FPS,误检率控制在3%以下。下次考虑上Transformer结构试试,不过得先解决显卡发烫能煎鸡蛋的问题。完整代码已经扔在Github上了,需要定制模型的朋友记得改config.yaml里的参数,别直接硬撸源码。

更多推荐