赛题背景
当前,全球新一轮科技革命和产业变革蓬勃发展,汽车与人工智能技术加速融合,电动化、网联化、智能化成为汽车产业的发展潮流和趋势,AI技术将更广泛地和汽车产业的各个领域,应用于汽车的智能维护、智能制造、智能驾驶等诸多方面。作为人工智能技术和汽车产业先进技术的倡导者,吉利汽车集团、阿里云、NVIDIA 英伟达一直致力于推动未来出行方式的发展,共同发起了本届2023全球智能汽车AI挑战赛。本届比赛将汇聚来自全球各地的杰出AI领域人才,推动自动驾驶、AI大模型、加速计算、云计算技术三者深度结合,为未来智能出行提供更加安全、高效、舒适的解决方案。
赛题任务
-
输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);
-
输出:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息(value,中文/英文均可以);
-
系统会针对参赛者提交的json文件,通过描述型的文本信息与真值进行对比,综合得出分数;其中,“距离最近的交通参与者的行为”的题目为2分,其它题目为1分;每个视频的满分为10分
数据说明
1、 文本描述结构树
2、上传json格式示例:
{
"author" : "abc" ,
"time" : "YYMMDD",
"model" : "model_name",
"test_results" :[
{
"clip_id" : "xxxx_1",
"scerario" : "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使用以下列表中的元素
"scerario" : ["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","pedestrain","policeman","nothing","others","unknown"]
"closest_participants_behavior" : ["slow down","go straight","turn right","turn left","stop","U-turn","speed up","lane change","others"]
baseline精读
!pip install paddleclip
对应着下面的
from clip import tokenize, load_model
从github上下载的clip是没有load_model函数的
下载clip到本地:pip install git+https://github.com/openai/CLIP.git
model, transforms = load_model('ViT_B_32', pretrained=True)
该函数将返回一个包含两个元素的元组:
model
:加载的CLIP模型实例,可以用于进行图像和文本的编码和比较。transforms
:用于预处理图像和文本输入的转换器。
# 设置图片路径和标签
img_path = "kobe.jpeg"
labels = ['kobe', 'james', 'Jordan']
# 准备输入数据
img = Image.open(img_path)
display(img)
image = transforms(Image.open(img_path)).unsqueeze(0)
text = tokenize(labels)
# 计算特征
with paddle.no_grad():
logits_per_image, logits_per_text = model(image, text)
probs = paddle.nn.functional.softmax(logits_per_image, axis=-1)
# 打印结果
for label, prob in zip(labels, probs.squeeze()):
print('该图片为 %s 的概率是:%.02f%%' % (label, prob*100.))
这段代码框架应该对应着飞桨给出的Paddle-CLIP用法示范:
【Paddle-CLIP】使用 CLIP 模型进行图像识别 - 飞桨AI Studio星河社区 (baidu.com)论文精读--CLIP-CSDN博客【Paddle-CLIP】使用 CLIP 模型进行图像识别 - 飞桨AI Studio星河社区 (baidu.com)
这里unsqueeze是因为图片读进来是(h, w, c),而CLIP模型要求输入的形状是(n, h, w, c),所以加一个维度变成(1, h, w, c)
-
logits_per_image
是一个张量,其形状为(1, num_classes)
,其中num_classes
表示分类的类别数量。它包含了模型对输入图像的预测结果,每个类别对应一个得分值。 -
logits_per_text
是一个张量,其形状为(1, num_classes)
,其中num_classes
表示分类的类别数量。它包含了模型对输入文本的预测结果,每个类别对应一个得分值。
softmax中的axis=-1表示对logits_per_image的最后一维,也就是num_class进行softmax获取每个类别的概率
cap = cv2.VideoCapture('./初赛测试视频/41.avi')
img = cap.read()[1]
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
image.resize((600, 300))
cap.read()
方法读取视频的下一帧,该方法返回两个值。第一个值是一个布尔值,表示是否成功读取了一帧图像。第二个值是一个表示当前帧图像的 NumPy 数组
当使用OpenCV库读取视频帧时,它以BGR颜色空间将图像数据存储在NumPy数组中。但是,为了在RGB颜色空间下正确显示图像,我们需要进行颜色转换,将BGR颜色空间转换为RGB颜色空间,以适应显示设备的需求。
BGR:
RGB:
Image.fromarray()
将NumPy数组转换为PIL图像对象
single_video_result[keyword] = texts[probs[0].argsort()[::-1][0]]
排序以后逆序取第一个,也就是概率最高的当keyword
json.dump(submit_json, up, ensure_ascii=False)
ensure_ascii
参数的值为 False
时,表示不进行ASCII转义,即保留非ASCII字符的原始形式
这里True和False的结果都一样
知识深究
CLIP
这是我写的一点论文解读,还在不定期持续更新中
BLIP
还未深入了解BLIP的工作原理和使用的方向,但是了解到BLIP应该是可以通过问答获取信息的
prompt = {
"clip_id": clip_id,
"scerario" : "What the scerario is it?", # 高
"weather":"What the weather is it?n",
"period":"What the period is it?", # 高
"road_structure":"What the road structure is it?",
"general_obstacle":"What the general obstacle is it?", # 低
"abnormal_condition":"What the abnormal condition is it?",
"ego_car_behavior":"What the ego car behavior is it?",
"closest_participants_type":"What the closest participants type is it?", # 低
"closest_participants_behavior":"What the closest_participants_behavior is it?"
}
我理解出的意思是:可以通过这种问答方式获得答案,然后对它输出的答案与你规范的答案做一个对比学习选最匹配的就行了