diff --git a/notebooks/tr/_toctree.yml b/notebooks/tr/_toctree.yml index f5fb46a1..df2d0087 100644 --- a/notebooks/tr/_toctree.yml +++ b/notebooks/tr/_toctree.yml @@ -19,7 +19,13 @@ title: Özel Verisetini DETR Modeli ile Fine-Tuning ederek Nesne Tespiti Yapımı 🖼, Spaces Üzerinde Gösterimi ve Gradio API Entegrasyonu - local: fine_tuning_vit_custom_dataset title: Vision Transformer Modelini Özel Bir Biyomedikal Verisetiyle Fine-Tune Etmek - + + - title: Multimodal Tarifleri + isExpanded: false + sections: + - local: analyzing_art_with_hf_and_fiftyone + title: Multimodal Embedding ile Sanatsal Stillerin Analizi + - title: Ajanlar için Tarifler isExpanded: false sections: diff --git a/notebooks/tr/analyzing_art_with_hf_and_fiftyone.ipynb b/notebooks/tr/analyzing_art_with_hf_and_fiftyone.ipynb new file mode 100644 index 00000000..62557631 --- /dev/null +++ b/notebooks/tr/analyzing_art_with_hf_and_fiftyone.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multimodal Embedding ile Sanatsal Stillerin Analizi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Yazar: [Jacob Marks](https://huggingface.co/jamarks)*\n", + "*Çevirmen: [Aylin Gümüş](https://huggingface.co/aylingumus)*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Art Analysis Cover Image](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_cover_image.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Görüntüler gibi görsel veriler bilgi açısından inanılmaz derecede zengindir, ancak yapısal olmayan doğası gereği analiz etmesi zordur.\n", + "\n", + "Bu not defterinde, multimodal embedding yöntemlerini ve hesaplanan öznitelikleri kullanarak resimlerdeki sanatsal stillerin nasıl analiz edileceğini keşfedeceğiz. Veri analizi ve görselleştirme için kullanmak üzere FiftyOne'a yükleyeceğimiz 🤗 Hub'dan [WikiArt veri kümesini](https://huggingface.co/datasets/huggan/wikiart) kullanacağız. Verilere birçok farklı açıdan göz atacağız:\n", + "\n", + "- **Görüntü Benzerliği Arama ve Anlamsal (Semantik) Arama**: 🤗 Transformers tarafından önceden eğitilmiş bir [CLIP](https://huggingface.co/openai/clip-vit-base-patch32) modelini kullanarak multimodal embedding'leri üreteceğiz ve yapısal olmayan aramalara izin vermek için veriyi indeksleyeceğiz.\n", + "\n", + "- **Kümeleme ve Görselleştirme**: Embedding'leri kullanarak görüntüleri sanatsal stillerine göre kümeleyeceğiz ve UMAP boyut indirgeme yöntemini kullanarak sonuçları görselleştireceğiz.\n", + "\n", + "- **Benzersizlik Analizi**: Veri kümesindeki diğer görüntülere ne kadar benzediğine bağlı olarak her görüntü için benzersizlik skoru atamak için embedding'lerimizi kullanacağız.\n", + "\n", + "- **Görüntü Kalitesi Analizi**: Her bir görüntü için parlaklık, kontrast ve doygunluk gibi görüntü kalite metriklerini hesaplayacağız ve bu metriklerin, görüntülerin sanatsal stili ile nasıl ilişkili olduğunu göreceğiz." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hadi başlayalım! 🚀" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bu not defterini çalıştırmak için, aşağıdaki kütüphaneleri yüklemelisiniz:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -U transformers huggingface_hub fiftyone umap-learn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "İndirmeleri ışık hızında yapmak için [HF Transfer](https://pypi.org/project/hf-transfer/) yükleyin:\n", + "\n", + "```bash\n", + "pip install hf-transfer\n", + "```\n", + "\n", + "Ve `HF_HUB_ENABLE_HF_TRANSFER` ortam değişkenini ayarlayarak etkinleştirin:\n", + "\n", + "```bash\n", + "import os\n", + "os.environ[\"HF_HUB_ENABLE_HF_TRANSFER\"] = \"1\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "Not: Bu not defteri transformers==4.40.0, huggingface_hub==0.22.2 ve fiftyone==0.23.8 ile test edilmiştir.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Şimdi bu not defteri için gerekli olan modülleri içe aktaralım:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import fiftyone as fo # base library and app\n", + "import fiftyone.zoo as foz # zoo datasets and models\n", + "import fiftyone.brain as fob # ML routines\n", + "from fiftyone import ViewField as F # for defining custom views\n", + "import fiftyone.utils.huggingface as fouh # for loading datasets from Hugging Face" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hub'dan 🤗 FiftyOne'a WikiArt veri kümesini yükleyerek başlayacağız. Bu veri kümesi Hugging Face'in `datasets` kütüphanesi aracılığıyla da yüklenebilir, ancak biz verileri doğrudan Datasets sunucusundan almak için [FiftyOne'ın 🤗 Hub entegrasyonunu](https://docs.voxel51.com/integrations/huggingface.html#huggingface-hub) kullanacağız. Hesaplamaları hızlı yapmak için, sadece ilk $1,000$ örneği indireceğiz." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = fouh.load_from_hub(\n", + " \"huggan/wikiart\", ## repo_id\n", + " format=\"parquet\", ## for Parquet format\n", + " classification_fields=[\"artist\", \"style\", \"genre\"], # columns to store as classification fields\n", + " max_samples=1000, # number of samples to load\n", + " name=\"wikiart\", # name of the dataset in FiftyOne\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Veri kümesinin ne içerdiğini görmek için özetini ekrana yazdırın:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Name: wikiart\n", + "Media type: image\n", + "Num samples: 1000\n", + "Persistent: False\n", + "Tags: []\n", + "Sample fields:\n", + " id: fiftyone.core.fields.ObjectIdField\n", + " filepath: fiftyone.core.fields.StringField\n", + " tags: fiftyone.core.fields.ListField(fiftyone.core.fields.StringField)\n", + " metadata: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.metadata.ImageMetadata)\n", + " artist: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Classification)\n", + " style: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Classification)\n", + " genre: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Classification)\n", + " row_idx: fiftyone.core.fields.IntField\n" + ] + } + ], + "source": [ + "print(dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Veri kümesini [FiftyOne uygulamasında](https://docs.voxel51.com/user_guide/app.html) görselleştirin:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session = fo.launch_app(dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![WikiArt Dataset](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_wikiart_dataset.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hadi, stillerini analiz edeceğimiz artistlerin isimlerini listeleyelim:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Unknown Artist', 'albrecht-durer', 'boris-kustodiev', 'camille-pissarro', 'childe-hassam', 'claude-monet', 'edgar-degas', 'eugene-boudin', 'gustave-dore', 'ilya-repin', 'ivan-aivazovsky', 'ivan-shishkin', 'john-singer-sargent', 'marc-chagall', 'martiros-saryan', 'nicholas-roerich', 'pablo-picasso', 'paul-cezanne', 'pierre-auguste-renoir', 'pyotr-konchalovsky', 'raphael-kirchner', 'rembrandt', 'salvador-dali', 'vincent-van-gogh']\n" + ] + } + ], + "source": [ + "artists = dataset.distinct(\"artist.label\")\n", + "print(artists)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Benzer Sanat Eserlerini Bulma" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hoşunuza giden bir sanat eseri bulduğunuzda, ona benzer parçalar bulmak istemeniz doğaldır. Bunu vektör embedding'leriyle yapabiliriz! Dahası, multimodal embedding'leri aracılığıyla, bir tablonun ya da bir şiirin bile tanımı olabilecek, verilen bir metin sorgusunu en yakın temsil eden tabloları bulma yeteğini açacağız.\n", + "\n", + "Hadi, görüntüler için 🤗 Transformers tarafından önceden eğitilmiş bir CLIP Vision Transformer (ViT) modelini kullanarak multimodal embedding'leri üretelim. [FiftyOne Brain](https://docs.voxel51.com/user_guide/brain.html)'in `compute_similarity()` fonksiyonunu çalıştırmak, bu embedding'leri hesaplayacak ve bu embedding'leri, veri setinde bir benzerlik indeksi üretmek için kullanacak." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing embeddings...\n", + " 100% |███████████████| 1000/1000 [5.0m elapsed, 0s remaining, 3.3 samples/s] \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fob.compute_similarity(\n", + " dataset, \n", + " model=\"zero-shot-classification-transformer-torch\", ## type of model to load from model zoo\n", + " name_or_path=\"openai/clip-vit-base-patch32\", ## repo_id of checkpoint\n", + " embeddings=\"clip_embeddings\", ## name of the field to store embeddings\n", + " brain_key=\"clip_sim\", ## key to store similarity index info\n", + " batch_size=32, ## batch size for inference\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "Alternatif olarak, modeli doğrudan 🤗 Transformers kütüphanesinden yükleyebilir ve modeli doğrudan kullanabilirsiniz:\n", + "\n", + "```python\n", + "from transformers import CLIPModel\n", + "model = CLIPModel.from_pretrained(\"openai/clip-vit-base-patch32\")\n", + "fob.compute_similarity(\n", + " dataset, \n", + " model=model,\n", + " embeddings=\"clip_embeddings\", ## name of the field to store embeddings\n", + " brain_key=\"clip_sim\" ## key to store similarity index info\n", + ")\n", + "```\n", + "\n", + "Bu ve daha fazlası hakkında daha kapsamlı bir rehber için, FiftyOne'ın 🤗 Transformers entegrasyonunu inceleyin.\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "FiftyOne uygulamasını yenileyin, örnek listedeki bir görüntünün onay kutusunu seçin ve veri kümesindeki en benzer görüntüleri görmek için fotoğraf ikonuna tıklayın. Arka planda, bu butona tıklamak, seçilen görüntüye en çok benzeyen görüntüleri bulan benzerlik indeksi, önceden hesaplanmış embedding'lere dayanarak bir sorguyu tetikler ve bunları uygulamada gösterir." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Image Similarity Search](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_image_search.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bunu, verilen sanat eserine hangi sanat eserlerinin en çok benzediğini görmek için kullanabiliriz. Benzer sanat eserlerini bulmak (kullanıcılara önermek ya da bir koleksiyona eklemek için) ya da yeni bir eser için ilham almak amacıyla faydalı olabilir." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ama dahası var! CLIP multimodal olduğu için, anlamsal (semantik) aramalar gerçekleştirmek için de kullanabiliriz! Bu, metin sorgularına dayalı görüntü araması yapabileceğimiz anlamına geliyor. Örneğin, \"pastel ağaçlar\" metniyle arama yapabiliriz ve veri kümesinde bu sorguya benzeyen tüm görüntüleri görebiliriz. Bunu yapmak için FiftyOne uygulamasındaki arama butonuna tıklayın ve bir metin sorgusu girin:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Semantic Search](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_semantic_search.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sahne arkasında, metin tokenize edilir, CLIP'in metin kodlayıcısı ile gömülür, ardından veri kümesindeki en benzer görüntüleri bulmak için benzerlik indeksini sorgulamak için kullanılır. Bu, metin sorgularına dayalı görüntü aramak için oldukça etkili bir yöntemdir ve belirli bir tema ya da stille eşleşen görüntüleri bulmak için faydalı olabilir. Ve bu CLIP ile sınırlı değil; görüntüler ve metin için embedding'ler üretebilen 🤗 Transformers'tan herhangi bir CLIP-benzeri model kullanabilirsiniz!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "💡 Etkili vektör araması ve büyük veri kümeleri üzerinde indeksleme için, Fifty One'ın açık kaynak vektör veritabanları ile yerel entegrasyonları var.\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Kümeleme ve Görselleştirme ile Sanatsal Motiflerin Ortaya Çıkarılması" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Benzerlik ve anlamsal (semantik) aramalar yaparak verilerle daha etkili bir şekilde etkileşim kurmaya başlayabiliriz. Ancak bunu bir adım daha ileri götürebilir ve işin içine biraz da denetimsiz öğrenme ekleyebiliriz. Bu, WikiArt veri kümesindeki sanatsal paternleri belirlememize yardımcı olacak; stilistik, topikal ve hatta kelimelerle ifade edilmesi zor olan motifleri bile.\n", + "\n", + "Bunu iki yöntemle yapacağız:\n", + "\n", + "1. **Boyut İndirgeme**: Embedding'lerin boyutunu 2B'ye indirgemek ve verileri bir dağılım grafiğinde görselleştirmek için UMAP yöntemini kullanacağız. Bu, görüntülerin stillerine, türlerine ve artistlerine göre nasıl kümelendiğini görmemizi sağlayacaktır.\n", + "2. **Kümeleme**: Görüntüleri embedding'lerine göre kümelemek ve hangi grupların ortaya çıktığını görmek için K-Means kümeleme yöntemini kullanacağız." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Boyut indirgeme için, önceden hesaplanmış embedding'leri parametre olarak geçerek FiftyOne Brain'den `compute_visualization()` fonksiyonunu çalıştıracağız. Boyut indirgeme amacıyla UMAP yöntemini kullanmak için `method=\"umap\"` olarak belirtiyoruz, ancak PCA veya t-SNE de kullanabiliriz:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating visualization...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/Caskroom/miniforge/base/envs/fdev/lib/python3.9/site-packages/numba/cpython/hashing.py:482: UserWarning: FNV hashing is not implemented in Numba. See PEP 456 https://www.python.org/dev/peps/pep-0456/ for rationale over not using FNV. Numba will continue to work, but hashes for built in types will be computed using siphash24. This will permit e.g. dictionaries to continue to behave as expected, however anything relying on the value of the hash opposed to hash as a derived property is likely to not work as expected.\n", + " warnings.warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "UMAP( verbose=True)\n", + "Tue Apr 30 11:51:45 2024 Construct fuzzy simplicial set\n", + "Tue Apr 30 11:51:46 2024 Finding Nearest Neighbors\n", + "Tue Apr 30 11:51:47 2024 Finished Nearest Neighbor Search\n", + "Tue Apr 30 11:51:48 2024 Construct embedding\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98dde3df324249df91f3336c913b409a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Epochs completed: 0%| 0/500 [00:00]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\tcompleted 0 / 500 epochs\n", + "\tcompleted 50 / 500 epochs\n", + "\tcompleted 100 / 500 epochs\n", + "\tcompleted 150 / 500 epochs\n", + "\tcompleted 200 / 500 epochs\n", + "\tcompleted 250 / 500 epochs\n", + "\tcompleted 300 / 500 epochs\n", + "\tcompleted 350 / 500 epochs\n", + "\tcompleted 400 / 500 epochs\n", + "\tcompleted 450 / 500 epochs\n", + "Tue Apr 30 11:51:49 2024 Finished embedding\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fob.compute_visualization(dataset, embeddings=\"clip_embeddings\", method=\"umap\", brain_key=\"clip_vis\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Şimdi FiftyOne uygulamasında veri kümesindeki her görüntü için 2B bir nokta göreceğimiz bir panel açabiliriz. Bu niteliklerin görüntü özelliklerimiz tarafından ne kadar güçlü bir şekilde yakalandığını görmek için, veri kümesindeki noktaları artist veya tür gibi alanlara göre renklendirebiliriz:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![UMAP Visualization](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_visualize_embeddings.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Benzer görüntüleri bir arada gruplayabilmek için embedding'ler üzerinde kümeleme de yapabiliriz — belki bu sanat eserlerinin dominant özellikleri halihazırda var olan etiketler tarafından algılanmamıştır ya da belki tanımlamak istediğimiz farklı alt türler vardır. Verilerimizi kümelemek için [FiftyOne Clustering Plugin](https://github.com/jacobmarks/clustering-plugin)'i indirmemiz gerekecek:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!fiftyone plugins download https://github.com/jacobmarks/clustering-plugin" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uygulamayı tekrar yenileyerek, kümeleme fonksiyonalitesine uygulamadaki bir operatör yardımıyla erişebiliriz. Operatör listesini açmak için ters tırnak tuşuna basın, \"cluster\" yazın ve açılan menüden operatörü seçin. Bu, kümeleme algoritmasını, hiperparametreleri ve kümelenecek alanı belirleyebileceğimiz etkileşimli bir panel açacaktır. Basit tutmak için, $10$ küme ile K-Means kümelemesini kullanacağız:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Böylelikle kümeleri uygulamada görselleştirebilir ve görüntülerin embedding'lerine göre nasıl gruplandığını görebiliriz:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![K-means Clustering](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_clustering.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bazı kümelerin artisti, bazılarının ise türü veya stili temel aldığını görebiliriz. Diğerleri ise daha soyut ve veriden ilk bakışta anlaşılamayan alt türleri veya diğer gruplamaları temsil edebilir." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## En Benzersiz Sanat Eserlerinin Belirlenmesi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Veri kümemiz hakkında sorabileceğimiz ilginç sorulardan biri, her görüntünün ne kadar eşsiz olduğudur. Bu soru, benzer görüntüleri önerilmesi, kopyaların tespit edilmesi veya aykırı değerlerin belirlenmesi gibi birçok uygulama için önemlidir. Sanat eseri bağlamında, bir tablonun ne kadar eşsiz olduğu, onun değerini belirlemede önemli bir faktör olabilir.\n", + "\n", + "Benzersizliği tanımlamanın milyonlarca yolu olsa da, görüntü embedding'lerimiz, her örneğe veri kümesindeki diğer örneklere ne kadar benzer olduğuna göre nicel olarak bir benzersizlik skoru atamamızı sağlar. Açıkçası, FiftyOne Brain'in `compute_uniqueness()` fonksiyonu, her örneğin embedding'i ile en yakın komşuları arasındaki mesafeye bakar ve bu mesafeye göre $0$ ile $1$ arasında bir skor hesaplar. Skorun $0$ olması, örneğin belirgin olmayan veya diğerlerine çok benzeyen bir örnek olduğunu; $1$ olması ise çok benzersiz bir örnek olduğunu gösterir." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing uniqueness...\n", + "Uniqueness computation complete\n" + ] + } + ], + "source": [ + "fob.compute_uniqueness(dataset, embeddings=\"clip_embeddings\") # compute uniqueness using CLIP embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Böylece embedding panelinde buna göre renklendirme yapabilir, benzersizlik skoruna göre filtreleyebilir ve hatta sıralayarak veri kümesindeki en benzersiz görüntüleri görebiliriz." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "most_unique_view = dataset.sort_by(\"uniqueness\", reverse=True)\n", + "session.view = most_unique_view.view() # Most unique images" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Most Unique Images](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_most_unique.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "least_unique_view = dataset.sort_by(\"uniqueness\", reverse=False)\n", + "session.view = least_unique_view.view() # Least unique images" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Least Unique Images](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_least_unique.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bir adım daha ileriye giderek, hangi artistin en benzersiz eserleri üretme eğiliminde olduğu sorusunu da cevaplayabiliriz. Her artistin tüm sanat eserleri için ortalama benzersizlik skorunu hesaplayabiliriz." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unknown Artist: 0.7932221632002723\n", + "boris-kustodiev: 0.7480731948424676\n", + "salvador-dali: 0.7368807620414014\n", + "raphael-kirchner: 0.7315448102204755\n", + "ilya-repin: 0.7204744626806383\n", + "marc-chagall: 0.7169373812321908\n", + "rembrandt: 0.715205220292227\n", + "martiros-saryan: 0.708560775790436\n", + "childe-hassam: 0.7018343391132756\n", + "edgar-degas: 0.699912746806587\n", + "albrecht-durer: 0.6969358680800216\n", + "john-singer-sargent: 0.6839955708720844\n", + "pablo-picasso: 0.6835137858302969\n", + "pyotr-konchalovsky: 0.6780653000855895\n", + "nicholas-roerich: 0.6676504687452387\n", + "ivan-aivazovsky: 0.6484361530090199\n", + "vincent-van-gogh: 0.6472004520699081\n", + "gustave-dore: 0.6307283287457358\n", + "pierre-auguste-renoir: 0.6271467146993583\n", + "paul-cezanne: 0.6251076007168186\n", + "eugene-boudin: 0.6103397516167454\n", + "camille-pissarro: 0.6046182609119615\n", + "claude-monet: 0.5998234558947573\n", + "ivan-shishkin: 0.589796389836674\n" + ] + } + ], + "source": [ + "artist_unique_scores = {\n", + " artist: dataset.match(F(\"artist.label\") == artist).mean(\"uniqueness\")\n", + " for artist in artists\n", + "}\n", + "\n", + "sorted_artists = sorted(\n", + " artist_unique_scores, key=artist_unique_scores.get, reverse=True\n", + ")\n", + "\n", + "for artist in sorted_artists:\n", + " print(f\"{artist}: {artist_unique_scores[artist]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Görünüşe göre, veri kümemizdeki en benzersiz eserlere sahip artist Boris Kustodiev! Hadi bazı eserlerine göz atalım:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "kustodiev_view = dataset.match(F(\"artist.label\") == \"boris-kustodiev\")\n", + "session.view = kustodiev_view.view()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Boris Kustodiev Artwork](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_kustodiev_view.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sanat Eserinin Görsel Özelliklerle Karakterize Edilmesi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Her şeyi toparlayacak olursak, temel konulara geri dönelim ve veri kümemizdeki görüntülerin bazı temel özelliklerini analiz edelim. Her bir görüntü için parlaklık, kontrast ve doygunluk gibi standart metrikleri hesaplayacağız ve bu metriklerin sanat eserlerinin sanatsal stili ve türü ile nasıl ilişkili olduğunu göreceğiz." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bu analizleri yapmak için, [FiftyOne Image Quality Plugin](https://github.com/jacobmarks/image-quality-issues)'ini indirmemiz gerekecek:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!fiftyone plugins download https://github.com/jacobmarks/image-quality-issues/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uygulamayı yenileyin ve operatör listesini tekrar açın. Bu kez `compute` yazın ve görüntü kalitesi operatörlerinden birini seçin. Parlaklık ile başlayacağız:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Compute Brightness](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_compute_brightness.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Operatör çalışmayı tamamladığında, her bir görüntü için parlaklık skoru içeren yeni bir alan veri kümemize eklenmiş olacak. Böylece bu veriyi uygulamada görselleştirebiliriz:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Brightness](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_brightness.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aynı zamanda parlaklığa göre renklendirebilir ve hatta stil gibi veri kümesindeki diğer alanlarla nasıl ilişkili olduğunu da görebiliriz:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Style by Brightness](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_style_by_brightness.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Şimdi aynı işlemi kontrast ve doygunluk için de yapalım. İşte doygunluk için elde edilen sonuçlar:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Filter by Saturation](https://huggingface.co/datasets/huggingface/cookbook-images/resolve/main/art_analysis_filter_by_saturation.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Umarız bu, verilerinize derin sinir ağları uygulamanın her şey demek olmadığını gösteriyordur. Bazen basit metrikler de en az onlar kadar bilgi verebilir ve verinize farklı bir bakış açısı kazandırabilir 🤓!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "📚 Daha büyük veri kümeleri için, işlemleri daha sonra yürütülmek üzere devretmeyi düşünebilirsiniz.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sırada Ne Var?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bu not defterinde, görüntülerdeki sanatsal stilleri analiz etmek için, multimodal embedding'leri nasıl kullanacağımızı, gözetimsiz öğrenmeyi ve geleneksel görüntü işleme tekniklerini keşfettik. Görüntü benzerliği ve anlamsal (semantik) arama işlemlerini nasıl gerçekleştirebileceğimizi, görüntüleri stillerine göre nasıl kümeleyeceğimizi, görüntülerin benzersizliğini nasıl analiz edeceğimizi ve görüntü kalite metriklerini nasıl hesaplayacağımızı gördük. Bu teknikler, sanat eseri koleksiyonlarından tıbbi görüntülere veya uydu görüntülerine kadar çok çeşitli görsel veri kümelerine uygulanabilir. [Hugging Face Hub üzerinden farklı bir veri kümesi yüklemeyi deneyin](https://docs.voxel51.com/integrations/huggingface.html#loading-datasets-from-the-hub) ve veriye hangi farklı bakış açılarıyla yaklaşabileceğinizi keşfedin!\n", + "\n", + "Daha da ileri gitmek isterseniz, aşağıdaki bazı ek analizleri de deneyebilirsiniz:\n", + "\n", + "- **Sıfır-Atış Sınıflandırma (Zero-Shot Classification)**: 🤗 Transformers tarafından önceden eğitilmiş bir görsel-dil modelini kullanarak, herhangi bir eğitim verisine ihtiyaç duymadan, veri kümesindeki görüntüleri konuya ya da içeriğe göre sınıflandırabilirsiniz. Daha fazla bilgi için [Zero-Shot Classification eğitimi](https://docs.voxel51.com/tutorials/zero_shot_classification.html)'ne göz atın.\n", + "- **Görüntü Açıklama (Image Captioning)**: 🤗 Transformers tarafından önceden eğitilmiş bir görsel-dil modelini kullanarak, veri kümesindeki görseller için açıklamalar (caption) oluşturabilirsiniz. Bu açıklamaları konu modellemesinde kullanabilir veya bu açıklamaların embedding'lerine göre sanat eserlerini kümelendirebilirsiniz. Daha fazla bilgi için FiftyOne'ın [Image Captioning Plugin](https://github.com/jacobmarks/fiftyone-image-captioning-plugin)'ine göz atın." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 📚 Kaynaklar" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- [FiftyOne 🤝 🤗 Hub Integration](https://docs.voxel51.com/integrations/huggingface.html#huggingface-hub)\n", + "- [FiftyOne 🤝 🤗 Transformers Integration](https://docs.voxel51.com/integrations/huggingface.html#transformers-library)\n", + "- [FiftyOne Vector Search Integrations](https://voxel51.com/vector-search/)\n", + "- [Visualizing Data with Dimensionality Reduction Techniques](https://docs.voxel51.com/tutorials/dimension_reduction.html)\n", + "- [Clustering Images with Embeddings](https://docs.voxel51.com/tutorials/clustering.html)\n", + "- [Exploring Image Uniqueness with FiftyOne](https://docs.voxel51.com/tutorials/uniqueness.html)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## FiftyOne Açık Kaynak Projesi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[FiftyOne](https://github.com/voxel51/fiftyone/) yüksek kalitede veri kümeleri ve bilgisayarla görme modelleri oluşturmak için kullanılan önde gelen açık kaynak araç setidir. 2 milyondan fazla kez indirilen FiftyOne, dünya genelindeki geliştiriciler ve araştırmacılar tarafından güvenle kullanılmaktadır.\n", + "\n", + "💪 FiftyOne ekibi, açık kaynak topluluğundan gelen katkıları memnuniyetle karşılar! Eğer FiftyOne'a katkıda bulunmak istiyorsanız, [katkı rehberine](https://github.com/voxel51/fiftyone/blob/develop/CONTRIBUTING.md) göz atabilirsiniz." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "fdev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}