从技术到先进生产力,从先进装备到作战能力,中间隔了一道GAP。现在AI技术进展很快,开源的模型大部分是单点或者一个模块单元的突破。如何把这些技术整装成作战单元,为业务带来实际的价值是我们必须要解决的一个问题。
消费侧技术点
中文clip:
这部分介绍的是如何搭建一个基于内容的图检索系统,实现功能有三:
1.基于文本描述来检索图
2.基于图来检索相似图
3.支持中英文双语检索
说是系统,然得益于多模态技术的发展实则几百行代码,几个文件而已。然别看代码不多,系统还功能还是很强大的,支持百万的图片的秒级别检索,检索准确度也非常高。也就是说这个系统虽然简单,但是却是工业级别的系统。鲁棒性是够的,如果你要做更高QPS和更精准的分级检索大部份代码应该是分布式、工程系统层面代码改造。
图的检索,有一下几类:
1.基于meta data的检索,直白点就是把图人为打上各种标签的标签检索
2.图特征检索:色系、直方图、复杂度、尺寸比例…
3.基于内容的图检索,包括图-文(长、短)语义embbeding
我们这篇文章主要是基于clip来实现基于内容的图检索,也会简单介绍基于dinov2的基于内容检索。两个模型的不是这部分重点,所以不会做介绍,直接了当介绍如何实现。
特征抽取部分代码:
1.把图数据批量读入,构建dataset
2.构建特征抽取预处理和模型
3.并行化抽取特征
def compute_embeddings(img_dir, save_path, batch_size, num_workers):
if not os.path.exists(os.path.dirname(save_path)):
os.makedirs(os.path.dirname(save_path))
device = "cuda" if torch.cuda.is_available() else "cpu"
#2.构建预处理和模型链路
model, preprocess = load_from_name("ViT-H-14", device=device, download_root='./')
model.eval()
#1.构建dataset
dataset = ClipSearchDataset(img_dir = img_dir, preprocess = preprocess)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers)
#特征抽取
img_path_list, embedding_list = [], []
for img, img_path in tqdm(dataloader):
with torch.no_grad():
features = model.encode_image(img.to(device))
features /= features.norm(dim=-1, keepdim=True)
embedding_list.extend(features.detach().cpu().numpy())
img_path_list.extend(img_path)
result = {'img_path': img_path_list, 'embedding': embedding_list}
with open(save_path, 'wb') as f:
pickle.dump(result, f, protocol=4)
特征数据存入faiss
把clip抽取的图特征存入faiss向量数据库,方便后面快速便捷的检索。
def create_faiss_index(embeddings_path, save_path):
with open(embeddings_path, 'rb') as f:
results = pickle.load(f)
embeddings = np.array(results['embedding'], dtype=np.float32)
index = faiss.index_factory(embeddings.shape[1], "Flat", faiss.METRIC_INNER_PRODUCT)
index.add(embeddings)
# save index
faiss.write_index(index, save_path)
相似度计算
利用clip模型把传入的图或者文做为输入,抽取出图、文本embedding特征。然后利用embbding特征到存入faiss向量库里面捞出相似度做高的top数据。得到对应数据的图的文件保存路径。
底下代码介绍了,如何通过图或者文作为出入抽取embbding,并给出了简单相似度计算实现。
import torch
from PIL import Image
import cn_clip.clip as clip
from cn_clip.clip import load_from_name, available_models
print("Available models:", available_models())
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
device = "cuda" if torch.cuda.is_available() else "cpu"
#model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model, preprocess = load_from_name("ViT-H-14", device=device, download_root='./')
model.eval()
image = preprocess(Image.open("examples/pokemon.jpeg")).unsqueeze(0).to(device)
text = clip.tokenize(["杰尼龟", "妙蛙种子", "小火龙", "皮卡丘"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
# 对特征进行归一化,请使用归一化后的图文特征用于下游任务
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
logits_per_image, logits_per_text = model.get_similarity(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("Label probs:", probs) # [[1.268734e-03 5.436878e-02 6.795761e-04 9.436829e-01]]
结果可视化
把检索回来的图用streamlit做可视化。
if search_mode == 'Image':
# search by image
img = Image.open(img_path).convert('RGB')
st.image(img, caption=f'Query Image: {img_path}')
img_tensor = preprocess(img).unsqueeze(0).to(device)
with torch.no_grad():
features = model.encode_image(img_tensor.to(device))
elif search_mode == 'Upload Image':
uploaded_file = st.file_uploader("Choose an image...", type=['jpg', 'jpeg', 'png'])
#img = Image.open("../image/train/left/00000.jpg").convert('RGB')
img = Image.open("examples/pokemon.jpeg").convert('RGB')
if uploaded_file is not None:
img = Image.open(uploaded_file).convert('RGB')
st.image(img)
img_tensor = preprocess(img).unsqueeze(0).to(device)
with torch.no_grad():
features = model.encode_image(img_tensor.to(device))
else:
# search by text
query_text = st.text_input('Enter a search term:')
with torch.no_grad():
text = clip.tokenize([query_text]).to(device)
features = model.encode_text(text)
dinov2特征抽取
基于dinov2的特征抽取,图文特征的抽取,出了用clip外,还可以用facebook家的dinov2来实现。下面给出的是单张图抽取方式,批量类似上面dataset并行化批量抽取方式可以直接到我git项目中找代码。
def compute_embeddings(img_dir, save_path, batch_size, num_workers):
if not os.path.exists(os.path.dirname(save_path)):
os.makedirs(os.path.dirname(save_path))
device = torch.device('cuda' if torch.cuda.is_available() else "cpu")
#Load DINOv2 model and processor
processor_dino = AutoImageProcessor.from_pretrained('facebook/dinov2-base')
model_dino = AutoModel.from_pretrained('facebook/dinov2-base').to(device)
#Retrieve all filenames
images = []
for root, dirs, files in os.walk(img_dir):
for file in files:
if file.endswith('jpg'):
images.append(root + '/'+ file)
index_dino = faiss.IndexFlatL2(768)
#Iterate over the dataset to extract features X2 and store features in indexes
for image_path in images:
img = Image.open(image_path).convert('RGB')
dino_features = extract_features_dino(img,processor_dino,model_dino,device)
add_vector_to_index(dino_features,index_dino)
chinese-clip
本项目使用额是OFA开源的chinese-clip底模来实现的,如果私域数据比较多的开源底模特征抽取效果不好,可以利用自己的数据对模型做二次预训练,单卡就能调的动;巨头实现可以参看chinese-clip项目代码。
chinese-clip还给出了onnx、TensorRT的推理加速,需要的可以执行他们脚本,按步骤执行就行。个人觉得数据量不大情况,torch版本实现就已经可以满足要求,检索推理优化速度差异不大,对于图库特征抽取如faiss时间会有一定优化。
创意侧技术点
:::tips
1.有版权图,加文字,优化表意准确性链路搭建
:::
:::tips
2.网络图,风格化处理链路
:::
:::tips
3.换背景
:::
:::tips
4.保留核心创意,换搭配元素链路
:::
垫图生成链路
前面已经介绍了基于内容的图检索,今天我们来介绍基于检索的图生成。基于检索的图生成重点在于多模态的检索,生成图至少有两种应用:
1.大模型生成文案,抽取关键词,clip检索出合适的配图
2.基于文案检索出图,以检索图为基础继续加工
3.上面两部分的组合,做文案配图
在这部分不会详细介绍改图,只是给出了一个SD turbo的image to image的简单例子。理论上讲这部分的图加工可以很复杂,比如:分图层生成图、按物体修改、按色系修改、基于草图增删、组合合图…
但这部分的目的在于介绍基于检索的方式来做图的生成,介绍基于图检索方式对图质量提升的好处。所以后面的一些修改组合技术可以另开章节介绍。
Midjourney 生成 APP 活动弹窗
1. 花瓣网找参考图,处理不必要的元素
这个弹窗设计我尝试了很多方法,发现还是需要垫图才能生成符合我想要的效果,所以这个方法还是得去找参考图才行,以下这张图来自花瓣网。
用 ps 处理下文字,别偷懒~(百度直接搜“花瓣网”即可,然后搜索“弹窗设计”)。
尝试了图生文功能,这里没能如愿生成合适的,不过也给了我写关键词的灵感,突然发现图生文还可以这样用,牛~
2. 关键词描述并垫图生成
然后我开始尝试写关键词,以下是完整关键词:
Use a card as the background, It is surrounded by clover and white flowers, Green base, White trolley, Pale gold coins, Yellow stars, Clouds, Disney style, cartoon style, 3D, behance, dribbble --iw 2 --v 5.2
使用一张卡片作为背景,四周环绕着三叶草和白色的花朵,绿色的底座,白色的小车,淡金色的硬币,黄色的星星,云彩,迪士尼风格,卡通风格,3D, behance,dribbble
上面这个写关键词的网站还挺好用的,也内置了一些常用关键词,分享给大家:https://moonvy.com/apps/ops/
接下来就简单了,垫图+关键词组合。参数命令用 --iw 2(增加图片权重,出图更接近原图)。–v 5.2 这个模型是最新的,用 v5 和 v5.1 模型生成的效果也差不多。
3. 挑选图片并抠图
Midjourney 的随机性大家知道,多跑几次图准有你想要的图:
选好图片之后就需要处理图片了,抠图和修部分细节,这一点也很简单。这里用到两个工具,Clipdrop 和 PS Beta。
我是利用 Clipdrop 抠图的,PS Beta 也可以,不过我感觉 Clipdrop 抠的更好点,这个是它的网址:https://clipdrop.co/
接下来就要用到 PS Beta 了,这个需要大家安装下,真的很好用。
4. 文案排版+UI 规范
为什么会用到 PS Beta 呢,是因为我需要处理这个卡片上的元素,我需要有一块空白的地方填写文案,框选不需要的元素,使用“内容填充”和“创意式填充”,根据最终的效果来合理运用。
最后一步,写上文案并进行 UI 规范设计一下~
来看下最终效果:
风格化生成链路
Midjourney 生成 3D 运营活动弹窗
1. 找参考图,确定设计风格
我们在接到设计需求之后,大家是否会跟我一样,根据需求来去找对应的参考图片。需求分析我就不介绍了,我们直接开始视觉设计篇。
首先就是去找到与需求描述相符的参考图片,注意的是我们下面的操作不会用到“/describe”功能(咱也不能老是用垫图的方法是不,这多没技术含量,虽然很好用…)。老办法,素材网站找参考图,这里还是我们的老朋友:花瓣。
我们先确定主体元素样式,这里我找到了这个礼物盒的图标,就它了,接下来我就会根据这个礼物元素进行关键词描述。
我会根据以上这个格式去写关键词,其实这个格式的顺序不是太重要,因为你会发现网上很多博主写的格式都不太一样,我建议大家按照自己的习惯描述就行,不要太久纠结到底是什么顺序,切记不要转牛角尖~
2. 根据需求及参考图,写出关键词
画面主体:礼物盒,3D 图标,粘土,卡通,任天堂
修饰词:可爱,光滑,光泽,红色和黄色,渐变颜色
细节词:白色背景,最高细节,等距视图,高清,最佳质量
参数后缀:–niji 5 --q 2(质量)
上面写的关键词就是根据找的礼物盒来描述的,不信你可以对着看,大家写关键词都可以用这种思路去创作,你会发现,写关键词真的不难~
完整关键词咱也不能落下,要分享就拿出咱最大的诚意来:
Gift box, 3D icon, clay, Cartoon, Nintendo, Lovely, smooth, Luster, Red and yellow, Gradient color, White background, The highest detail, The best quality, Isometric view, HD --niji 5 --q 2
这套关键词可以作为画这种 3D 风格图标的一套模板,可替换的关键词为:
3. 挑选生成的素材,抠出元素
开始跑图吧,剩下的事情就好办了,Midjourney 的随机性会让你不得不多跑几组图片,这一点要耐心~
图跑出来了就开始把咱们的 3D 元素抠出来吧,这次我就不开 PS 了,用 Clipdrop 抠图,简直不要太快。
看来这次的教程又是 4 步就可以完成了,真的是 泰裤辣!
下面一步我会用“Figma”这个软件,大家用 PS 等设计工具也可以哈,都是可以完成最后一步的,接着看:
4. 排版出图,真的可落地!
排个版都会吧,打上文案,加点装饰元素,做个按钮,就很简单…
最后再配个颜色,就大功告成啦~
保留核心创意换配元素生成链路
Midjourney 生成 B 端运营海报
1. 找参考图,确定设计风格
第一步,找风格元素参考去,这是我们接下来描写关键词的重点,建议大家不要凭空想象,先看别人做的,我们参考改进,下面还是这个网站(花瓣):
上面的这个图标就是我找到的参考,接下来我会按照我描述关键词的步骤开始头脑风暴,进行创作
这期的效果也不用垫图,可关键词直出图,也可以垫图来控制画面风格,不过注意你如果生成的关键词是 盾牌图标 ,那么你垫的图片也要是 盾牌图标 ,不然会出现灾难现场,自己可以试试
2. 根据需求及参考图,写出关键词
画面主体:一个 3D 盾牌 图标
修饰词:蓝色渐变,磨砂玻璃
细节词:超简约外观,明亮色彩,工作室照明,光线追踪,蓝白色背景,工业设计,等距视图,丰富的细节,超高清,高质量,16K
参数后缀:–V 5.2
这组描述词我测试了很久很久,现在我感觉用 AI 绘图最耗时间的事情就是写关键词了,因为需要不断的用关键词来测试效果,这个效果不行就修改关键词继续测试,所以写关键词也很重要!!以下是完整关键词:
A 3D shield icon, Blue gradient, Frosted glass, Transparent sense of science and technology, Ultra-minimalist appearance, Bright color, Studio lighting, Blue and white background, Industrial design, A wealth of details, Ultra high definition, dribble, pinterest, Ray tracing, Isometric view, blender, c4d, Oc renderer, High quality, 16K --v 5.2
橙色标注地方为可替换关键词,其它关键词可保持不变,同样这套可作为 B 端科技风格图标的一套模板关键词。
3. 生成合成图片素材,抠出元素
先来看看我最终设计的图片:
这组设计并不是直接出一张图,然后排版就完成的。是我生成了一共 3 组不同的元素,然后合成为一张场景图的。
我也尝试过关键词直出一张图,但是实际上不管我怎么写关键词,垫图,始终无法达到我的最终设计要求,哪怕我“运气好”生成了一组合适的图片,后面的视觉风格保持统一也很难做到,所以只能把各个元素拆分,后期合成了。
具体怎么做的咱们继续往下看吧~
首先用上面写的关键词跑出以下元素:
再提醒一遍,前面写的关键词我只改了一个单词,就是把 盾牌 关键词分别改成了:“相机、文件夹、耳机、魔方、地球仪”,其他关键词保持不变,这也是为了保持风格统一。
主体元素确定了,还缺一个辅助元素,那就是 主体元素 下面的底座。这一步也很简单,垫图+关键词(注意,这里的关键词还是刚刚那组,把 盾牌 关键词改为 pedestal(底座)。
垫图注意:一定要与我们生成的主体元素差不多风格的图片,不要随便放一个底座图片上去!!!
这一步完了之后再来一张背景素材就搞定了,背景素材简单,直接图生文,然后垫图+关键词,看图。
怕你们看不懂,我再啰嗦一遍,找一张合适的图片参考,然后用“/describe”命令,找一组大致符合这个图片的关键词,然后垫同样的图片,把关键词加上,跑图即可。
最后就是把主体元素,辅助元素抠图:
4. 合成排版出图,可落地!!
我的宝藏设计工具:Figma!先出个 Demo,把文案排版一下:
然后配上颜色,把背景素材合成上,剩下的路得你们自己走了,整个流程已经走完,希望本篇文章对你有帮助。
换背景+字链路
Midjourney 生成福袋活动弹窗
1. 找参考图,确定设计风格
老样子,先找参考图,根据参考图及需求写出关键词,这期的福袋设计会用到垫图+关键词 的方式。
第一步,找风格元素参考去,这是我们接下来描写关键词的重点,建议大家不要凭空想象,先看别人做的,我们参考改进,下面还是这个网站(花瓣):
上面的这个福袋就是我找到的参考,接下来我会按照我描述关键词的步骤开始头脑风暴,进行创作
这组关键词其实就是用的之前做 3D 元素弹窗的关键词,属于比较通用的一组关键词,适用于任何此类型的 3D 图标。
尝试了关键词直接生成的图片,很难生成符合国内的福袋风格…
2. 根据需求及参考图,写出关键词
画面主体:福袋,3D 图标
修饰词:中国风,卡通风格,粘土材质,可爱,光滑
细节词:红色和黄色,白色背景,3D 渲染,最高细节,最好的质量,正视图,高清,8K
参数后缀:–niji 5
基本上我就修改了前面的关键词,后面的关键词都可以被固定,作为生成 3D 元素的关键词,改变主体元素即可,然后改下颜色关键词,以下是完整关键词:
Blessing bag, 3D icon, Chinese style, Cartoon style, Clay material, Lovely, smooth, Red and yellow, White background, The highest detail, The best quality, Upright view, 3D rendering, HD, 8K --niji 5
橙色标注地方为可替换关键词,其它关键词可保持不变。
3. 生成合成图片素材,抠出元素
然后开始操作跑图吧,垫上前面找的参考,然后加上关键词,然后抠图都知道吧,不重复了:
我们再来看看不垫图生成的效果,这种效果也很不错,但是这个并不是我们最终落地的效果,之所以垫图,就是控制图片的整体风格,再配合关键词,基本上就能很好的控制最终的效果,把“命运掌握自己手中吧”:
还有个小知识,可以多垫几张图,但是风格需要是一致的图片,这样通过 垫图+关键词 的操作,生不出合适的元素,你可以化身“东北锤王”来捶我,我不反抗
4. 文案排版+UI 规范
处理下图片吧,把不需要的元素,效果不好的地方,用“PS Beta”处理下,不用 Beta 版本也行,我也只用到了“内容填充”的功能。
完了之后排个版,加点装饰元素,这福袋活动弹窗不就完成了。
那个周围的金币元素也是用同样的方式生成,把 福袋 关键词 ,改成 金币 即可。
图生产技术点
寻找足够多图数据源
LAION-400M[1]这个史上最大规模多模态图文数据集发布之后,今年又又又有LAION-5B[2]这个超大规模图文数据集发布了。
其包含 58.5 亿个 CLIP [5]过滤的图像-文本对的数据集,比 LAION-400M 大 14 倍,是世界第一大规模、多模态的文本图像数据集,共80T数据,并提供了色情图片过滤、水印图片过滤、高分辨率图片、美学图片等子集和模型,供不同方向研究。
LAION-5B通过CommonCrawl获取文本和图片,OpenAI的CLIP计算后获取图像和文本的相似性,并删除相似度低于设定阈值的图文对(英文阈值0.28,其余阈值0.26),500亿图片保留了不到60亿,最后形成58.5亿个图文对,包括23.2亿的英语,22.6亿的100+语言及12.7亿的未知语言。
官网:
https://laion.ai/blog/laion-5b/
数据集信息:
https://opendatalab.org.cn/LAION-5B
论文:
https://openreview.net/pdf?id=M3Y74vmsMcY
LAION-400M介绍:
https://mp.weixin.qq.com/s/vzyOF4esJCkBZDMiNScE5A
图文对数据集
最开始,数据集均通过人工注释生成,如COCO[7]和Visual Genome[8],COCO Captions在COCO图片数据基础上,由人工标注图片描述得到。Visual Genome是李飞飞2016年发布的大规模图片语义理解数据集,含图像和问答数据,标注密集,语义多样。这两个数据集主要用于图像生成描述(Visual Genome也可以用于图像问答),然而由于图片数量较少,仅有330k和5M对,模型发展受到限制。
后来逐渐出现了非人工注释的多模态数据集,如Conceptual Captions 3M[9]和Conceptual Captions 12M[16],对应描述从网站的alt-text属性过滤而来。随着CLIP模型的出现,大规模预训练模型逐渐成为多模态领域趋势,类似的还有ALT200M[10]和ALIGN1.8B[3],数据集规模逐渐扩大到数十亿,虽然没有经过人工注释,但由于数据量大,在NLP、零样本视觉推理、多模态检索等多种下游任务中仍能取得良好甚至SOTA的效果。但可惜的是,CLIP所使用的4亿图文对以及ALIGN等数据集均没有公开。
去年公开的LAION-400M拥有4亿图文对,是当时最大的公开图文数据集,一经公开获取了很好的反响,也有多个模型基于该数据进行训练取得了较好效果,但相较官方CLIP仍有轻微差距,并且LAION-400M中含有大量令人不适的图片,对于模型,尤其是生成模型影响较大。比如stable diffusion模型,很多人会用来生成色情图片,产生了不好的影响,更大更干净的数据集成为需求。
这次公开的LAION-5B除了扩大规模之外,还提供了一些模型进行过滤,LAION训练了色情内容识别模型NSFW过滤绝大部分不适图片,水印检测模型可以过滤水印图片,由于部分隐私或不适内容若删除会影响研究丰富性,所以在总体数据内不会删除,会提供不同的子集用于不同用途。
1.2 图像数据集
大型如Instagram-1B、JFT300M、JFT3B均为私有数据集,暂未公开。
图3: 数据集大小比较,公开数据集(top)和私有数据集(bottom)。LAION-5B比其他公开数据集大100倍,数据来源:[2]
LAION-5B的数据规模目前最大,可以对许多未公开的多模态模型进行训练并获得较好效果,并公开了第一个开源的CLIP模型。并且数据多样,包含各种领域图片,对于后续研究提供了更多的方向,比如数据重叠、图片噪声、不适图片筛选、低资源语言、自然语言对于多模态的作用、模型偏差等等。
但如果将LAION-5B直接应用于工业,需要注意清洗图片,因为LAION-5B中含水印图片及不适图片,模型会因此产生偏差。
多模态理解
MM-LLM 使用 LLM 提供认知功能,让其处理各种多模态任务。LLM 能提供多种所需能力,比如稳健的语言泛化能力、零样本迁移能力和上下文学习(ICL)。与此同时,其它模态的基础模型却能提供高质量的表征。考虑到不同模态的基础模型都是分开预训练的,因此 MM-LLM 面临的核心挑战是如何有效地将 LLM 与其它模态的模型连接起来以实现协作推理。
在这个领域内,人们关注的主要焦点是优化提升模态之间的对齐(alignment)以及让模型与人类意图对齐。这方面使用的主要工作流程是多模态预训练(MM PT)+ 多模态指令微调(MM IT)。
2023 年发布的 GPT-4 (Vision) 和 Gemini 展现出了出色的多模态理解和生成能力;由此激发了人们对 MM-LLM 的研究热情。
一开始,研究社区主要关注的是多模态内容理解和文本生成,此类模型包括 (Open) Flamingo、BLIP-2、Kosmos-1、LLaVA/LLaVA-1.5、MiniGPT-4、MultiModal-GPT、VideoChat、Video-LLaMA、IDEFICS、Fuyu-8B、Qwen-Audio。
为了创造出能同时支持多模态输入和输出的 MM-LLM,还有一些研究工作探索了特定模态的生成,比如 Kosmos-2 和 MiniGPT-5 研究的是图像生成,SpeechGPT 则聚焦于语音生成。
近期人们关注的重点是模仿类似人类的任意模态到任意模态的转换,而这或许是一条通往通用人工智能(AGI)之路。
一些研究的目标是将 LLM 与外部工具合并,以达到近似的任意到任意的多模态理解和生成;这类研究包括 Visual-ChatGPT、ViperGPT、MM-REACT、HuggingGPT、AudioGPT。
反过来,为了减少级联系统中传播的错误,也有一些研究团队想要打造出端到端式的任意模态 MM-LLM;这类研究包括 NExT-GPT 和 CoDi-2。
给出了 MM-LLM 的时间线。
MM-LLM 的训练流程可以分为两个主要阶段:MM PT(多模态预训练)和 MM IT(多模态指令微调)。
MM PT
在预训练阶段(通常是利用 XText 数据集),通过优化预定义的目标来训练输入和输出投影器,使其对齐不同的模态。(有时候也会将参数高效型微调(PEFT)技术用于 LLM 骨干。)
MM IT
MM IT 这种方法需要使用一组指令格式的数据集对预训练的 MM-LLM 进行微调。通过这个微调过程,MM-LLM 可以泛化到未曾见过的任务,执行新指令,从而增强零样本性能。
MM IT 包含监督式微调(SFT)和根据人类反馈的强化学习(RLHF),目标是与人类意图或偏好对齐并提升 MM-LLM 的交互能力。
SFT 可将预训练阶段的部分数据转换成指令感知型的格式。
SFT 之后,RLHF 会对模型进行进一步的微调,这需要有关 MM-LLM 所给响应的反馈信息(比如由人类或 AI 标注的自然语言反馈(NLF))。这个过程采用了一种强化学习算法来有效整合不可微分的 NLF。模型的训练目标是根据 NLF 生成对应的响应。
现有的 MM-LLM 在 MM PT 和 MM IT 阶段使用的数据集有很多,但它们都是表 3 和表 4 中数据集的子集。
当前最佳的 MM-LLM
该团队比较了 26 个当前最佳(SOTA)MM-LLM 的架构和训练数据集规模,如表 1 所示。另外他们还简单总结了每种模型的核心贡献和发展趋势。
(1) Flamingo:一系列设计用于处理交织融合的视觉数据和文本的视觉语言(VL)模型,可输出自由形式的文本。
(2) BLIP-2:提出了一种能更高效利用资源的框架,其中使用了轻量级的 Q-Former 来连接不同模态,还使用了冻结的 LLM。使用 LLM,可通过自然语言 prompt 引导 BLIP-2 执行零样本图像到文本生成。
(3) LLaVA:率先将指令微调技术迁移到多模态领域。为了解决数据稀疏性问题,LLaVA 使用 ChatGPT/GPT-4 创建了一个全新的开源多模态指令遵从数据集和一个多模态指令遵从基准 LLaVA-Bench
(4) MiniGPT-4:提出了一种经过精简的方法,其中仅训练一个线性层来对齐预训练视觉编码器与 LLM。这种高效方法展现出的能力能媲美 GPT-4。
(5) mPLUG-Owl:提出了一种全新的用于 MM-LLM 的模块化训练框架,并整合了视觉上下文。为了评估不同模型在多模态任务上的性能,该框架还包含一个指示性的评估数据集 OwlEval。
(6) X-LLM:扩展到了包括音频在内的多个模态,展现出了强大的可扩展性。利用了 QFormer 的语言可迁移能力,X-LLM 成功在汉藏语系汉语语境中得到了应用。
(7) VideoChat:开创了一种高效的以聊天为中心的 MM-LLM 可用于进行视频理解对话。这项研究为该领域的未来研究设定了标准,并为学术界和产业界提供了协议。
(8) InstructBLIP:该模型是基于 BLIP-2 模型训练得到的,在 MM IT 阶段仅更新了 Q-Former。通过引入指令感知型的视觉特征提取和对应的指令,该模型可以提取灵活且多样化的特征。
(9) PandaGPT 是一种开创性的通用模型,有能力理解 6 种不同模态的指令并遵照行事:文本、图像 / 视频、音频、热量、深度和惯性测量单位。
(10) PaLIX:其训练过程使用了混合的视觉语言目标和单模态目标,包括前缀补全和掩码 token 补全。研究表明,这种方法可以有效用于下游任务,并在微调设置中到达了帕累托边界。
(11) Video-LLaMA:提出了一种多分支跨模态预训练框架,让 LLM 可以在与人类对话的同时处理给定视频的视觉和音频内容。该框架对齐了视觉与语言以及音频与语言。
(12) Video-ChatGPT:该模型是专门针对视频对话任务设计的,可以通过整合时空视觉表征来生成有关视频的讨论。
(13) Shikra:提出了一种简单但统一的预训练 MM-LLM,并且专门针对参考对话(Referential Dialogue)任务进行了调整。参考对话任务涉及到讨论图像中的区域和目标。该模型表现出了值得称道的泛化能力,可有效处理未曾见过的情况。
(14) DLP:提出了用于预测理想 prompt 的 P-Former,并在一个单模态语句的数据集上完成了训练。这表明单模态训练可以用于增强多模态学习。
(15) BuboGPT:为了全面理解多模态内容,该模型在构建时学习了一个共享式语义空间。其探索了图像、文本和音频等不同模态之间的细粒度关系。
(16) ChatSpot:提出了一种简单却有效的方法,可为 MM-LLM 精细化调整精确引用指令,从而促进细粒度的交互。通过集成精确引用指令(由图像级和区域级指令构成),多粒度视觉语言任务描述得以增强。
(17) Qwen-VL:一种支持英语和汉语的多语言 MM-LLM。Qwen-VL 还允许在训练阶段输入多张图像,这能提高其理解视觉上下文的能力。
(18) NExT-GPT:这是一种端到端、通用且支持任意模态到任意模态的 MM-LLM,支持自由输入和输出图像、视频、音频和文本。其采用了一种轻量的对齐策略 —— 在编码阶段使用以 LLM 为中心的对齐,在解码阶段使用指令遵从对齐。
(19) MiniGPT-5:这种 MM-LLM 整合了转化成生成式 voken 的技术,并集成了 Stable Diffusion。它擅长执行交织融合了视觉语言输出的多模态生成任务。其在训练阶段加入了无分类器指导,以提升生成质量。
(20) LLaVA-1.5:该模型基于 LLaVA 框架并进行了简单的修改,包括使用一种 MLP 投影,引入针对学术任务调整过的 VQA 数据,以及使用响应格式简单的 prompt。这些调整让模型的多模态理解能力得到了提升。
(21) MiniGPT-v2:这种 MM-LLM 的设计目标是作为多样化视觉语言多任务学习的一个统一接口。为了打造出能熟练处理多种视觉语言任务的单一模型,每个任务的训练和推理阶段都整合了标识符(identifier)。这有助于明确的任务区分,并最终提升学习效率。
(22) CogVLM:一种开源 MM-LLM,其通过一种用在注意力和前馈层中的可训练视觉专家模块搭建了不同模态之间的桥梁。这能让多模态特征深度融合,同时不会损害在下游 NLP 任务上的性能。
(23) DRESS:提出了一种使用自然语言反馈提升与人类偏好的对齐效果的方法。DRESS 扩展了条件式强化学习算法以整合不可微分的自然语言反馈,并以此训练模型根据反馈生成适当的响应。
(24) X-InstructBLIP:提出了一种使用指令感知型表征的跨模态框架,足以扩展用于助力 LLM 处理跨多模态(包括图像 / 视频、音频和 3D)的多样化任务。值得注意的是,它不需要特定模态的预训练就能做到这一点。
(25) CoDi-2:这是一种多模态生成模型,可以出色地执行多模态融合的指令遵从、上下文生成以及多轮对话形式的用户 - 模型交互。它是对 CoDi 的增强,使其可以处理复杂的模态交织的输入和指令,以自回归的方式生成隐含特征。
(26) VILA:该模型在视觉任务上的性能出色,并能在保持纯文本能力的同时表现出卓越的推理能力。VILA 之所以性能优异,是因为其充分利用了 LLM 的学习能力,使用了图像 - 文本对的融合属性并实现了精细的文本数据重新混合。
当前 MM-LLM 的发展趋势:
(1) 从专注于多模态理解向特定模态生成发展,并进一步向任意模态到任意模态转换发展(比如 MiniGPT-4 → MiniGPT-5 → NExT-GPT)。
(2) 从 MM PT 到 SFT 再到 RLHF,训练流程持续不断优化,力求更好地与人类意图对齐并增强模型的对话互动能力(比如 BLIP-2 → InstructBLIP → DRESS)。
(3) 拥抱多样化的模态扩展(比如 BLIP-2 → X-LLM 和 InstructBLIP → X-InstructBLIP)。
(4) 整合质量更高的训练数据集(比如 LLaVA → LLaVA-1.5)。
(5) 采用更高效的模型架构,从 BLIP-2 和 DLP 中复杂的 Q-Former 和 P-Former 输入投射器模块到 VILA 中更简单却有效的线性投影器。