Компьютерное зрение и распознавание изображений, несомненно, являются интересными областями машинного обучения. Хотя он становится все более доступным для тех, кто только начинает свой путь в области машинного обучения, ему необходимы знания таких инструментов, как Python и TensorFlow.

К счастью, если мы хотим поиграть и создать примеры распознавания изображений, Google разработал Teachable Machine — веб-инструмент, который делает создание моделей машинного обучения быстрым, простым и доступным для всех. Сочетание Teachable Machine с передовым инструментом обработки данных Streamlit означает, что мы можем быстро и легко создавать забавные и интерактивные модели распознавания изображений.

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

Необходимые условия: учетная запись GitHub, веб-камера, 2 ваши любимые мягкие игрушки, плюшевые игрушки или предметы домашнего обихода!

Начало работы

Обучаемая машина и создание модели

Teachable Machine от Google бесплатна и проста в использовании — вам даже не нужно создавать учетную запись.

Зайдите на сайт здесь: https://teachablemachine.withgoogle.com/train

Выберите «Проект изображения», а затем «Стандартная модель изображения».

Затем интерфейс позволяет сразу же приступить к созданию тренировочных изображений.

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

Затем вы можете выбрать «Веб-камера» и нажать кнопку «Удерживать для записи», чтобы начать принимать тренировочные данные. Это изображения, которые модель будет использовать для обучения.
Для достижения наилучших результатов:

  • Сохраняйте фон как можно более четким — простой белый цвет без других объектов даст наилучшие результаты.
  • Освещение должно быть четким и простым — важно убедиться, что освещение соответствует классу 1 и классу 2.
  • Убедитесь, что не захвачены пустые изображения. Вы можете удалить любые изображения, которые вы случайно сделали.
  • Держите все, кроме вашего предмета, вне поля зрения. По возможности избегайте рук, лица и всего остального.
  • Покачайте свой предмет и сделайте в общей сложности около 1000 фотографий (удерживая кнопку, вы сделаете это очень быстро). Обязательно получите разные положения с разной глубины и под разными углами.

Как только вы будете довольны изображениями, которые вы собрали, нажмите «обучить». Это будет использовать ваши данные и TensorFlow.js для обучения модели в вашем браузере. Teachable Machine сделает все за вас — обучите / протестируйте ваши данные, обработайте изображения и передайте их модели, проверьте точность и рассчитайте ваши показатели.

После обучения вы можете узнать больше о том, насколько хорошо работает ваша модель, нажав «Дополнительно» и «Под капотом». Оттуда вы можете увидеть оценки точности и матрицу путаницы. Это показатели точности вашей модели.

Точность 1,00 означает, что, используя пример входных данных, он всегда может предсказать, Пикачу это или Иви — отлично! Такая идеальная модель, как правило, встречается довольно редко, но на моих примерных картинках четкий фон и легко различить двух плюшевых игрушек — желтое тело Пикачу с ярко-красными щеками облегчает модель!

Теперь, когда вы обучили свою модель, вы можете просмотреть предварительный просмотр. Когда вы показываете каждый объект, он сообщает вам процент достоверности для каждого класса. Моя модель была очень уверена (и правильна) в отношении Пикачу и Иви.

Экспорт вашей модели

Теперь, когда у вас есть модель, которой вы довольны (если вы недовольны, пересмотрите этапы создания изображения и этапы обучения), вы можете экспортировать ее. Мы собираемся экспортировать файлы, чтобы разместить их в нашем приложении Streamlit Cloud.

Перейдите к кнопке «Экспорт модели» на панели предварительного просмотра.

Выберите параметр Tensorflow с типом преобразования модели Keras. Затем нажмите «Загрузить мою модель».

Создание вашей модели займет несколько минут — ваши обучающие данные (изображения) никогда не покидают ваш браузер, но он будет использовать сервер Teachable Machine Cloud, чтобы немного ускорить процесс. Теперь у вас должен быть файл .zip с именем Converted_Keras.zip — он содержит два файла, которые вам понадобятся для работы вашего интерактивного приложения Streamlit — keras_model.h5 и labels.txt.

keras_model.h5 содержит инструкции для нашей модели.
labels.txt содержит информацию о названиях наших классов.

Teachable Machine предоставляет фрагменты кода — мы используем версию, адаптированную для интеграции компонентов Streamlit.

Создание нашего репозитория GitHub

Вам понадобится учетная запись GitHub. После входа в систему создайте вилку репозитория для этого проекта:

https://github.com/LCarpenter87/TeachableMachine

Разветвление репозитория дает вам копию, в которую вы можете вносить изменения. Первое изменение, которое нужно сделать, это добавить загруженные файлы. Перейдите к опции «Загрузить файлы» в разделе «Добавить файл».

Перейдите к «Загрузить файлы», добавьте распакованную версию keras_model.h5 и labels.txt, а затем нажмите «Зафиксировать изменения».

Это все для GitHub! streamlit_app.py — вот где происходит волшебство. Стоит посмотреть на код, чтобы лучше понять проект. Я познакомлю вас с основным кодом позже в этом руководстве.

Подключение к облаку Streamlit

Streamlit — отличная платформа, предназначенная для предоставления простых в использовании интерфейсов для проектов по науке о данных с минимальными усилиями. Мы собираемся использовать бесплатную облачную версию сообщества.

Зарегистрируйте аккаунт здесь: https://share.streamlit.io/signup

После входа в систему перейдите в «Новое приложение» -> «Из существующего репозитория». Вам нужно будет связать свою учетную запись Streamlit с GitHub, чтобы позволить Streamlit получить доступ к вашим репозиториям и создать необходимый ключ API.

Выберите свою копию репозитория — и вы готовы к работе! Нажмите «Развернуть»! кнопку, и Streamlit отправит ваше приложение в духовку и начнет выпекать.

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

Поздравляем, ваша веб-страница Streamlit завершена! Создать интерактивную страницу в Streamlit очень просто.

Живая версия демонстрационной модели Пикачу/Иви —
https://lcarpenter87-teachablemachine-streamlit-app-uknici.streamlit.app/

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

Понимание Streamlit и кода

Требования.txt

Один из самых важных файлов в репозитории — requirements.txt — это простой файл, состоящий всего из двух строк. Файл requirements.txt сообщает облаку Streamlit, какие пакеты и библиотеки потребуются среде Python. Облако Streamlit затем продолжит и запустит «Pip Install» для каждого элемента в списке.

streamlit_app.py

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

import streamlit as st

Мы начинаем с импорта нужных нам библиотек — библиотеки Python Streamlit позволяют использовать весь замечательный код Streamlit — вы можете видеть, что мы называем его ярлыком «st». Каждый раз, когда вы видите код с 'st.', это из библиотеки Streamlit и позволяет нам создавать компоненты StreamLit.

import cv2

cv2 — это библиотека Open Computer Vision для Python — эта библиотека содержит функции для обработки изображений. Изображения, поступающие прямо с веб-камеры, нуждаются в обработке, так как они не в том формате, который нужен нашей модели.

from keras.models import load_model

Keras — это Python API TensorFlow. Именно так мы общаемся и разговариваем с TensorFlow из Python. Мы будем использовать это, чтобы загрузить модель из Teachable Machine и сделать прогноз.

st.title(f'Is it {classes[0]} or {classes[1]}!?')
img_file_buffer = st.camera_input(f"Take a picture of {classes[0]} or {classes[1]}")

Здесь мы используем наши первые две команды Streamlit.

st.title будет написано на странице крупным шрифтом.

st.camera_input() очень удобен — он создает компонент, который позволит нам сделать снимок с помощью нашей веб-камеры и вернуть его как изображение, которое мы можем назначить (в данном случае мы назначаем его в img_file_buffer). Документация по API Streamlit показывает несколько отличных примеров того, как работать с входом камеры.

if img_file_buffer is not None:

Это одна из самых крутых строк кода в проекте. img_file_buffer заполняется, когда компонент веб-камеры используется для фотографирования. Этот оператор if будет ожидать изображения, а затем запускает остальную часть кода.

    bytes_data = img_file_buffer.getvalue()
    cv2_img = cv2.imdecode(np.frombuffer(bytes_data, np.uint8), cv2.IMREAD_COLOR)
    image = cv2.resize(cv2_img, (224, 224), interpolation=cv2.INTER_AREA)
    image = np.asarray(image, dtype=np.float32).reshape(1, 224, 224, 3)
    image = (image / 127.5) - 1
    probabilities = model.predict(image)

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

if probabilities[0,0] > 0.8:
        prob = round(probabilities[0,0] * 100,2)
        st.write(f"I'm {prob}% sure that's {classes[0]}!")
    elif probabilities[0,1] > 0.8:
        prob = round(probabilities[0,1] * 100,2)
        st.write(f"I'm {prob}% sure that's {classes[1]}!")
    else:
        st.write("I'm not confident that I know what this is! ")

Как только мы получим наши вероятности из модели — по одной вероятности для каждого класса — мы можем вывести сообщение пользователю. В этой версии мы проверяем, превышает ли вероятность 0,8 для любого класса. st.write() похож на print().

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

Если вы попытались использовать более двух классов, ошибка будет именно в этой части! Вам потребуется изменить код, чтобы учесть наличие большего количества классов.

    st.balloons()

А теперь лучшая часть любого проекта Streamlit — это то, что я всегда буду включать. st.balloons() Я оставлю вас, чтобы понять, что это делает!

Будущее усовершенствование:

На данный момент мы использовали st.camera_input() для получения статического изображения. У нас также есть возможность использовать живую версию нашей веб-камеры и делать непрерывный прогноз, как мы видели в предварительном просмотре Teachable Machine. Хотя код по-прежнему доступен, он использует многопоточность, чтобы обеспечить обработку изображения с веб-камеры, а также получать больше изображений с веб-камеры, и для обработки потока с веб-камеры требуется дополнительная библиотека streamlit_webrtc.

Мой следующий шаг — написание руководства по работе с веб-версией в режиме реального времени, а пока вот streamlit_app.py для версии в режиме реального времени:



Спасибо

Спасибо, что читаете и следите за новостями! Надеюсь, вам было весело играть со Streamlit и Teachable Machine. Дайте мне знать, если у вас есть какие-либо вопросы или если у вас есть какие-либо успехи (или неудачи) в следовании этому руководству!