Pytorchを使ってYOLOv3で物体検出をしてみた!【機械学習】
IT技術
Pytorch(パイトーチ)とは?
今回は、Pytorch(パイトーチ) を使って、YOLOv3で物体検出してみたいと思います!
どんなものができるの?
最終的に目指すはこんなイメージです。
Pytorch(パイトーチ)は、2016年にリリースされた、比較的新しいディープラーニングのフレームワークです。
Anaconda仮想環境の作成
いつものように、Anaconda 仮想環境を作成して動かしていきます。
仮想環境の作成
AnacondaPrompt を起動し、「pytorch」という名前の仮想環境を新規作成します。
1conda create -n pytorch python=3.7
作成を進めて良いか聞かれますので、「y」を返答します。
1:
2:
3Proceed ([y]/n)? y
環境ができたか確認
環境ができたかどうか、conda infoコマンドで環境一覧を確認します。
1(base) C:\Users\k>conda info --envs
2# conda environments:
3#
4:
5:
6pytorch F:\Anaconda3\envs\pytorch
7:
8:
ソースコードのダウンロードとパッケージのインストール
次に作成した仮想環境を起動して、ソースコードのダウンロードと、パッケージ(Pytorch など)のインストールを行います。
仮想環境の起動
先ほど作った pytorch環境を、conda activateコマンドで起動します。
1conda activate pytorch
pytorch のインストール
pytorch をインストールします。
1pip install torch===1.4.0 torchvision===0.5.0 -f https://download.pytorch.org/whl/torch_stable.html
お使いの環境ごとに、pytorch のインストールコマンドがありますので、詳しくはpytorch公式サイトからご自身の環境を選択して、コマンドを確認ください。
【公式サイト】
https://pytorch.org/
ソースコードのダウンロード
git cloneコマンドで、ダウンロードしてきます。
1git clone https://github.com/eriklindernoren/PyTorch-YOLOv3
「PyTorch-YOLOv3」というフォルダが新たに作成されます。
gitコマンドが使えない場合
gitコマンドが使えないからは、以下のサイトからzipファイルでダウンロードして展開してください。
【Github】
https://github.com/eriklindernoren/PyTorch-YOLOv3
追加パッケージのインストール
pytorch 以外で、ソースコードで使われているパッケージをインストールします。
1pip install numpy matplotlib terminaltables pillow tqdm
tensorflow は2系だと動かない箇所があるので、「1.14.0」をインストールします。
1pip install tensorflow==1.14.0
weights、学習用画像、ラベルファイルなどの準備
weights のダウンロード
weights をダウンロードします。
1cd PyTorch-YOLOv3/weights
2wget -c https://pjreddie.com/media/files/yolov3.weights
3wget -c https://pjreddie.com/media/files/darknet53.conv.74
テスト用データセットのダウンロード
データセットをダウンロードして解凍します。
※unzipコマンドがなかったため、2つのzipファイルはwindows側から手作業で解凍になります。
1cd ../data
2git clone https://github.com/pdollar/coco
3cd coco
4mkdir images
5cd images
6wget -c https://pjreddie.com/media/files/train2014.zip
7wget -c https://pjreddie.com/media/files/val2014.zip
train2014.zip、val2014.zip を解凍しておきます。
データセットリストとラベルの準備
データセットリストや、ラベルを準備していきます。
※こちらも、zipファイルはwindows側から手作業で解凍になります。
1cd ..
2wget -c https://pjreddie.com/media/files/instances_train-val2014.zip
3wget -c https://pjreddie.com/media/files/coco/5k.part
4wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
5wget -c https://pjreddie.com/media/files/coco/labels.tgz
6tar xzf labels.tgz
instances_train-val2014.zip を解凍します。
テキストエディタで開く
2つのファイル(5k.part、trainvalno5k.part)の拡張子を.txtに変更し、テキストエディタで開けるようにします。
1mv 5k.part 5k.part.txt
2mv trainvalno5k.part trainvalno5k.part.txt
次に、5k.part.txt、trainvalno5k.part.txt を、テキストディタで開きます。
今回は、サクラエディタ を使って説明していきます。
全て相対パスで記載されていますので、サクラエディタの置換機能を使ってフルパスに書き換えます。
「検索」-「置換」を選択し、以下を入力します。
置換前:images
置換後:(ご自身の現在のディレクトリパス)/images
「すべて置換」を押して保存してください。
動作テスト
全クラスを検出するかどうかの、動作テストをします。
1> python test.py --weights_path weights/yolov3.weights
1Namespace(batch_size=8, class_path='data/coco.names', conf_thres=0.001, data_config='config/coco.data', img_size=416, iou_thres=0.5, model_def='config/yolov3.cfg', n_cpu=8, nms_thres=0.5, weights_path='weights/yolov3.weights')
2Compute mAP...
3Detecting objects: 100%|█████████████████████| 625/625 [07:47<00:00, 1.34it/s]
4Computing AP: 100%|████████████████████████████| 80/80 [00:01<00:00, 61.68it/s]
5Average Precisions:
6+ Class '0' (person) - AP: 0.6907212559148146
7+ Class '1' (bicycle) - AP: 0.4686822117113182
8+ Class '2' (car) - AP: 0.5847841045899727
9+ Class '3' (motorbike) - AP: 0.6173475670233581
10+ Class '4' (aeroplane) - AP: 0.7368216071089109
11+ Class '5' (bus) - AP: 0.7522702521659901
12+ Class '6' (train) - AP: 0.754366135549987
13+ Class '7' (truck) - AP: 0.4188437458193888
14+ Class '8' (boat) - AP: 0.4055389301338935
15+ Class '9' (traffic light) - AP: 0.44435772408870156
16+ Class '10' (fire hydrant) - AP: 0.7803236133317674
17+ Class '11' (stop sign) - AP: 0.7203250980406222
18+ Class '12' (parking meter) - AP: 0.5318708513711929
19+ Class '13' (bench) - AP: 0.333531412986252
20+ Class '14' (bird) - AP: 0.4441595446835033
21+ Class '15' (cat) - AP: 0.7303651100622199
22+ Class '16' (dog) - AP: 0.7319868226122028
23+ Class '17' (horse) - AP: 0.7751149347910166
24+ Class '18' (sheep) - AP: 0.598545323377722
25+ Class '19' (cow) - AP: 0.5233226031698437
26+ Class '20' (elephant) - AP: 0.8563760674918008
27+ Class '21' (bear) - AP: 0.7462024921293304
28+ Class '22' (zebra) - AP: 0.7870724480836109
29+ Class '23' (giraffe) - AP: 0.8227934002804086
30+ Class '24' (backpack) - AP: 0.3245205073145688
31+ Class '25' (umbrella) - AP: 0.5271352385614393
32+ Class '26' (handbag) - AP: 0.20446606814034693
33+ Class '27' (tie) - AP: 0.49596291789434654
34+ Class '28' (suitcase) - AP: 0.5698340627779086
35+ Class '29' (frisbee) - AP: 0.6356266022474135
36+ Class '30' (skis) - AP: 0.4062281544252748
37+ Class '31' (snowboard) - AP: 0.4548600158139028
38+ Class '32' (sports ball) - AP: 0.5431164514113785
39+ Class '33' (kite) - AP: 0.4099665529050882
40+ Class '34' (baseball bat) - AP: 0.5038513158693446
41+ Class '35' (baseball glove) - AP: 0.47781969136825725
42+ Class '36' (skateboard) - AP: 0.684912975442008
43+ Class '37' (surfboard) - AP: 0.6221156903422052
44+ Class '38' (tennis racket) - AP: 0.6876458521606972
45+ Class '39' (bottle) - AP: 0.42285647466222365
46+ Class '40' (wine glass) - AP: 0.510761553837962
47+ Class '41' (cup) - AP: 0.47089750300368505
48+ Class '42' (fork) - AP: 0.44105747037036275
49+ Class '43' (knife) - AP: 0.28895809307646003
50+ Class '44' (spoon) - AP: 0.21264364213602976
51+ Class '45' (bowl) - AP: 0.48829414001620447
52+ Class '46' (banana) - AP: 0.2748223574624601
53+ Class '47' (apple) - AP: 0.17688092734832933
54+ Class '48' (sandwich) - AP: 0.4593752028469572
55+ Class '49' (orange) - AP: 0.2862201577164195
56+ Class '50' (broccoli) - AP: 0.34971876417167286
57+ Class '51' (carrot) - AP: 0.22373169046110197
58+ Class '52' (hot dog) - AP: 0.37026860962388863
59+ Class '53' (pizza) - AP: 0.5297778312770234
60+ Class '54' (donut) - AP: 0.5068303948266906
61+ Class '55' (cake) - AP: 0.47662734658244443
62+ Class '56' (chair) - AP: 0.3980491022763224
63+ Class '57' (sofa) - AP: 0.5213790206407863
64+ Class '58' (pottedplant) - AP: 0.42390700060249376
65+ Class '59' (bed) - AP: 0.6338351737747959
66+ Class '60' (diningtable) - AP: 0.4137962532076218
67+ Class '61' (toilet) - AP: 0.7377284037968452
68+ Class '62' (tvmonitor) - AP: 0.6991582192409012
69+ Class '63' (laptop) - AP: 0.6871290301612112
70+ Class '64' (mouse) - AP: 0.7214561998225428
71+ Class '65' (remote) - AP: 0.4789736959009461
72+ Class '66' (keyboard) - AP: 0.664486808487626
73+ Class '67' (cell phone) - AP: 0.3974345880019803
74+ Class '68' (microwave) - AP: 0.6423763095621656
75+ Class '69' (oven) - AP: 0.48310064765403904
76+ Class '70' (toaster) - AP: 0.16233766233766234
77+ Class '71' (sink) - AP: 0.5075077631307962
78+ Class '72' (refrigerator) - AP: 0.6862896780296917
79+ Class '73' (book) - AP: 0.17112114326289157
80+ Class '74' (clock) - AP: 0.6882583035600587
81+ Class '75' (vase) - AP: 0.4415797067050875
82+ Class '76' (scissors) - AP: 0.3438161776311857
83+ Class '77' (teddy bear) - AP: 0.5859239378766117
84+ Class '78' (hair drier) - AP: 0.11363636363636365
85+ Class '79' (toothbrush) - AP: 0.26435902215432283
86mAP: 0.5145143465508358
class0~79までの80クラスのテストと、最後にmAPが出力されれば正常動作しています。
YOLOv3で物体検出!
data/samplesフォルダに、9枚のサンプル画像があります。
それらを入力にして、物体検出をかけて行きます。
サンプル画像で物体検出を行いますが、先に出力用のフォルダを作っておきます。
1mkdir ./output
2mkdir ./output/samples
物体検出開始!
それでは、検出を行います。
1> python detect.py --image_folder data/samples/
上手く犬、自転車、トラック(車)が検出されています。
その他8枚の画像
あとの8枚も、このような感じになります。
さいごに
Pytorch で YOLOv3 は、上手く動きましたか?
そういえば、唯一の国産フレームワークだった「Chainer」が開発終了を宣言しました。
Pytorch は、その思想を引き継いでいるフレームワークと言っても過言ではありません!
ただ、Pytorch と Tensorflowのどちらをメインに使っていくか迷いどころだとは思います…
ですが、いろいろ試してみるのが一番だと思いますので、楽しんで使ってみることをオススメします!
こちらの記事もオススメ!
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
関連記事
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit