• トップ
  • ブログ一覧
  • Pytorchを使ってYOLOv3で物体検出をしてみた!【機械学習】
  • Pytorchを使ってYOLOv3で物体検出をしてみた!【機械学習】

    広告メディア事業部広告メディア事業部
    2020.06.23

    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#
    456pytorch F:\Anaconda3\envs\pytorch
    78

    ソースコードのダウンロードとパッケージのインストール

    次に作成した仮想環境を起動して、ソースコードのダウンロードと、パッケージ(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.zipval2014.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のどちらをメインに使っていくか迷いどころだとは思います…

    ですが、いろいろ試してみるのが一番だと思いますので、楽しんで使ってみることをオススメします!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    関連記事

    featureImg2020.05.15Windows 10 で YOLOv3 を自前画像で学習させる(環境構築編)【機械学習】物体検出モデル YOLOv3 を自前画像で学習させよう「YOLOv3」とは、物体検出(画像から物体の位置と種類を検出)...

    featureImg2020.05.18Windows 10 で YOLOv3 を自前画像で学習させる(物体検出編)【機械学習】後編:物体検出モデル YOLOv3 を自前画像で学習させようこの記事では、物体検出する機械学習モデル「YOLOv3」を...

    featureImg2020.05.19Tensorflow2 で YOLOv3 を動かしてみた!【機械学習】Tensorflow2 で YOLOv3 を動かし画像から物体検出をしようこの手の新しいソフトウェアは、バージョンが変...

    featureImg2020.03.24Tensorflow Liteを使ってAndroidで物体検出をしよう!【機械学習】Tensorflow Liteを使って物体検出 どんなものができるの?今回はディープラーニングを使って、「Androi...

    featureImg2020.06.23Pytorchを使ってYOLOv3で物体検出をしてみた!【機械学習】Pytorch(パイトーチ)とは?今回は、Pytorch(パイトーチ) を使って、YOLOv3で物体検出してみたいと思...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background