• Главная
  • О нас
  • Контакты
  • Главная
  • О нас
  • Контакты

Учебный проект «Умная кухня», использующий нейросеть
Educational project "Kitchen Helper" using neural network

 

Публикации:

О ФИЗИЧЕСКОМ МОДУЛЕ, ИСПОЛЬЗУЮЩЕМ НЕЙРОСЕТЬ ДЛЯ ПОДБОРА РЕЦЕПТОВ

УЧЕБНЫЙ ПРОЕКТ, ИСПОЛЬЗУЮЩИЙ НЕЙРОСЕТЬ

Участники проекта, авторы:

Татьяна Владимировна Гурьянова,  главный специалист по образовательному процессу (информационные технологии, ООО «СофтКлуб – центр разработки»  tatiana.gourianova@softclub.by;

Даниил Олегович Гурьянов, бакалавр,  Европейский Гуманитарный Университет; Gourianov.Daniil@student.ehu.lt

Владислав Вадимович Готовко, бакалавр,  ФПМИ, прикладная математика, Белорусский Государственный Университет; gotovko.vladrus@mail.ru

Дмитрий Игоревич Черноокий, студент кафедры многопроцессорных систем и сетей,  ФПМИ, Информатика, Белорусский Государственный Университет; cernookijdima7@gmail.com

Егор Николаевич Михейков , студент кафедры Биомедицинской Информатики,  ФПМИ, Информатика, Белорусский Государственный Университет; mikheikovegor@gmail.com

Егор Ильясович Корти, студент кафедры программного обеспечения информационных технологий,  КСИС, Белорусский Государственный Университет Информатики и Радиоэлектроники; egor0korti@gmail.com

Владислав Валентинович Бескостый, студент кафедры программного обеспечения информационных технологий,  КСИС, Белорусский Государственный Университет Информатики и Радиоэлектроники; vladbeskosty7@gmail.com

Иван Игоревич  Бужинский, студент,  факультета компьютерного проектирования, специальность «Инженерно-психологическое обеспечение информационных технологий», кафедра инженерной психологии и эргономики Белорусский Государственный Университет Информатики и Радиоэлектроники, buzhinin4@gmail.com

Егор Сергеевич Панкратьев, студент кафедры программного обеспечения информационных технологий, КСИС, Белорусский Государственный Университет Информатики и Радиоэлектроники; egor.pankratiew@gmail.com

Виктория Андреевна Янковская , ассистент кафедры ядерной физики,  Физический факультет, Прикладная физика, Белорусский Государственный Университет; vika.test.y@gmail.com

Егор Александрович Жарский, студент факультета компьютерного проектирования специальность: Информационные системы и технологии (в обеспечении промышленной безопасности) Белорусский Государственный Университет Информатики и Радиоэлектроники, egor.zharskiy@mail.ru

Бороховский Георгий Владимирович, студент бакалавриата, Физический факультет, Компьютерная физика, компьютерное моделирование физических процессов, Белорусский Государственный Университет, fiz.borohovs@bsu.by


Далее описываются этапы создания учебного проекта «Умная Кухня», рабочее название
KitchenHelper, в которой программа помогает в повседневной жизни, в подборе рецептов, ингредиентов, составлению меню и приготовлении пищи. Планируя деятельность мы замахнулись на создание не только полноценного веб-приложения, использующего нейросети, но и на попытку сделать роботизированную руку, участвующую в приготовлении пищи.

 

The publication describes the stages of creating the educational project "Smart Kitchen", working title KitchenHelper, in which the program helps in everyday life, in selecting recipes, ingredients, compiling a menu and cooking. When planning the activity, we aimed to create not only a full-fledged web application using neural networks, but also an attempt to make a robotic hand involved in cooking.

 

Keywords: умный дом, проектное обучение, решения собственной разработки, smart house, project-based learning, in-house developed solutions,

 

1.     Введение

 

Информационные технологии развиваются очень быстро, отчасти по этой причине существует разрыв между тем, что учат в вузах и тем, что реально требуется на производстве. В этой статье описан конкретный пример студенческой стажировки, но не форме приема студента в качестве чернорабочего, а попытка силами самих студентов самостоятельно сделать качественный и востребованный проект. По мнению авторов это один из самых быстрых способов научить современного студента промышленному программированию.

 

Учебный проект разработан в рамках совместного соглашения Белорусского государственного университета и ООО «СофтКлуб» под брендом SC-Academy – глобального проекта профессиональной преадаптации студентов бакалавриата и магистратуры технических и научно-естественных специальностей.


2. Немного теории, необходимой для использования в проекте нейросети

 

Начали мы обучение с рассказа о «живом» проекте, в котором описывалось применение нейронных сетей в ритейле, проекте по распознаванию товаров.

 

2.1. Применение нейронных сетей в ритейле

Суть проекта заключалась в том, что была написана программа, позволяющая совершать покупки без продавцов. 

 

Проект состоял из нескольких ключевых этапов:

· Сбор данных

· Подготовка данных (разметка)

· Обучение

· Анализ метрик, тестирование

· Интеграция с кассовой системой

 

Структура сервиса, использующаяся в проекте (Рисунок 1):

Рисунок 1 – Структура сервиса

 

 

2.2. Основные понятия и определения

Далее учащимся были даны основные понятия о том, что такое нейросеть и нейрон (Рисунок 2):

 

Рисунок 2 – Нейросеть и нейрон

 

Рассказано о том, как производится оценка качества модели (Рисунок 3):

 

Рисунок 3 – Оценка качества модели

 

Приведен пример современной архитектуры нейронной сети YOLOv5, созданной специально для быстрого и точного детектирования объектов. Сеть способна обрабатывать информацию в реальном времени, что критически важно для описанной выше системы на кассах. YOLOv5 показывает отличные результаты в распознавании объектов даже на сложных изображениях.


Учащимся были
даны основы ml и nlp. Рассмотрена модель для классификации изображений fashion_mnist, система рекомендаций, метод к-соседей, модель NearestNeighbors, анализ временных рядов.

 

Рекомендованы для самостоятельного обучения онлайн курсы: «First Step in NLP  2.0», «Структурирование проектов машинного обучения»,  «Нейронные сети и глубокое обучение» .

 

2.3. Практические задания


Далее учащимся было предложено сделать мини-проекты:

 

2.3.1.     Мини-проект 1. В Швейцарии  существуют четыре диалекта немецкого языка.  Нужно предсказать диалект по фрагменту разговорной речи.

 Для  выполнения этого минипроекта нужно загрузить dataset и train наборы, обучить различные модели: «Random forest», «Gradient boosting», «SGD classifier» и так далее:

· clf = MultinomialNB().fit(x, y)

clf.score(x_val, y_val)

· clf = RandomForestClassifier().fit(x, y)

clf.score(x_val, y_val)

· clf = KNeighborsClassifier().fit(x, y)

clf.score(x_val, y_val)

· clf = GradientBoostingClassifier().fit(x, y)

clf.score(x_val, y_val)

 

После этого загрузить тестовые наборы и протестировать нейросеть.

 

2.3.2.     Мини-проект 2. В библиотеке найти книгу с похожим рейтингом. Для этого загрузить dataset, округлеть рейтинг, затем использовать модель и функцию для обучения нейросети:

 

model = NearestNeighbors(n_neighbors=8)

model.fit(features)

dist, idlist= model.kneighbors(features)

def BookRecommender(book_name):

    book_list_name = []

    book_id = df2[df2["title"] == book_name].index

    book_id = book_id[0]

    for newid in idlist[book_id]:

        book_list_name.append(df2.loc[newid].title)

    return book_list_name

 

Пример решения мини-проекта можно посмотреть, используя среду разработки jupyter notebook

 

2.3.3.     Нейронная сеть помогает подобрать рецепты

 

По аналогии  с учебными проектами была обучена нейронная сеть, которая на основании предпочтений человека выводит список рекомендованных рецептов.

1.     Импортируем нужные библиотеки. Полный список библиотек, которые мы использовали в проекте можно увидеть на рисунке 4.

Рисунок 4 – Использованные библиотеки

2.     Подключаем dataset с рецептами.

3.     Строим график зависимости от рейтинга рецепта. На рисунке 5 предоставлен график, который вывела нам программа:

 

Рисунок 5 – График зависимости от рейтинга

 

4.   Создаём и добавляем в dataset колонку с округлённым рейтингом рецептов.

5.   Создаём несколько dataset с выбранными данными и объединяем в один для удобства дальнейшей работы.

features = pd.concat([rating_df, cuisine_df, df2['rating'], df2['vote_count']], axis=1)

6.   Производим нормализацию dataset.

features = MinMaxScaler().fit_transform(features)

7.   Используем модель машинного обучения.

model = NearestNeighbors(n_neighbors=8)

model.fit(features)

dist, idlist= model.kneighbors(features)

8.   Создаем функцию, которая на основании выбранного рецепта будит создавать список с похожими рецептами.

9.   Используем функцию.

10.  Выводим список. Рисунок 6 показывает нам, что программа выводит список рецептов:

Рисунок 6 – Вывод программы

Далее мы решили сделать проект, в котором нейросеть по подбору рецептов стала бы частью современного пользовательского приложения. В разработке группа студентов бакалавриата и магистратуры БГУ и БГУИР.  Приведем краткое описание проекта, рабочее название которого  KitchenHelper.


3.
Web-сервис KitchenHelper

KitchenHelper — это веб-приложение, которое помогает пользователям находить и создавать рецепты с учетом доступных ингредиентов и оборудования. Сервис позволяет зарегистрированным пользователям делиться своими рецептами, добавлять собственные ингредиенты, управлять оборудованием для приготовления пищи и получать персонализированные рекомендации на основе своих предпочтений и имеющихся ресурсов.

 

3.1. Основные функции

3.1.1. Регистрация и аутентификация пользователей

  • Пользователи могут регистрироваться на платформе, создавая уникальные профили.

  • Аутентификация и авторизация через стандартные методы, такие как email/пароль, а также через JWT.

3.1.2.     Создание и управление рецептами

  • Зарегистрированные пользователи могут создавать и публиковать собственные рецепты.

  • В рецептах указываются необходимые ингредиенты и оборудование с их количеством и размерами.

  • Возможность добавлять фотографии, пошаговые инструкции и советы по приготовлению.

3.1.3       Ингредиенты

  • Пользователи могут выбирать ингредиенты из заранее определенного списка базовых ингредиентов.

  • Возможность добавлять собственные ингредиенты, которые будут доступны только этому пользователю.

  • Управление количеством и единицами измерения ингредиентов.

3.1.4. Оборудование

  • Добавление и управление оборудованием (например, блендер, духовка, ножи) в рецептах.

  • Указание необходимого количества и характеристик оборудования (размеры, мощность и т.д.).

3.1.5.     Персонализированные рекомендации

·       На основе данных о пользователе (история рецептов, доступные ингредиенты, предпочтения) нейронная сеть предлагает наиболее подходящие рецепты.

·       Рекомендации обновляются с учетом изменений в профиле пользователя (например, добавление новых ингредиентов или оборудования).

3.2. Интеграция с нейронной сетью

  • Использование искусственного интеллекта для анализа предпочтений пользователя и предложения наиболее подходящих рецептов.

  • Обучение модели на основе данных о поведении пользователей для улучшения точности рекомендаций.

3.3. Технологический стек

  • Backend: Django + Django REST Framework для реализации API и управления бизнес-логикой.

  • Frontend: React или Vue.js для создания интерактивного пользовательского интерфейса.

  • База данных: PostgreSQL для хранения данных о пользователях, рецептах, ингредиентах и оборудовании.

  • AI/ML: TensorFlow/Sklearn для разработки и внедрения нейронной сети, которая будет рекомендовать рецепты пользователям.

  • Аутентификация: JWT (JSON Web Tokens) для аутентификации пользователей и BasicAuthentication для социальных входов.

 

3.4. Пример пользовательского сценария

3.4.1.     Регистрация и настройка профиля

  • Пользователь регистрируется на платформе, добавляет информацию о своих кулинарных предпочтениях и доступном оборудовании.

3.4.2. Создание рецепта

·       Пользователь создаёт рецепт, выбирая ингредиенты и оборудование из базы данных или добавляя свои собственные.

·       Загружает фото готового блюда и публикует рецепт.

3.4.3. Получение рекомендаций

  • Пользователь заходит на главную страницу и видит подборку рецептов, которые соответствуют его предпочтениям и доступным ресурсам.

3.4.4.     Приготовление и взаимодействие

  • Пользователь выбирает рецепт, готовит блюдо по инструкциям, и оставляет отзыв.

  • Делится рецептом с друзьями или в социальных сетях через встроенные функции приложения.

3.5. Описание готовой части проекта

Для того, чтобы получить представление об организации api, нужно скачать KitchenHelperDoc.yaml, затем открыть https://editor-next.swagger.io/ [5] и импортировать  *.yaml в этот редактор: вы увидете api в таком же виде, в каком бы вы их увидели, развернув приложение на вашем компьютере и открыв в браузере http-адрес приложения/api (Рисунок 7, 8):

Рисунок 7 – *.yaml документация в Swagger-редакторе


Рисунок 8 – Развернутое на локальном хостинге приложение, страница http://127.0.0.1:8000/api/

 

Каждую из api-функций можно вызвать через соответствующий http-запрос (Рисунок 9)

Рисунок 9 – Развернутое на локальном хостинге приложение, вызов функции get_all_equipment:  http://127.0.0.1:8000/api/get_all_equipment/

 

Так выглядит «админка» нашего проекта (Рисунок 10):

 

Рисунок 10 – Развернутое на локальном хостинге приложение, страница http://127.0.0.1:8000/admin

 

В проекте в качестве базы данных мы использовали Postgres. Для упрощения администрирования на сервере postgresql графический клиент pgAdmin, через который мы в удобном виде можем создавать, удалять, изменять базы (Рисунок 11):

Рисунок 11 – База данный в pgAdmin

Скажем несколько слов об архитектуре проекта в терминах шаблонов проектирования

Свой проект мы начали создавать, используя классическую модель (Рисунок 12):


Рисунок 12 – Используемая модель клиент-сервер

Но по мере роста проекта потребовались дополнительные знания по разработке программного обеспечения, касающегося архитектуры.


Бизнес-модель
–  это какой-то объект с его инкапсулированный логикой – –  кандидат домейн-слоя. Во главе дома, во главе угла,  стоит бизнес-layer, где описываются все модели, события, которые могут  происходить в домене


Инфраструктура 
(infrastrucrure layer) –  репозитории для взаимодействия с базой, например, либо с кэшем. Почему это выделяется в отдельный слой? Потому что  сегодня кэш мы один используем, завтра другой. Либо, наоборот, вообще не используем кэш:  таким образом, этот код просто изолируется от домена.

 

В нашем проекте существуют два субдомена: первый, это кухня, Kitchen, второй –  это нейросеть.

 

В начале, когда объем кода был невелик, нейросеть была отдельной утилитой в папке utils, как часть текущего единственного домена. По мере написания кода и расширения проекта, его пришлось выделить в отдельный домен, поддомен или субдомен. Субдомен (subdomain) –  элемент домена, его составляющая часть. Суть в том, что делить по cубдоменам можно в рамках одного решения-solution.

 

Есть ещё такое понятие, как модульный монолит. Монолит вполне можно выстроить по чистой архитектуре.

 

В KitchenHelper чётко видится деление на клиента frontend и на api, используется микро-сервисики из common и из apps (Рисунок 13):

Рисунок 13 – Код. Первоначальное деление,

Далее, в apps просматривается разделение по area — не совсем правильное место в папке apps, но подобное разделение — заявка на чистую архитектуру (Рисунок 14)

Рисунок 14 – Код. Разделение по area

Если говорить про какой-то усредненный Onion (в переводе с английского лук – такой тип архитектуры назван по схожести разреза луковицы), имеет четыре слоя. Если двигаться от центра: первый домен, второй —  application layer, infrastrucrure layer, затем идет executable service либо клиент — в нашем случае это api и frontend, то есть api желательно вынести в верхний слой, поместить рядом с frontend (Рисунок 15):

Рисунок 15 – Код. Разделение на бизнес-логику, тесты и фронтенд

Api не может быть инфраструктурой. Это контракт.  Это то, что приложение использует: какую-то базу, third-party — любые так чужеродные сервисы — для получения какой-нибудь аналитики, например, вот здесь можно вот писать код.  Если, например, в этом приложении нужно будет отправлять, допустим, письма, используя Sendgrid — для нас это будет  third-party. И, чтобы не испортить логику приложения, нам, нужно объявить какой-то интерфейс, заключить контракт, а под этот интерфейс на уровне инфраструктуры прятать реализацию.

Коль зашел разговор о  third-party, то стоит отметить, что в нашем приложении мы собираемся использовать third-party-сервис – приложение, написанное на Golang. Суть этого приложения заключается в следующем: выбирается для исследования десять каких-либо характеристик, например десять разных кухонь мира и попарно сравниваются, пользователю предлагается выбрать наиболее предпочитаемую характеристику из пары (Рисунок 16):

Рисунок 16 – Сервис исследований предпочтений, логинация под пользователем.


Статистика используется для исследования предпочтений пользователя приложения.

Для полноценного использования мы написали программу-сервис работы с сайтом https://forms-s9jo.onrender.com/, которая, используя selenium, авторизуется на этом сайте под администратором, обнуляет статистику, создает новый опрос, при этом может заменить десять исследуемых характеристик: заменив, например, картинки с народными кухнями на картинки с блюдами, после прохождения опроса пользователем программа использует статистику опроса для предложения вариантов рецептов.

В этом же слое, где находится фронтенд, утилиты для работы с third-party сервисами, мы разместили папку с тестами .tests.

В этой публикации мы не будем подробно останавливаться на автоматизированном тестировании. Заметим только то, что для нашего проекта не достаточно написать тесты к коду на питоне, необходимо тестировать ещё много всего, касающегося взаимодействия пользователя с интерфейсом программы, нагрузку и многое другое. Сегодня наша команда стоит вначале пути (Рисунок 17):

Рисунок 17 – Код. Папка .tests
 

Так, например, файл: authentification.py cодержит функции для аутентификации пользователя, обновления токена и выполнения авторизованных запросов к API с использованием JWT.

 

Основные функции:

authenticate_user() выполняет аутентификацию, отправляя учетные данные на сервер, сохраняет токены доступа и обновления в глобальные переменные, в случае ошибки выбрасывает исключение;

refresh_access_token() обновляет токен доступа с помощью токена обновления, при успешном обновлении сохраняет новый токен, иначе выбрасывает исключение; make_authorized_request(method, endpoint, **kwargs) выполняет авторизованный запрос к API, добавляя токен в заголовок, если токен истек, автоматически обновляет его и повторяет запрос (Рисунок 18):

 

Рисунок 18 – Код. Папка .tests. Файл authentification.py


Папка
frontend содержит клиентскую часть приложения, которая написана на react (Рисунки 19, 20):

Рисунок 19 – Страница рецептов от лица зарегистрированного пользователя

Рисунок 20 – Страница авторизации

 

В заключении хотелось бы отметить, что работа над проектах велась с использованием подхода Kanban для реализации принципов методологии Agile и DevOps  (Рисунок 21):

Рисунок 21 – Проект KitchenHelper на YouTrack. Доска Agile

 

Для планирования времени использовалась диаграммы Ганта (Рисунок 22)

Рисунок 22– Проект KitchenHelper на YouTrack. Диаграммы Ганта


Техническое задание обрастало деталями, заказчик помимо технических требовал представления вполне определенного пользовательского сценария. Чтобы иметь возможность выбора и увеличить шансы получить заказ, мы, пользуясь предыдущими наработками переписали бэкенд на Java (Spring Data JPA Hibernate), а также создали образы приложения, используя Docker и Docker-compose