はじめに
Python、機械学習ともに初心者の筆者が書いた記事です。
誤りがあるかもしれないのでご注意ください。
yolo
のtrain.py
によって生成した学習済みモデル(best.pt
)を使って、画像認識をトリガーとしたプログラムを作成したくなったので、detect.py
のコードリーディングから始めてみようと思いました。今回は、yolov5
のコードを用います。
なんとなく、yolo
のバージョンの中でコードが一番シンプルそうだなと思ったためです。また、Usageが最初に記述されており、使い方がわかりやすかったのも理由です。
yolov5/detect.py
の構成
detect.pyは、2つの関数(run
、parse_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_opt
⇒main
⇒run
となっています。
その順にコードブロック内にコメントのカタチで説明を入れていきます。
※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
⇒「解析する」
opt
⇒ option
⇒「オプション」
args
⇒ arg
⇒ argument
⇒「引数」
参考
main
def main(opt):
# check_requirementsは何やってるのかわからない
check_requirements(exclude=('tensorboard', 'thop'))
# opt に保持されているすべてのオプション引数の値をrunの引数として代入?
# **var()の意味が分からない
run(**vars(opt))
**
の意味はこれ?↓
終わりに
メイン関数のcheck_requirements(...)
や、**var(...)
の意味が調べてもわからなかったのが心残りです。おそらく、本記事の目的とはあまり関係ないでしょうが...
run
だけ分けて次にやります。コード量が多すぎて疲れました。