竞赛总结:智能驾驶汽车虚拟仿真视频数据理解
- 赛题名称:2023全球智能汽车AI挑战赛——赛道二:智能驾驶汽车虚拟仿真视频数据理解赛道
- 赛题任务:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息
- 赛题类型:计算机视觉、目标检测
比赛链接:2023全球智能汽车AI挑战赛——赛道二:智能驾驶汽车虚拟仿真视频数据理解赛道
Datawhale教学视频:二次元的Datawhale的个人空间-二次元的Datawhale个人主页)
赛事背景
当前,全球新一轮科技革命和产业变革蓬勃发展,汽车与人工智能技术加速融合,电动化、网联化、智能化成为汽车产业的发展潮流和趋势,AI技术将更广泛地和汽车产业的各个领域,应用于汽车的智能维护、智能制造、智能驾驶等诸多方面。作为人工智能技术和汽车产业先进技术的倡导者,吉利汽车集团、阿里云、NVIDIA 英伟达一直致力于推动未来出行方式的发展,共同发起了本届2023全球智能汽车AI挑战赛。本届比赛将汇聚来自全球各地的杰出AI领域人才,推动自动驾驶、AI大模型、加速计算、云计算技术三者深度结合,为未来智能出行提供更加安全、高效、舒适的解决方案。
赛事任务
输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);
输出:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息(value,中文/英文均可以);
数据说明
文本描述结构树
上传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的一些关键特点和工作原理的简介:
- 多模态表示学习: CLIP的设计目标是使模型能够理解文本和图像之间的语义关系,而不是仅限于特定任务。这使得CLIP在各种任务上都能表现良好,而无需针对每个任务进行专门的微调。
- 对比性学习: CLIP使用对比损失进行训练。这意味着模型学会将相关的文本和图像样本靠近,而不相关的样本分开。这种对比性学习的方法使得CLIP在理解语义关系时更为强大。
- 零样本学习: CLIP在零样本学习方面表现出色。这意味着模型可以在没有特定任务样本的情况下执行任务,因为它已经学会了通用的文本-图像表示。
- 大规模预训练: CLIP是在大规模文本和图像数据上进行预训练的。这使得模型能够捕捉更广泛的语义信息,从而在多种任务上通用。
- 应用广泛: 由于其多模态的性质,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