Skip to content

Commit 47dff16

Browse files
Merge pull request pranjay-poddar#3562 from karthikbhandary2/food
Added the food detector script
2 parents 81dde0d + f62cb27 commit 47dff16

File tree

7 files changed

+204
-0
lines changed

7 files changed

+204
-0
lines changed

ML Projects/Food-Vision/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Food-Vision
2+
This is project that is done as a part of PyTorch for deep learning by ZTM. This is a more advanced version of the Food-Vision-Mini. In this I used all of the data that is all types of food available on the dataset is used. I used `EfficientNetV2` as my model which was taken from the pytorch models through `transfer learning`.
3+
4+
I deployed the project on to `Hugging Face🤗` using `Gradio`.
5+
6+
Here is the link: https://huggingface.co/spaces/karthik2/foodvision_big

ML Projects/Food-Vision/app.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
### 1. Imports and class names setup ###
2+
import gradio as gr
3+
import os
4+
import torch
5+
6+
from model import create_effnetb2_model
7+
from timeit import default_timer as timer
8+
from typing import Tuple, Dict
9+
10+
# Setup class names
11+
with open("class_names.txt", "r") as f:
12+
class_names = [food_name.strip() for food_name in f.readlines()]
13+
14+
### 2. Model and transforms preparation ###
15+
# Create model and transforms
16+
effnetb2, effnetb2_transforms = create_effnetb2_model(num_classes=101)
17+
18+
# Load saved weights
19+
effnetb2.load_state_dict(
20+
torch.load(f="09_pretrained_effnetb2_feature_extractor_food101_20_percent.pth",
21+
map_location=torch.device("cpu")) # load to CPU
22+
)
23+
24+
### 3. Predict function ###
25+
26+
def predict(img) -> Tuple[Dict, float]:
27+
# Start a timer
28+
start_time = timer()
29+
30+
# Transform the input image for use with EffNetB2
31+
img = effnetb2_transforms(img).unsqueeze(0) # unsqueeze = add batch dimension on 0th index
32+
33+
# Put model into eval mode, make prediction
34+
effnetb2.eval()
35+
with torch.inference_mode():
36+
# Pass transformed image through the model and turn the prediction logits into probaiblities
37+
pred_probs = torch.softmax(effnetb2(img), dim=1)
38+
39+
# Create a prediction label and prediction probability dictionary
40+
pred_labels_and_probs = {class_names[i]: float(pred_probs[0][i]) for i in range(len(class_names))}
41+
42+
# Calculate pred time
43+
end_time = timer()
44+
pred_time = round(end_time - start_time, 4)
45+
46+
# Return pred dict and pred time
47+
return pred_labels_and_probs, pred_time
48+
49+
### 4. Gradio app ###
50+
51+
# Create title, description and article
52+
title = "FoodVision BIG 🍔👁💪"
53+
description = "An [EfficientNetB2 feature extractor](https://pytorch.org/vision/stable/models/generated/torchvision.models.efficientnet_b2.html#torchvision.models.efficientnet_b2) computer vision model to classify images [101 classes of food from the Food101 dataset](https://github.com/mrdbourke/pytorch-deep-learning/blob/main/extras/food101_class_names.txt)."
54+
article = "Created at [09. PyTorch Model Deployment](https://www.learnpytorch.io/09_pytorch_model_deployment/#11-turning-our-foodvision-big-model-into-a-deployable-app)."
55+
56+
# Create example list
57+
example_list = [["examples/" + example] for example in os.listdir("examples")]
58+
59+
# Create the Gradio demo
60+
demo = gr.Interface(fn=predict, # maps inputs to outputs
61+
inputs=gr.Image(type="pil"),
62+
outputs=[gr.Label(num_top_classes=5, label="Predictions"),
63+
gr.Number(label="Prediction time (s)")],
64+
examples=example_list,
65+
title=title,
66+
description=description,
67+
article=article)
68+
69+
# Launch the demo!
70+
demo.launch()
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
apple_pie
2+
baby_back_ribs
3+
baklava
4+
beef_carpaccio
5+
beef_tartare
6+
beet_salad
7+
beignets
8+
bibimbap
9+
bread_pudding
10+
breakfast_burrito
11+
bruschetta
12+
caesar_salad
13+
cannoli
14+
caprese_salad
15+
carrot_cake
16+
ceviche
17+
cheese_plate
18+
cheesecake
19+
chicken_curry
20+
chicken_quesadilla
21+
chicken_wings
22+
chocolate_cake
23+
chocolate_mousse
24+
churros
25+
clam_chowder
26+
club_sandwich
27+
crab_cakes
28+
creme_brulee
29+
croque_madame
30+
cup_cakes
31+
deviled_eggs
32+
donuts
33+
dumplings
34+
edamame
35+
eggs_benedict
36+
escargots
37+
falafel
38+
filet_mignon
39+
fish_and_chips
40+
foie_gras
41+
french_fries
42+
french_onion_soup
43+
french_toast
44+
fried_calamari
45+
fried_rice
46+
frozen_yogurt
47+
garlic_bread
48+
gnocchi
49+
greek_salad
50+
grilled_cheese_sandwich
51+
grilled_salmon
52+
guacamole
53+
gyoza
54+
hamburger
55+
hot_and_sour_soup
56+
hot_dog
57+
huevos_rancheros
58+
hummus
59+
ice_cream
60+
lasagna
61+
lobster_bisque
62+
lobster_roll_sandwich
63+
macaroni_and_cheese
64+
macarons
65+
miso_soup
66+
mussels
67+
nachos
68+
omelette
69+
onion_rings
70+
oysters
71+
pad_thai
72+
paella
73+
pancakes
74+
panna_cotta
75+
peking_duck
76+
pho
77+
pizza
78+
pork_chop
79+
poutine
80+
prime_rib
81+
pulled_pork_sandwich
82+
ramen
83+
ravioli
84+
red_velvet_cake
85+
risotto
86+
samosa
87+
sashimi
88+
scallops
89+
seaweed_salad
90+
shrimp_and_grits
91+
spaghetti_bolognese
92+
spaghetti_carbonara
93+
spring_rolls
94+
steak
95+
strawberry_shortcake
96+
sushi
97+
tacos
98+
takoyaki
99+
tiramisu
100+
tuna_tartare
101+
waffles
Loading

ML Projects/Food-Vision/model.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import torch
2+
import torchvision
3+
4+
from torch import nn
5+
6+
def create_effnetb2_model(num_classes:int=3, # default output classes = 3 (pizza, steak, sushi)
7+
seed:int=42):
8+
# 1, 2, 3 Create EffNetB2 pretrained weights, transforms and model
9+
weights = torchvision.models.EfficientNet_B2_Weights.DEFAULT
10+
transforms = weights.transforms()
11+
model = torchvision.models.efficientnet_b2(weights=weights)
12+
13+
# 4. Freeze all layers in the base model
14+
for param in model.parameters():
15+
param.requires_grad = False
16+
17+
# 5. Change classifier head with random seed for reproducibility
18+
torch.manual_seed(seed)
19+
model.classifier = nn.Sequential(
20+
nn.Dropout(p=0.3, inplace=True),
21+
nn.Linear(in_features=1408, out_features=num_classes)
22+
)
23+
24+
return model, transforms
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
torch==1.12.0
2+
torchvision==0.13.0
3+
gradio==3.1.4

0 commit comments

Comments
 (0)