赛题背景
当前,全球新一轮科技革命和产业变革蓬勃发展,汽车与人工智能技术加速融合,电动化、网联化、智能化成为汽车产业的发展潮流和趋势,AI技术将更广泛地和汽车产业的各个领域,应用于汽车的智能维护、智能制造、智能驾驶等诸多方面。本届比赛内容是智能驾驶车辆的虚拟仿真视频的数据理解,该比赛将推动自动驾驶、AI大模型、加速计算、云计算技术深度结合,为未来智能出行提供更加安全、高效、舒适的解决方案。
赛题链接
https://tianchi.aliyun.com/s/7e720100fbd31e382869f7fd4a41908c
赛事任务
赛题:智能驾驶汽车虚拟仿真视频数据理解赛道
任务:
- 输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);
- 输出:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息(value,中文/英文均可以)
赛题数据集
赛题提供了没有标签的测试集,但没有给出训练集,因此可以通过预训练模型进行预测,或自行寻找外部数据集进行训练模型。不涉及模型的训练和测试,因此不需要运用到AI专用的加速显卡,使用CPU在本地电脑端(笔记本电脑),云端(云计算平台:Kaggle,阿里云天池,百度飞桨即可运行)。
评价指标
需要提交以下格式的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"
... ...
},
... ...
}
任务一:Baseline运行和模型提升
天池大神,Datawhale成员阿水在百度的AI Studio部署了baseline,可以一键运行。
地址:
https://aistudio.baidu.com/projectdetail/7033846?contributionType=1&sUid=40990&shared=1&ts=1699415726984
运行时使用2核8GB的CPU,只需3分钟即可完成运行。
在这里baseline,可以获得80分。建议采用huggingface的开源预训练模型:CLIP,可以获得120分左右。
下面介绍Hugging face和CLIP:
Hugging face
介绍
Hugging Face,股份有限公司是一家总部位于纽约市的法美公司,开发使用机器学习构建应用程序的工具。它最引人注目的是为自然语言处理应用程序构建的transformers库,以及允许用户共享机器学习模型和数据集并在空间中展示其工作的平台。
服务和技术
Transformers库
Transformers库是一个Python包,包含用于文本、图像和音频任务的transformer模型的开源实现。它与PyTorch、TensorFlow和JAX深度学习库兼容,并包括著名模型(如BERT和GPT-2)的实现。该库最初被称为“PyTorch预训练的BERT,后来更名为“PyTorch transformers” ,最后更名为“transformers”。
Hugging face Hub
Hugging Face Hub 是一个托管平台(集中的 Web 服务) :
- 基于 Git 的代码库,包括项目的讨论和请求;
- 模型,还具有基于 Git 的版本控制;
- 数据集,主要是文本、图像和音频;
- Web应用程序(“ space”和“ widgets”) ,用于机器学习应用程序的小规模演示。
其他库
除了Transformers和Hugging face Hub,拥抱脸生态系统还包含用于其他任务的库,比如数据集处理(“数据集”) 、模型评估(“评估”) 、模拟(“模拟”) 、机器学习演示(“广播”)。
以上内容摘自Wikipedia:
https://en.wikipedia.org/wiki/Hugging_Face
相关网站
hugging face官网:
https://huggingface.co/
Github:
https://github.com/huggingface
Twitter:
https://twitter.com/huggingface
CLIP模型
简介
CLIP的全称是Contrastive Language-Image Pre-Training,中文是对比语言-图像预训练,是一个预训练模型,简称为CLIP。该模型是 OpenAI 在 2021 年发布的,最初用于匹配图像和文本的预训练神经网络模型,这个任务在多模态领域比较常见,可以用于文本图像检索,CLIP是近年来在多模态研究领域的经典之作。该模型大量的成对互联网数据进行预训练,在很多任务表现上达到了目前最佳表现(SOTA) 。
CLIP模型能够实现文本和图像之间的跨模态学习,这意味着它可以理解和关联文本和图像这两种不同的数据类型。通过对文本和图像进行联合学习,CLIP可以更好地理解和生成符合文本描述的图像。由于CLIP模型在预训练阶段已经学习了大量的文本和图像知识,因此它可以在没有见过的新类别上实现零样本学习。这意味着CLIP模型可以处理那些在训练时没有见过的新的文本和图像,具有很强的适应能力。
基本原理
CLIP的思想非常简单,只需要看懂这幅图就可以了,左边是训练的原理,CLIP一共有两个模态,一个是文本模态,一个是视觉模态,分别对应了Text Encoder和Image Encoder。
- Text Encoder用于对文本进行编码,获得其Embedding;
- Image Encoder用于对图片编码,获得其Embedding。
- 两个Embedding均为一定长度的单一向量。
下面简要介绍基础思路:
基础改进思路
使用CLIP模型的不同版本。测试对准确度的提高。
环境配置
pip install torch
pip install transformers
pip install opencv
模型下载
官网:
https://huggingface.co/models
模型选择
我们优先选择新的模型,这样效果会比几年前的就模型有提高。但是要注意,模型当中需要有json文件,否则会报错
CLIP模型的baseline
以下是CLIP模型的baseline,由天池大佬,Datawhale成员阿水提供:
使用Jupyter notebook运行,Python 3的Kernel。
import glob, json, os
import cv2
from PIL import Image
from tqdm import tqdm_notebook
import numpy as np
from sklearn.preprocessing import normalize
import matplotlib.pyplot as plt
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
inputs = processor(text=["a photo of a cat", "a photo of a dog"], images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
logits_per_image.softmax(dim=1) # we can take the softmax to get the label probabilities
cn_match_words = {
"工况描述": ["高速/城市快速路", "城区", "郊区", "隧道", "停车场", "加油站/充电站", "未知"],
"天气": ["晴天", "雨天", "多云", "雾天", "下雪", "未知"],
"时间": ["白天", "夜晚", "拂晓/日暮", "未知"],
"道路结构": ["十字路口", "丁字路口", "上下匝道", "车道汇入", "进出停车场", "环岛", "正常车道", "未知"],
"一般障碍物": ["雉桶", "水马", "碎石/石块", "井盖", "减速带", "没有"],
"道路异常情况": ["油污/水渍", "积水", "龟裂", "起伏不平", "没有", "未知"],
"自车行为": ["直行", "左转", "右转", "停止", "掉头", "加速", "减速", "变道", "其它"],
"最近的交通参与者": ["行人", "小型汽车", "卡车", "交警", "没有", "未知", "其它"],
"最近的交通参与者行为": ["直行", "左转", "右转", "停止", "掉头", "加速", "减速", "变道", "其它"],
}
en_match_words = {
"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"],
}
cap = cv2.VideoCapture('./初赛测试视频/41.avi')
img = cap.read()[1]
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
image.resize((600, 300))
submit_json = {
"作者" : "阿水" ,
"时间" : "231011",
"模型名字" : "model_name",
"测试结果" : []
}
submit_json = {
"author" : "abc" ,
"time" : "231011",
"model" : "model_name",
"test_results" : []
}
paths = glob.glob('./初赛测试视频/*')
paths.sort()
for video_path in paths:
print(video_path)
clip_id = video_path.split('/')[-1]
# clip_id = video_path.split('/')[-1][:-4]
cap = cv2.VideoCapture(video_path)
img = cap.read()[1]
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
single_video_result = {
"clip_id": clip_id,
"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"
}
for keyword in en_match_words.keys():
if keyword not in ["weather", "road_structure", 'scerario', 'road_structure', 'period']:
continue
texts = np.array(en_match_words[keyword])
inputs = processor(text=list(texts), images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1) # probs: [[1.2686e-03, 5.4499e-02, 6.7968e-04, 9.4355e-01]]
single_video_result[keyword] = texts[probs[0].argsort().numpy()[::-1][0]]
submit_json["test_results"].append(single_video_result)
len(paths)
with open('coggle_result.json', 'w', encoding='utf-8') as up:
json.dump(submit_json, up, ensure_ascii=False)
# "作者" : "abc" ,
# "时间" : "YYMMDD",
# "模型名字" : "model_name",
# "测试结果" :[
# {
# "视频ID" : "xxxx_1",
# "工况描述" : "城市道路",
# "天气":"未知",
# "时间":"夜晚",
# "道路结构":"匝道",
# "一般障碍物":"无",
# "道路异常情况":"无",
# "自车行为":"右转",
# "最近的交通参与者":"小轿车",
# "最近的交通参与者行为":"制动"
# },
submit_json
注意事项
- 文件路径可能需要修改。
- 注意生成的json文件,视频ID部分不等带有路径,只能是:03.avi等文件名。如果不是,自行调整代码中的CLIP的path。
个人感悟
- 大模型(LLM)和计算机开源时代已经到来,计算机技术和方法已经渗透到国计民生的各个方面,需要主动学习以适应时代发展的需要。在这里推荐一个开源社区:Datawhale
- Huggingface有很多的开源模型,可以作为模型的预训练部分。
- 使用新模型,新的模型普遍比旧的模型性能更高。
Datawhale介绍
Datawhale 是一个专注于数据科学与 AI 领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。
Datawhale 以「for the learner,和学习者一起成长。」为使命,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。
同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人、人与知识、人与企业和人与未来的联结。
公众号