{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Vignette: Using the Synderm dataset" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from huggingface_hub import get_token\n", "from torch.utils.data import DataLoader\n", "from huggingface_hub import HfApi\n", "import matplotlib.pyplot as plt\n", "import webdataset as wds\n", "from PIL import Image\n", "import pandas as pd\n", "import json\n", "import io\n", "import re" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/workspace/synthetic-derm\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/workspace/synthetic-derm/.venv/lib/python3.10/site-packages/IPython/core/magics/osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n", " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n" ] } ], "source": [ "# Set path to root directory of package\n", "%cd ../../../" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dataset Statistics\n", "First, we will show some dataset statistics. Since the dataset is so large (about 1 million images), we have crawled the complete dataset beforehand and generated a csv file at `huggingface/folder_counts.csv`. This lists the total png image count for each combination of disease and synthetic generation type (pretrained/finetuned and inpaint/outpaint/text-to-image)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"huggingface/folder_counts.csv\")\n", "df = df.rename(columns={\"Image Count\": \"count\", \"Folder\": \"folder\"})\n", "\n", "# Define the pattern components\n", "extract = {\n", " \"submethods\": [\"inpaint\", \"inpaint_outpaint\", \"text_to_image\"],\n", " \"methods\": [\"inpaint\", \"text_to_image\"],\n", " \"ft\": [\"finetune\", \"pretrained\"]\n", "}\n", "\n", "def match_replace(str, values):\n", " for value in values:\n", " if str.endswith(value):\n", " stop_index = len(str) - len(value) - 1 # Account for underscore\n", " str = str[0:stop_index]\n", " return str, value\n", " return str, None # Return default if no match found\n", "\n", "df[\"label\"] = df[\"folder\"]\n", "for key, values in extract.items():\n", " result = df[\"label\"].apply(lambda x: match_replace(x, values))\n", " df[\"label\"] = result.apply(lambda x: x[0])\n", " df[key] = result.apply(lambda x: x[1])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
foldercountlabelsubmethodsmethodsft
0acne_finetune_text_to_image_text_to_image1260acnetext_to_imagetext_to_imagefinetune
1acne_vulgaris_finetune_text_to_image_text_to_i...2540acne_vulgaristext_to_imagetext_to_imagefinetune
2actinic_keratosis_finetune_text_to_image_text_...2940actinic_keratosistext_to_imagetext_to_imagefinetune
3all_finetune_inpaint_inpaint35300allinpaintinpaintfinetune
4all_finetune_inpaint_inpaint_outpaint35300allinpaint_outpaintinpaintfinetune
\n", "
" ], "text/plain": [ " folder count \\\n", "0 acne_finetune_text_to_image_text_to_image 1260 \n", "1 acne_vulgaris_finetune_text_to_image_text_to_i... 2540 \n", "2 actinic_keratosis_finetune_text_to_image_text_... 2940 \n", "3 all_finetune_inpaint_inpaint 35300 \n", "4 all_finetune_inpaint_inpaint_outpaint 35300 \n", "\n", " label submethods methods ft \n", "0 acne text_to_image text_to_image finetune \n", "1 acne_vulgaris text_to_image text_to_image finetune \n", "2 actinic_keratosis text_to_image text_to_image finetune \n", "3 all inpaint inpaint finetune \n", "4 all inpaint_outpaint inpaint finetune " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def print_table(totals):\n", " # Display formatted table\n", " print(\"-\" * 50)\n", " print(f\"{'Label':<40} {'Count':>10}\")\n", " print(\"-\" * 50)\n", " for label, count in totals.items():\n", " print(f\"{label:<40} {count:>10,}\")\n", " print(\"-\" * 50)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Total images per label:\n", "--------------------------------------------------\n", "Label Count\n", "--------------------------------------------------\n", "all 158,850\n", "psoriasis 121,048\n", "basal_cell_carcinoma 98,594\n", "squamous_cell_carcinoma 96,410\n", "lichen_planus 85,380\n", "allergic_contact_dermatitis 75,212\n", "lupus_erythematosus 68,164\n", "neutrophilic_dermatoses 64,344\n", "sarcoidosis 63,874\n", "photodermatoses 61,520\n", "folliculitis 49,645\n", "melanoma 4,400\n", "mycosis_fungoides 3,080\n", "actinic_keratosis 2,940\n", "prurigo_nodularis 2,650\n", "kaposi_sarcoma 2,610\n", "acne_vulgaris 2,540\n", "scleroderma 2,320\n", "scabies 2,030\n", "pyogenic_granuloma 1,950\n", "pityriasis_rubra_pilaris 1,670\n", "eczema 1,540\n", "drug_eruption 1,500\n", "nematode_infection 1,470\n", "granuloma_annulare 1,460\n", "erythema_multiforme 1,380\n", "dermatofibroma 1,370\n", "neurofibromatosis 1,310\n", "seborrheic_keratosis 1,300\n", "vitiligo 1,300\n", "acne 1,260\n", "dermatomyositis 1,210\n", "urticaria 1,180\n", "dariers_disease 1,170\n", "keloid 1,070\n", "pityriasis_rosea 1,060\n", "porokeratosis_actinic 1,060\n", "seborrheic_dermatitis 980\n", "ehlers_danlos_syndrome 940\n", "juvenile_xanthogranuloma 920\n", "superficial_spreading_melanoma_ssm 910\n", "stevens_johnson_syndrome 900\n", "lyme_disease 860\n", "telangiectases 860\n", "porphyria 840\n", "urticaria_pigmentosa 840\n", "tuberous_sclerosis 820\n", "necrobiosis_lipoidica 820\n", "fixed_eruptions 810\n", "lupus_subacute 790\n", "malignant_melanoma 790\n", "milia 780\n", "cheilitis 730\n", "scleromyxedema 680\n", "syringoma 630\n", "tungiasis 620\n", "papilomatosis_confluentes_and_reticulate 600\n", "hailey_hailey_disease 580\n", "pediculosis_lids 250\n", "--------------------------------------------------\n" ] } ], "source": [ "label_totals = df.groupby('label')['count'].sum().sort_values(ascending=False)\n", "print(\"\\nTotal images per label:\")\n", "print_table(label_totals)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Total images per generation type:\n", "--------------------------------------------------\n", "Label Count\n", "--------------------------------------------------\n", "text_to_image 795,021\n", "inpaint 105,900\n", "inpaint_outpaint 105,900\n", "--------------------------------------------------\n" ] } ], "source": [ "label_totals = df.groupby('submethods')['count'].sum().sort_values(ascending=False)\n", "print(\"\\nTotal images per generation type:\")\n", "print_table(label_totals)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dataset Details\n", "\n", "We have developed two version of the 1 million image synthetic derm dataset in [WebDataset](https://github.com/webdataset/webdataset) format. These are:\n", "\n", "1) [synthetic-derm-1M](https://huggingface.co/datasets/tbuckley/synthetic-derm-1M): This dataset is organized into .tar shards that contain at most 5,000 images (up to ~2GB). Each shard is named using the format: `shard-{disease-label}-{synthetic-generation-method}-{submethod}-{index}.tar`. An example shard name is `shard-vitiligo-finetune-text-to-image-text-to-image-00000.tar`. This dataset is intended for fine-grained retrieval of particular labels and generation methods.\n", "\n", "1) [synthetic-derm-1M-train](https://huggingface.co/datasets/tbuckley/synthetic-derm-1M-train): This dataset is also organized into .tar shards of the same size. However, we group images by generation method, perform a shuffle, and then shard this images. This dataset is better suited to model training since it has already been shuffled. Each shard is named using the format: `shard-{synthetic-generation-method}-{index}.tar`. For model training, the dataset can still be subset to specific labels.\n", "\n", "See [WebDataset FAQ](https://github.com/webdataset/webdataset/blob/main/FAQ.md) for many more examples of how to use these two datasets.\n", "\n", "Now, we will demonstrate how data can be selected and retrieved from the dataset. Shards contain a flat list of images and metadata (each image has its own metadata file with the same name). This allows the dataset to be serially unpacked and loaded from the cloud, meaning minimal memory and time overhead to use this dataset. The dataset can be loaded in less than a second.\n", "\n", "The typical workflow for using this large dataset is:\n", "1) Subset the dataset using the URL for selected labels and methods\n", "2) Iterate over the subset dataset\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will pull all the shard names from the HuggingFace repository and list a few." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".gitattributes\n", "data/shard-acne-finetune-text-to-image-text-to-image-00000.tar\n", "data/shard-acne-vulgaris-finetune-text-to-image-text-to-image-00000.tar\n", "data/shard-actinic-keratosis-finetune-text-to-image-text-to-image-00000.tar\n", "data/shard-all-finetune-inpaint-inpaint-00000.tar\n", "data/shard-all-finetune-inpaint-inpaint-00001.tar\n", "data/shard-all-finetune-inpaint-inpaint-00002.tar\n", "data/shard-all-finetune-inpaint-inpaint-00003.tar\n", "data/shard-all-finetune-inpaint-inpaint-00004.tar\n", "data/shard-all-finetune-inpaint-inpaint-00005.tar\n", "data/shard-all-finetune-inpaint-inpaint-00006.tar\n", "data/shard-all-finetune-inpaint-inpaint-00007.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00000.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00001.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00002.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00003.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00004.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00005.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00006.tar\n", "data/shard-all-finetune-inpaint-inpaint-outpaint-00007.tar\n" ] } ], "source": [ "api = HfApi()\n", "\n", "# Fetch the list of files in the dataset directory\n", "repo_id=\"tbuckley/synthetic-derm-1M\"\n", "files = api.list_repo_files(repo_id=repo_id, repo_type=\"dataset\")\n", "\n", "for file in files[0:20]:\n", " print(file)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "264" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(files)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1) Subsetting the dataset\n", "First, we will show a few different ways the dataset can be subset. We will start by selecting a few labels of interest, and pulling all instances of these labels that were generated using the `finetune-inpaint` strategy. For simplicity, we will only select the first indexed shard for each label. This means we will pull in at most 5,000 images for each label." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# Change this to a desired directory for caching shards. Shards that are downloaded will populate here\n", "cache_dir = \"/n/scratch/users/t/thb286/wds_cache\"" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# The labels we want to select\n", "labels = [\n", " \"allergic-contact-dermatitis\",\n", " \"basal-cell-carcinoma\", \n", " \"folliculitis\",\n", " \"lichen-planus\",\n", "]\n", "url = \"https://huggingface.co/datasets/tbuckley/synthetic-derm-1M/resolve/main/data/shard-{\" + \",\".join(labels) + \"}-finetune-inpaint-inpaint-00000.tar\"\n", "dataset = wds.WebDataset(url, cache_dir=cache_dir, shardshuffle=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will unpack and look at the first instance in this dataset. Since WebDataset is a streaming format, we cannot directory index any image -- we must iterate through all images. If you must have random access to images in this dataset, you can use the WebDataset `wids` library." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Keys in the dataset are: dict_keys(['__key__', '__url__', 'json', '__local_path__', 'png'])\n", "Image metadata {'name': 'allergic_contact_dermatitis_finetune_inpaint_inpaint_generations1_00_001d22ff2543f95d2d38c18da0446c84.png', 'md5hash': '001d22ff2543f95d2d38c18da0446c84', 'label': 'allergic-contact-dermatitis', 'method': 'finetune_inpaint', 'submethod': 'inpaint', 'generation_num': '00', 'tag': 'generations1'}\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Print out the first entry in the dataset:\n", "for item in dataset:\n", " print(f\"Keys in the dataset are: {item.keys()}\")\n", "\n", " metadata = json.loads(item[\"json\"])\n", " print(f\"Image metadata {metadata}\")\n", "\n", " # Decode and display the PNG image\n", " image = Image.open(io.BytesIO(item[\"png\"]))\n", " plt.figure(figsize=(2, 2))\n", " plt.imshow(image)\n", " plt.axis('off')\n", " plt.show()\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, for demonstrating purposes, we will iterate through the entire dataset we have just subset. We will print out the numbers of each class present in this dataset. This will take a few minutes." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Number of images per class:\n", "allergic-contact-dermatitis: 3580\n", "basal-cell-carcinoma: 4060\n", "folliculitis: 1910\n", "lichen-planus: 4120\n" ] } ], "source": [ "class_counts = {label: 0 for label in labels}\n", "\n", "for i, item in enumerate(dataset):\n", " metadata = json.loads(item[\"json\"])\n", "\n", " class_name = metadata[\"label\"]\n", " class_counts[class_name] += 1\n", "\n", "print(\"\\nNumber of images per class:\")\n", "for class_name, count in class_counts.items():\n", " print(f\"{class_name}: {count}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, for a more advanced example, we will select *all* shards for a list of labels. Since we don't a priori know the number of shards for each label, we will query HuggingFace for a list of all shards. We will then select the shards we need using our list of labels. We will then pass the list of shard URLs to the WebDataset constructor. Finally, we will iterate through the first 10 images in this new dataset and display them **(warning: graphic)**." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of shards collected: 28\n" ] } ], "source": [ "labels = [\n", " \"basal-cell-carcinoma\",\n", " \"allergic-contact-dermatitis\"\n", "]\n", "\n", "# Regex pattern to extract shard indices\n", "pattern = re.compile(\n", " r\"data/shard-(?P