ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Darknet YOLOが少し変わっていた件

久しぶりに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)で埋めています。
これは実際の絵を見てもらえれば雰囲気がわかります。(ちょっと小さいですが)