文章目錄[隱藏]
文章轉載自公眾(zhong) 號:Coggle數據科學,版權歸原作者所有,本文僅(jin) 供分享
Part1 賽題任務
AIGC即AI Generated Content,是指利用人工智能技術來生成內(nei) 容,AIGC也被認為(wei) 是繼UGC、PGC之後的新型內(nei) 容生產(chan) 方式,AI繪畫、AI寫(xie) 作等都屬於(yu) AIGC的分支。
本次比賽的任務是創建一個(ge) 模型,該模型可以反轉生成給定圖像的擴散過程(即通過圖片生成原始prompt)。
- 輸入:16,000張SD生成的圖片;
- 標簽:prompt文本編碼之後的向量;
https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts
使用預測和實際提示嵌入向量之間的餘(yu) 弦相似度評估,對於(yu) 測試集中的每個(ge) 圖像,您必須預測用於(yu) 生成圖像的prompt轉換為(wei) 384 長度的嵌入向量。
核心評分代碼如下,對文本通過all-MiniLM-L6-v2進行編碼,然後轉換維度進行提交:
# https://www.kaggle.com/code/inversion/stable-diffusion-sample-submission/
# 讀取prompt文本 sample_submission = pd.read_csv('sample_submission.csv', index_col='imgId_eId')
# 讀取用於(yu) 編碼prompt的模型 st_model = SentenceTransformer('/kaggle/input/sentence-transformers-222/all-MiniLM-L6-v2')
# 編碼並轉換維度 prompt_embeddings = st_model.encode(prompts['prompt']).flatten()
# 寫(xie) 入提交結果 submission = pd.DataFrame(
index=imgId_eId,
data=prompt_embeddings,
columns=['val']).rename_axis('imgId_eId')
submission.to_csv('submission.csv')
Part2 基礎知識
Stable Diffusion介紹
Stable Diffusion(簡稱SD)誕生於(yu) 2022年8月,主要思路來自於(yu) CVPR22 上合作發表的潛擴散模型(Latent Diffusion Model)論文。
相比較於(yu) DALL-E等大模型,Stable Diffusion對顯存壓力更小。Stable Diffusion不僅(jin) 生成的圖像質量非常高,運行速度快,並且有資源和內(nei) 存的要求也較低。
Stable Diffusion根據文本提示作為(wei) 輸入來生成的圖像,也可以用它對圖像根據文字描述進行修改。
SD Prompt規則
Prompt順序:越靠前的Tag權重越大:比如景色Tag在前,人物就會(hui) 小,相反的人物會(hui) 變大或半身。
Prompt個(ge) 數:生成圖片的大小會(hui) 影響Prompt的效果,圖片越大需要的Prompt越多,不然Prompt會(hui) 相互汙染。
Prompt權重:在Stable Diffusion 中使用()英文括號可增加括號中Tag在畫麵中的權重 x1.1,[]可減小Tag權重x0.91。
Emoji Prompt:Prompt支持使用emoji,且表現力較好,可通過添加emoji達到表現效果,如?形容表情。
更多SD相關(guan) 的Prompt特征工程,可以參考如下資料:
- https://github.com/Maks-s/sd-akashic - https://github.com/adieyal/sd-dynamic-prompts - https://invoke-ai.github.io/InvokeAI/features/PROMPTS/
all-MiniLM-L6-v2
all-MiniLM-L6-v2在可用訓練數據(超過 10 億(yi) 個(ge) 句子對)上進行訓練,將句子和段落映射到 384 維密集向量空間,可用於(yu) 聚類或語義(yi) 搜索等任務。
更多模型介紹,可以參考如下資料
- https://www.sbert.net/docs/pretrained_models.html - https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2
Part3 參賽要點
賽題是AIGC領域的前沿賽題,但並不是單純創造圖片,而是希望構建模型去生成合理的prompt,進而生成合適的圖片。
圖片圖片
賽題使用的Stable Diffusion v2(SD v2)權重是公開的,且可以輕鬆在本地或者運算生成新的圖片。模型權重和地址如下:
- 模型權重:https://huggingface.co/stabilityai/stable-diffusion-2/blob/main/768-v-ema.ckpt - 使用代碼:https://github.com/Stability-AI/stablediffusion/blob/main/scripts/txt2img.py
本次賽題並不提供數據,而是提供了一個(ge) 模型權重,需要選手通過模型權重來得到的一個(ge) 逆向的模型。
參加本次比賽,必備如下知識:
- SD v2原始的訓練數據大致有哪些?
- SD v2支持比較好的單詞有哪些?
- SD v2推薦的prompt是什麽特點?
如果訓練逆向模型(先不考慮想法),從(cong) 數據和標簽角度思考:
- 如何得到圖像的關鍵詞?
- 如何得到關鍵詞的權重?
- 如何對關鍵詞的次序進行組織?
- 如何判斷關鍵詞與圖像是否匹配?
- 如何在本地搭建驗證集?
Part4 賽題Baseline
思路1:Vit-GPT2
Visual Transformers(Vit)是強大的圖像分類模型,而 GPT2 是一種可用於(yu) 生成文本的語言模型。Vit-GPT2思路是將圖片Vit特征解碼為(wei) 文本,用來描述圖片內(nei) 容。
排行榜得分:0.30612
# 加載Vit-GPT模型 model = VisionEncoderDecoderModel.from_pretrained(model_dir) feature_extractor = ViTFeatureExtractor.from_pretrained(model_dir) tokenizer = AutoTokenizer.from_pretrained(model_dir)
# 對圖片生成文本,然後對文本進行編碼 def predict_step(image_paths):
images = [] for image_path in image_paths:
i_image = Image.open(image_path) if i_image.mode != "RGB":
i_image = i_image.convert(mode="RGB")
images.append(i_image) # Vit-GPT,Vit部分 pixel_values = feature_extractor(images=images, return_tensors="pt").pixel_values
pixel_values = pixel_values.to(device) # Vit-GPT,GPT部分 output_ids = model.generate(pixel_values, gen_kwargs) # 文本編碼部分 preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True)
preds = [pred.strip() for pred in preds] return preds
Baseline地址:https://huggingface.co/nlpconnect/vit-gpt2-image-captioning
思路2:OFA模型
OFA將多模態及單模態的理解和生成任務統一到一個(ge) 簡單的Seq2Seq生成式框架中,OFA執行預訓練並使用任務指令進行微調。
排行榜得分:0.42644
# 圖片數據變換 mean, std = [0.5, 0.5, 0.5], [0.5, 0.5, 0.5] resolution = 480 patch_resize_transform = transforms.Compose([ lambda image: image.convert("RGB"), transforms.Resize((resolution, resolution), interpolation=Image.BICUBIC), transforms.ToTensor(), transforms.Normalize(mean=mean, std=std) ])
# 加載OFA模型,輸入任務指令 tokenizer = OFATokenizer.from_pretrained(CKPT_DIR)
model = OFAModel.from_pretrained(CKPT_DIR, use_cache=False).cuda()
txt = " what does the image describe?" inputs = tokenizer([txt], return_tensors="pt").input_ids
OFA模型資料如下:
- 開源地址:https://github.com/OFA-Sys/OFA - 模型權重:https://huggingface.co/OFA-Sys
Baseline地址:https://www.kaggle.com/code/mayukh18/ofa-transformer-lb-0-42644
思路3:CLIP + Prompt模板
CLIP從(cong) 互聯網收集的4億(yi) (圖像、文本)對的數據集,在預訓練之後,用自然語言描述所學的視覺概念,從(cong) 而使模型能夠在zero-shot狀態下轉移到下遊任務。
排行榜得分:0.45836
def interrogate(image: Image) -> str: # CLIP預測得到文本 caption = ci.generate_caption(image) # 計算圖片特征 image_features = ci.image_to_features(image) # 計算博物館prompt medium = [ci.mediums.labels[i] for i in cos(image_features, mediums_features_array).topk(1).indices][0] # 計算圖片風格prompt movement = [ci.movements.labels[i] for i in cos(image_features, movements_features_array).topk(1).indices][0] # 計算口味/通用prompt flaves = ", ".join([ci.flavors.labels[i] for i in cos(image_features, flavors_features_array).topk(3).indices]) # prompt模板 if caption.startswith(medium): prompt = f"{caption}, {movement}, {flaves}" else: prompt = f"{caption}, {medium}, {movement}, {flaves}"
return clip_interrogator._truncate_to_fit(prompt, ci.tokenize)
上述不同的prompt生成邏輯來自CLIP Interrogator,其收集了大量的常見的prompt用於(yu) 進行匹配。
Baseline地址:https://www.kaggle.com/code/leonidkulyk/lb-0-45836-blip-clip-clip-interrogator
評論已經被關(guan) 閉。