Streamlit развертывает обнаружение объектов YOLOv5

глубокое обучение Python

Это 28-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

окрестности

  • виндовс 10 64 бит
  • anaconda with python 3.8
  • streamlit 0.86.0
  • yolov5 v5.0

что такое стримлит

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

инсталляция

streamlitТребоватьpythonВерсию выше или равную 3.6 можно использовать напрямуюpipустановить

pip install streamlit

После успешной установки используйте его встроенныйhello appпроверить, выполнить команду

streamlit hello

После запуска сервиса он автоматически откроет нам страницу, адрес такойhttp://localhost:8501

streamlit

можно увидеть,streamlitПорт 8501 используется по умолчанию

Кроме,streamlitОфициальный также предоставляет несколько более сложное приложение, которое сочетает в себеyolov3Алгоритм обнаружения цели, адрес склада:GitHub.com/stream-like-it/…, желающие могут перейти к исследованию, код короткий, но функция полная

streamlit

Итак, как запустить файлы исходного кода, написанные нами? На самом деле это очень просто, например, файл с исходным кодомapp.py, то вы можете выполнить

streamlit run app.py

Вот еще две часто используемые команды

  • streamlit docs Просмотреть документацию
  • очистить кеш Streamlit очистить кеш

Общие компоненты Streamlit

кнопка

import streamlit as st

button = st.button('按钮')

streamlit button

поле ввода текста

import streamlit as st

st.text_input('请输入最喜欢的编程语言', key="name")

streamlit text_input

текстовый дисплей

import streamlit as st

st.write('Hello streamlit.')

streamlit write

streamlitИдеальная поддержкаmarkdownсинтаксис, вы можете использовать его напрямуюwriteметод, см. пример

import streamlit as st

st.write("""
    # 一级标题
    ## 二级标题
    ### 三级标题

    **强调**
    

    >这是引用

    . python    
    . java    
    . c/c++    
    . rust    
""")

streamlit write markdown

Кромеwriteметод,streamlitтакже обеспечиваетtextметод, который также может отображать текстовую информацию

import streamlit as st

st.text('Hello streamlit.')

заглавие

import streamlit as st

st.title('title')

streamlit title

Кромеtitle,streamlitтакже обеспечиваетheaderиsubheader

import streamlit as st

st.header('header')
st.subheader('subheader')

streamlit header

Слайдер

import streamlit as st

number = st.slider('Pick a number', 0, 100)

streamlit slider

поле выбора

import streamlit as st

flag = st.checkbox('Yes')

streamlit checkbox

одна кнопка

import streamlit as st

languages = ['python', 'c', 'rust', 'c++']

st.radio('Pick a language', languages)

streamlit radio

выпадающее окно выбора

import streamlit as st

st.selectbox('用过哪几种编程语言?', ('python', 'c', 'java', 'rust'))

streamlit selectbox

выбор даты

import streamlit as st

date = st.date_input('Pick a date')

streamlit date_input

палитра цветов

import streamlit as st

color = st.color_picker('Pick a color')

streamlit color_picker

средство выбора файлов

import streamlit as st

file = st.file_uploader('Pick a file')

streamlit file_uploader

Другие особенности стримлита

показать json

import streamlit as st

st.json({
    "code": 0,
    "data": {
        "sex": "female",
        "age": 18,
        "score": 100
    }
})

streamlit json

показать код

from numpy.core.arrayprint import _leading_trailing
import streamlit as st

code = """
    def func():
        print('Hello streamlit.')
"""
st.code(code, language='python')

streamlit code

Отображение фрейма данных в пандах

from numpy.core.arrayprint import _leading_trailing
import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(50, 5), columns=(
    'col %d' % i for i in range(5)))
st.dataframe(df)

streamlit pandas dataframe

в последнем предложенииst.dataframe(df)Можно использоватьst.write(df)вместо этого эффект тот же

показать стол

import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(50, 5), columns=(
    'col %d' % i for i in range(5)))
st.table(df)

streamlit table

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

Отображение данных индикатора

Здесь необходимо установить другую библиотекуstreamlit-metrics, выполнить команду установкиpip install streamlit-metricsПросто

import streamlit as st
from streamlit_metrics import metric_row

st.write("一周数据统计")
metric_row(
    {
        "关注人数": 100,
        "点赞人数": 200,
        "在看人数": 300,
        "分享人数": 400
    }
)

streamlit metric

Состояние сеанса и обратные вызовы для Streamlit

состояние сеанса

Открытие новой страницы в браузере создает сеанс (session). состояние сеанса - страницаrerun(не похожеF5Способ взаимодействия данных при обновлении страницы).

посмотреть пример подсчета

import streamlit as st

st.title('Hello streamlit.')
counter = 0

increment = st.button('Increment')
if increment:
    counter += 1

st.write('Count= ', counter)

streamlit session state

Вы можете видеть, что только когда кнопка нажата в первый раз,CountДобавлено 1, последующий щелчок,counterНичего не изменится, что явно отличается от того, что мы ожидали.

Давайте изменим код выше

from typing import Counter
import streamlit as st

st.title('Hello streamlit.')
if 'counter' not in st.session_state:
    st.session_state.counter = 0

increment = st.button('Increment')
if increment:
    st.session_state.counter += 1

st.write('Count= ', st.session_state.counter)

streamlit session state

Эта функция обычная, каждый раз, когда нажимается кнопка,Countпросто добавь 1

обратные вызовы

Перезвони(callbacks)ЯвляетсяpythonФункция, которая вызывается при изменении компонента ввода, например при нажатии кнопки, перемещении ползунка и т. д.

Для приведенного выше примера используйтеcallbacksнемного отредактировать

from typing import Counter
import streamlit as st

# callbacks
def increment_counter():
    st.session_state.counter += 1


st.title('Callbacks')
if 'counter' not in st.session_state:
    st.session_state.counter = 0

st.button('Increment', on_click=increment_counter)
st.write('Count= ', st.session_state.counter)

Эффект выполнения кода тот же. Это пример без параметров, если вам нужно взаимодействие с данными, вы можете использоватьargsилиkwargs, см. пример ниже

import streamlit as st

st.title('Callbacks with args')
if 'counter' not in st.session_state:
    st.session_state.counter = 0

increment_value = st.number_input('Enter a value', value=0, step=1)


def increment_counter(increment_value):
    st.session_state.counter += increment_value


increment = st.button('Increment', on_click=increment_counter,
                      args=(increment_value, ))

st.write('Count = ', st.session_state.counter)

streamlit callbacks args

Посмотрите нижеkwargsиспользование, которое принимает именованные параметры

import streamlit as st

st.title('Callbacks with kwargs')
if 'counter' not in st.session_state:
    st.session_state.counter = 0


def increment_counter(increment_value=0):
    st.session_state.counter += increment_value


def decrement_counter(decrement_value=0):
    st.session_state.counter -= decrement_value


st.button('Increment', on_click=increment_counter,
          kwargs=dict(increment_value=5))

st.button('Decrement', on_click=decrement_counter,
          kwargs=dict(decrement_value=1))

st.write('Count = ', st.session_state.counter)

callbacks kwargs

нажмитеIncrementкнопка,CountПросто добавьте 5, нажмитеDecrementкнопка,Countпросто вычесть 1

Соображения о состоянии сеанса

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

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

  • Состояние сеанса не является постоянным. еслиstreamlitЕсли сервер выйдет из строя, то все, что хранится в состоянии сеанса, будет удалено.

упрощенное развертывание

streamlitСамое главное преимущество — совместное использование

Войти на сайтstreamlit.io/sharing, запросить приглашение

streamlit share

После заполнения основной информации просто дождитесь ответа

streamlit share

streamlitЗапрос был обработан очень быстро, на следующий день я получил электронное письмо с подтверждением.

stremlit share email

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

  1. Сохраните проект вgithub, по умолчаниюmainФилиал, проект должен иметьrequirements.txtдокумент

  2. доступshare.streamlit.io/, использоватьgithubлогин аккаунта

  3. Создать приложение

streamlit share

  1. Заполните информацию о проекте, не заполняйте по ошибке ветку и входные файлы

streamlit share

  1. Запустите развертывание и установите различные зависимости в фоновом режиме.

streamlit share

  1. Запуск проекта

streamlit share

Я сообщил об ошибке здесь

Traceback (most recent call last):

  File "/home/appuser/venv/lib/python3.7/site-packages/streamlit/script_runner.py", line 350, in _run_script

    exec(code, module.__dict__)

  File "/app/yolov5-streamlit/main.py", line 5, in <module>

    from detect import detect

  File "/app/yolov5-streamlit/detect.py", line 5, in <module>

    import cv2

  File "/home/appuser/venv/lib/python3.7/site-packages/cv2/__init__.py", line 5, in <module>

    from .cv2 import *

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

Здесь необходимоrequirements.txtв файлеopencv-pythonизменить наopencv-python-headless

Нажмите в правом верхнем углуrerunПосле этого переустановите зависимости, и вы можете успешно запустить

streamlit share

Наконец, чтобы проверить, является ли функция нормальной. Выберите локальное изображение для загрузки, затем нажмите «Определить».

streamlit share

Пока без проблем, всеAppРазвертывание завершено, вы можете поделиться им с друзьями

streamlit share

streamlit share

Если вы хотите испытать это онлайн, вы можете посетить

класс share.stream IT.IO/Невозможно/…

Загрузка исходного кода

githubадрес:GitHub.com/Фэнтези/…

Входной файлmain.py, внутри сstreamlitСоответствующий код интерфейса на самом деле очень мал, посмотрите на это так:streamlitЭто действительно очень подходит для друзей, которые не знают интерфейс.yolov5Часть кода, в основном, копирует исходный проект, только изменено 2 места.

  1. Метод обнаружения вDetect.py добавляет параметрopt
  2. Измените формат, сохраненный после обнаружения видео, с исходногоmp4vизменился наavc1. Причина в том, чтоstreamlitсерединаvideoподходит для воспроизведенияh264закодированныйmp4, подробная операция может относиться кImagination.com/2021/08/20/…

использованная литература