在本地食品配送服务领域,像Zomato和Swiggy这样的主要玩家占据了市场主导地位。顾客期望收到新鲜的食品;如果收到变质的食品,他们希望得到退款或折扣券。然而,手动判断食品的新鲜度对于顾客和公司员工来说都是繁琐的。一个解决方案是使用深度学习模型自动化这一过程。这些模型可以预测食品的新鲜度,只允许标记的投诉由员工进行最终验证。如果模型确认食品新鲜,它可以自动驳回投诉。在本文中,将构建一个食品质量检测器,使用深度学习技术。
深度学习是人工智能的一个子集,在这种情况下提供了重要的实用性。具体来说,可以采用卷积神经网络(CNN)来训练模型,使用食品图像来辨别它们的新鲜度。模型的准确性完全取决于数据集的质量。理想情况下,结合用户在本地食品配送应用中的聊天机器人投诉中的实时食品图像将大大提高准确性。然而,由于缺乏这样的数据,依赖于一个广泛使用的数据集,即Kaggle上的“新鲜和腐烂分类数据集”。要探索完整的深度学习代码,只需点击提供的“复制并编辑”按钮。
了解食品质量在客户满意度和业务增长中的重要性。发现深度学习如何帮助构建食品质量检测器。通过逐步实施这个模型获得实践经验。了解其实施中的挑战和解决方案。
深度学习,作为人工智能的一个子集,主要使用空间数据集来构建模型。深度学习中的神经网络被用来训练这些模型,模仿人脑的功能。在食品质量检测的背景下,用大量食品图像训练深度学习模型对于准确区分好和坏的食品安全至关重要。可以根据输入的数据进行超参数调整,以使模型更加准确。
将这一特性整合到本地食品配送中提供了几个好处。该模型避免了对特定客户的偏见,并准确预测,从而减少了投诉解决时间。此外,还可以在订单打包过程中使用这一特性来检查食品质量,确保客户始终收到新鲜的食品。
为了完全构建这一特性,需要遵循许多步骤,如获取和清理数据集,训练深度学习模型,评估性能并进行超参数调整,最后将模型保存为h5格式。之后,可以使用React构建前端,并使用Python的Django框架构建后端。将使用Django处理图像上传和处理。
在深入数据预处理和模型构建之前,了解数据集至关重要。如前所述,将使用Kaggle上名为“新鲜和腐烂食品分类”的数据集。该数据集分为两个主要类别:用于训练和测试目的的“训练”和“测试”。在训练文件夹下,有9个新鲜水果和新鲜蔬菜的子文件夹,以及9个腐烂水果和腐烂蔬菜的子文件夹。
在本节中,将首先使用‘tensorflow.keras.preprocessing.image.load_img’函数加载图像,并使用matplotlib库可视化图像。对图像进行预处理以适应模型训练非常重要。这包括清理和组织图像,使其适合模型。
import os
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import load_img
def visualize_sample_images(dataset_dir, categories):
n = len(categories)
fig, axs = plt.subplots(1, n, figsize=(20, 5))
for i, category in enumerate(categories):
folder = os.path.join(dataset_dir, category)
image_file = os.listdir(folder)[0]
img_path = os.path.join(folder, image_file)
img = load_img(img_path)
axs[i].imshow(img)
axs[i].set_title(category)
plt.tight_layout()
plt.show()
dataset_base_dir = '/kaggle/input/fresh-and-stale-classification/dataset'
train_dir = os.path.join(dataset_base_dir, 'Train')
categories = ['freshapples', 'rottenapples', 'freshbanana', 'rottenbanana']
visualize_sample_images(train_dir, categories)
现在让将训练和测试图像加载到变量中。将所有图像调整为相同的高度和宽度180。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
batch_size = 32
img_height = 180
img_width = 180
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
validation_split=0.2)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary',
subset='training')
validation_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary',
subset='validation')
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(),
Dense(512, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
epochs = 10
history = model.fit(
train_generator,
steps_per_epoch=train_generator.samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_generator.samples // batch_size)
from tensorflow.keras.preprocessing import image
import numpy as np
def classify_image(image_path, model):
img = image.load_img(image_path, target_size=(img_height, img_width))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array /= 255.0
predictions = model.predict(img_array)
if predictions[0] > 0.5:
print("Rotten")
else:
print("Fresh")
image_path = '/kaggle/input/fresh-and-stale-classification/dataset/Train/
rottenoranges/Screen Shot 2018-06-12 at 11.18.28 PM.png'
classify_image(image_path, model)