当前位置: 首页
AI
【Paddle打比赛】 交通标志分类识别

【Paddle打比赛】 交通标志分类识别

热心网友 时间:2025-07-22
转载
本文围绕交通标志分类识别竞赛展开,介绍了赛题背景、任务及数据集情况。还阐述了利用PaddleClas套件,通过数据格式化划分、配置MobileNetV3模型、训练评估、导出模型并预测,最终生成结果提交的完整流程与注意事项。

【paddle打比赛】 交通标志分类识别 - 游乐网

一、【Paddle打比赛】 交通标志分类识别

1.赛题名称

【交通标志分类识别 竞赛 - DataFountain 】 https://www.datafountain.cn/competitions/553

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

2.赛题背景

目标检测在自动驾驶等方面有着广泛的应用前景,在自动驾驶场景中,需要对交通标志(如限速标志等)进行识别以采取不同的驾驶策略。此赛题旨在使用Oneflow框架识别确定图像中显示的交通标志的类型,并且对不同的环境(如光线、障碍物或标志距离)具有鲁棒性。

3.赛题任务

此赛题的数据集由云测数据提供。比赛数据集中包含6358张真实场景下行车记录仪采集的图片,我们选取其中95%的图片作为训练集,5%的图片作为测试集。参赛者需基于Oneflow框架在训练集上进行训练,对测试集中的交通标志进行分类识别。数据集中一共有10种细分的交通标志标签。

4.数据简介

本赛题的数据集包含6358张人工标注的类别标签。标签包括以下10种类别:“GuideSign”, “M1”, “M4, “M5”, “M6”, “M7”, “P1”, “P10_50”, “P12”, “W1”,分别对应十个不同的交通标识类别。所有数据已经按比例人工划分为了训练集和测试集,并且提供了相关的训练集标注的json文件。

5.数据说明

数据集包含train和test两个文件夹,以及一个统一的train.json文件用来保存所有训练数据集的标注,图片标签将字典以json格式序列化进行保存,所有的标注都保存在train.json文件中的名为annotations的key下,其中每个训练文件都包含以下属性:

P12: 礼让标志P10_50:限速50GuideSing:路牌W1:警告P1:禁停M1:方向指示M4:直行M6:机动车道M6:自行车道M7:人行横道

【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网 【Paddle打比赛】 交通标志分类识别 - 游乐网

6.提交要求

参赛者使用Oneflow框架对数据集进行训练后对测试集图片进行推理后,

1.将测试集图片的目标检测和识别结果以与训练集格式保持一致的json文件序列化保存,并上传至参赛平台由参赛平台自动评测返回结果。2.在提交时的备注附上自己的模型github仓库链接。

{ “annotations”: [ { “filename”: “test/W1/00123.webp”, # filepath: str “label”: 0 # label: int from 0 to 9 }] }

二、环境准备

飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,助力使用者训练出更好的视觉模型和应用落地。此次计划使用端到端的PaddleClas图像分类套件来快速完成分类。

In [ ]
# git下载!git clone https://gitee.com/paddlepaddle/PaddleClas.git --depth=1
登录后复制
Cloning into 'PaddleClas'...remote: Enumerating objects: 1037, done.remote: Counting objects: 100% (1037/1037), done.remote: Compressing objects: 100% (918/918), done.remote: Total 1037 (delta 332), reused 478 (delta 95), pack-reused 0Receiving objects: 100% (1037/1037), 59.94 MiB | 7.11 MiB/s, done.Resolving deltas: 100% (332/332), done.Checking connectivity... done.
登录后复制In [ ]
# PaddleClas安装%cd ~/PaddleClas/!pip install -U pip!pip install -r requirements.txt!pip install -e ./
登录后复制

三、数据准备

1.数据解压缩

In [ ]
%cd ~!unzip -oq /home/aistudio/data/data125044/road_sign.zip
登录后复制In [ ]
!unzip -qoa train_dataset.zip!unzip -qoa test_dataset.zip
登录后复制In [ ]
! rm test_dataset.zip! rm train_dataset.zip
登录后复制In [2]
from PIL import Imageimg=Image.open("train/P12/00014.webp")img
登录后复制
登录后复制In [3]
img=Image.open("train/P10_50/00014.webp")img
登录后复制
登录后复制In [4]
img=Image.open("train/GuideSign/00452.webp")img
登录后复制
登录后复制

2.数据集格式化 AND 划分

In [ ]
%cd ~import jsonimport ostrain_json={}with open('train.json','r') as f:    train_json=json.load(f)print(len(train_json["annotations"]))train_f = open('train_list.txt', 'w') eval_f = open('eval_list.txt', 'w') for i in range(len(train_json["annotations"])):    if i%5==0:        eval_f.write(train_json["annotations"][i]['filename']+' '+ str(train_json["annotations"][i]['label']) +'\n')    else:        train_f.write(train_json["annotations"][i]['filename']+' '+ str(train_json["annotations"][i]['label']) +'\n')
登录后复制
/home/aistudio6024
登录后复制

四、模型训练

1.配置

以 PaddleClas/ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml 为基础进行配置,具体见下:

# global configsGlobal:  checkpoints: null  pretrained_model: null  output_dir: ./output/  device: gpu  save_interval: 1  eval_during_train: True  eval_interval: 1  epochs: 20  print_batch_step: 10  use_visualdl: True  # used for static mode and model export  image_shape: [3, 224, 224]  save_inference_dir: ./inference# model architectureArch:  name: MobileNetV3_large_x1_0  class_num: 102 # loss function config for traing/eval processLoss:  Train:    - CELoss:        weight: 1.0  Eval:    - CELoss:        weight: 1.0Optimizer:  name: Momentum  momentum: 0.9  lr:    name: Cosine    learning_rate: 0.00375    warmup_epoch: 5    last_epoch: -1  regularizer:    name: 'L2'    coeff: 0.000001# data loader for train and evalDataLoader:  Train:    dataset:      name: ImageNetDataset      image_root: /home/aistudio/      cls_label_path: /home/aistudio/train_list.txt      transform_ops:        - DecodeImage:            to_rgb: True            channel_first: False        - RandCropImage:            size: 224        - RandFlipImage:            flip_code: 1        - NormalizeImage:            scale: 1.0/255.0            mean: [0.485, 0.456, 0.406]            std: [0.229, 0.224, 0.225]            order: ''    sampler:      name: DistributedBatchSampler      batch_size: 512      drop_last: False      shuffle: True    loader:      num_workers: 4      use_shared_memory: True  Eval:    dataset:       name: ImageNetDataset      image_root: /home/aistudio/      cls_label_path: /home/aistudio/eval_list.txt      transform_ops:        - DecodeImage:            to_rgb: True            channel_first: False        - ResizeImage:            resize_short: 256        - CropImage:            size: 224        - NormalizeImage:            scale: 1.0/255.0            mean: [0.485, 0.456, 0.406]            std: [0.229, 0.224, 0.225]            order: ''    sampler:      name: DistributedBatchSampler      batch_size: 128      drop_last: False      shuffle: False    loader:      num_workers: 4      use_shared_memory: TrueInfer:  infer_imgs: docs/images/whl/demo.webp  batch_size: 10  transforms:    - DecodeImage:        to_rgb: True        channel_first: False    - ResizeImage:        resize_short: 256    - CropImage:        size: 224    - NormalizeImage:        scale: 1.0/255.0        mean: [0.485, 0.456, 0.406]        std: [0.229, 0.224, 0.225]        order: ''    - ToCHWImage:  PostProcess:    name: Topk    topk: 5    class_id_map_file: ./dataset/flowers102/flowers102_label_list.txtMetric:  Train:    - TopkAcc:        topk: [1, 5]  Eval:    - TopkAcc:        topk: [1, 5]
登录后复制

2.开始训练

In [ ]
# 覆盖配置%cd ~!cp -f ~/MobileNetV3_large_x1_0.yaml  PaddleClas/ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml
登录后复制In [ ]
%cd ~/PaddleClas/# 进入 PaddleClas 根目录,执行此命令# Arch.pretrained=True使用预训练模型!python tools/train.py -c ./ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml -o Arch.pretrained=True
登录后复制

训练情况:

【Paddle打比赛】 交通标志分类识别 - 游乐网

【Paddle打比赛】 交通标志分类识别 - 游乐网

3.开始评估

In [44]
%cd ~/PaddleClas/!python  tools/eval.py \        -c ./ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml  \        -o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model
登录后复制
[2024/01/10 23:08:17] root INFO: [Eval][Epoch 0][Iter: 0/9]CELoss: 0.36174, loss: 0.36174, top1: 0.90625, top5: 1.00000, batch_cost: 1.31483s, reader_cost: 1.22580, ips: 97.35107 images/sec[2024/01/10 23:08:17] root INFO: [Eval][Epoch 0][Avg]CELoss: 0.25337, loss: 0.25337, top1: 0.93923, top5: 0.99732
登录后复制

五、预测

1.模型导出

In [49]
# 模型导出%cd ~/PaddleClas/!python tools/export_model.py -c ./ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml  -o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model
登录后复制

2.开始预测

编辑 PaddleClas/deploy/python/predict_cls.py,按提交格式输出预测结果到文件。

import osimport sys__dir__ = os.path.dirname(os.path.abspath(__file__))sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))import cv2import numpy as npfrom utils import loggerfrom utils import configfrom utils.predictor import Predictor# from utils.get_image_list import get_image_listfrom python.preprocess import create_operatorsfrom python.postprocess import build_postprocessclass ClsPredictor(Predictor):    def __init__(self, config):        super().__init__(config["Global"])        self.preprocess_ops = []        self.postprocess = None        if "PreProcess" in config:            if "transform_ops" in config["PreProcess"]:                self.preprocess_ops = create_operators(config["PreProcess"][                    "transform_ops"])        if "PostProcess" in config:            self.postprocess = build_postprocess(config["PostProcess"])        # for whole_chain project to test each repo of paddle        self.benchmark = config["Global"].get("benchmark", False)        if self.benchmark:            import auto_log            import os            pid = os.getpid()            self.auto_logger = auto_log.AutoLogger(                model_name=config["Global"].get("model_name", "cls"),                model_precision='fp16'                if config["Global"]["use_fp16"] else 'fp32',                batch_size=config["Global"].get("batch_size", 1),                data_shape=[3, 224, 224],                save_path=config["Global"].get("save_log_path",                                               "./auto_log.log"),                inference_config=self.config,                pids=pid,                process_name=None,                gpu_ids=None,                time_keys=[                    'preprocess_time', 'inference_time', 'postprocess_time'                ],                warmup=2)    def predict(self, images):        input_names = self.paddle_predictor.get_input_names()        input_tensor = self.paddle_predictor.get_input_handle(input_names[0])        output_names = self.paddle_predictor.get_output_names()        output_tensor = self.paddle_predictor.get_output_handle(output_names[            0])        if self.benchmark:            self.auto_logger.times.start()        if not isinstance(images, (list, )):            images = [images]        for idx in range(len(images)):            for ops in self.preprocess_ops:                images[idx] = ops(images[idx])        image = np.array(images)        if self.benchmark:            self.auto_logger.times.stamp()        input_tensor.copy_from_cpu(image)        self.paddle_predictor.run()        batch_output = output_tensor.copy_to_cpu()        if self.benchmark:            self.auto_logger.times.stamp()        if self.postprocess is not None:            batch_output = self.postprocess(batch_output)        if self.benchmark:            self.auto_logger.times.end(stamp=True)        return batch_outputdef get_image_list(img_file_path):    imgs_lists = []    # if img_file is None or not os.path.exists(img_file):    #     raise Exception("not found any img file in {}".format(img_file))    img_end = ['jpg', 'png', 'jpeg', 'JPEG', 'JPG', 'bmp']    import os    from os.path import join, getsize    for root, dirs, files in os.walk(img_file_path):        for file in files:            img_file=os.path.join(root, file)            imgs_lists.append(img_file)    if len(imgs_lists) == 0:        raise Exception("not found any img file in {}".format(img_file))    imgs_lists = sorted(imgs_lists)    return imgs_listsdef main(config):    cls_predictor = ClsPredictor(config)    image_list = get_image_list(config["Global"]["infer_imgs"])    batch_imgs = []    batch_names = []    cnt = 0    # dic    import json    mydic=[]    for idx, img_path in enumerate(image_list):        img = cv2.imread(img_path)        if img is None:            logger.warning(                "Image file failed to read and has been skipped. The path: {}".                format(img_path))        else:            img = img[:, :, ::-1]            batch_imgs.append(img)            img_name = os.path.basename(img_path)            batch_names.append(img_name)            cnt += 1        if cnt % config["Global"]["batch_size"] == 0 or (idx + 1                                                         ) == len(image_list):            if len(batch_imgs) == 0:                continue            batch_results = cls_predictor.predict(batch_imgs)            for number, result_dict in enumerate(batch_results):                filename = batch_names[number]                clas_ids = result_dict["class_ids"]                scores_str = "[{}]".format(", ".join("{:.2f}".format(                    r) for r in result_dict["scores"]))                label_names = result_dict["label_names"]                print("{}:\tclass id(s): {}, score(s): {}, label_name(s): {}".                      format(filename, clas_ids, scores_str, label_names))                temp_dic={}                temp_dic["filename"]="test/"+img_path.strip('/home/aistudio')                temp_dic["label"]=clas_ids[0]                mydic.append(temp_dic)            batch_imgs = []            batch_names = []    # 保存到文件    with open('/home/aistudio/result.json', 'w') as f:        myjson={"annotations":mydic}        json.dump(myjson,f)    if cls_predictor.benchmark:        cls_predictor.auto_logger.report()    returnif __name__ == "__main__":    args = config.parse_args()    config = config.get_config(args.config, overrides=args.override, show=True)    main(config)
登录后复制In [ ]
# 自定义predict_cls.py覆盖%cd ~!cp -f ~/predict_cls.py ~/PaddleClas/deploy/python/predict_cls.py
登录后复制In [77]
# 开始预测%cd /home/aistudio/PaddleClas/deploy!python3 python/predict_cls.py  -c configs/inference_cls.yaml -o Global.infer_imgs=/home/aistudio/test -o Global.inference_model_dir=../inference/  -o PostProcess.Topk.class_id_map_file=None
登录后复制

预测日志

01220.webp:class id(s): [0, 3, 2, 4, 5], score(s): [1.00, 0.00, 0.00, 0.00, 0.00], label_name(s): []01229.webp:class id(s): [0, 2, 3, 4, 5], score(s): [0.97, 0.02, 0.00, 0.00, 0.00], label_name(s): []01232.webp:class id(s): [0, 3, 2, 8, 5], score(s): [0.98, 0.01, 0.00, 0.00, 0.00], label_name(s): []00004.webp:class id(s): [2, 3, 1, 0, 5], score(s): [0.79, 0.10, 0.03, 0.02, 0.01], label_name(s): []00013.webp:class id(s): [1, 5, 2, 3, 0], score(s): [0.80, 0.08, 0.05, 0.02, 0.01], label_name(s): []00052.webp:class id(s): [1, 5, 3, 4, 6], score(s): [0.91, 0.03, 0.02, 0.01, 0.01], label_name(s): []00061.webp:class id(s): [3, 0, 4, 2, 5], score(s): [0.60, 0.14, 0.09, 0.06, 0.03], label_name(s): []00092.webp:class id(s): [1, 2, 3, 5, 4], score(s): [0.65, 0.18, 0.08, 0.04, 0.01], label_name(s): []
登录后复制

六、提交

1.提交结果

提交当前目录下的result.json,即刻得到成绩,如下图:

【Paddle打比赛】 交通标志分类识别 - 游乐网

大家来试试吧!

2.其他注意事项

生成版本时提示存在无效软链接无法保存 ,可以在终端 PaddleClas 下运行下列代码清理即可。

for a in `find . -type l`do    stat -L $a >/dev/null 2>/dev/null    if [ $? -gt 0 ]    then      rm $a    fidone
登录后复制
来源:https://www.php.cn/faq/1422377.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
逼AI当山顶洞人!Claude防话痨插件爆火,网友:受够了AI废话

逼AI当山顶洞人!Claude防话痨插件爆火,网友:受够了AI废话

新智元报道编辑:元宇【新智元导读】一个让AI像原始人一样说话的插件,在HN上一夜爆火,冲破2w星。它的核心只是一条简单粗暴的prompt:删掉冠词、客套和一切废话,号称能省下75%的输出token。

时间:2026-04-07 14:55
季度利润翻 8 倍,最赚钱的「卖铲人」财报背后,内存涨价狂潮如何收场?

季度利润翻 8 倍,最赚钱的「卖铲人」财报背后,内存涨价狂潮如何收场?

AI 时代最赚钱的公司,可能从来不是做 AI 的那个。作者|张勇毅编辑|靖宇淘金热里最稳赚的人,从来不是淘金的,是卖铲子的。这句老话在 2026 年的科技行业又应验了一次。只不过这次卖铲子的不是英伟

时间:2026-04-07 14:49
Claude Code Harness+龙虾科研团来了!金字塔分层架构+多智能体

Claude Code Harness+龙虾科研团来了!金字塔分层架构+多智能体

Claw AI Lab团队量子位 | 公众号 QbitAI你还在一个人做科研吗?科研最难的,从来不是问题本身,而是一个想法从文献到实验再到写作,只能靠自己一点点往前推。一个人方向偏了没人提醒,遇到歧

时间:2026-04-07 14:43
让离线强化学习从「局部描摹」变「全局布局」丨ICLR'26

让离线强化学习从「局部描摹」变「全局布局」丨ICLR'26

面对复杂连续任务的长程规划,现有的生成式离线强化学习方法往往会暴露短板。它们生成的轨迹经常陷入局部合理但全局偏航的窘境。它们太关注眼前的每一步,却忘了最终的目的地。针对这一痛点,厦门大学和香港科技大

时间:2026-04-07 14:37
美国犹他州启动新试点项目:AI为患者开具精神类药物处方

美国犹他州启动新试点项目:AI为患者开具精神类药物处方

IT之家 4 月 5 日消息,据外媒 PC Mag 当地时间 4 月 4 日报道,美国医疗机构 Legion Health 在犹他州获得监管批准,启动一项试点项目,允许 AI 系统为患者开具精神类药

时间:2026-04-07 14:30
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程