久しぶりにDarknetを触ってみたら、昨年のGWの頃から少し変わっていたのでまとめました。
ついでにDarknetからKerasへの変換プログラムYAD2Kも修正して動くようにしました。
重みのフォーマット
https://github.com/pjreddie/darknet/blob/master/src/parser.c
が少し変わりました。
fread(&major, sizeof(int), 1, fp); fread(&minor, sizeof(int), 1, fp); fread(&revision, sizeof(int), 1, fp); fread(net->seen, sizeof(int), 1, fp);
が
fwrite(&major, sizeof(int), 1, fp); fwrite(&minor, sizeof(int), 1, fp); fwrite(&revision, sizeof(int), 1, fp); fwrite(net->seen, sizeof(size_t), 1, fp);
に変更になりました。
最後がsizeof(int)から、sizeof(size_t)です。これによりwightファイルのヘッダーの大きさが変わります。前のバージョンでは環境によらずヘッダーのサイズはsizeof(int)×4バイトだったものが、新しいバージョンでは作った環境(size_tのサイズ)によって変わってきます。sizeof(int)とsizeof(size_t)が違う環境の場合、ここでずれてしまいます。
yad2kの変更点はここ
https://github.com/allanzelener/YAD2K/blob/master/yad2k.py
# Load weights and config. print('Loading weights.') weights_file = open(weights_path, 'rb') # weights_header = np.ndarray( # shape=(4, ), dtype='int32', buffer=weights_file.read(16)) weights_header = np.ndarray( shape=(4, ), dtype='int32', buffer=weights_file.read(20))
重みをロードするときのヘッダーサイズを16から20に変更するなど、(yad2kの実行環境ではなく、)重みを生成した環境のヘッダーサイズに合わせてください。
入力データ
今調べてみると、2017年の11月からletterbox_imageという処理が追加されています。
https://github.com/pjreddie/darknet/blob/master/src/image.c
前のバージョンでは画像データをそのままYOLOの入力に合わせていましたが、この変更によりアスペクト比を維持したまま縮小し、空いたスペースをRGB=(128,128,128)で埋めています。
これは実際の絵を見てもらえれば雰囲気がわかります。(ちょっと小さいですが)