深度学习交通标志识别,数据集+源码+界面系统 ,对TT100K数据集做了类别清洗
完整代码已经扔在Github上了,需要定制模型的朋友记得改config.yaml里的参数,别直接硬撸源码。交通标志识别这事儿听起来简单,实际落地时踩的坑比马路上的减速带还多。先说说数据集处理这个老大难问题——原版TT100K数据集有221个小类,但实际应用中"前方学校"和"注意儿童"这种标志根本不需要细分。深度学习交通标志识别,数据集+源码+界面系统 ,对TT100K数据集做了类别清洗,将属于同一
深度学习交通标志识别,数据集+源码+界面系统 ,对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里的参数,别直接硬撸源码。

更多推荐


所有评论(0)