RuDOLPH: One Hyper-Modal Transformer can be creative as DALL-E and smart as CLIP
Project description
[Paper] [Хабр] [Model Card] [Colab] [Kaggle]
RuDOLPH 🦌🎄☃️
One Hyper-Modal Transformer can be creative as DALL-E and smart as CLIP
Russian Diffusion On Language Picture Hyper-modality (RuDOLPH) is a fast and light text-image-text transformer (350M GPT-3) designed for a quick and easy fine-tuning setup for the solution of various tasks: from generating images by text description and image classification to visual question answering and more. This model demonstrates the power of Hyper-modality Transformers.
(!!!) Hyper-modality means generalized multi-modal, e.g., model that consists of two multi-modal parts: text-2-image and image-2-text becomes text and image hyper-modality model
Sparse Attention Mask
row - col - row - [last] conv
Models
- 350M (RuDOLPH)
- 1.3B (In Progress)
- 4B (In Progress)
Installing
pip install rudolph==0.0.1rc4
Usage
Init models
from rudalle import get_tokenizer, get_vae
from rudalle.utils import seed_everything
from rudalle.image_prompts import ImagePrompts
from rudolph.model import get_rudolph_model
from rudolph.pipelines import zs_clf, generate_codebooks, self_reranking_by_image, self_reranking_by_text, show, generate_captions, generate_texts
from rudolph import utils
device = 'cuda'
model = get_rudolph_model('350M', fp16=True, device=device)
model.to(device);
tokenizer = get_tokenizer()
vae = get_vae(dwt=False).to(device)
Setup for Fast Image Generation
text = 'рисунок кота'
bs, images_num = 48, 48
top_k, top_p = 512, 0.9
with torch.no_grad():
codebooks = generate_codebooks(text, tokenizer, model, top_k=top_k, images_num=images_num, top_p=top_p, bs=bs)
ppl_text, ppl_image = self_reranking_by_text(text, codebooks, tokenizer, model, bs=bs)
images = vae.decode(codebooks[ppl_text.argsort()[:4]])
images = torchvision.utils.make_grid(images, nrow=2)
img = torchvision.transforms.functional.to_pil_image(images)
img
Text Generation
generate_texts(
tokenizer,
model,
template='красивый пейзаж ',
top_k=32, top_p=0.6, texts_num=32, bs=32, seed=42
)[:8]
[{'text': 'красивый пейзаж вид на закат с вершины горы и леса на острове маврикий', 'ppl': 125.21},
{'text': 'красивый пейзаж с лесом и озером в финляндии - финляндия', 'ppl': 146.34},
{'text': 'красивый пейзаж с горами и лесами в тумане - горы в тумане', 'ppl': 147.4},
{'text': 'красивый пейзаж с горным хребтом на заднем плане', 'ppl': 183.2},
{'text': 'красивый пейзаж с озером и горным хребтом', 'ppl': 199.13},
{'text': 'красивый пейзаж с горным хребтом и рекой', 'ppl': 202.48},
{'text': 'красивый пейзаж на закате в тоскане, италия', 'ppl': 220.98},
{'text': 'красивый пейзаж вид на море в солнечный день', 'ppl': 223.37}]
Image Generation + Self Reranking
text = 'красивый пейзаж с озером и лесом на заднем плане'
images_num = 256
seed_everything(42)
codebooks = []
for top_k, top_p, images_num in [
(2048, 0.99, images_num),
(1024, 0.99, images_num),
(1024, 0.98, images_num),
]:
codebooks.append(generate_codebooks(text, tokenizer, model, top_k=top_k, images_num=images_num, top_p=top_p, bs=32))
codebooks = torch.cat(codebooks)
ppl_text, ppl_image = self_reranking_by_text(text, codebooks, tokenizer, model, bs=32)
with torch.no_grad():
images = vae.decode(codebooks[ppl_text.argsort()[:16]])
pil_images = utils.torch_tensors_to_pil_list(images)
show(pil_images, 8)
text = 'зимнее время года'
ppl_text, ppl_image = self_reranking_by_text(text, codebooks, tokenizer, model, bs=32)
with torch.no_grad():
images = vae.decode(codebooks[ppl_text.argsort()[:16]])
pil_images = utils.torch_tensors_to_pil_list(images)
show(pil_images, 8)
text = 'ночное время суток'
ppl_text, ppl_image = self_reranking_by_text(text, codebooks, tokenizer, model, bs=32)
with torch.no_grad():
images = vae.decode(codebooks[ppl_text.argsort()[:16]])
pil_images = utils.torch_tensors_to_pil_list(images)
show(pil_images, 8)
Image Prompt (like Inpainting)
text = 'лодка с алыми парусами'
images_num = 1024
bs = 32
borders = {'up': 6, 'left': 4, 'right': 6, 'down': 2}
image_prompts = ImagePrompts(pil_img, borders, vae, device, crop_first=True)
seed_everything(42)
codebooks = []
for top_k, top_p, images_num in [
(1024, 0.99, images_num),
]:
codebooks.append(
generate_codebooks(text, tokenizer, model, top_k=top_k, images_num=images_num, top_p=top_p, bs=bs, image_prompts=image_prompts)
)
codebooks = torch.cat(codebooks)
ppl_text, ppl_image = self_reranking_by_text(
text,
codebooks,
tokenizer,
model,
bs=bs,
)
with torch.no_grad():
images = vae.decode(codebooks[ppl_text.argsort()[:16]])
pil_images = utils.torch_tensors_to_pil_list(images)
show(pil_images, 8)
Diffusion (TODO, see Colab)
Image Captioning + Self Reranking
texts = generate_captions(pil_img, tokenizer, model, vae, template='на картинке ', top_k=16, captions_num=128, bs=32, top_p=0.6, temperature=0.8, seed=43)
ppl_text, ppl_image = self_reranking_by_image(texts, pil_img, tokenizer, model, vae, bs=32, seed=42)
for idx in ppl_image.argsort()[:8]:
print(f'-{texts[idx]}')
-на картинке кораблик в лесу
-на картинке можно найти красивую картинку на телефон на заставку
-на картинке море с домиком
-на картинке как выглядит самый красивый мост в мире
-на картинке в хорошем качестве
-на картинке обои на рабочий стол
-на картинке можно скачать обои на рабочий стол
-на картинке изображен охотничий спаниель
-на картинке собака боксер
-на картинке собака похожа на стаффорда
-на картинке изображен белый бигль
-на картинке собака с большим носом
-на картинке собака похожая на стаффорда
-на картинке изображена собака с большим носом
-на картинке собака похожая на стаффордширский терьер
-на картинке изображена многоэтажка
-на картинке изображены два человека в здании
-на картинке изображены дома
-на картинке изображен дом с привидениями
-на картинке изображена гостиница
-на картинке изображены две квартиры
-на картинке здание в центре города
-на картинке изображен многоквартирный дом
-на картинке я вижу мотоцикл
-на картинке я хочу в таджикистан
-на картинке я вижу двухэтажную красивую красивую веранду с велосипедом и велосипедом
-на картинке изображена мотоцикл
-на картинке я вижу двухэтажный велосипед
-на картинке я вижу двухэтажную избу с велосипедом
-на картинке я хочу покрасить старый деревянный дом
-на картинке изображена машина с мотоциклом
Zero-Shot Image Classification using PPL
import base64
import requests
from PIL import Image
from io import BytesIO
bs4_urls = requests.get('https://raw.githubusercontent.com/sberbank-ai/ru-dolph/master/pics/pipelines/cats_vs_dogs_bs4.json').json()
f, ax = plt.subplots(2,4, figsize=(12,6))
for i, bs4_url in enumerate(bs4_urls):
pil_img = Image.open(BytesIO(base64.b64decode(bs4_url)))
classes = ['кошка', 'собака']
preds = zs_clf(
pil_img,
classes,
model,
tokenizer,
vae,
template = '{}',
)
ax[i//4, i%4].imshow(pil_img)
ax[i//4, i%4].set_title(preds['class'])
Linear Probe (TODO, see Colab)
Authors:
- Alex Shonenkov: Github, Kaggle GM
- Michael Konstantinov: Mishin Learning, Transformer Community
Citation
@article{shonenkov2022ruDolph,
title = {RuDOLPH: One Hyper-Modal Transformer can be creative as DALL-E and smart as CLIP},
author = {Alex Shonenkov and Michael Konstantinov},
year = {2022},
eprint = {...},
archivePrefix = {arXiv},
primaryClass = {cs.CL}
}
@misc{github2022ruDolph,
title = {RuDOLPH: One Hyper-Modal Transformer can be creative as DALL-E and smart as CLIP},
author = {Alex Shonenkov and Michael Konstantinov},
year = {2022},
howpublished = {\url{https://github.com/sberbank-ai/ru-dolph}},
}
Supported by
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for rudolph-0.0.1rc4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4e9fca1e65ba06fbda4eab1fd837f2714f94e96044861a96d82ffc49087b2033 |
|
MD5 | 45f7484ee779fc45124dbc4fd6dda352 |
|
BLAKE2b-256 | 5ed0a38bdedc82aed566de7f0b557ff8eabd08990ed44188564a6259ed5e5df7 |