1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YOLOv5 detect.py のコードを読んでみる

Posted at

はじめに

Python、機械学習ともに初心者の筆者が書いた記事です。
誤りがあるかもしれないのでご注意ください。

 yolotrain.pyによって生成した学習済みモデル(best.pt)を使って、画像認識をトリガーとしたプログラムを作成したくなったので、detect.pyのコードリーディングから始めてみようと思いました。今回は、yolov5のコードを用います。

 なんとなく、yoloのバージョンの中でコードが一番シンプルそうだなと思ったためです。また、Usageが最初に記述されており、使い方がわかりやすかったのも理由です。

yolov5/detect.pyの構成

 detect.pyは、2つの関数(runparse_opt)とメイン関数(main)から成り立っています。if __name__ == "__main__"から見ていくと呼び出される順番は、

def main(opt):
    check_requirements(exclude=('tensorboard', 'thop'))
    run(**vars(opt))

if __name__ == "__main__":
    opt = parse_opt()
    main(opt)

 parse_optmainrunとなっています。
 その順にコードブロック内にコメントのカタチで説明を入れていきます。

if __name__ == "__main__"について

parse_opt

def parse_opt():
    # 引数解析のためのArgumentParserインスタンスの生成
    parser = argparse.ArgumentParser()

    # 引数(オプション引数)の追加
    parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    parser.add_argument('--vid-stride', type=int, default=1, help='video frame-rate stride')

    # .parse_args()で引数の解析結果を取得し、代入
    opt = parser.parse_args()
    
    # 三項演算子を使用している
    # オプション引数の imgsz について、
    # if len(opt.imgsz) == 1 がtrueならば opt.imgsz *= 2 、falseならば opt.imgsz *= 1 が実行される
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    
    # opt に保持されているオプション引数の値をdict(「キー」と「値」の組)として出力
    print_args(vars(opt))
    return opt

parse ⇒「解析する」
optoption ⇒「オプション」
argsargargument ⇒「引数」

参考

main

def main(opt):
    # check_requirementsは何やってるのかわからない
    check_requirements(exclude=('tensorboard', 'thop'))

    # opt に保持されているすべてのオプション引数の値をrunの引数として代入?
    # **var()の意味が分からない
    run(**vars(opt))

**の意味はこれ?↓

終わりに

メイン関数のcheck_requirements(...)や、**var(...)の意味が調べてもわからなかったのが心残りです。おそらく、本記事の目的とはあまり関係ないでしょうが...
runだけ分けて次にやります。コード量が多すぎて疲れました。

runへ続く

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?