Spaces:
Sleeping
Sleeping
| title: Two-Button Image Labeler | |
| emoji: π·οΈ | |
| colorFrom: yellow | |
| colorTo: green | |
| sdk: streamlit | |
| app_file: app.py | |
| pinned: false | |
| # Two-Button Image Labeler (HuggingFace Spaces) | |
| A zero-install app for collaborators to label images with **two buttons** (left/right). | |
| Perfect for quick yes/no or binary classification tasks with doctors or non-technical users. | |
| ## Features | |
| - Shows one image at a time. | |
| - Two big buttons (configurable labels). | |
| - Keyboard shortcuts: **A** for left, **L** for right. | |
| - "Skip" button. | |
| - Captures annotator's name. | |
| - Saves to `labels.csv` and (optionally) **auto-uploads** it back to your Space repository after every label. | |
| - Hides already-labeled images by default (configurable). | |
| - Works with multiple annotators at once (file lock ensures safe writes). | |
| --- | |
| ## Quick Start (HuggingFace Spaces) | |
| 1. Create a new **Space** β **Gradio**. | |
| 2. Upload the files from this repo (`app.py`, `requirements.txt`). You can use the zip attached or drag & drop. | |
| 3. Create a folder `images/` in the Space and upload your images there (PNG/JPG/etc.). | |
| 4. (Optional but recommended) Set secrets in the Space **Settings β Variables and secrets**: | |
| - `HF_TOKEN` β a write token from your Hugging Face account. | |
| - `HF_SPACE_REPO` β your Space repo id, e.g. `yourname/your-space`. | |
| - With these set, the app will push updates to `labels.csv` back into the repo automatically so you always have the latest labels. | |
| 5. Share the Space link with your doctors. They: | |
| - Enter their name | |
| - Click **Start** | |
| - Press **β Class A** or **Class B β** (or **A/L** keys) | |
| You can download the latest labels at any time with the **Download CSV** button (Admin section). | |
| --- | |
| ## Configuration (Environment Variables) | |
| | Variable | Default | Description | | |
| |---|---|---| | |
| | `IMAGE_DIR` | `images` | Folder containing images (can include subfolders). | | |
| | `LABELS_CSV` | `labels.csv` | Path to the CSV file saved by the app. | | |
| | `LABEL_A` | `Class A` | Text on the left button. | | |
| | `LABEL_B` | `Class B` | Text on the right button. | | |
| | `APP_TITLE` | `Two-Button Image Labeler` | Title at the top of the app. | | |
| | `APP_DESCRIPTION` | *(see app.py)* | Instructions shown under the title. | | |
| | `SHOW_ALREADY_LABELED` | `0` | If `1`, includes images that already have a label. | | |
| | `SHUFFLE_IMAGES` | `1` | If `1`, randomize image order per session. | | |
| | `HF_TOKEN` | *(none)* | Your HF write token. If set with `HF_SPACE_REPO`, labels are auto-pushed to the repo. | | |
| | `HF_SPACE_REPO` | *(none)* | Your Space repo id, e.g. `yourname/your-space`. | | |
| | `UPLOAD_TO_REPO` | `1` | If `1`, attempt to push labels to the repo on every write. | | |
| | `AUTH_USER`, `AUTH_PASS` | *(none)* | If set, password-protect the app (basic auth). Useful if your Space is public. | | |
| **Note:** If you keep `SHOW_ALREADY_LABELED=0`, the app hides any image that appears at least once in `labels.csv` (regardless of annotator). Set to `1` if you want multiple independent labels per image. | |
| --- | |
| ## CSV Format | |
| The app appends one row per click with these columns: | |
| - `image` β relative path to the image from `IMAGE_DIR` | |
| - `label` β the chosen label (`LABEL_A` or `LABEL_B`) | |
| - `annotator` β whatever the user entered under "Your name" | |
| - `timestamp` β ISO 8601 UTC time | |
| --- | |
| ## Deploy Locally (Optional) | |
| ```bash | |
| pip install -r requirements.txt | |
| python app.py | |
| ``` | |
| Then open http://localhost:7860 and start labeling. | |
| To add a password: | |
| ```bash | |
| export AUTH_USER=myuser | |
| export AUTH_PASS=mypassword | |
| python app.py | |
| ``` | |
| --- | |
| ## Tips for Medical Data | |
| - If images are sensitive, keep the Space **private** (available on paid HF plans) or enable basic auth via `AUTH_USER`/`AUTH_PASS`. | |
| - You can also host the same app on your institution's intranet server; itβs just a Gradio Python script. | |
| --- | |
| ## Troubleshooting | |
| - **No images found**: Make sure your Space repo has an `/images` folder with JPG/PNG files. | |
| - **CSV not updating in Git**: Set both `HF_TOKEN` and `HF_SPACE_REPO` secrets. The app uploads `labels.csv` using `huggingface_hub` on each write. | |
| - **Multiple annotators**: Supported. A file lock prevents collisions when writing `labels.csv`. | |