新着情報

YOLOv3の利用(4): Mac OSX Sierra 環境での転移学習(その2)

YOLOv3の利用(1):Mac OSX Sierra(10.12.6)環境における転移学習(その1)では、参考文献(1)を取り上げ、 そこで使用したYOLOv3学習サイト

https://github.com/ayooshkathuria/pytorch-yolo-v3

の学習済みモデルを使用して転移学習が実現できることを説明した。 しかし、サイト内のプログラムは画像や映像内の対象物を検出し、 対象物ラベルとその枠領域抽出が可能であるが、検出精度を計算していない点で不十分と考える。 Ubuntu20.04やWindows 10 ProでのYOLOv3の転移学習の所では下記の2つのgithubサイトを取り上げた。 (1) TensorFlowワークフレーム下でYOLOv3学習を実現するサイト[参考文献(2)]

https://github.com/zzh8829/yolov3-tf2

(2) PyTorchワークフレーム下でYOLOv3学習を実現するサイト[参考文献(3)]

https://github.com/nekobean/pytorch_yolov3.git

上記(1), (2)は対象物の枠領域検出、ラベル名及び検出精度の3項目の計算を実現しているサイトであり、 その学習済みモデルを使用して転移学習の実現はUbuntu20.04及びWindows 10 Pro環境で可能なことを、 それぞれ本Blog内の下記の記事 YOLOv3の利用(2):Ubuntu20.04環境の場合、 YOLOv3の利用(3):Windows 10 Pro環境の場合 にて詳しく述べた。 Mac OSX Sierra(10.12.6)環境でも転移学習の第1候補として上記(1)と(2)のYOLOv3の学習実現サイトの 利用を始めに考えた。しかし、サイト内の対象物検出プログラムをMac OSX Sierra(10.12.6)環境で実行するとエラー が出て、先へ進むことができなかった。 その後、エラーの詳細解析により、上記サイトの転移学習が何故失敗したのか原因を解明できた。 失敗原因を除去した結果、Mac OSX Sierra(10.12.6)環境でも上記(1), (2)のサイトを利用した転移学習が 可能になったので、新しいBlog記事として、 YOLOv3の利用(4):OSX Sierra(10.12.6)環境での転移学習(その2)をここで記載する。 (1) TensorFlowワークフレーム下でYOLOv3学習実現するサイト[参考文献(2)]が利用できなかった原因: サイト内のrequirements.txtを使い、 > pip install -r requirements.txt を実行したためである。requirements.txtはopencv-contrib-pythonの最上位バージョン4.6.0.66を Mac OSX Sierra(10.12.6)にインストールしようとして失敗し、エラーメッセージを出す。 Mac OSX Sierraにおけるopencv-pythonの有効なバージョンは 4.1.0.25 以下であり、 これより上位バージョンでは実行エラーとなる。 requirements.txtを修正し、opencv-contrib-python=4.1.0.25にして、すべての問題が解決することを得た。 画像中からの対象物の検出に関しては、

> python detect.py – -image  ./data/meme2.jpg  – -output ./output.jpg の実行により、dataフォルダに配置された画像データmeme2.jpgを入力画像データとして、画像内の対象物検出を行い対象物の検出領域、ラベル名、検出精度を計算し、これら検出結果を入力画像データに書き込み、検出済み画像データとして保存できることを確認した。

Fig.1. Meme2.jpg画像。

Fig.2. 対象物検出画像。

ビデオ映像に関しては、detect_video.pyの21行目のflags.DEFINE_string行の’XVID’を 下記の様に’avc1‘に書き換えた後、

flags.DEFINE_string(‘output_format’, ‘avc1‘, ‘codec used in VideoWriter when saving video to file’)

detect_video.pyプログラムを下記の様に実行して、

python detect_video.py – -input data/cars.mp4 – -output ./output-cars.mp4

dataフォルダに配置した映像ファイルcars.mp4から対象物検を検出し、 検出済み映像から構成されるビデオ output-cars.mp4の出力を確認した。

Fig.3. output-cars.mp4の埋込ビデオであり、対象物検出ビデオが作成されている。。

◎ 注意点: detect_video.pyの21行目に於いて、下記の様にコーディックに’H264‘を使用すると、 output-cars.mp4ファイルは出力できるが、OpenCV:FFMPEGはコーディック’H264‘の代わりに ’avc1‘で代替えすると言うwarning messageを出力する。Windows 10 Proでも、 下記の様にコーディックに’H264’を使用するとOpenCV:FFMPEGからのwarning messagesを受けるが、 コーディック’avc1‘を使用すれば、warning messages無しで、正常終了することを確認した。 flags.DEFINE_string(‘output_format’, ‘H264‘, ‘codec used in VideoWriter when saving video to file’)

Mac OSX Sierra(10.12.6)に関して次の知見(a)、(b)を得た。 (a) OpencvのVersion=4.2.0.32をインストールすると、Mac OSX Sierra(10.12.6) のPython仮想環境ではOpenCVのインポートに失敗する。 換言すると、from cv2 import * を実行できないという実行エラーを得る。

何故なら、実行中にlibpng16.16.dylibを探しても検出できずに、エラーとなる。 このダイナミックリンクライブラリlibpng16.16.dylibはMac OS X High Sierra (10.13)用に作成されたものであり、 Mac OS Sierra (10.12.6)の環境では使用できない。 Mac OS Sierraで使用可能なのは、OpenCV のVersion=4.1.0.25より下位バージョンであり、 その場合、from .cv2 import *のエラーは生じない(Fig.4.を参照)。

Fig.4. Python仮想環境 (tf114pt110-py37)のOpenCV Ver=4.2.0.32の実行エラーとOpenCV Ver.=4.1.0.25の正常実行例。

(b) mp4ファイルを出力するには、先の◎ 注意点の所に記載した様に、opencv-pythonでは、 新しいコーディック’H264‘を使用せずに、最初から古いコーディック’avc1‘を使用すべきである。 この知見はMacに限らず、Windows 10でも同様である。

2) PyTorchワークフレーム下でYOLOv3学習を実現するサイト[参考文献(3)] が利用できなかった原因:

当初のMac OSX Sierra(10.12.6)のPython仮想環境(tf265pt170-py37)のPyTorchはVer.=1.7.0であり、 バージョンが低すぎた為に失敗したと思われる。 Pytorch=1.7.0~1.9.0では、Fig.5に示す様に、 TypeError: meshgrid() got an unexpected keyword argument ‘indexing’と言うエラー・メッセージ を発して実行エラーとなるが、Pytorch=1.10.0 ~1.11.0ではこの実行エラーは生じない。

Fig.5. TypeErrorメッセージ。PytorchのVersion=1.7.0 ~1.9.0までの下位バージョンでの実行エラーである。

解決策として、

pip install torch=1.10.0 torchvision=0.11.0 torchaudio=0.10.0

を実行して、PyTorch=1.7.0 から PyTorch=1.10.0 にVersion Upしたことで Fig.5のTypeErrorがなくなり、 参考文献(3)の学習サイトの学習済みモデルを用いる転移学習の実現を確認できた。 PyTorchフレームワーク下のYOLOv3学習実現サイトのクローン化をgit clone

http://github.com/nekobean/pytorch_yolov3.git

によって実施する。

> cd pytorch_yolov3

によってカレントディレクトリをpytorch_yolov3に移す。 このPyTochフレームワーク下でYOLOv3の学習を実現するサイトの最大の魅力は画像一枚づつを指定して、 検出済み画像を作成しなくても良い点である。

即ち、下記のdetect_video.py プログラムを実行することで、dataフォルダに検出処理したい 複数枚の画像データを配置しておけば、outputフォルダに検出済み画像を一括保存をする事ができる。

python detect_image.py  – -input data – -output output

– -weights weights/yolov3.weights – -config config/yolov3_coco.yaml

次のコマンドにより、ビデオ映像bike-person-cars.mp4を用いて、映像内の対象物検出ビデオを作成できる。

python detect_video.py –input data/bike-person-cars.mp4

– -output output-cars.mp4 –weights weights/yolov3.weights

– -config config/yolov3_coco.yaml

Fig.6. 著作権フリー動画を集めたPexels Videosよりダウンロードした動画bike-person-cars.mp4を
入力映像に使用し、detect_video.pyにより対象物検出ビデオoutput-cars.mp4を作成した。

最後に、TorchのバージョンとTorchvisionのバージョンに矛盾が生じる時も実行エラーが生じるため、 python, torch, torchvisionの各バージョンで矛盾が起きない組み合わせに関する下記のサイトを参照すると良い。

https://github.com/pytorch/vision#installation%20for%20the%20compatibility%20matrix.

参考文献

(1)【Python】YOLOv3を使ってみた https://qiita.com/konan/items/f29ac144f960d0f6a8ec (2) Python:やってみた(機械学習) : 静止画と動画で物体検出(Yolo3)をやってみる (3) YOLOv3 – 学習済みモデルで画像から人や車を検出する方法 https://pystyle.info/pytorch-yolov3-how-to-use-pretrained-model/

コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です