Streamlight를 사용하여 웹 기반의 실시간 컴퓨터 시각 응용 프로그램 구축

이 글은 이 라이브러리의 구 판본을 바탕으로 한 것으로 이미 유행이 지났다.
보이다✌️
Streamlit는 데이터 과학자, 기계 학습 연구원과 개발자에게 좋은 구조이고 streamlit-webrtc 실시간 영상(과 오디오) 흐름을 처리할 수 있도록 확장되었다.
이는 서버에서 파이톤으로만 컴퓨터 시각 알고리즘을 실현할 수 있다는 뜻이다. 사용자는 이를 인터넷 애플리케이션으로 사용하고 인터넷 카메라나 스마트폰에서 실시간으로 동영상을 입력할 수 있다.

본고는 이 라이브러리를 어떻게 사용해서 이런 응용 프로그램을 개발하는지 설명하는 간단한 강좌이다.

선결 조건


설치streamlit.
$ pip install streamlit
만약 Streamlight에 익숙하지 않다면, 나는 네가 좀 보라고 건의한다. its tutorial몇 분밖에 안 걸려요.

Streamlight webrtc 사용


필요한 패키지 설치


설치streamlit-webrtc.본 강좌는 버전0.6.3을 바탕으로 한다.API는 향후 릴리즈에서 변경될 수 있습니다.
$ pip install streamlit-webrtc
$ # pip install streamlit-webrtc==0.6.3 # Specify the exact version if necessary
동시에 설치opencv-python.
$ pip install opencv-python

첫 번째 예


우선, streamlit_webrtc 의 사용자 정의 구성 요소를 페이지에 간단하게 놓고, 아래의 예로 삼자.
# simple_loopback.py

import streamlit as st
from streamlit_webrtc import webrtc_streamer

webrtc_streamer(key="example")
key 매개 변수는 다른 Streamlight 구성 요소와 다르므로 선택할 수 없습니다.고유 문자열을 설정해야 합니다.
그리고 streamlit run 명령을 사용하여 프로그램을 실행합니다. 아래와 같습니다.
$ streamlit run simple_loopback.py
브라우저에서 응용 프로그램을 연 후 시작 버튼을 클릭합니다.
그리고 인터넷 카메라에서 온 영상이 나온다.
(웹캠 및 마이크에 대한 액세스 권한이 필요할 수 있습니다.해당되는 경우 허용합니다.)
이것은 streamlit-webrtc 의 가장 간단한 예이다. 로컬 인터넷 카메라에서 영상을 포획하여 파이톤 프로세스에 보내고, 이를 앞쪽으로 보내서 미리 보기를 표시한다.

단순 프레임 필터


다음에 우리는 컴퓨터 시각 코드를 어떻게 이 과정에 주입하는지 보게 될 것이다.
다음은 OpenCV의 Canny 필터를 사용한 다음 예입니다.
# canny_filter.py

import cv2
from streamlit_webrtc import VideoTransformerBase, webrtc_streamer


class VideoTransformer(VideoTransformerBase):
    def transform(self, frame):
        img = frame.to_ndarray(format="bgr24")

        img = cv2.cvtColor(cv2.Canny(img, 100, 200), cv2.COLOR_GRAY2BGR)

        return img


webrtc_streamer(key="example", video_transformer_factory=VideoTransformer)
이 코드를 실행하고 결과를 보십시오.
$ streamlit run canny_filter.py
비디오 스트림에 실시간으로 적용되는 Canny 필터를 볼 수 있습니다.
webrtc_streamervideo_transformer_factory 파라미터를 받아들일 수 있다. 이것은 Callable 파라미터로 transform(self, frame) 방법이 있는 종류의 실례를 되돌려준다.
유형 주석을 좋아한다면 ABC (추상 기류) VideoTransformerBase 를 사용하면 이 인터페이스를 정의할 수 있습니다. 위의 예시와 같습니다.
어쨌든, 위의 예시와 같이, 당신은 transform() 방법에서 임의의 프레임 필터를 실현할 수 있으며, 이 방법은 영상 흐름의 모든 프레임을 변환할 수 있습니다.transform() 매개 변수frame를 받아들이고numpy 수조img를 되돌려줍니다.
매개 변수frameav.VideoFramefrom av package의 실례이고, 반환값img은 출력 프레임 그림을 나타내는numpy 수조이다.
영상 흐름은 분기 라인에서 처리되며, 주 라인에서streamlit의 스크립트 실행 흐름과 무관하며, transform()는 분기 라인에서 호출됩니다.

대화형 컨트롤


Streamlight를 사용하는 가장 큰 장점 중 하나는 슬라이더와 선택 단추와 같은 상호작용 컨트롤러입니다.streamlit-webrtc 그것들과 결합하여 사용하면 효과가 좋다.
다음 예제를 참조하십시오.
# interactive.py

import cv2
import streamlit as st
from streamlit_webrtc import VideoTransformerBase, webrtc_streamer


class VideoTransformer(VideoTransformerBase):
    def __init__(self):
        self.threshold1 = 100
        self.threshold2 = 200

    def transform(self, frame):
        img = frame.to_ndarray(format="bgr24")

        img = cv2.cvtColor(
            cv2.Canny(img, self.threshold1, self.threshold2), cv2.COLOR_GRAY2BGR
        )

        return img


ctx = webrtc_streamer(key="example", video_transformer_factory=VideoTransformer)

if ctx.video_transformer:
    ctx.video_transformer.threshold1 = st.slider("Threshold1", 0, 1000, 100)
    ctx.video_transformer.threshold2 = st.slider("Threshold2", 0, 1000, 200)

그리고 이 코드를 실행합니다.
$ streamlit run interactive.py

이 예는 이전 예제에 기반하고 슬라이더를 사용하여 Canny 필터 매개변수를 제어하는 것으로 확장됩니다.ctx에서 되돌아오는 webrtc_streamer() 대상은 여기에서 인용.video_transformer 속성에 사용됩니다.이 속성은 VideoTransformer 실례화video_transformer_factory의 실례이다.
그리고 실례 속성transform()ctx.video_transformer.threshold1을 통해 슬라이더의 값을 ctx.video_transformer.threshold2에 전달한다.
이것은 transform()가 호출되었고 상기 비동기적인 방식이 다른 라인에서 운행되기 때문이다.
이 값의 전달이 라인이 안전한지 확인하십시오. 특히 복잡한 대상을 전달할 때 조심해야 합니다.

추가 예제 및 정보


이 글은 캔니 필터의 간단한 예시 하나만 보여 주지만,
너는 더욱 재미있는 어떤 종류의 컴퓨터 시각 응용 프로그램을 개발할 수 있다.
예를 들어, MobileNet SSD는
https://share.streamlit.io/whitphx/streamlit-webrtc-example/main/app.py(유선형 공유)

https://streamlit-webrtc-example.herokuapp.com/(Heroku자유계획).

https://github.com/whitphx/streamlit-webrtc-example는 이 애플리케이션의 저장소입니다.
다음 명령을 사용하여 로컬 환경에서 이 적용을 시도할 수도 있습니다.
$ pip install streamlit-webrtc opencv-python
$ streamlit run https://raw.githubusercontent.com/whitphx/streamlit-webrtc-example/main/app.py
앞에서 말한 바와 같이 streamlit-webrtc 's README.
This forum topic는 이 라이브러리에 대한 이해에 도움이 될 수 있습니다.

원격 서버에서 호스팅


우리는 원격 호스트에 응용 프로그램을 배치할 수 있도록localhost를 연구해 왔다.
이것은 streamlitstreamlit-webrtc 의 좋은 방법이다. 왜냐하면 사용자가 로컬 인터넷 카메라나 스마트폰으로 쉽게 원격으로 응용 프로그램을 시도할 수 있기 때문이다.
이 점을 하려면, 특히 사용하는 것에 주의해야 한다. streamlit-webrtc

네트워크 연결성


일부 네트워크 환경에서는 비디오 스트리밍이 작동하지 않습니다.
예를 들어, 일부 사무실 네트워크에서는 방화벽이 WebRTC 패킷을 폐기합니다.

HTTPS

streamlit-webrtc API를 사용하여 로컬 웹캠에 액세스하는 방법은 안전하지 않은 환경에서는 작동하지 않습니다.
getUserMedia() 표시

A secure context is, in short, a page loaded using HTTPS or the file:/// URL scheme, or a page loaded from localhost.


따라서 원격 서버에서 어플리케이션을 호스팅할 때는 HTTPS를 통해 서비스를 제공해야 합니다.
가장 간단한 방법 중 하나는 Heroku와 같은 위탁 관리 서비스를 사용하는 것이다. 이것은 기본적으로 HTTPS 서비스를 제공한다.특히 streamlit를 사용하는 응용 프로그램에 대해서는 This document를 선택할 수 있다.
위에 표시된 객체 검사 예제 응용 프로그램은 실제로 Heroku와 Streamlight 공유를 사용합니다.Streamlit Sharing에서 이 서비스의 이 프로그램의 배치 설정을 볼 수 있습니다.
만약 로컬 네트워크 내의 호스트에 응용 프로그램을 제공해야 한다면, 예를 들어nginx와 같은 역방향 프록시 소프트웨어를 사용할 수 있다.
원형 단계the repository는 간단하지만 유용한 옵션일 수 있습니다.

좋은 웹페이지 즐겨찾기