はじめに
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だけ分けて次にやります。コード量が多すぎて疲れました。