キカベン
機械学習でより便利な世の中へ
G検定対策
お問い合わせ
   

DockerによるYOLOv5の導入をやってみる

thumb image

YOLO v5で物体検出 (PyTorch Hubからダウンロード)で紹介した方法より簡単にYOLOv5を導入するやり方を紹介します。

UltralyticsのGithubでYOLOv5をDocker hubからダウンロードして使う方法が解説されています。

Dockerをインストールするにはdocker.comを参照してください。

1. Dockerイメージをダウンロード🔝

では、docker pullコマンドでYOLOv5のイメージをDocker Hubからダウンロードします。

docker pull ultralytics/yolov5:latest

ダウンロードが終わるまでしばらくかかります。インターネットのスピードにもよりますが、5から10分ほど待ちます。

ダウンロードされたDockerのイメージの情報を見てみましょう。

docker images

最新のDockerのイメージは46時間前に作られたものとあります。サイズも割と大きいですね。

REPOSITORY           TAG               IMAGE ID       CREATED         SIZE
ultralytics/yolov5   latest            222c7980baa0   46 hours ago    14.9GB

2. Dockerコンテナを作成🔝

では、ダウンロードしたDockerのイメージをもとにコンテナを作成してみましょう。

docker run -it ultralytics/yolov5:latest

-itを指定することで作成されたコンテナのコンソールでコマンドを実行することができます。

lsを実行するとコンテナ内のファイルが閲覧できます。

root@7aa0b3c5a9e3:~# ls
Dockerfile  data	models		  train.py	  weights
LICENSE     detect.py	requirements.txt  tutorial.ipynb
README.md   hubconf.py	test.py		  utils

3. サンプル画像でテスト🔝

では、試しにサンプルイメージでテストしてみましょう。

一番小さいモデルのyolov5sを使います。

python detect.py --weights yolov5s.pt --source data/images/bus.jpg

初めて実行するときには、指定したモデルのファイルであるyolov5s.ptがダウンロードされます。

サンプルの画像ファイルであるdata/images/bus.jpgで物体検出が行われ結果が表示されます。

image 1/1 /usr/src/app/data/images/bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.160s)
Results saved to runs/detect/exp

人間が4人、バスが1台、消火栓が1つ検出されました。

また、出力された画像がruns/detect/exp/bus.jpgに保存されています。

ただし、このままだとコンテナ内にあるので直接見ることができません。

コンテナ内のファイルをアクセスするには2つの方法があるので、以下で説明します。

4. 出力画像をコンテナの外にコピー🔝

YOLOv5が出力した画像を見たいのでコンテナの外にコピーしましょう。

まず、pwdでコンテナ内の現在のディレクトリを確認します。

root@7ae6e62e5c0c:~# pwd
/usr/src/app

よって、出力画像はコンテナ内の/usr/src/app/runs/detect/exp/bus.jpgにあることになります。

もうひとつターミナルを(コンテナの外で)開いて、次のコマンドを実行してください。

docker ps

これで現在実行中のコンテナのリストが出ます。実行しているコンテナは一つだけですね。

CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                NAMES
7ae6e62e5c0c   ultralytics/yolov5:latest   "/usr/local/bin/nvid…"   11 minutes ago   Up 11 minutes   6006/tcp, 8888/tcp   practical_easley

これでコンテナのIDが分かったので、画像をコピーしましょう。

# docker cp <コンテナのID>:<コピー元のパス> <コンテナの外のコピー先のパス>

docker cp 7ae6e62e5c0c:/usr/src/app/runs/detect/exp/bus.jpg .

これで画像がコンテナの外にコピーされました。

画像が確認できます。

YOLOv5 bus.jpg

逆に、コンテナの外からコンテナの中にファイルをコピーすることも可能です。

# docker cp <コンテナの外のコピー元のパス> <コンテナのID>:<コピー先のパス> 

5. Dockerコンテナを消去🔝

YOLOv5のDockerコンテナを終了し、コンテナの外に出るにはexitを実行します。

exit

コンテナから出た後に、次のコマンドを実行してみるとDockerコンテナが走っていないのが確認できます。

docker ps

結果は何もありません。

次のコマンドを実行すると終了したDockerコンテナの情報が見れます。

docker ps -a

以下のように表示され、終了したDockerコンテナのIDが見れます。先ほど確認したIDと同じですね。

CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS                     PORTS     NAMES
7ae6e62e5c0c   ultralytics/yolov5:latest   "/usr/local/bin/nvid…"   29 minutes ago   Exited (0) 2 minutes ago             practical_easley

このIDを使ってコンテナの再起動を行うことも可能です。

# コンテナを再起動
docker start 7ae6e62e5c0c

# コンテナでbashを実行する
docker exec -it 7ae6e62e5c0c bash

コンテナに入った後に、lsを実行すればYOLOv5のファイルがあるのが確認できます。

今回はこれ以上使わないのでexitしましょう。

exit

これでbashから抜けましたが、コンテナ自体はまだ実行され続けています。

コンテナをストップしてから削除しましょう。

# コンテナをストップする
docker stop 7ae6e62e5c0c

# コンテナを削除する
docker rm 7ae6e62e5c0c

これでdocker ps -aを実行しても何も出てこなくなります。

6. コンテナの中とフォルダーを共有🔝

Dockerコンテナの中と外でファイルのやりとりを頻繁にする場合は、フォルダーを共有することも可能です。

まず、共有するフォルダーを作りましょう。

mkdir runs

名前はなんでもいいですが、とりあえず分かりやすいようにrunsにしました。

次のように、共有フォルダを指定してコンテナを作成し実行します。

# -v <共有フォルダ>:<コンテナ内の共有フォルダ>

docker run -v `pwd`/runs:/usr/src/app/runs -it ultralytics/yolov5:latest

コンテナ内でlsを実行するとrunsというフォルダがあるのが確認できます。

root@b143a8b14ddb:~# ls
Dockerfile  README.md  detect.py   models	     runs     train.py	      utils

では、先ほどと同じテストを実行しましょう。

python detect.py --weights yolov5s.pt --source data/images/bus.jpg

出力された画像がコンテナ内の/usr/src/app/runs/detect/exp/bus.jpgにあることになります。

このrunsフォルダはコンテナの中と外で共有されているので、出力画像をコンテナの外から見ることができます。

YOLOv5 bus.jpg

このファイルはコンテナを終了した後にも残ります。

コンテナを使うと実行環境へのデプロイが簡単になり便利ですね。

今日はここまで。



コメントを残す

メールアドレスは公開されません。