やってみよう!

プログラミングとかでぃーぷらーにんぐとかVRとか気になったものをやってみる予定

YOLOv3を試してみる

ディープラーニングを何か試してみたいけどデータセット作るのが面倒 なので、自動で人物を見つけて切り抜いてくれないかなと探してみたらYOLOv3というのがあるらしい。

github.com

動かし方はほぼREADME.md通りでよくて、

qiita.com

動かしてみた系の記事もたくさんあるのでそんなに詰まる箇所はなかったけど、動画出力で詰まりそうな箇所があったのでメモ。

デモ

まず解析したい動画を用意します(今回はごちうさの1話を用意しました。 )

www.nicovideo.jp

前回、ディープラーニング用の環境をDockerで作ったので、それを使います。ただ、実行時にプレビューが出るのでXの設定とOpenCV等必要なライブラリを追加します。

Dockerfile

FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04
ENV TZ=Asia/Tokyo
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update
RUN apt install -y tzdata tk-dev xvfb vim wget
RUN apt install -y python3-pip python3-tk
RUN pip3 install numpy matplotlib scipy tensorflow-gpu keras pillow opencv-contrib-python 
RUN apt install -y git

docker-compose.yml

version: '2.3'
services:
  python:
    build: ./
    volumes:
      - ./src:/home/src
      - /tmp/.X11-unix/:/tmp/.X11-unix/
    runtime: nvidia
    environment:
      - "DISPLAY=$DISPLAY"
      - "QT_X11_NO_MITSHM=1"
    devices:
      - /dev/snd
      - /dev/usb
    privileged: true
    working_dir: "/home/src"
    tty: true

devicesの部分は要らない気もしますが...

とりあえず環境はこんな感じでイケるはずです。

docker-compose up -d --build

docker-compose exec python bash

コンテナに入ったらgithubからソースをダウンロードしてきます

git clone https://github.com/qqwweee/keras-yolo3.git

cd keras-yolo3

学習済みモデルをダウンロード

wget https://pjreddie.com/media/files/yolov3.weights

keras用に変換

python3 convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

実行

ごちうさの動画は/home/src/movie/gochiusa1.mp4に置きました。

python3 yolo_video.py --input /home/src/movie/gochiusa1.mp4

実行結果を保存

ちなみに、実行結果を動画として保存したい場合は

python3 yolo_video.py --input /home/src/movie/gochiusa1.mp4 --output /home/src/movie_out/out.mp4

のようにすればいいのですが、

AttributeError: 'NoneType' object has no attribute 'array_interface'

とエラーがでるので、yolo.pyの177行目あたりにある

v[f:id:ascreit:20180908234543j:plain]ideo_FourCC    = int(vid.get(cv2.CAP_PROP_FOURCC))

video_FourCC = cv2.VideoWriter_fourcc(*'XVID')

と修正して、念の為、190行目辺りのreturn_value, frame = vid.read()の下にif not return_value: breakを追記

while True:
        return_value, frame = vid.read()
        if not return_value:
            break

こんな感じで追記しておくと動きました。

ごちうさの解析結果

f:id:ascreit:20180908234543j:plain

f:id:ascreit:20180908234621j:plainf:id:ascreit:20180909000140g:plain

あんまり認識しませんね。。。

チノちゃんはトイレと認識されがち