File size: 10,070 Bytes
60cd555
3990ff5
2a2d987
213ba68
 
ef1a0b5
 
60cd555
2a2d987
 
 
 
 
ef1a0b5
17f8e21
ef1a0b5
3990ff5
60cd555
 
3990ff5
2a2d987
3990ff5
90d44fa
3990ff5
2a2d987
3990ff5
 
 
 
 
 
 
 
 
 
2a2d987
3990ff5
2a2d987
3990ff5
ef1a0b5
3990ff5
 
ef1a0b5
 
3990ff5
ef1a0b5
 
 
 
 
 
3990ff5
 
ef1a0b5
 
3990ff5
 
 
ef1a0b5
3990ff5
 
 
 
 
ef1a0b5
 
 
3990ff5
 
ef1a0b5
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
ef1a0b5
 
 
3990ff5
ef1a0b5
3990ff5
 
ef1a0b5
3990ff5
ef1a0b5
3990ff5
ef1a0b5
 
 
 
 
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef1a0b5
 
 
3990ff5
ef1a0b5
 
 
 
 
3990ff5
ef1a0b5
 
 
 
 
3990ff5
ef1a0b5
 
2a2d987
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2a2d987
3990ff5
 
 
 
2a2d987
3990ff5
 
 
2a2d987
3990ff5
2a2d987
3990ff5
 
 
 
 
2a2d987
3990ff5
 
 
 
17f8e21
3990ff5
 
 
 
17f8e21
3990ff5
 
 
 
17f8e21
3990ff5
 
 
 
 
 
 
 
17f8e21
ef1a0b5
17f8e21
 
3990ff5
 
 
 
ef1a0b5
17f8e21
 
3990ff5
17f8e21
 
3990ff5
ef1a0b5
 
17f8e21
3990ff5
17f8e21
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17f8e21
3990ff5
 
 
 
 
17f8e21
3990ff5
17f8e21
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17f8e21
3990ff5
 
 
 
 
 
 
 
 
 
 
 
 
ef1a0b5
2a2d987
 
 
3990ff5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
---
title: Production AI Food Recognition API
emoji: 🍽️
colorFrom: red
colorTo: pink
sdk: docker
app_port: 7860
pinned: false
license: mit
tags:
  - food-recognition
  - computer-vision
  - nutrition
  - fastapi
  - food-101
  - pytorch
  - production
---

# 🍽️ Production AI Food Recognition API

**Enterprise-grade FastAPI backend** with multi-model ensemble for comprehensive food recognition covering 3000+ food categories and real-time nutritional analysis.

## 🎯 Production Features

- πŸ€– **Multi-Model Ensemble** - 5+ specialized AI models (3000+ food categories)
- 🎯 **Intelligent Voting** - Combines predictions from multiple models for accuracy
- ⚑ **Production Optimizations** - Model warm-up, memory management, error handling
- πŸ”„ **Auto Device Detection** - GPU β†’ MPS β†’ CPU fallback
- πŸ“Š **Real-time Nutrition API** - 5 external databases with fallback chain
- πŸ–ΌοΈ **Enhanced Preprocessing** - Contrast boost + sharpness enhancement
- 🌐 **CORS Enabled** - Ready for frontend integration
- πŸ”’ **Security Headers** - Production-safe configuration
- πŸ“ˆ **Health Monitoring** - Comprehensive health checks
- 🌍 **Global Food Coverage** - Balkans, Europe, US, Asia, and more

## πŸš€ API Endpoints

### Main Endpoints

#### `POST /api/nutrition/analyze-food`
**Next.js Frontend Integration**

```bash
curl -X POST "https://your-space.hf.space/api/nutrition/analyze-food" \
  -F "[email protected]"
```

**Response:**
```json
{
  "label": "Pizza",
  "confidence": 0.9970,
  "nutrition": {
    "calories": 266,
    "protein": 11.0,
    "carbs": 33.0,
    "fat": 10.0
  },
  "alternatives": [
    {"label": "Lasagna", "confidence": 0.0015, "confidence_pct": "0.2%"},
    {"label": "Calzone", "confidence": 0.0008, "confidence_pct": "0.1%"}
  ],
  "source": "AI Food Recognition"
}
```

#### `POST /analyze`
**Hugging Face Spaces UI**

Returns detailed response with model information for testing interface.

#### `GET /health`
**Health Check**

```json
{
  "status": "healthy",
  "model_loaded": true,
  "device": "CUDA",
  "model": "nateraw/food",
  "memory_usage": "1250.3MB"
}
```

## πŸ”§ Next.js Integration

### Backend Route
```typescript
// app/api/nutrition/analyze-food/route.js
export async function POST(request) {
  const formData = await request.formData();
  
  const response = await fetch(
    'https://your-hf-space.hf.space/api/nutrition/analyze-food',
    {
      method: 'POST',
      body: formData,
    }
  );
  
  if (!response.ok) {
    throw new Error(`Backend API error: ${response.status}`);
  }
  
  const data = await response.json();
  
  // Transform to your app's format
  return Response.json({
    foodName: data.label,
    confidence: data.confidence,
    calories: Math.round(data.nutrition.calories),
    proteins: +data.nutrition.protein.toFixed(1),
    carbs: +data.nutrition.carbs.toFixed(1),
    fats: +data.nutrition.fat.toFixed(1),
    // ... other fields
  });
}
```

### Frontend Usage
```typescript
const analyzeFood = async (file: File) => {
  const formData = new FormData();
  formData.append('file', file);

  const res = await fetch('/api/nutrition/analyze-food', {
    method: 'POST',
    body: formData,
  });

  const data = await res.json();
  console.log(`${data.foodName} (${Math.round(data.confidence * 100)}%)`);
};
```

## 🧠 AI Models & Food Categories (3000+ total)

### **Multi-Model Architecture**
1. **Food-101 Specialist** (`nateraw/food`) - 101 categories
   - Core food recognition, high accuracy
2. **Extended Food Model** (`Kaludi/food-category-classification-v2.0`) - 2000 categories  
   - International cuisines, regional foods
3. **Nutrition Labels** (`microsoft/DiT-base-finetuned-SROIE`) - 1000 categories
   - Packaged foods, ingredient recognition
4. **General Objects** (`google/vit-base-patch16-224`) - 1000+ categories
   - Raw ingredients, fruits, vegetables
5. **Microsoft BEiT** (`microsoft/beit-base-patch16-224`) - 1000+ categories
   - Advanced object detection

### **Supported Food Categories**
- **πŸ‡§πŸ‡¦ Balkanska jela:** Δ†evapi, Burek, Pljeskavica, Sarma, Klepe, Kajmak, Ajvar
- **🍝 Italijanska:** Pizza, Pasta, Risotto, Lasagna, Gnocchi, Tiramisu
- **🍜 Azijska:** Sushi, Ramen, Pad Thai, Dim Sum, Curry, Bibimbap, Kimchi
- **πŸ” Američka:** Hamburger, Hot Dog, BBQ, Pancakes, Waffles, Nachos
- **πŸ₯— Zdrava hrana:** Salate, Smoothie, Quinoa, Avocado, Nuts, Seeds
- **🍎 VoΔ‡e:** Apple, Banana, Orange, Berries, Tropical fruits
- **πŸ₯• PovrΔ‡e:** Tomato, Cucumber, Peppers, Leafy greens, Root vegetables
- **πŸ₯© Meso i riba:** Beef, Chicken, Pork, Salmon, Seafood
- **πŸ§€ Mlečni proizvodi:** Cheese varieties, Yogurt, Milk products
- **🍰 Deserti:** Cakes, Cookies, Ice cream, Pastries

## βš™οΈ Production Configuration

### Resource Requirements
| Deployment | CPU | RAM | Storage | Inference Time |
|------------|-----|-----|---------|----------------|
| **CPU** | 2-4 cores | 4-8GB | 3GB | 2-4s |
| **GPU (T4)** | 2 cores | 8-16GB | 3GB | 0.3-0.7s |
| **GPU (A10G)** | 4 cores | 16-24GB | 3GB | 0.2-0.4s |

### Environment Variables

#### Required for Production
```bash
# Custom port (default: 7860)
PORT=7860

# Nutrition API Keys (OPTIONAL - works without any keys!)
USDA_API_KEY=your_usda_key_here           # Optional: Better USDA results
EDAMAM_APP_ID=your_edamam_app_id          # Optional: Premium nutrition data
EDAMAM_APP_KEY=your_edamam_app_key        
SPOONACULAR_API_KEY=your_spoonacular_key  # Optional: Recipe data
```

#### Optional
```bash
# Custom model cache location
TRANSFORMERS_CACHE=/app/model_cache

# Log level
LOG_LEVEL=INFO
```

#### Nutrition Data Sources (Automatic Fallback Chain)

**πŸ†“ COMPLETELY FREE APIs (No limits):**
1. **OpenFoodFacts** (2M+ products worldwide)
   - No registration needed
   - Collaborative database like Wikipedia for food
   - Global coverage, great for packaged foods

2. **USDA FoodData Central** (1M+ foods)
   - Free API key from: https://fdc.nal.usda.gov/api-guide.html
   - Comprehensive US foods database
   - Government data, very accurate

3. **FoodRepo** (European foods)
   - No registration needed
   - Swiss food database
   - Great for European/organic foods

**πŸ’° LIMITED FREE APIs:**
4. **Edamam Nutrition API** (1000/month)
   - Register at: https://developer.edamam.com/
   - Premium nutrition analysis

5. **Spoonacular** (150/day)
   - Register at: https://spoonacular.com/food-api
   - Recipe-focused database

### File Size Limits
- **Max file size:** 10MB
- **Max image dimension:** 512px (auto-resized)
- **Supported formats:** JPEG, PNG, WebP

## πŸ› οΈ Local Development

```bash
# Clone and setup
git clone <repository-url>
cd food_recognition_backend

# Install dependencies
pip install -r requirements.txt

# Run development server
python app.py

# Server starts on http://localhost:7860
# API docs at http://localhost:7860/docs
```

## πŸ§ͺ Testing

### Test with cURL
```bash
# Test health
curl http://localhost:7860/health

# Test food recognition
curl -X POST http://localhost:7860/api/nutrition/analyze-food \
  -F "file=@test_image.jpg"
```

### Test with Python
```python
import requests

with open('pizza.jpg', 'rb') as f:
    response = requests.post(
        'http://localhost:7860/api/nutrition/analyze-food',
        files={'file': f}
    )
    
result = response.json()
print(f"Food: {result['label']} ({result['confidence']:.1%})")
print(f"Calories: {result['nutrition']['calories']}")
```

## πŸš€ Deployment to Hugging Face Spaces

1. **Create new Space** on [Hugging Face](https://huggingface.co/spaces)
2. **Select Docker SDK** and set port to `7860`
3. **Upload files:** `app.py`, `requirements.txt`, `README.md`
4. **Wait for build** (~5-10 minutes)
5. **Test endpoints** using the Space URL

### Dockerfile (Auto-generated)
```dockerfile
FROM python:3.9
WORKDIR /code
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 7860
CMD ["python", "app.py"]
```

## πŸ’‘ Best Practices

### Image Quality Tips
βœ… **Optimal Images:**
- High resolution (>300px)
- Well-lit and focused
- Food fills 70%+ of frame
- Single dish per image
- Minimal background clutter

❌ **Avoid:**
- Blurry or dark images
- Multiple different foods
- Extreme close-ups
- Heavy filters/editing

### Performance Optimization
- Model uses `torch.no_grad()` for inference
- Automatic memory cleanup after each prediction
- GPU memory management with `torch.cuda.empty_cache()`
- Image preprocessing with quality enhancement

## πŸ“ Technical Stack

- **Backend:** FastAPI 0.104.1
- **ML Framework:** PyTorch 2.0+ + Transformers 4.35+
- **Model:** `nateraw/food` (Food-101 dataset)
- **Image Processing:** Pillow + NumPy
- **Deployment:** Hugging Face Spaces (Docker)

## πŸ”’ Security Features

- File type validation (JPEG/PNG/WebP only)
- File size limits (10MB max)
- Security headers (X-Content-Type-Options, X-Frame-Options)
- Input sanitization and error handling

## πŸ“Š Model Performance

- **Training Dataset:** Food-101 (101,000 images)
- **Test Accuracy:** ~85% on Food-101 test set
- **Categories:** 101 food classes
- **Model Size:** ~350MB
- **Architecture:** Vision Transformer (ViT)

## ⚠️ Important Notes

1. **Nutritional Data:** Values are estimates based on typical foods. For precise nutrition information, consult product packaging or nutrition databases.

2. **Model Limitations:** Works best with common foods from the Food-101 dataset. May not recognize regional/ethnic foods not in training data.

3. **Production Ready:** Includes error handling, logging, health checks, and memory management for production deployment.

## 🀝 Credits & License

- **Model:** [nateraw/food](https://huggingface.co/nateraw/food) (Apache 2.0)
- **Dataset:** [Food-101](https://data.vision.ee.ethz.ch/cvl/datasets_extra/food-101/) (CC BY 4.0)
- **Code:** MIT License
- **Framework:** [FastAPI](https://fastapi.tiangolo.com/) + [Transformers](https://huggingface.co/transformers)

---

**πŸš€ Production-ready AI Food Recognition API built with PyTorch, FastAPI, and Food-101 dataset**