Как развернуть модель Roboflow в Streamlit

Во Части 2 нашей серии руководств мы познакомили вас с Roboflow для обучения модели с вашими собственными изображениями. Теперь давайте двигаться дальше:

Создание веб-приложения Streamlit для обнаружения объектов изображения с помощью модели Roboflow

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

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

Давайте подготовим виртуальную среду для приложения Streamlit. Сначала давайте создадим виртуальную среду и после ее создания активируем ее (Windows).

python -m venv env
env\Scripts\activate

Затем нам нужно установить PyTorch, Ultralytics и Streamlit. Попробуйте установить в следующем порядке.

pip install torch
pip install ultralytics
pip install streamlit

После этого мы готовы попробовать hello world в Streamlit, чтобы убедиться, что все установлено правильно. Создайте файл с именем app.py и поместите следующие строки кода, используя вашу любимую IDE:

import streamlit as st
st.write("Hello, World!")

Затем запустите его из терминала в cmd и, если все работает нормально, откроется браузер.

streamlit run app.py

Затем, чтобы создать инструмент для загрузки наших изображений и использования модели, нам нужно открыть редактор кода, и давайте начнем с замены предыдущего файла и создания нового с именем app.py. Но нам также нужна папка с именем weights и на данный момент это все. Теперь давайте перейдем к следующему шагу.

Создайте загрузку изображения в веб-приложении Streamlit

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

Мы также визуализируем вывод модели с выделенными на изображении идентифицированными объектами. Перейдем к коду.

Во Части 2 этой серии мы обсудили, как загрузить предварительно обученный файл веса модели Yolov8. скачал файл best.pt и сохранил его в нашем каталоге weights. Мы будем использовать тот же файл веса. В созданный файл с именем app.py пишем следующие строки кода:

# Import required libraries
import PIL

import streamlit as st
from ultralytics import YOLO

# Replace the relative path to your weight file
model_path = 'weights/best.pt'

# Setting page layout
st.set_page_config(
    page_title="Object Detection",  # Setting page title
    page_icon="🤖",     # Setting page icon
    layout="wide",      # Setting layout to wide
    initial_sidebar_state="expanded",    # Expanding sidebar by default
    
)

# Creating sidebar
with st.sidebar:
    st.header("Image Config")     # Adding header to sidebar
    # Adding file uploader to sidebar for selecting images
    source_img = st.file_uploader(
        "Upload an image...", type=("jpg", "jpeg", "png", 'bmp', 'webp'))

    # Model Options
    confidence = float(st.slider(
        "Select Model Confidence", 25, 100, 40)) / 100

# Creating main page heading
st.title("Object Detection")
st.caption('Updload a photo with this :blue[hand signals]: :+1:, :hand:, :i_love_you_hand_sign:, and :spock-hand:.')
st.caption('Then click the :blue[Detect Objects] button and check the result.')
# Creating two columns on the main page
col1, col2 = st.columns(2)

# Adding image to the first column if image is uploaded
with col1:
    if source_img:
        # Opening the uploaded image
        uploaded_image = PIL.Image.open(source_img)
        # Adding the uploaded image to the page with a caption
        st.image(source_img,
                 caption="Uploaded Image",
                 use_column_width=True
                 )

try:
    model = YOLO(model_path)
except Exception as ex:
    st.error(
        f"Unable to load model. Check the specified path: {model_path}")
    st.error(ex)

if st.sidebar.button('Detect Objects'):
    res = model.predict(uploaded_image,
                        conf=confidence
                        )
    boxes = res[0].boxes
    res_plotted = res[0].plot()[:, :, ::-1]
    with col2:
        st.image(res_plotted,
                 caption='Detected Image',
                 use_column_width=True
                 )
        try:
            with st.expander("Detection Results"):
                for box in boxes:
                    st.write(box.xywh)
        except Exception as ex:
            st.write("No image is uploaded yet!")

Вы можете изменить текст приложения в кодах строк st.caption так, как вы предпочитаете для своего проекта. Теперь давайте запустим приложение в терминале:

streamlit run app.py

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

Если все работает правильно, выполните следующую команду, чтобы получить требования:

pip freeze > requirements.txt

Также нам нужно создать файл с именем packages.txt в папке с кодом и поместить в него эту строку:

libgl1

Теперь мы можем создать репозиторий на Github, чтобы поместить наше приложение в streamlit.io, но перед этим обязательно удалите все в требованиях, кроме трех вещей:

torch==2.0.1
ultralytics==8.0.142
streamlit==1.25.0

Streamlit.io позволяет загружать только 1 ГБ. Установки занимают большую часть места, поэтому, чтобы избежать этого, мы оставляем три обязательные библиотеки для нашего приложения. Проверьте мой репозиторий и как его нужно загрузить.

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

Подключите учетную запись Streamlit к Github, а затем выберите репозиторий, в котором находится ваше приложение. затем выберите ветку и измените путь к основному файлу:

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

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

Затем вы можете попробовать свое приложение и проверить, правильно ли оно работает.

Заключение

Я надеюсь, что это руководство будет полезно для ваших проектов. Сочетание Roboflow и Streamlit позволяет разрабатывать приложения с удобным интерфейсом. Этот подход упрощает обнаружение и отслеживание объектов в режиме реального времени, позволяя использовать широкий спектр вариантов использования не только моделей обнаружения объектов для других проектов по науке о данных и машинному обучению.

Следите за мной. Я добавил одну дополнительную часть для активного обучения из Windows и Colab, Активное обучение Raspberry и развертывание Raspberry Pi, обязательно ознакомьтесь с дополнительными сообщениями 4, 5 и 6. Если вы обнаружите ошибки после этого или отзывы об этом руководстве, дайте мне знаете в комментариях, спасибо за внимание к этому сообщению. Удачи в ваших проектах.