Python의 WebRTC로 하여금 aiortc와 물체 검측의 YOLO v3 협업을 실현하도록 시도하다
개시하다
aiortc Python이 구현한 WebRTC의 프로그램 라이브러리
컨디션
Dockerfile
사용한 Docker file은 여기에 있습니다.
# Ubuntu 18.04 and aiortc
# aiortc: https://github.com/jlaine/aiortc
FROM ubuntu:18.04
MAINTAINER mganeko
#
# -- if you are using docker behind proxy, please set ENV --
#
#ENV http_proxy "http://proxy.yourdomain.com:8080/"
#ENV https_proxy "http://proxy.yourdomain.com:8080/"
ENV DEBIAN_FRONTEND nonineractive
#
# -- build tools --
#
RUN apt update && apt upgrade -y
RUN apt install python3 -y
RUN apt install python3-pip -y
RUN apt install python3-dev -y
RUN python3 -V
RUN pip3 -V
RUN pip3 install --upgrade pip
RUN pip -V
RUN apt install libopus-dev -y
RUN apt install libvpx-dev -y
RUN apt install libffi-dev -y
RUN apt install libssl-dev -y
RUN apt install libopencv-dev -y
#
# -- aiortc --
#
RUN apt install git -y
RUN mkdir /root/work
WORKDIR /root/work/
RUN git clone https://github.com/jlaine/aiortc.git
RUN pip install aiohttp
RUN pip install aiortc
RUN pip install opencv-python
#
# ------ yolo v3 ---
#
RUN apt install vim -y
RUN apt install wget -y
WORKDIR /root/work/
RUN git clone https://github.com/pjreddie/darknet.git
WORKDIR /root/work/darknet
RUN make
RUN wget https://pjreddie.com/media/files/yolov3.weights
RUN wget https://pjreddie.com/media/files/yolov3-tiny.weights
RUN ln -s /root/work/darknet/libdarknet.so /usr/lib/libdarknet.so
#-- copy darknet sample ---
WORKDIR /root/work/
RUN git clone https://github.com/mganeko/python3_yolov3.git
RUN cp /root/work/python3_yolov3/darknet-tiny-label.py /root/work/darknet/python/
# --- link ---
RUN ln -s /root/work/darknet/cfg /root/work/aiortc/examples/server/
RUN ln -s /root/work/darknet/data /root/work/aiortc/examples/server/
RUN ln -s /root/work/darknet/yolov3-tiny.weights /root/work/aiortc/examples/server/
#-- copy ---
WORKDIR /root/work/
RUN git clone https://github.com/mganeko/aiortc_yolov3.git
RUN cp /root/work/aiortc_yolov3/server_yolo.py /root/work/aiortc/examples/server/
RUN cp /root/work/aiortc_yolov3/index.html /root/work/aiortc/examples/server/
#COPY server_yolo.py /root/work/aiortc/examples/server/
#COPY index.html /root/work/aiortc/examples/server/
# --- for running --
EXPOSE 8080
WORKDIR /root/work/aiortc/examples/server/
CMD [ "python3", "server_yolo.py" ]
구축 프로그램
터미널에서 docker build 실행하기 (그림 이름은 적당히 추가하십시오)$ docker build -t mganeko/aiortc-yolov3 -f Dockerfile .
실행 프로그램
(1) 터미널에서 docker run으로 컨테이너 부팅docker run -d -p 8001:8080 mganeko/aiortc-yolov3
$ docker build -t mganeko/aiortc-yolov3 -f Dockerfile .
(1) 터미널에서 docker run으로 컨테이너 부팅
docker run -d -p 8001:8080 mganeko/aiortc-yolov3
Firefox, Safari로 연결할 수 없음
(3) [Usevideo] 확인, 옵션 선택
이번에는 다음과 같은 옵션이 추가됐다.해보고 싶은 것을 선택하세요.
테두리만 그리면 실시간으로 추적할 수 있지만 물체가 검출되면 무거워지고 영상은 점점 느려진다.유감스럽게도 이런 방법은 실용적이지 않다.
(4) [start] 버튼 클릭
몇 초가 지나면 브라우저와 aiortc의 연결이 확립되고 원시 영상과 가공된 영상이 번갈아 표시됩니다.
Object detection with YOLO v3 (YOLO v3에서 물체를 감지하고 테두리와 라벨을 그립니다) 의 예는 여기에 있습니다.
이번에 사용한 것은 ylov3-tiny 모형으로 한 프레임의 처리도 1초 이상 걸린다.영상이 점점 느려지기 때문에 수초 이상 사용하기 어렵다.
이미지 변환
이번 키모는 아오텍스의 비디오 프레임과darknet의 IMAGE 간의 상호 전환이다.
YUV 형식이라는 이름을 들어봤는데 이번이 처음이에요.
또 파이톤과 C 언어 형식의 포인터 변환도 처음 사용하기 때문에 오류나 비효과, 메모리 유출이 발생할 수 있다.지적해 주셨으면 좋겠습니다.
aiortc → darknet
두 단계에서 전환을 진행하다.
from ctypes import *
img = frame_to_bgr(frame) # YUV420 --> BGR. aiortcで提供されている
dn_image = array_to_image(img) # BGR --> IMAGE structure with float array
# 今回用意した変換関数
def array_to_image(arr):
arr = arr.transpose(2,0,1)
c = arr.shape[0]
h = arr.shape[1]
w = arr.shape[2]
arr = (arr/255.0).flatten()
data = c_array(c_float, arr) # c_array は darknet のサンプルより
im = IMAGE(w,h,c,data)
return im
darknet → aiortc
반대 방향도 두 단계로 나눠 전환한다.
from ctypes import *
import numpy
arr = image_to_array(im) # IMAGE structure --> BGR
newFrame = frame_from_bgr(arr) # BGR --> YUV420. aiortcで提供されている
# 今回用意した変換関数
def image_to_array(im):
size = im.w * im.h * im.c
data_pointer = cast(im.data, POINTER(c_float))
arr = numpy.ctypeslib.as_array(data_pointer,shape=(size,))
arrU8 = (arr * 255.0).astype(numpy.uint8)
arrU8 = arrU8.reshape(im.c, im.h, im.w)
arrU8 = arrU8.transpose(1,2,0)
return arrU8
프레임 및 레이블 그리기
darknet을 사용하여 프레임과 탭을 그릴 때 이 방법을 사용합니다.
img = cv2.rectangle(img, (left, top), (right, bottom), (255, 128,0), 3, 4)
img = cv2.putText(img, name, (left, top), cv2.FONT_HERSHEY_PLAIN, 2, (255, 128, 0), 2, 4)
왜 문자열이 잘 변환되지 않는지 모르겠습니다. b 'label' 처럼 그립니다.끝말
aiortc와 YOLO v3를 연합시키는 목적을 달성했지만 실시간으로 물체 검측을 하는 것은 어려울 것 같다.나는 원리적으로 할 수 있는 일과 실제로 지금 할 수 있는 일 사이에 아직도 차이가 있다는 것을 실감했다.
GPU를 사용해도 30프레임을 초간 실시간으로 처리하기 어렵기 때문에 실제로 사용하려면 다음과 같은 작전이 필요하다.
(2018.07.17) 스레드 정지 영상 사용 금지
Reference
이 문제에 관하여(Python의 WebRTC로 하여금 aiortc와 물체 검측의 YOLO v3 협업을 실현하도록 시도하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/massie_g/items/987e6f7f438053e46e36텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)