この記事はPython Advent Calendar 2021 カレンダー1の19日目の記事です。よろしくお願いします。
TensorflowやPytorchなどのディープラーニングフレームワークを使用するときに目的に合わせてよく使うコード例をまとめてみようという記事になります。参考になれば幸いです。
目次
1.画像のパスのリストを作成
2.ハイパーパラメータをまとめたconfigファイルを作成
3.pythonファイルで引数を取る
環境
M1 Mac
python: 3.8.12
1.画像のパスのリストを作成したい
あるディレクトリ内の画像のパスをリスト化することで、for文で一気にファイル名を変更したり、削除や移動、画像への色々な処理などを行えます。
import glob
# trainディレクトリ内の画像パスをリスト化
# 「*」にすることでtrainディレクトリ以下の全てのファイルを指定できる
img_path_list = glob.glob('./train/*')
画像のパス名を0001.png, 0002.pngといったように順番関係のあるものにしている場合は上記コードだけだと順番がバラバラになってしまうので注意です。
# リスト.sort()でファイル名を見て昇順ソート
img_path_list.sort()
例えば以下のように書くことでディレクトリ内の画像をnddarray化してリサイズすることが可能です。
import cv2
for path in img_path_list:
img = cv2.imread(path)
img = cv2.resize(128, 128)
「画像のパスをリスト化する」作業はディープラーニングをやってる中でよく使います。
2.モデルの設定(学習率、画像サイズなど)をまとめたい
ディープラーニングや機械学習ではJupyter notebook・Jupyter labなどのnotebook形式で実行される方が多いと思いますが、各セルでoptimizerの設定や、モデルの定義、データの読み込みなどを書いて実行していきがちですよね。
特にコンペだと何回も何回もハイパラを変更して実行することになるので、変更箇所はすぐにわかるようにしたい、すぐにアクセスできるようにしたい。
と言うことで辞書形式で設定値をまとめておくと楽です。
easydict
というライブラリを使います。
下記コマンドでインストール。
pip install easydict # pip
conda install -c conda-forge easydict # conda
以下cfg.py
というpythonファイルに各種設定をまとめる例になります。
from easydict import EasyDict as edict
# 空の辞書を作成
Cfg = edict()
# Cfg.キー名 = 値 の形式で設定値を書いていく
Cfg.batch_size = 32
Cfg.optimizer = 'adam'
Cfg.loss = 'categorical_crossentropy'
Cfg.learning_rate = 0.001
Cfg.height = 256
Cfg.width = 256
Cfg.checkpoint_dir = './checkpoints/'
Cfg.Cutmix = True
こんな感じで必要な設定項目をまとめたら
from cfg import Cfg
config = Cfg
# Cfg.キー名で各値にアクセスできる
Cfg.batch_size
# -> 32
こうしておくと変更する場所が一箇所で済むので非常に楽です。
特に論文モデルの公式実装ではこうしたconfigファイルが書かれていることが多いです。
3.pythonファイルで引数を取りたい
普段、機械学習やディープラーニングを実行する環境がnotebook形式だと、いざ実務などで実行スクリプトを書くとなったときに困ってしまうと思います(自分がそうでした)。
argparse
ライブラリを使って引数指定をしてみましょう
以下推論時の画像サイズ及び画像パスを引数に指定した推論実行ファイルinfer.py
の例です。
import argparse
# 他に必要なものインポート
# ---------------------------
# 引数の設定
parcer = argparse.ArgumentParser(description='推論実行ファイル')
parser.add_argument('img_path', type=str, help='画像のパス') # 「--」無しだと必須の引数
parser.add_argument('--img_height', type=int, help='画像の高さ', default=256) # 「--」付きだとオプション引数
parser.add_argument('--img_width', type=int, help='画像の幅', default=256)
# 引数の値をまとめて取得
args = parser.parse_args()
# 引数の値を取り出して変数に代入
img_path = args.img_path
height = args.img_height
width = args.img_width
# 推論実行関数
def infer(img_path, height, width):
# 省略
# ---------------------
if __name__ == '__main__':
infer(img_path, height, width)
こうしたスクリプトを書いてコンソール上で以下のように入力すると
python infer.py './train/img_001.png' 128 128
'./train/img_001.png'
という画像を縦128, 横128のサイズで推論を実行することができます。
まとめ
実務に携わるようになって使うようになったもの、勉強したものをまとめました。
他にもマルチスレッド処理など、まだまだpythonの知識が足りないので勉強していきます。