CLIPfa: Connecting Farsi Text and Images
OpenAI released the paper Learning Transferable Visual Models From Natural Language Supervision
in which they present the CLIP (Contrastive Language–Image Pre-training) model. This model is trained to connect text and images, by matching their corresponding vector representations using a contrastive learning objective. CLIP consists of two separate models, a vision encoder and a text encoder. These were trained on a wooping 400 Million images and corresponding captions. We have trained a Farsi (Persian) version of OpenAI's CLIP on a dataset of 400,000 (image, text) pairs. We used Farahani's RoBERTa-fa
as the text encoder and ViT
as the vision encoder from Original CLIP and finetuned them.
It should be noted that only 400K pairs were used for this training, whereas 4 million pairs were used for the Original CLIP. Also, the training took 30 days across 592 GPUs powered by the V100 chip.
How to use?
Both models generate vectors with 768 dimensions.
from transformers import CLIPVisionModel, RobertaModel, AutoTokenizer, CLIPFeatureExtractor
# download pre-trained models
vision_encoder = CLIPVisionModel.from_pretrained('SajjadAyoubi/clip-fa-vision')
preprocessor = CLIPFeatureExtractor.from_pretrained('SajjadAyoubi/clip-fa-vision')
text_encoder = RobertaModel.from_pretrained('SajjadAyoubi/clip-fa-text')
tokenizer = AutoTokenizer.from_pretrained('SajjadAyoubi/clip-fa-text')
# define input image and input text
text = 'something'
image = PIL.Image.open('my_favorite_image.jpg')
# compute embeddings
text_embedding = text_encoder(**tokenizer(text, return_tensors='pt')).pooler_output
image_embedding = vision_encoder(**preprocessor(image, return_tensors='pt')).pooler_output
text_embedding.shape == image_embedding.shape
Demo:
The followings are just some use cases of CLIPfa on 25K Unsplash images
- use
pip install -q git+https://github.com/sajjjadayobi/clipfa.git
from clipfa import CLIPDemo
demo = CLIPDemo(vision_encoder, text_encoder, tokenizer)
demo.compute_text_embeddings(['گاو' ,'اسب' ,'ماهی'])
demo.compute_image_embeddings(test_df.image_path.to_list())
Image Search:
demo.image_search(query='غروب خورشید')
demo.image_search(query='جنگل در زمستان برفی')
Analogy:
demo.anology('sunset.jpg', additional_text='دریا')
demo.anology('sunset.jpg', additional_text='برف')
Zero Shot Image Classification:
demo.zero_shot(image_path='apples.jpg')
- Provided labels with their probability for each image.
گاو:36 , ماهی:22, اسب:42 | گاو:41 , ماهی:23, اسب:36 | گاو:26 , ماهی:45, اسب:27 |
---|---|---|
CLIPfa at Huggingface
🤗
spaces
Online Demo: We used a small set of images (25K) to keep this app almost real-time, but it's obvious that the quality of image search depends heavily on the size of the image database.
Dataset: 400K
We started with this question that how much the original Clip model depends on its big training dataset containing a lot of conceptual samples. Our model shows that It is possible to meet an acceptable enough target with only a little amount of data even though, It may not have known enough concepts and subjects to be used widely. Our model trained on a dataset gathered from different resources such as The Flickr30k, MS-COCO 2017, Google CCm3, ... . We used these datasets and translated them into the Persian language with a tool
prepared by ourselves. Using the Google Translate and Multilingual Similarity Check method we provided an automatic translator that has been given a list of English captions and filtered by the best translations.
- Note: We used
image2ds
a great tool to download large scale image datasets such as MS-COCO. It can download, resize and package 100M urls in 20h on one machine. Also supports saving captions for url+caption datasets. coco-flickr-fa 130K on Kaggle
Training:
Any dataset can be used with little change by the training code
. CLIPfa can be trained with other encoders as long as they have the same hidden size at the last layer. In this
notebook I used training code
to train a small CLIP on translated flickr30K
dataset.
↩️
Citation: If you have a technical question regarding the model, code or publication, create an issue in the repository. we didn't publish any papers on the work. However, if you did, please cite us properly with an entry like one below.
@misc{ParsBigBird,
author = {Sajjad Ayoubi, Navid Kanaani},
title = {CLIPfa: Connecting Farsi Text and Images},
year = 2021,
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/SajjjadAyobi/CLIPfa}},
}
Made with
❤️ in my basement🤫