Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 24bd8fa

Browse files
Merge pull request avinashkranjan#1652 from Data-Elites/fooddetector
Added Food Detector script
2 parents 06c7f85 + 3618042 commit 24bd8fa

File tree

7 files changed

+205
-0
lines changed

7 files changed

+205
-0
lines changed
30.4 MB
Binary file not shown.

‎Food Detector/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
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.
2+
3+
I deployed the project on to Hugging Face🤗 using Gradio.
4+
5+
Here is the link: https://huggingface.co/spaces/karthik2/foodvision_big
6+
7+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference

‎Food Detector/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()

‎Food Detector/class_names.txt

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
2.74 MB
Loading[フレーム]

‎Food Detector/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

‎Food Detector/requirements.txt

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)

AltStyle によって変換されたページ (->オリジナル) /