Πώς να εντοπίσετε το φαγητό σας από διαφορετικές εικόνες;

Πώς να εντοπίσετε το φαγητό σας από διαφορετικές εικόνες;

September 30, 2022 0 Von admin

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

Intr

Όλοι απολαμβάνουμε το φαγητό, είτε το street food είτε σε κάποια εστιατόρια διαφορετικών ποικιλιών. Έχετε αναρωτηθεί ποιο φαγητό να επιλέξετε με πόσες θερμίδες ή οτιδήποτε συμβαίνει όπως το σερφάρισμα στο διαδίκτυο και ξαφνικά κοιτάτε μια εικόνα φαγητού και δεν ξέρετε πόσες θερμίδες έχει περιεκτικότητα σε λίπος ή πρωτεΐνη;

Στις μέρες μας, απαιτείται συνεπής πρόσληψη υγιεινών τροφίμων για τη διατήρηση μιας ισορροπημένης διατροφής και την αποφυγή της παχυσαρκίας στους ανθρώπους. Η πρόσληψη τροφής αποτελεί συστατικό της παρακολούθησης της υγείας.

Διαφορετικές εικόνες

Ο διαβήτης και ακόμη και οι ασθένειες μπορούν όλα να παρακολουθούνται με τη βοήθεια αυτού.

Θα συζητήσουμε αργότερα λεπτομερώς σχετικά με το. Ας έρθουμε στο θέμα, ως Επιστήμονας Δεδομένων, έρχεται στο μυαλό σας το ερώτημα, πώς μπορούμε να βάλουμε ετικέτες ή να σχολιάσουμε εικόνες; Εάν οι εικόνες είναι μικρές σε αριθμούς, μπορεί να γίνει απλώς σήμανση με τη βοήθεια μιας απλής μεθόδου, αλλά εάν οι εικόνες είναι σε μεγάλους αριθμούς;

Εδώ παρουσιάζουμε το περιστέρι της βιβλιοθήκης, το οποίο μπορεί να βοηθήσει στους σχολιασμούς των εικόνων, και μετά από αυτό, μπορούμε να προβλέψουμε τις ετικέτες των εικόνων κατασκευάζοντας ένα μοντέλο.

Σκοπός

Θα συζητήσουμε εδώ λεπτομερώς πώς να σχολιάσουμε και να προβλέψουμε τις εικόνες.

Σχετικά με το σύνολο δεδομένων

Αυτό το σύνολο δεδομένων περιέχει φωτογραφίες ινδικού φαγητού που καταγράφηκαν με τη χρήση κινητών τηλεφώνων σε πραγματικό πλαίσιο για τον τομέα των τροφίμων της Ινδίας. Διαθέτει μεγάλη γκάμα φωτογραφιών πιάτων από όλη την Ινδία.

Για τον εντοπισμό τροφίμων και αναλύσεων που σχετίζονται με την υγεία, κάθε εικόνα μπορεί να έχει πολλές ετικέτες.

Εισαγωγή σχετικών βιβλιοθηκών

Ας ξεκινήσουμε με την εισαγωγή διαφορετικών βιβλιοθηκών που χρειαζόμαστε για να σχολιάσουμε και να οπτικοποιήσουμε τις εικόνες μας.

Πρέπει όλοι να είστε εξοικειωμένοι με το NumPy # Numerical Python, τα Pandas, ένα εργαλείο ανάλυσης και χειρισμού δεδομένων και το Matplotlib για οπτικοποίηση.

Η μονάδα Glob, όπως υποδηλώνει το όνομά της, είναι η συντομότερη μορφή της Global, που σημαίνει ότι αναζητά όλες τις διαδρομές αρχείων για το συγκεκριμένο μοτίβο.

Το CV2 είναι μια άλλη έκδοση του βιογραφικού που είναι χρήσιμη για την επεξεργασία εικόνας.

Το OS, όπως γνωρίζετε, σημαίνει το λειτουργικό σύστημα και είναι η τυπική βιβλιοθήκη της Python που δεν απαιτείται για λήψη. Λειτουργεί στο σύστημα αρχείων.

Το Pigeon, όπως αναφέρθηκε, χρησιμοποιείται για σχολιασμό. Είναι μια βιβλιοθήκη python και μπορεί να εγκατασταθεί από το Github ή από το pip. Το PigeonXT είναι απλώς μια επέκταση του Pigeon και μας βοηθά να σχολιάσουμε το σύνολο δεδομένων χωρίς ετικέτα.

pip εγκατάσταση pigeonXT-jupyter

Οι λειτουργικές μονάδες Python Imaging Library (PIL) παρέχουν μια βιβλιοθήκη εικόνων για επεξεργασία.

Από τη μονάδα IPython.display, θα εισαγάγουμε την οθόνη και την εικόνα που χρησιμοποιούνται για την εμφάνιση δεδομένων και εικόνων. Εδώ είναι το σύνολο δεδομένωνπου θα χρησιμοποιήσουμε.

Κώδικας

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import glob
import cv2
import os
import PIL.Image
from pigeonXT import annotate
from IPython.display import display, Image

Για να οπτικοποιήσετε διαφορετικές εικόνες

Θα εισαγάγουμε τη βιβλιοθήκη και την εικόνα Glob από το PIL (Πακέτο μαξιλαριού). Δημιουργήσαμε μια κενή λίστα με μεταβλητή images_lst. Με τη βοήθεια της βιβλιοθήκης Glob, θα ανοίξουμε το φάκελό μας με το όνομα εικόνα φαγητού και θα προσθέσουμε στη λίστα μας τις λεγόμενες διαφορετικές εικόνες φαγητού.

Κώδικας

images_lst = [] #variable images_lst
for f in glob.glob(r"C:Usersss529Anaconda3foodimage*"): #the location of the image is mentioned. This has to be changed as per user's system, depending upon where the image is being saved.
    img=(PIL.Image.open(f))
    img = img.resize((200,200))#.reshape(len(img))
    #img.reshape(-1,1)
    images = np.asarray(img, dtype=np.int32)
    images_lst.append(images)

Τώρα θα δημιουργήσουμε ένα πλαίσιο δεδομένων με το όνομα df5 και θα το αποθηκεύσουμε στο αρχείο csv image_columns.csv.

Κώδικας

df5=pd.DataFrame([images_lst])
l=[]
for i in range(0, len(df5[0])):
    k=df5[0][i].astype(float)/255
l.append(k)
df5.shape
df5.to_csv('image_columns.csv')

Για να ελέγξετε τις εικόνες από το πλαίσιο δεδομένων που δημιουργήθηκε.

im = df5.loc[0,1]
im
plt.imshow(im, cmap='gray')
plt.axis('off')
εικόνες φαγητού

Σχόλιο

Έχουμε διαφορετικές εικόνες αποθηκευμένες στο φάκελο, εικόνες τροφίμων και τώρα θα χρησιμοποιήσουμε τη βιβλιοθήκη Pigeon για να σχολιάσουμε το σύνολο δεδομένων χωρίς ετικέτα.

Κώδικας

annotations=annotate([  "C:\Users\ss529\Anaconda3\foodimageData1.jpg", "C:\Users\ss529\Anaconda3\foodimageData2.jpg",  "C:\Users\ss529\Anaconda3\foodimageData10.jpg" ],
  options=['Non-Veg', 'Pulses', 'Bread','Puri','Veg','dessert', 'Sweets','Rice','Chappati','Biscuits','Milk','Rasgulla','Snacks','Desi Ghee'],
  display_fn = lambda filename: display(Image(filename))
)
Διαφορετικές εικόνες

Μετά την επισήμανση των δεδομένων, θα εμφανιστούν τα δεδομένα όπως φαίνεται παρακάτω-

print(annotations)
[('C:\Users\ss529\Anaconda3\foodimage\Data1.jpg', 'Veg'),
 ('C:\Users\ss529\Anaconda3\foodimage\Data2.jpg', 'Pulses'),
 ('C:\Users\ss529\Anaconda3\foodimage\Data10.jpg', 'Veg')]

Μπορούμε να προσθέσουμε μια άλλη στήλη, όπως πόσες θερμίδες περιέχει το φαγητό ανάλογα με την ανάγκη.

Επέκταση των Σχολιασμών

Για να επεκτείνουμε τον σχολιασμό, θα χρησιμοποιήσουμε τη λέξη-κλειδί επέκτασης.

s=[]
s.extend(annotations)
[('C:\Users\ss529\Anaconda3\foodimage\Data1.jpg', 'Veg'),
 ('C:\Users\ss529\Anaconda3\foodimage\Data2.jpg', 'Pulses'),
 ('C:\Users\ss529\Anaconda3\foodimage\Data10.jpg', 'Veg')]
df=pd.DataFrame(s)
df.to_csv('food_items.csv')
df1=pd.read_csv("food_items.csv")
df1.head()
έξοδος κώδικα

Μετονομασία των στηλών

Θα μετονομάσουμε τις στήλες 0 σε Url και τη στήλη 1 σε Ετικέτες.

df1.rename(columns={'1':'Labels','0': 'Url'}, inplace=True)
έξοδος κώδικα

Αφαίρεση της ανεπιθύμητης στήλης

Θα αφαιρέσουμε την ανεπιθύμητη στήλη Unnamed:0, η οποία δεν απαιτείται. Μπορούμε να χρησιμοποιήσουμε τη μέθοδο pop ή τη λέξη-κλειδί del για να διαγράψουμε τη στήλη.

del df1['Unnamed: 0']

Για να ελέγξετε το σχήμα.

df1['Labels'].shape
>>>(3,)

Για να ελέγξετε τις εικόνες.

image= Image.open(df1['Url'][0])
plt.imshow(image, cmap='gray')
plt.axis('off')
Διαφορετικές εικόνες

Μετά τον σχολιασμό, θα τα τοποθετήσουμε σε διαφορετικούς φακέλους για εκπαίδευση, δοκιμή και αξιολόγηση.

IMG_WIDTH=200
IMG_HEIGHT=200
batch_size=4
train_dir = r"C:Usersss529Anaconda3foodtraining"
test_dir = r"C:Usersss529Anaconda3foodvalidation"
eval_dir= r"C:Usersss529Anaconda3foodevaluation"
test_image= r"C:Usersss529Anaconda3foodtrainingBread100.jpg"

Για να ελέγξετε τις εικόνες.

img=mpimg.imread(test_image)

plt.imshow(img)

εικόνες φαγητού

Θα δημιουργήσουμε ένα κενό σύνολο με διαφορετικές μεταβλητές.

train = {}
test = {}
val_eval={}

Θα δημιουργήσουμε ένα μονοπάτι για δοκιμή και εκπαίδευση και ισχύει σε διαφορετικές μεταβλητές.

path = r"C:Usersss529Anaconda3food"
path_train = os.path.join(path, "training")

Θα ανοίξουμε τη λίστα των καταλόγων για δοκιμή, εκπαίδευση και επικύρωση και θα την αποθηκεύσουμε στις διάφορες μεταβλητές που δημιουργήθηκαν.

for i in os.listdir(path_train):
    train[i] = os.listdir(os.path.join(path_train, i))
path_test = os.path.join(path, "validation")
for i in os.listdir(path_test):
    test[i] = os.listdir(os.path.join(path_test, i))
path_test = os.path.join(path, "evaluation")
for i in os.listdir(path_test):
    val_eval[i] = os.listdir(os.path.join(path_test, i))

Θα ελέγξουμε το σχήμα κάθε συλλεγόμενου στοιχείου.

from random import sample

Πρέπει να υπάρχει μια ερώτηση στο μυαλό σας, γιατί χρειαζόμαστε ένα δείγμα;

Είναι μια απλή απάντηση, καθώς πρέπει να ελέγξουμε το μήκος των στοιχείων σε κάθε μεταβλητή.

len_train = np.concatenate(list(train.values())).shape[0]
len_test = np.concatenate(list(test.values())).shape[0]
len_eval = np.concatenate(list(val_eval.values())).shape[0]

Εκτυπώστε το αποτέλεσμα σε μορφή.

print("Images in training data : {}".format(len_train))
print("Images in testing data : {}".format(len_test))
print("Images in evaluation data : {}".format(len_eval))
>>>Images in training data : 176
>>>Images in testing data : 33
>>>Images in evaluation data : 72

Για εμφάνιση των εικόνων στο σετ εκπαίδευσης.

fig, axs = plt.subplots(len(train.keys()), 5, figsize = (15, 15))
for i, item in enumerate(os.listdir(path_train)):
    images = sample(train[item], 5)
    for j, image in enumerate(images):
        img = Image.open(os.path.join(path_train, item, image))
        axs[i, j].imshow(img)
        axs[i, j].set(xlabel = item, xticks = [], yticks = [])
fig.tight_layout()
Διαφορετικές εικόνες

Για να ελέγξετε το μήκος των διαφορετικών ειδών εικόνων τροφίμων στο σετ εκπαίδευσης.

for item in train.keys():
    print(item, len(train[item]))
>>>Bread 115
   Dessert 11
   Vegetable 50

Κατασκευάζοντας το μοντέλο

Θα χρησιμοποιήσουμε τη βιβλιοθήκη βαθιάς εκμάθησης Keras Python για την κατασκευή του μοντέλου. Θα εισάγουμε το Image Data Generator για να ενεργοποιήσουμε τη δέσμη εικόνων για εκπαίδευση.

Το διαδοχικό μοντέλο επιτρέπει μεθόδους στρώμα-προς-στρώμα που περιλαμβάνουν κάθε επίπεδο με τανυστές εισόδου και εξόδου.

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

Το πλάτος και το ύψος της εικόνας ρυθμίστηκαν στα 200.

model=tf.keras.Sequential(
        [
            tf.keras.layers.InputLayer(input_shape=(200,200,3)),
            tf.keras.layers.Conv2D(
                filters=32, kernel_size=2, strides=(2, 2), activation='relu'),
            tf.keras.layers.Conv2D(
                filters=64, kernel_size=2, strides=(2, 2), activation='relu'),
            tf.keras.layers.Flatten(),
            # No activation
            tf.keras.layers.Dense(6)])
epochs = 10
batch_size = 4
model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=['accuracy'])

οι εποχές αναφέρονται στην περίοδο.

Το batch_size εδώ αναφέρεται στον αριθμό των αντικειμένων.

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
# Train generator
train_generator = train_datagen.flow_from_directory(
    path_train,
    target_size=(200, 200),
    batch_size=4,
    class_mode="sparse"
)
validation_generator = test_datagen.flow_from_directory(
    test_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode="sparse")
# Test generator
test_generator = test_datagen.flow_from_directory(
    path_test,
    target_size=(200, 200),
    batch_size=4,
    class_mode="sparse"
)

class_mode αναφέρεται στον τύπο των πινάκων με ετικέτα.

history = model.fit(train_generator, steps_per_epoch=len(train_generator)//batch_size, validation_data=test_generator, epochs=5)

Προβλέψεις

Ορισμένες μονάδες που θα χρειαστεί να εισαγάγουμε για την προεπεξεργασία των εικόνων.

from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
from keras.applications.vgg16 import VGG16
from keras.models import load_model
from keras.preprocessing.image import load_img

Θα δημιουργήσουμε την κενή λίστα προβλέψεων μεταβλητών.

prediction=[]

Θα φορτώσουμε τις εικόνες από το σετ εκπαίδευσης και θα τις αποθηκεύσουμε σε μια μεταβλητή.

 image = load_img('food/training/Vegetable/10.jpg', target_size=(200, 200))
 img = np.array(image)
 img = img / 255.0
 img = img.reshape(1,200,200,3)

Θα δημιουργήσουμε ένα λεξικό με αντιστοιχισμένα κλειδιά και τιμές.

 labels = {
     0:'Bread', 
     1:'Dessert', 
     2:'Vegetable',
 }

Θα χρησιμοποιήσουμε τη μέθοδο πρόβλεψης από το μοντέλο.

 label = model.predict(img)
 print(labels)
 label=label.argmax()
 prediction.append(labels[label])
 print("Predicted Class:", prediction)
 {0: 'Bread', 1: 'Dessert', 2: 'Vegetable'}
 Result
>>>Predicted Class: ['Vegetable']

Καρδιαγγειακή νόσο

Η καρδιαγγειακή νόσος αναφέρεται σε απόφραξη των αρτηριών. Οφείλεται στην εναπόθεση λιπών στις αρτηρίες, γνωστή ως αθηροσκλήρωση. Αποκλείει τις αρτηρίες, κλειδώνει τις ροές του αίματος στους μύες και προκαλεί καρδιακή προσβολή.

Μία από τις περισσότερες αιτίες θανάτου στο Ηνωμένο Βασίλειο είναι οι καρδιαγγειακές παθήσεις. Οι άνδρες και οι γυναίκες που πέθαναν το 2015 και το 2018 στην Ιρλανδία εμφανίζουν μέγιστο αριθμό θανάτων για άτομα άνω των 70 ετών.

Λόγω της χρήσης αλκοόλ, του καπνίσματος και των κακών διατροφικών συνηθειών, οι νέοι είναι πιο πιθανό να αναπτύξουν CVD (καρδιαγγειακή νόσο).

συμπέρασμα

Οι δύο στόχοι μας ήταν ο ένας να σχολιάσουμε τα δεδομένα χωρίς ετικέτα και μετά να δημιουργήσουμε ένα μοντέλο για την πρόβλεψη των εικόνων. Υπάρχει συσχέτιση μεταξύ του υπέρβαρου, του διαβήτη, του καρκίνου, του καπνίσματος και της καρδιαγγειακής νόσου.

Το μειωμένο κάπνισμα, η πρόοδος στη θεραπεία και τον έλεγχο της υπέρτασης και η ευρεία χρήση στατινών για τη μείωση των επιπέδων χοληστερόλης στην κυκλοφορία μπορεί να συμβάλλουν σε χαμηλότερο κίνδυνο καρδιαγγειακής νόσου στην Ευρώπη, αν και ο κίνδυνος παραμένει υψηλότερος.

Επιπλέον, η διατήρηση μιας ετικέτας θερμίδων τροφίμων μπορεί να αποτελεί πρόσληψη για μια υγιεινή διατροφή. Να επισημαίνουν και να καταγράφουν τα τρόφιμα που καταναλώνονται συχνά και να κατανοούν σε βάθος τα τρόφιμα που καταναλώνονται (λόγω της μεγάλης ποικιλίας κουζινών). Χρησιμοποιήσαμε τη βιβλιοθήκη Pigeon για να κάνουμε σχολιασμούς και Keras για να φτιάξουμε ένα μοντέλο. Τα αποτελέσματά μας δείχνουν την πρόβλεψη των εικόνων σωστά. Ωστόσο, η ακρίβεια πρέπει ακόμη να βελτιωθεί.

Βασικά Takeaways

1. Πώς να χρησιμοποιήσετε το Library Pigeon για σχολιασμό

2. Πώς να φτιάξετε ένα μοντέλο για την πρόβλεψη εικόνων

3. Χρήση επέκτασης και λέξης-κλειδιού del.

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.