Python의 WebRTC로 하여금 aiortc와 물체 검측의 YOLO v3 협업을 실현하도록 시도하다

17246 단어 Python3WebRTC,YOLOv3

개시하다


  • aiortc Python이 구현한 WebRTC의 프로그램 라이브러리
  • 참조: Docker로 Pythn의 WebRTC를 이동하여 설치해 보십시오
  • YOLO v3는 C 언어로 제작된 머신러닝 프레임워크darknet에서 움직이는 물체 감지 네트워크다.
  • 데이터 네트워크의 GitHub
  • 참조: Docker에서 Python 3에서 YOLO v3로 이동해 봤습니다.
  • 이번에는 이 두 가지를 조합해서 Docker에서 이동을 시도해 보자.결과를 먼저 표시합니다.
  • 협업 자체도 가능하고 물체 검측도 가능
  • CPU가 이동 중이므로 프레임당 1초 이상 걸립니다.실시간으로 영상을 처리하는 것은 불가능하다
  • 지속적인 영상 지연 →비디오가 스레드로 중지되었습니다.
  • GPU로 이동하면 빨라질 것 같은데(검증되지 않음) 초간 30프레임을 따라잡기가 어려울 것 같다
  • 이번에 만든 샘플 코드는 여기 있습니다.
  • https://github.com/mganeko/aiortc_yolov3
  • 컨디션

  • 호스트 OS: Mac OS X 10.12.6(Sierra)
  • Docker: Docker for Mac Version 17.06.0-ce-mac18 (18433)
  • 컨테이너 베이스: Ubuntu 18.04LTE
  • Dockerfile


    사용한 Docker file은 여기에 있습니다.
  • python3
  • libopus-dev, libvpx-dev
  • libffi-dev, libssl-dev
  • libopencv-dev(2018.07.03 추가)
  • aiortc
  • darknet
  • YOLO v3 모델
  • 이번 샘플GitHub
  • 기다린다
    # 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
    
  • 이 예에서 호스트 OS의 8001 포트는 컨테이너의 8080 포트와 연결된다.
  • 용기 내부 aiortc/examples/serveryolo.py를 시작하는 중입니다.
  • (2) 크롬을 통한 액세스http://localhost:8001/
    Firefox, Safari로 연결할 수 없음
    (3) [Usevideo] 확인, 옵션 선택
    이번에는 다음과 같은 옵션이 추가됐다.해보고 싶은 것을 선택하세요.
  • light blue frame ... YUV로 연한 파란색 프레임 생성
  • draw rectangle with OpenCV ... OpenCV로 고정 프레임 그리기 테스트
  • object detection with YOLO v3 ... YOLOv3에서 물체를 검출하고 테두리와 라벨을 그립니다
  • detection YOLO v3, rect OpenCV ... YOLO v3에서 물체를 감지하고 openCV에서 테두리와 라벨 그리기

  • 테두리만 그리면 실시간으로 추적할 수 있지만 물체가 검출되면 무거워지고 영상은 점점 느려진다.유감스럽게도 이런 방법은 실용적이지 않다.
    (4) [start] 버튼 클릭
    몇 초가 지나면 브라우저와 aiortc의 연결이 확립되고 원시 영상과 가공된 영상이 번갈아 표시됩니다.
    Object detection with YOLO v3 (YOLO v3에서 물체를 감지하고 테두리와 라벨을 그립니다) 의 예는 여기에 있습니다.

    이번에 사용한 것은 ylov3-tiny 모형으로 한 프레임의 처리도 1초 이상 걸린다.영상이 점점 느려지기 때문에 수초 이상 사용하기 어렵다.

    이미지 변환


    이번 키모는 아오텍스의 비디오 프레임과darknet의 IMAGE 간의 상호 전환이다.
    YUV 형식이라는 이름을 들어봤는데 이번이 처음이에요.
    또 파이톤과 C 언어 형식의 포인터 변환도 처음 사용하기 때문에 오류나 비효과, 메모리 유출이 발생할 수 있다.지적해 주셨으면 좋겠습니다.

    aiortc → darknet


    두 단계에서 전환을 진행하다.
  • YUV420→BGR 배열(OpenCV의 이미지 형식)
  • BGR 정렬→데이터망 IMAGE(C 언어 구조, RGB 채널이 있는flat 정렬)
  • 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


    반대 방향도 두 단계로 나눠 전환한다.
  • darknet IMAGE(C 언어 구조, RGB 채널이 있는 flat 배열)→ BGR 배열(OpenCV의 이미지 형식)
  • BGR 정렬→YUV420
  • 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을 사용하여 프레임과 탭을 그릴 때 이 방법을 사용합니다.
  • https://qiita.com/massie_g/items/a2bcfac4fed66b1b0717#python3실현
  • OpenCV의 경우는 다음과 같습니다.
      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) 스레드 정지 영상 사용 금지
  • WebRTC의 영상을 멈추지 않기 위해 다른 라인에서 YOLO v3의 물체 검측을 진행합니다
  • 좋은 웹페이지 즐겨찾기