質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Darknet

Darknetは、C言語で記述されたオープンソースのニューラルネットフレームワークで簡単にインストールすることが可能です。学習済みモデルとアルゴリズムも配布しており、ダウンロードすれば容易に動かすこともできます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

4121閲覧

keras-yolov3のtrain.pyのコードについて

shocora

総合スコア8

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Darknet

Darknetは、C言語で記述されたオープンソースのニューラルネットフレームワークで簡単にインストールすることが可能です。学習済みモデルとアルゴリズムも配布しており、ダウンロードすれば容易に動かすこともできます。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/09/23 15:57

###前提

https://sleepless-se.net/2019/06/21/how-to-train-keras%E2%88%92yolo3/を参考に独自データにおけるYOLOv3の学習を行っています。

上記サイトで使用されているコード:
https://github.com/sleepless-se/keras-yolo3

すべてでなくても良いので教えていただけると助かります。

質問したいこと

1.
train.pyのコードの中で不明な点があります。
52行目から90行目の以下のコードの部分で、2回model.fit_generater()を行っているのはなぜでしょうか。2つの違いを教えていただきたいです。

また、それぞれのepochsとinitial_epochsの数値は何を指定しているのでしょうか。この状態だと50epochsずつの計100epochs繰り返すのですが、自分でepochs数を変えたい場合、どの数値を変更したらどう変わるのか教えていただきたいです。

Python

1 # Train with frozen layers first, to get a stable loss. 2 # Adjust num epochs to your dataset. This step is enough to obtain a not bad model. 3 if True: 4 model.compile(optimizer=Adam(lr=1e-3), loss={ 5 # use custom yolo_loss Lambda layer. 6 'yolo_loss': lambda y_true, y_pred: y_pred}) 7 8 batch_size = 32 9 if len(sys.argv) > 2: 10 batch_size = int(sys.argv[2]) 11 12 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) 13 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes), 14 steps_per_epoch=max(1, num_train//batch_size), 15 validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes), 16 validation_steps=max(1, num_val//batch_size), 17 epochs=50, 18 initial_epoch=0, 19 callbacks=[logging, checkpoint]) 20 model.save_weights(log_dir + 'trained_weights_stage_1.h5') 21 22 # Unfreeze and continue training, to fine-tune. 23 # Train longer if the result is not good. 24 if True: 25 for i in range(len(model.layers)): 26 model.layers[i].trainable = True 27 model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # recompile to apply the change 28 print('Unfreeze all of the layers.') 29 30 batch_size = 32 # note that more GPU memory is required after unfreezing the body 31 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) 32 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes), 33 steps_per_epoch=max(1, num_train//batch_size), 34 validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes), 35 validation_steps=max(1, num_val//batch_size), 36 epochs=100, 37 initial_epoch=50, 38 callbacks=[logging, checkpoint, reduce_lr, early_stopping]) 39 model.save_weights(log_dir + 'trained_weights_final.h5')

2.学習中のログに関して

このログを出力するコードは何行目に書かれているのでしょうか。また、デフォルトだとlossとval_lossが出力されているのですが、accuracyを一緒に表示するのはどうすればよいのでしょうか。
学習中ログの一部

3.データ拡張に関して

170行目から192行目で定義されるdata_generatorの部分で学習データの水増しはされているのでしょうか。
また、されていない場合どこにどのようなコードを追加すればできるのでしょうか。

Python

1def data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes): 2 '''data generator for fit_generator''' 3 n = len(annotation_lines) 4 i = 0 5 while True: 6 image_data = [] 7 box_data = [] 8 for b in range(batch_size): 9 if i==0: 10 np.random.shuffle(annotation_lines) 11 image, box = get_random_data(annotation_lines[i], input_shape, random=True) 12 image_data.append(image) 13 box_data.append(box) 14 i = (i+1) % n 15 image_data = np.array(image_data) 16 box_data = np.array(box_data) 17 y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes) 18 yield [image_data, *y_true], np.zeros(batch_size) 19 20def data_generator_wrapper(annotation_lines, batch_size, input_shape, anchors, num_classes): 21 n = len(annotation_lines) 22 if n==0 or batch_size<=0: return None 23 return data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こないだ同じモデルを動かしましたので僕の見解を示します。

train.pyのコードの中で不明な点があります。

52行目から90行目の以下のコードの部分で、2回model.fit_generater()を行っているのはなぜでしょうか。2つの違いを教えていただきたいです。

1回目で50epoch動かしていますがデフォルトではこの50回はlearning rate(学習率)を1e-3に固定して学習を行っています.
2回目以降は学習状況に応じて学習率を変化させて学習させています.
1回目である程度lossが低くなるまで学習させるために固定して学習させるために2回に分けられていると考えます.

また、それぞれのepochsとinitial_epochsの数値は何を指定しているのでしょうか。この状態だと50epochsずつの計100epochs繰り返すのですが、自分でepochs数を変えたい場合、どの数値を変更したらどう変わるのか教えていただきたいです。

それぞれ名前の通りです.
initial_epochsはepochの初期値です。
epochsは学習をするepoch数です.
1回目にepochs=50,initial_epoch=0,となっていて2回目はepochs=100,initial_epoch=50となっていることで2回目はepoch51からepoch100までの50epoch実行します。
なのでここを変えれば大丈夫です。

このログを出力するコードは何行目に書かれているのでしょうか。また、デフォルトだとlossとval_lossが出力されているのですが、accuracyを一緒に表示するのはどうすればよいのでしょうか。

YOLOv3はクラス分類のモデルとはちがい、物体検出モデルでかつ領域提案とクラス分類を同時に行うために,損失関数(loss)を工夫して回帰問題に帰着しています.
最適化アルゴリズムがこのlossを最小にするように頑張るのでaccuracyを1に近づけるといったものではないのでaccuracyはないです.
代わりにイテレーションごとにlossを表示できるようになってる場所があったので(yolo.py?だっけ)それを表示するようにはできます.

170行目から192行目で定義されるdata_generatorの部分で学習データの水増しはされているのでしょうか。

また、されていない場合どこにどのようなコードを追加すればできるのでしょうか。

僕が学習データ500枚を使って動かした時は450枚をtrain_data、50枚をval_dataとして回してたので勝手に水増しはされてないと思います.
コードを見た感じでもただランダムにとってきてるだけだと思います。

僕もまだ理解できてない部分が多いのでもしかしたら間違ってるかもです。
間違ってたらすみません。

投稿2021/01/21 18:38

kyokio

総合スコア560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shocora

2021/01/22 08:48

回答ありがとうございます。loss値しか出力できないことが疑問だったので解説していただき理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問