--- title: Emotion Recognition API emoji: ๐Ÿง  colorFrom: blue colorTo: purple sdk: docker sdk_version: latest app_file: app.py pinned: false --- # ๐Ÿ˜Š Emotion Recognition โ€“ Realโ€‘Time Facial Emotion Detection ![Python](https://img.shields.io/badge/Python-3.8+-blue.svg) ![PyTorch](https://img.shields.io/badge/PyTorch-Latest-orange.svg) ![FastAPI](https://img.shields.io/badge/FastAPI-Latest-green.svg) ![License](https://img.shields.io/badge/License-MIT-yellow.svg)
Emotion Recognition Demo *Real-time facial emotion detection using deep learning*
--- This project is a **realโ€‘time facial emotion recognition system** built around a **fineโ€‘tuned MobileNetV2 model**. We start from an **ImageNetโ€‘pretrained MobileNetV2**, fineโ€‘tune it on a custom facial emotion dataset, save the weights as `emotion_recognition_model.pth`, and then use that model behind a **FastAPI backend** and **browser-based webcam UI** to detect emotions such as ๐Ÿ˜  *Angry*, ๐Ÿ˜จ *Fear*, ๐Ÿ˜Š *Happy*, ๐Ÿ˜ข *Sad,* and ๐Ÿ˜ฒ *Surprise* from a live camera feed. --- ## โœจ Features - ๐Ÿค– **Fineโ€‘tuned deep learning model** โ€“ MobileNetV2 is fineโ€‘tuned on a labeled facial emotion dataset to specialize it for emotion recognition. - ๐Ÿ“น **Realโ€‘time detection** from your webcam (browser or local OpenCV). - ๐Ÿš€ **FastAPI REST API** endpoint for image-based emotion prediction. - ๐ŸŽจ **Simple HTML/JS frontend** that streams frames to the backend and displays the predicted emotion. - ๐Ÿ’ป **Standalone webcam script** (`webcam.py`) if you prefer running everything locally without the browser. --- ## ๐Ÿ“ Project Structure ``` ๐Ÿ“ฆ Emotion Recognition Project โ”œโ”€โ”€ ๐Ÿ“‚ frontend/ โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ index.html # Minimal UI with a video element and live emotion text โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ script.js # Grabs webcam frames, sends them to the backend โ”‚ โ””โ”€โ”€ ๐Ÿ“„ style.css # Basic styling for the page and video element โ”œโ”€โ”€ ๐Ÿ“‚ model/ โ”‚ โ”œโ”€โ”€ ๐Ÿ api.py # FastAPI app exposing POST /api/predict โ”‚ โ”œโ”€โ”€ ๐Ÿ inference.py # Loads model and defines predict(image) function โ”‚ โ”œโ”€โ”€ ๐Ÿ model.py # MobileNetV2 architecture definition โ”‚ โ”œโ”€โ”€ ๐Ÿ webcam.py # OpenCV-based realโ€‘time emotion recognition โ”‚ โ”œโ”€โ”€ ๐Ÿ““ working.ipynb # Jupyter notebook for fineโ€‘tuning MobileNetV2 โ”‚ โ”œโ”€โ”€ ๐Ÿ’พ emotion_recognition_model.pth # Fineโ€‘tuned PyTorch checkpoint โ”‚ โ””โ”€โ”€ ๐Ÿ“‚ Data/ # Dataset folders (Angry, Fear, Happy, Sad, Surprise) โ”œโ”€โ”€ ๐Ÿณ DockerFile # Docker image definition for deployment โ””โ”€โ”€ ๐Ÿ“‹ requirements.txt # Python dependencies ``` --- ## ๐Ÿ› ๏ธ Requirements ### System Requirements - ๐Ÿ **Python** 3.8+ (recommended) - ๐Ÿ“ฆ **pip** for installing dependencies - ๐Ÿ“ท A **webcam** - โšก (Optional) **GPU with CUDA** for faster inference, otherwise CPU will be used. ### Python Packages Python packages (also listed in `requirements.txt`): - `torch`, `torchvision` ๐Ÿ”ฅ - `numpy` ๐Ÿ”ข - `opencv-python` ๐Ÿ“น - `matplotlib` ๐Ÿ“Š - `pillow` ๐Ÿ–ผ๏ธ - `tqdm` ๐Ÿ“ˆ - `requests` ๐ŸŒ - `fastapi`, `uvicorn` โšก (install explicitly if missing) ### Installation You can install everything with: ```bash pip install -r requirements.txt fastapi uvicorn ``` --- ## ๐Ÿš€ How to Run ### ๐ŸŒ Web API + Frontend 1. **Navigate to the model folder**: ```bash cd model ``` 2. **Start the FastAPI server** (with Uvicorn): ```bash uvicorn api:app --host 0.0.0.0 --port 8000 --reload ``` 3. **Open the frontend**: - Option A: The API mounts the `frontend` folder as static files. Open your browser and go to: ```text http://localhost:8000/ ``` - If needed, ensure the working directory is such that `../frontend` (from `model/api.py`) points to the `frontend` folder in this repo. 4. **Allow camera access** ๐Ÿ“ท in the browser when prompted. 5. You should see the **live video** and the **predicted emotion** updating underneath! ๐ŸŽ‰ --- ### ๐Ÿ’ป Local Webcam Script (No Browser) If you prefer a pure Python / OpenCV pipeline: 1. Make sure dependencies are installed: ```bash pip install -r requirements.txt ``` 2. From the `model` directory, run: ```bash python webcam.py ``` 3. A window called **"Emotion Recognition"** will appear: - ๐Ÿ‘ค Detected faces will be highlighted with a bounding box. - ๐Ÿท๏ธ The predicted emotion label will be shown next to each face. - Press **`q`** to quit. --- ### ๐Ÿณ Run with Docker (Optional) If you prefer not to manage Python and system dependencies manually, you can use the provided `DockerFile`: 1. **Build the image** from the project root: ```bash docker build -t emotion-recognition -f DockerFile . ``` 2. **Run the container** and expose the API on port `8000`: ```bash docker run --rm -p 8000:8000 emotion-recognition ``` 3. Open your browser at: ```text http://localhost:8000/ ``` and allow camera access. The behavior is the same as in the "Web API + Frontend" section above. --- ## ๐Ÿง  Model & Inference Details - The model is a **MobileNetV2** classifier whose final layer is adapted to the number of emotion classes (e.g. ๐Ÿ˜  Angry, ๐Ÿ˜จ Fear, ๐Ÿ˜Š Happy, ๐Ÿ˜ข Sad, ๐Ÿ˜ฒ Surprise). - The **fineโ€‘tuned weights and class names** are stored in `emotion_recognition_model.pth`, which is produced by the training notebook (`working.ipynb`). - Images are preprocessed with: - ๐Ÿ“ Resize to \(224 \times 224\) - ๐Ÿ”„ Conversion to tensor - ๐Ÿ“Š Normalization with ImageNet mean and std - Inference is done by `inference.py` via: - `predict(pil_image)` โ†’ returns a string label, e.g. `"Happy"`. ### Testing the Model You can test the model directly with a static image (from the `model` directory): ```bash python inference.py ``` This will load `Image.jpg` and print the predicted emotion. --- ## ๐Ÿ“ก API Reference ### Endpoints - **`GET /`** - Returns a simple JSON status: `{"status": "API running"}`. - **`POST /api/predict`** - **Body**: `multipart/form-data` with a single field: - `file`: image file (e.g. JPEG/PNG). - **Response**: ```json { "emotion": "Happy" } ``` The frontend uses this endpoint to send frames from your webcam (as blobs) approximately once per second. --- ## ๐Ÿ“š Dataset & Training (Fineโ€‘Tuning Overview) - The (optional) `Data` directory is expected to contain labeled images organized by emotion: - ๐Ÿ˜  `Angry/`, ๐Ÿ˜จ `Fear/`, ๐Ÿ˜Š `Happy/`, ๐Ÿ˜ข `Sad/`, ๐Ÿ˜ฒ `Suprise/`. - The **fineโ€‘tuning process is captured in `working.ipynb`**: - Load an **ImageNetโ€‘pretrained MobileNetV2** from `torchvision`. - Replace the final classification layer so that its output dimension matches the number of emotion classes. - Create PyTorch `Dataset`/`DataLoader` objects from the `Data` folders with standard augmentations and preprocessing. - Train the network (typically using crossโ€‘entropy loss and an optimizer like Adam/SGD) while monitoring validation accuracy. - Save the best model checkpoint and class mapping to `emotion_recognition_model.pth`. - You can adapt the model for new datasets by: - Updating the `Data` folders and class list. - Reโ€‘running or modifying `working.ipynb` and, if needed, adjusting `model.py` for a different backbone or number of classes. **Dataset Source**: [Kaggle - Human Face Emotions](https://www.kaggle.com/datasets/samithsachidanandan/human-face-emotions) --- ## ๐Ÿ”ง Troubleshooting - **๐Ÿ“ท Camera access denied (browser)** - Check browser permissions and ensure you're using `http://localhost` (not `file://`). - **๐Ÿ”Œ "Backend not reachable" in the frontend** - Confirm the FastAPI server is running on the same host/port that `script.js` expects (`/api/predict` โ†’ default `http://localhost:8000/api/predict`). - Check for CORS issues or port conflicts. - **๐Ÿ“ฆ Model file not found** - Ensure `emotion_recognition_model.pth` is present in the `model` directory when running any Python scripts there. --- ## ๐Ÿ“„ License & Credits - The project uses **PyTorch**, **FastAPI**, **OpenCV**, and **PIL** under their respective licenses. - Dataset images in `Data/` should respect their original source licenses (not provided here). - Feel free to modify or extend this project for research, learning, or personal use. ---

Made with โค๏ธ using PyTorch, FastAPI, and OpenCV

โญ Star this repo if you find it helpful!