Digambar29's picture
Changed file structure
c7cce82
---
title: Emotion Recognition API
emoji: 👨‍💻
colorFrom: indigo
colorTo: pink
sdk: docker
sdk_version: "{{sdkVersion}}"
app_file: app.py
pinned: false
---
## Emotion Recognition – Real‑Time Facial Emotion Detection
This project is a **real‑time facial emotion recognition system**.
It uses a **PyTorch MobileNetV2 model** on the backend and a **browser-based webcam UI** on the frontend to detect emotions such as *Angry, Fear, Happy, Sad,* and *Surprise* from a live camera feed.
### Features
- **Real‑time detection** from your webcam (browser or local OpenCV).
- **Pre‑trained deep learning model** (`emotion_recognition_model.pth`) based on MobileNetV2.
- **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
- **`frontend/`**
- `index.html` – Minimal UI with a video element and live emotion text.
- `script.js` – Grabs webcam frames, sends them to the backend (`/api/predict`), and updates the UI.
- `style.css` – Basic styling for the page and video element.
- **`model/`**
- `api.py` – FastAPI app exposing `POST /api/predict` and serving the frontend.
- `inference.py` – Loads the trained model and defines the `predict(image)` function.
- `model.py` – Helper to construct the MobileNetV2 architecture.
- `webcam.py` – OpenCV-based real‑time emotion recognition from your local webcam.
- `emotion_recognition_model.pth` – Trained PyTorch checkpoint (model weights + class labels).
- `Data/` – Dataset folders (`Angry`, `Fear`, `Happy`, `Sad`, `Suprise`) used for training.
- **`requirements.txt`** – Python dependencies.
---
### 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 (also listed in `requirements.txt`):
- `torch`, `torchvision`
- `numpy`
- `opencv-python`
- `matplotlib`
- `pillow`
- `tqdm`
- `requests`
- `fastapi`, `uvicorn` (install explicitly if missing)
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.
---
### How to Run – 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.
---
### Model & Inference Details
- The model is a **MobileNetV2** classifier with the final layer adapted to the number of emotion classes.
- The trained weights and class names are stored in `emotion_recognition_model.pth`.
- 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"`.
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
- **`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 (High Level)
- The `Data` directory contains labeled images organized by emotion:
- `Angry/`, `Fear/`, `Happy/`, `Sad/`, `Suprise/`.
- The model was trained externally (not fully captured in this repo) using this dataset and saved into `emotion_recognition_model.pth`.
- You can adapt the model for new datasets by:
- Updating the `Data` folders and class list.
- Adjusting `model.py` and the training script (not included here).
---
### 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.