Это 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/…