
Pytorchを使ってYOLOv3で物体検出をしてみた!【機械学習】
2021.12.20
Pytorch(パイトーチ)とは?
今回は、Pytorch(パイトーチ) を使って、YOLOv3で物体検出してみたいと思います!
どんなものができるの?
最終的に目指すはこんなイメージです。

Pytorch(パイトーチ)は、2016年にリリースされた、比較的新しいディープラーニングのフレームワークです。
Anaconda仮想環境の作成
いつものように、Anaconda 仮想環境を作成して動かしていきます。
仮想環境の作成
AnacondaPrompt を起動し、「pytorch」という名前の仮想環境を新規作成します。
1 | conda create -n pytorch python=3.7 |
作成を進めて良いか聞かれますので、「y」を返答します。
1 2 3 | : : Proceed ([y]/n)? y |
環境ができたか確認
環境ができたかどうか、conda infoコマンドで環境一覧を確認します。
1 2 3 4 5 6 7 8 | (base) C:\Users\k>conda info --envs # conda environments: # : : pytorch F:\Anaconda3\envs\pytorch : : |
ソースコードのダウンロードとパッケージのインストール
次に作成した仮想環境を起動して、ソースコードのダウンロードと、パッケージ(Pytorch など)のインストールを行います。
仮想環境の起動
先ほど作った pytorch環境を、conda activateコマンドで起動します。
1 | conda activate pytorch |
pytorch のインストール
pytorch をインストールします。
1 | pip 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コマンドで、ダウンロードしてきます。
1 | git clone https://github.com/eriklindernoren/PyTorch-YOLOv3 |
「PyTorch-YOLOv3」というフォルダが新たに作成されます。

gitコマンドが使えない場合
gitコマンドが使えないからは、以下のサイトからzipファイルでダウンロードして展開してください。
【Github】
https://github.com/eriklindernoren/PyTorch-YOLOv3
追加パッケージのインストール
pytorch 以外で、ソースコードで使われているパッケージをインストールします。
1 | pip install numpy matplotlib terminaltables pillow tqdm |
tensorflow は2系だと動かない箇所があるので、「1.14.0」をインストールします。
1 | pip install tensorflow==1.14.0 |
weights、学習用画像、ラベルファイルなどの準備
weights のダウンロード
weights をダウンロードします。
1 2 3 | cd PyTorch-YOLOv3/weights wget -c https://pjreddie.com/media/files/yolov3.weights wget -c https://pjreddie.com/media/files/darknet53.conv.74 |
テスト用データセットのダウンロード
データセットをダウンロードして解凍します。
※unzipコマンドがなかったため、2つのzipファイルはwindows側から手作業で解凍になります。
1 2 3 4 5 6 7 | cd ../data git clone https://github.com/pdollar/coco cd coco mkdir images cd images wget -c https://pjreddie.com/media/files/train2014.zip wget -c https://pjreddie.com/media/files/val2014.zip |
train2014.zip、val2014.zip を解凍しておきます。
データセットリストとラベルの準備
データセットリストや、ラベルを準備していきます。
※こちらも、zipファイルはwindows側から手作業で解凍になります。
1 2 3 4 5 6 | cd .. wget -c https://pjreddie.com/media/files/instances_train-val2014.zip wget -c https://pjreddie.com/media/files/coco/5k.part wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part wget -c https://pjreddie.com/media/files/coco/labels.tgz tar xzf labels.tgz |
instances_train-val2014.zip を解凍します。
テキストエディタで開く
2つのファイル(5k.part、trainvalno5k.part)の拡張子を.txtに変更し、テキストエディタで開けるようにします。
1 2 | mv 5k.part 5k.part.txt mv trainvalno5k.part trainvalno5k.part.txt |
次に、5k.part.txt、trainvalno5k.part.txt を、テキストディタで開きます。
今回は、サクラエディタ を使って説明していきます。
全て相対パスで記載されていますので、サクラエディタの置換機能を使ってフルパスに書き換えます。
「検索」-「置換」を選択し、以下を入力します。
置換前:images
置換後:(ご自身の現在のディレクトリパス)/images
「すべて置換」を押して保存してください。
動作テスト
全クラスを検出するかどうかの、動作テストをします。
1 | > python test.py --weights_path weights/yolov3.weights |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | Namespace(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') Compute mAP... Detecting objects: 100%|█████████████████████| 625/625 [07:47<00:00, 1.34it/s] Computing AP: 100%|████████████████████████████| 80/80 [00:01<00:00, 61.68it/s] Average Precisions: + Class '0' (person) - AP: 0.6907212559148146 + Class '1' (bicycle) - AP: 0.4686822117113182 + Class '2' (car) - AP: 0.5847841045899727 + Class '3' (motorbike) - AP: 0.6173475670233581 + Class '4' (aeroplane) - AP: 0.7368216071089109 + Class '5' (bus) - AP: 0.7522702521659901 + Class '6' (train) - AP: 0.754366135549987 + Class '7' (truck) - AP: 0.4188437458193888 + Class '8' (boat) - AP: 0.4055389301338935 + Class '9' (traffic light) - AP: 0.44435772408870156 + Class '10' (fire hydrant) - AP: 0.7803236133317674 + Class '11' (stop sign) - AP: 0.7203250980406222 + Class '12' (parking meter) - AP: 0.5318708513711929 + Class '13' (bench) - AP: 0.333531412986252 + Class '14' (bird) - AP: 0.4441595446835033 + Class '15' (cat) - AP: 0.7303651100622199 + Class '16' (dog) - AP: 0.7319868226122028 + Class '17' (horse) - AP: 0.7751149347910166 + Class '18' (sheep) - AP: 0.598545323377722 + Class '19' (cow) - AP: 0.5233226031698437 + Class '20' (elephant) - AP: 0.8563760674918008 + Class '21' (bear) - AP: 0.7462024921293304 + Class '22' (zebra) - AP: 0.7870724480836109 + Class '23' (giraffe) - AP: 0.8227934002804086 + Class '24' (backpack) - AP: 0.3245205073145688 + Class '25' (umbrella) - AP: 0.5271352385614393 + Class '26' (handbag) - AP: 0.20446606814034693 + Class '27' (tie) - AP: 0.49596291789434654 + Class '28' (suitcase) - AP: 0.5698340627779086 + Class '29' (frisbee) - AP: 0.6356266022474135 + Class '30' (skis) - AP: 0.4062281544252748 + Class '31' (snowboard) - AP: 0.4548600158139028 + Class '32' (sports ball) - AP: 0.5431164514113785 + Class '33' (kite) - AP: 0.4099665529050882 + Class '34' (baseball bat) - AP: 0.5038513158693446 + Class '35' (baseball glove) - AP: 0.47781969136825725 + Class '36' (skateboard) - AP: 0.684912975442008 + Class '37' (surfboard) - AP: 0.6221156903422052 + Class '38' (tennis racket) - AP: 0.6876458521606972 + Class '39' (bottle) - AP: 0.42285647466222365 + Class '40' (wine glass) - AP: 0.510761553837962 + Class '41' (cup) - AP: 0.47089750300368505 + Class '42' (fork) - AP: 0.44105747037036275 + Class '43' (knife) - AP: 0.28895809307646003 + Class '44' (spoon) - AP: 0.21264364213602976 + Class '45' (bowl) - AP: 0.48829414001620447 + Class '46' (banana) - AP: 0.2748223574624601 + Class '47' (apple) - AP: 0.17688092734832933 + Class '48' (sandwich) - AP: 0.4593752028469572 + Class '49' (orange) - AP: 0.2862201577164195 + Class '50' (broccoli) - AP: 0.34971876417167286 + Class '51' (carrot) - AP: 0.22373169046110197 + Class '52' (hot dog) - AP: 0.37026860962388863 + Class '53' (pizza) - AP: 0.5297778312770234 + Class '54' (donut) - AP: 0.5068303948266906 + Class '55' (cake) - AP: 0.47662734658244443 + Class '56' (chair) - AP: 0.3980491022763224 + Class '57' (sofa) - AP: 0.5213790206407863 + Class '58' (pottedplant) - AP: 0.42390700060249376 + Class '59' (bed) - AP: 0.6338351737747959 + Class '60' (diningtable) - AP: 0.4137962532076218 + Class '61' (toilet) - AP: 0.7377284037968452 + Class '62' (tvmonitor) - AP: 0.6991582192409012 + Class '63' (laptop) - AP: 0.6871290301612112 + Class '64' (mouse) - AP: 0.7214561998225428 + Class '65' (remote) - AP: 0.4789736959009461 + Class '66' (keyboard) - AP: 0.664486808487626 + Class '67' (cell phone) - AP: 0.3974345880019803 + Class '68' (microwave) - AP: 0.6423763095621656 + Class '69' (oven) - AP: 0.48310064765403904 + Class '70' (toaster) - AP: 0.16233766233766234 + Class '71' (sink) - AP: 0.5075077631307962 + Class '72' (refrigerator) - AP: 0.6862896780296917 + Class '73' (book) - AP: 0.17112114326289157 + Class '74' (clock) - AP: 0.6882583035600587 + Class '75' (vase) - AP: 0.4415797067050875 + Class '76' (scissors) - AP: 0.3438161776311857 + Class '77' (teddy bear) - AP: 0.5859239378766117 + Class '78' (hair drier) - AP: 0.11363636363636365 + Class '79' (toothbrush) - AP: 0.26435902215432283 mAP: 0.5145143465508358 |
class0~79までの80クラスのテストと、最後にmAPが出力されれば正常動作しています。
YOLOv3で物体検出!
data/samplesフォルダに、9枚のサンプル画像があります。
それらを入力にして、物体検出をかけて行きます。
サンプル画像で物体検出を行いますが、先に出力用のフォルダを作っておきます。
1 2 | mkdir ./output mkdir ./output/samples |
物体検出開始!
それでは、検出を行います。
1 | > python detect.py --image_folder data/samples/ |

上手く犬、自転車、トラック(車)が検出されています。
その他8枚の画像
あとの8枚も、このような感じになります。







さいごに
Pytorch で YOLOv3 は、上手く動きましたか?
そういえば、唯一の国産フレームワークだった「Chainer」が開発終了を宣言しました。
Pytorch は、その思想を引き継いでいるフレームワークと言っても過言ではありません!
ただ、Pytorch と Tensorflowのどちらをメインに使っていくか迷いどころだとは思います…
ですが、いろいろ試してみるのが一番だと思いますので、楽しんで使ってみることをオススメします!
こちらの記事もオススメ!
関連記事
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン