Kaggle Diffusion Prompt 賽題 Baseline

文章轉載自公眾(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

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

CIE Alevel六大科目近四年夏季考A*/A率數據區別大嗎?

下一篇

U.S. News收購CollegeAdvisor谘詢平台 大學排名還可信嗎?

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部