竞赛总结:智能驾驶汽车虚拟仿真视频数据理解

竞赛总结:智能驾驶汽车虚拟仿真视频数据理解

  • 赛题名称:2023全球智能汽车AI挑战赛——赛道二:智能驾驶汽车虚拟仿真视频数据理解赛道
  • 赛题任务:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息
  • 赛题类型:计算机视觉、目标检测

比赛链接:2023全球智能汽车AI挑战赛——赛道二:智能驾驶汽车虚拟仿真视频数据理解赛道

Datawhale教学视频:二次元的Datawhale的个人空间-二次元的Datawhale个人主页)

赛事背景

当前,全球新一轮科技革命和产业变革蓬勃发展,汽车与人工智能技术加速融合,电动化、网联化、智能化成为汽车产业的发展潮流和趋势,AI技术将更广泛地和汽车产业的各个领域,应用于汽车的智能维护、智能制造、智能驾驶等诸多方面。作为人工智能技术和汽车产业先进技术的倡导者,吉利汽车集团、阿里云、NVIDIA 英伟达一直致力于推动未来出行方式的发展,共同发起了本届2023全球智能汽车AI挑战赛。本届比赛将汇聚来自全球各地的杰出AI领域人才,推动自动驾驶、AI大模型、加速计算、云计算技术三者深度结合,为未来智能出行提供更加安全、高效、舒适的解决方案。

赛事任务

输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);

输出:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息(value,中文/英文均可以);

数据说明

文本描述结构树

image-20240114211932916

上传json格式示例

建议用英文提交:
{
   
"author" : "abc" ,
"time" : "YYMMDD",
"model" : "model_name",
"test_results" :[
    {
   
    "clip_id" : "xxxx_1",
    "scenario" : "cityroad",
    "weather":"unknown",
    "period":"night",
    "road_structure":"ramp",
    "general_obstacle":"nothing",
    "abnormal_condition":"nothing",
    "ego_car_behavior":"turning right",
    "closest_participants_type":"passenger car",
    "closest_participants_behavior":"braking"
    },
    {
   
    "clip_id" : "xxxx_2"
    ... ...
    },
... ...
}

为了减少程序编译过程中的问题,提交答案的json文件中的 key & value 请使用英文,key请不要进行更改,value使用以下列表中的元素。

"scenario" : ["suburbs","city street","expressway","tunnel","parking-lot","gas or charging stations","unknown"]
"weather" : ["clear","cloudy","raining","foggy","snowy","unknown"]
"period" : ["daytime","dawn or dusk","night","unknown"]
"road_structure" : ["normal","crossroads","T-junction","ramp","lane merging","parking lot entrance","round about","unknown"]
"general_obstacle" : ["nothing","speed bumper","traffic cone","water horse","stone","manhole cover","nothing","unknown"]
"abnormal_condition" : ["uneven","oil or water stain","standing water","cracked","nothing","unknown"]
"ego_car_behavior" : ["slow down","go straight","turn right","turn left","stop","U-turn","speed up","lane change","others"]
"closest_participants_type" : ["passenger car","bus","truck","pedestrian","policeman","nothing","others","unknown"]
"closest_participants_behavior" : ["slow down","go straight","turn right","turn left","stop","U-turn","speed up","lane change","others"]

评测指标

初赛阶段:排行榜总分=视频理解准确度分数
复赛阶段:复赛总成绩=复赛排行榜视频理解准确度分数(100%)+代码复现时效分数(10%)
具体成绩计算方法和晋级标准请参考【赛制介绍】

视频理解准确度分数评测规则如下:

参赛者可采用不同的人工智能的模型和算法,推理出对应视频的描述语言,参赛者可以在给定的备选答案中选出一个正确的答案,如果其描述语言不在给定的备选答案中,也可以给出一个最佳的答案。

系统会针对参赛者提交的json文件,通过描述型的文本信息与真值进行对比,综合得出分数;其中,“距离最近的交通参与者的行为”的题目为2分,其它题目为1分;每个视频的满分为10分。每一个视频结果中的key值,需要参考数据说明的json格式示例,请勿进行修改。

对于真值部分,组织者会建立对应的中英文近义词作为真值列表,只要在该列表中就获得分数,例如真值“雨天” = [“雨天”, “雨”, “小雨”… , “rainy”, “rain”, “raining”…],参赛选手可以选择对应的近义词来进行作答,但每一项的真值列表不公开,仅体现在后台程序中。

解题思路

基本思路

  • 使用文本与图像进行匹配

datawhale学习组织将Baseline部署在线上平台百度AI Studio上,可一键fork运行代码:

https://aistudio.baidu.com/projectdetail/7033846?contributionType=1&sUid=40990&shared=1&ts=1699415726984

baseline代码解读

# 导入必要的库和模块
import paddle  # 导入 PaddlePaddle 深度学习框架
from PIL import Image  # 从 PIL 库导入 Image 模块,用于图像处理
from clip import tokenize, load_model  # 导入 clip 模块,可能用于图像和文本的联合处理
import glob, json, os  # 导入文件处理和 JSON 处理的库
import cv2  # 导入 OpenCV 库,用于计算机视觉任务
from tqdm import tqdm_notebook  # 导入 tqdm_notebook 以在笔记本中显示进度条
import numpy as np  # 导入 NumPy 用于数值处理
from sklearn.preprocessing import normalize  # 从 sklearn.preprocessing 导入 normalize 用于数据归一化
import matplotlib.pyplot as plt  # 导入 matplotlib.pyplot 用于绘图

# 加载模型和转换工具
model, transforms = load_model('ViT_B_32', pretrained=True)  # 加载预训练的 ViT_B_32 模型和其转换

# 为各个类别和相应词汇定义字典
en_match_words = {
   
    # 各个类别的关键词列表
}

# 初始化提交的 JSON 结构
submit_json = {
   
    "author": "abc",  # 作者姓名
    "time": "231011",  # 时间戳
    "model": "model_name",  # 使用的模型名称
    "test_results": []  # 测试结果的列表,初始为空
}

# 获取并排序视频路径
paths = glob.glob('./PreliminaryTestVideos/*')  # 使用 glob 获取指定路径下的所有视频文件
paths.sort()  # 对路径进行排序

# 遍历每个视频文件进行处理
for video_path in paths:
    print(video_path)  # 打印视频路径
    
    # 从路径中提取视频剪辑的 ID
    clip_id = video_path.split('/')[-1]
    cap = cv2.VideoCapture(video_path)  # 使用 OpenCV 读取视频
    img = cap.read()[1]  # 读取视频的第一帧
    image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图像从 BGR 转换为 RGB 格式
    image = Image.fromarray(image)  # 将数组转换为 PIL 图像
    image = transforms(image).unsqueeze(0)  # 应用预处理转换并添加一个维度

    # 初始化用于单个视频结果的字典
    single_video_result = {
   
        # 视频的各种属性
    }
    
    # 针对特定关键词进行预测
    for keyword in en_match_words.keys():
        if keyword not in ["weather", "road_structure"]:
            continue  # 如果关键词不是 weather 或 road_structure,则跳过
        
        texts = np.array(en_match_words[keyword])  # 将关键词转换为 NumPy 数组

        with paddle.no_grad():  # 禁用梯度计算
            # 使用模型进行预测
            logits_per_image, logits_per_text = model(image, tokenize(en_match_words[keyword]))
            probs = paddle.nn.functional.softmax(logits_per_image, axis=-1)  # 应用 softmax 获取概率分布

        probs = probs.numpy()  # 将概率转换为 NumPy 数组
        single_video_result[keyword] = texts[probs[0].argsort()[::-1][0]]  # 选择具有最高概率的词汇作为结果
        
    submit_json["test_results"].append(single_video_result)  # 将结果添加到测试结果列表
    
# 将最终结果写入 JSON 文件
with open('clip_result.json', 'w', encoding='utf-8') as up:
    json.dump(submit_json, up, ensure_ascii=False)  # 以 UTF-8 编码将结果保存到文件中

进阶思路

  • 使用图像进行视觉问答
  • 时序视频进行视频问答
  • 使用多模态大模型(CLIP)进行问答
多模态大模型CLIP简介

CLIP(Contrastive Language-Image Pre-training)是一种多模态大模型,由OpenAI开发。它是一种能够同时理解文本和图像的模型,通过对文本和图像进行对比性学习,使其在多模态任务上表现出色。以下是CLIP的一些关键特点和工作原理的简介:

  1. 多模态表示学习: CLIP的设计目标是使模型能够理解文本和图像之间的语义关系,而不是仅限于特定任务。这使得CLIP在各种任务上都能表现良好,而无需针对每个任务进行专门的微调。
  2. 对比性学习: CLIP使用对比损失进行训练。这意味着模型学会将相关的文本和图像样本靠近,而不相关的样本分开。这种对比性学习的方法使得CLIP在理解语义关系时更为强大。
  3. 零样本学习: CLIP在零样本学习方面表现出色。这意味着模型可以在没有特定任务样本的情况下执行任务,因为它已经学会了通用的文本-图像表示。
  4. 大规模预训练: CLIP是在大规模文本和图像数据上进行预训练的。这使得模型能够捕捉更广泛的语义信息,从而在多种任务上通用。
  5. 应用广泛: 由于其多模态的性质,CLIP可以用于多种任务,包括图像分类、物体检测、文本检索等。

总体而言,CLIP代表了一种强大的多模态学习方法,使得模型能够理解文本和图像之间的语义关系,并在各种任务上表现出色。

大佬代码解读

大佬代码地址(大家可以关注膜拜一下大佬):self drive | Kaggle

推理天气,时间和道路结构
# 导入必要的库
import glob
import cv2
import numpy as np

# 创建一个JSON格式的字典,包含作者信息、时间戳、模型名称和一个空的测试结果列表
submit_json = {
   
    "author" : "abc" ,
    "time" : "231011",
    "model" : "model_name",
    "test_results" : []
}

# 获取指定路径下的视频文件列表,排序后存储在paths变量中
paths = glob.glob('/kaggle/input/clip-test/初赛测试视频/*')
paths.sort()
debug = False

# 如果设置了debug标志,则只选择一个特定的视频路径用于调试
if debug:
    paths = ['/kaggle/input/clip-test/初赛测试视频/40.avi']

# 遍历每个视频文件
for video_path in paths:
    print(video_path
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三水编程

感谢客官打赏~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值