Это 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Порт 8501 используется по умолчанию
Кроме,streamlitОфициальный также предоставляет несколько более сложное приложение, которое сочетает в себеyolov3Алгоритм обнаружения цели, адрес склада:GitHub.com/stream-like-it/…, желающие могут перейти к исследованию, код короткий, но функция полная
Итак, как запустить файлы исходного кода, написанные нами? На самом деле это очень просто, например, файл с исходным кодомapp.py, то вы можете выполнить
streamlit run app.py
Вот еще две часто используемые команды
- streamlit docs Просмотреть документацию
- очистить кеш Streamlit очистить кеш
Общие компоненты Streamlit
кнопка
import streamlit as st
button = st.button('按钮')
поле ввода текста
import streamlit as st
st.text_input('请输入最喜欢的编程语言', key="name")
текстовый дисплей
import streamlit as st
st.write('Hello streamlit.')
streamlitИдеальная поддержкаmarkdownсинтаксис, вы можете использовать его напрямуюwriteметод, см. пример
import streamlit as st
st.write("""
# 一级标题
## 二级标题
### 三级标题
**强调**
>这是引用
. python
. java
. c/c++
. rust
""")
Кромеwriteметод,streamlitтакже обеспечиваетtextметод, который также может отображать текстовую информацию
import streamlit as st
st.text('Hello streamlit.')
заглавие
import streamlit as st
st.title('title')
Кромеtitle,streamlitтакже обеспечиваетheaderиsubheader
import streamlit as st
st.header('header')
st.subheader('subheader')
Слайдер
import streamlit as st
number = st.slider('Pick a number', 0, 100)
поле выбора
import streamlit as st
flag = st.checkbox('Yes')
одна кнопка
import streamlit as st
languages = ['python', 'c', 'rust', 'c++']
st.radio('Pick a language', languages)
выпадающее окно выбора
import streamlit as st
st.selectbox('用过哪几种编程语言?', ('python', 'c', 'java', 'rust'))
выбор даты
import streamlit as st
date = st.date_input('Pick a date')
палитра цветов
import streamlit as st
color = st.color_picker('Pick a color')
средство выбора файлов
import streamlit as st
file = st.file_uploader('Pick a file')
Другие особенности стримлита
показать json
import streamlit as st
st.json({
"code": 0,
"data": {
"sex": "female",
"age": 18,
"score": 100
}
})
показать код
from numpy.core.arrayprint import _leading_trailing
import streamlit as st
code = """
def func():
print('Hello streamlit.')
"""
st.code(code, language='python')
Отображение фрейма данных в пандах
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)
в последнем предложении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)
с вышеуказанным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
состояние сеанса
Открытие новой страницы в браузере создает сеанс (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)
Вы можете видеть, что только когда кнопка нажата в первый раз,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)
Эта функция обычная, каждый раз, когда нажимается кнопка,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)
Посмотрите ниже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)
нажмитеIncrementкнопка,CountПросто добавьте 5, нажмитеDecrementкнопка,Countпросто вычесть 1
Соображения о состоянии сеанса
Есть две вещи, которые следует отметить в отношении состояния сеанса, а именно:
-
Пока страница открыта и подключена к
streamlitсервер, состояние сеанса всегда будет существовать. После закрытия вкладки все, что хранится в состоянии сеанса, теряется. -
Состояние сеанса не является постоянным. если
streamlitЕсли сервер выйдет из строя, то все, что хранится в состоянии сеанса, будет удалено.
упрощенное развертывание
streamlitСамое главное преимущество — совместное использование
Войти на сайтstreamlit.io/sharing, запросить приглашение
После заполнения основной информации просто дождитесь ответа
streamlitЗапрос был обработан очень быстро, на следующий день я получил электронное письмо с подтверждением.
В электронном письме подробно описаны этапы развертывания, в основном просто следуйте за операцией.
-
Сохраните проект в
github, по умолчаниюmainФилиал, проект должен иметьrequirements.txtдокумент -
доступshare.streamlit.io/, использовать
githubлогин аккаунта -
Создать приложение
- Заполните информацию о проекте, не заполняйте по ошибке ветку и входные файлы
- Запустите развертывание и установите различные зависимости в фоновом режиме.
- Запуск проекта
Я сообщил об ошибке здесь
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После этого переустановите зависимости, и вы можете успешно запустить
Наконец, чтобы проверить, является ли функция нормальной. Выберите локальное изображение для загрузки, затем нажмите «Определить».
Пока без проблем, всеAppРазвертывание завершено, вы можете поделиться им с друзьями
Если вы хотите испытать это онлайн, вы можете посетить
класс share.stream IT.IO/Невозможно/…
Загрузка исходного кода
githubадрес:GitHub.com/Фэнтези/…
Входной файлmain.py, внутри сstreamlitСоответствующий код интерфейса на самом деле очень мал, посмотрите на это так:streamlitЭто действительно очень подходит для друзей, которые не знают интерфейс.yolov5Часть кода, в основном, копирует исходный проект, только изменено 2 места.
- Метод обнаружения вDetect.py добавляет параметр
opt - Измените формат, сохраненный после обнаружения видео, с исходного
mp4vизменился наavc1. Причина в том, чтоstreamlitсерединаvideoподходит для воспроизведенияh264закодированныйmp4, подробная операция может относиться кImagination.com/2021/08/20/…