リアルタイムのSOTAパフォーマンスを備えた公式EfficientDetのPytorchの再実装、オリジナルペーパーリンク:https://arxiv.org/abs/1911.09070
データセットのトレーニングに問題があり、データセットを一般に公開している場合、またはすでに開いている場合は、 help wantedタグの問題について投稿する場合は、無料であれば、保証されていない場合は、あなたのためにトレーニングを支援しようとします。
要件:
データセットの画像の総数は10kを超えてはならず、容量は5GB未満である必要があり、自由にダウンロードできます。つまり、Baiduyun。
データセットは、このレポの形式である必要があります。
このリポジトリにデータセットを投稿すると、世界に開かれています。したがって、機密データセットをアップロードしないでください!
データセットが法律に反している場合、またはプライバシーに侵入する場合は、お気軽にご連絡ください。
最も重要なことは、私が望んでいない限り、私に訓練を要求することはできません。
評価結果とともに、このレポで訓練されたウェイトを投稿します。
PytorchでEfficientDetを試してみたい人が助けてくれることを願っています。
トレーニングの例はここにあります。チュートリアル。訓練されたウェイトはここにあります。ウェイト
パフォーマンスは論文の非常に近いものであり、まだソタです。
Speed/FPSテストには、JIT/データの精度のトリックなしで後処理の時間が含まれます。
| 係数 | pth_download | GPU MEM(MB) | FPS | 極端なFPS(バッチサイズ32) | マップ0.5:0.95(このレポー) | マップ0.5:0.95(公式) |
|---|---|---|---|---|---|---|
| D0 | EfficientDet-D0.pth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | EfficientDet-D1.pth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | EfficientDet-D2.pth | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | EfficientDet-D3.pth | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | EfficientDet-D4.pth | 1903 | 14.75 | - | 48.8 | 49.4 |
| D5 | EfficientDet-D5.pth | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | EfficientDet-D6.pth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | EfficientDet-D7.pth | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7x | EfficientDet-D8.pth | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23]は、EfficientDet-D7X、Map 53.9をサポートし、そのバックボーンとしてEfficientNet-B7を使用し、さらに深いピラミッドレベルのBIFPNを使用しています。簡単にするために、それをEfficientDet-D8と呼びましょう。
[2020-07-15] EfficientDet-D7ウェイトを更新、マップ52.7
[2020-05-11]ブール文字列変換を追加して、head_onlyが動作することを確認する
[2020-05-10] NMSをBatched_NMSに置き換えて、MAPを0.5〜0.7にさらに改善します。
[2020-05-04] COCOカテゴリID MISMATCH BUGを修正しますが、カスタムデータセットでのトレーニングに影響しないはずです。
[2020-04-14]修正損失関数バグ。最新のコードを引いてください。
[2020-04-14]いくつかの時代の後に助けを必要とする人や良い結果を得られない人のために、このチュートリアルをチェックしてください。 GPUサポートを使用してColabで実行できます。
[2020-04-10]トレーニングモデル内で損失関数をゆがめ、複数のGPUでトレーニングするときにメモリ使用量のバランスが取れ、より大きなバッチサイズでトレーニングを可能にします。
[2020-04-10] D7(D6が大きく、アンカースケールが大きい)をサポートしてテストするマップをテストする
[2020-04-09]カスタムアンカースケールと比率を許可します
[2020-04-08] D6サポートを追加して、そのマップをテストします
[2020-04-08]トレーニングスクリプトとそのドキュメントを追加します。評価スクリプトと簡単な推論スクリプトを更新します。
[2020-04-07] D0-D5マップをテストしました、結果はいいようです、詳細はここにあります
[2020-04-07]固定戦略。
[2020-04-06]アンカー戦略を適応させます。
[2020-04-05]このリポジトリを作成します。
# install requirements
pip install pycocotools numpy opencv-python tqdm tensorboard tensorboardX pyyaml webcolors
pip install torch==1.4.0
pip install torchvision==0.5.0
# run the simple inference script
python efficientdet_test.py
トレーニングEfficientDetは、痛みを伴う時間のかかる作業です。 1〜2日以内に良い結果を得ることを期待してはいけません。我慢してください。
これに慣れていない場合は、このチュートリアルをご覧ください。 GPUサポートを使用してColabで実行できます。
# your dataset structure should be like this
datasets/
-your_project_name/
-train_set_name/
-*.jpg
-val_set_name/
-*.jpg
-annotations
-instances_{train_set_name}.json
-instances_{val_set_name}.json
# for example, coco2017
datasets/
-coco2017/
-train2017/
-000000000001.jpg
-000000000002.jpg
-000000000003.jpg
-val2017/
-000000000004.jpg
-000000000005.jpg
-000000000006.jpg
-annotations
-instances_train2017.json
-instances_val2017.json
# create a yml file {your_project_name}.yml under 'projects'folder
# modify it following 'coco.yml'
# for example
project_name: coco
train_set: train2017
val_set: val2017
num_gpus: 4 # 0 means using cpu, 1-N means using gpus
# mean and std in RGB order, actually this part should remain unchanged as long as your dataset is similar to coco.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
# this is coco anchors, change it if necessary
anchors_scales: '[2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)]'
anchors_ratios: '[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]'
# objects from all labels from your dataset with the order from your annotations.
# its index must match your dataset's category_id.
# category_id is one_indexed,
# for example, index of 'car' here is 2, while category_id of is 3
obj_list: ['person', 'bicycle', 'car', ...]
# train efficientdet-d0 on coco from scratch
# with batchsize 12
# This takes time and requires change
# of hyperparameters every few hours.
# If you have months to kill, do it.
# It's not like someone going to achieve
# better score than the one in the paper.
# The first few epoches will be rather unstable,
# it's quite normal when you train from scratch.
python train.py -c 0 --batch_size 64 --optim sgd --lr 8e-2
# train efficientdet-d1 on a custom dataset
# with batchsize 8 and learning rate 1e-5
python train.py -c 1 -p your_project_name --batch_size 8 --lr 1e-5
# train efficientdet-d2 on a custom dataset with pretrained weights
# with batchsize 8 and learning rate 1e-3 for 10 epoches
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --num_epochs 10
--load_weights /path/to/your/weights/efficientdet-d2.pth
# with a coco-pretrained, you can even freeze the backbone and train heads only
# to speed up training and help convergence.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --num_epochs 10
--load_weights /path/to/your/weights/efficientdet-d2.pth
--head_only True
# while training, press Ctrl+c, the program will catch KeyboardInterrupt
# and stop training, save current checkpoint.
# let says you started a training session like this.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3
--load_weights /path/to/your/weights/efficientdet-d2.pth
--head_only True
# then you stopped it with a Ctrl+c, it exited with a checkpoint
# now you want to resume training from the last checkpoint
# simply set load_weights to 'last'
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3
--load_weights last
--head_only True
# eval on your_project, efficientdet-d5
python coco_eval.py -p your_project_name -c 5
-w /path/to/your/weights
# when you get bad result, you need to debug the training result.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --debug True
# then checkout test/ folder, there you can visualize the predicted boxes during training
# don't panic if you see countless of error boxes, it happens when the training is at early stage.
# But if you still can't see a normal box after several epoches, not even one in all image,
# then it's possible that either the anchors config is inappropriate or the ground truth is corrupted.
Q1。いくつかの効率的なPytorchプロジェクトがすでにある間にこれを実装する理由。
A1:AFAIKのどれも公式EfficientDetの真のアルゴリズムを完全に回復していないため、コミュニティはゼロからトレーニングして公式のEfficientDetと同じスコアを達成することができなかったか、苦労していません。
Q2:このリポジトリとその他の違いは何ですか?
A2:たとえば、これら2つは最も人気のあるEfficientDet-Pytorchです。
https://github.com/toandaominh1997/efficientdet.pytorch
https://github.com/signatrix/efficientdet
問題と、これらが公式のスコアと同じスコアを達成するのが難しい理由と、なぜ次のとおりです。
最初のもの:
2番目:
Pytorchのバッチノーマル化は、Tensorflow、Momentum_pytorch = 1 -Momentum_tensorflowとはわずかに異なります。あまり注意を払っても、このtrapに気づきませんでした。 Signatrix/EfficientDetはTensorflowからパラメーターを成功させたため、実行中の平均と実行の分散が新しい入力によって支配されているため、BNはより悪くパフォーマンスします。
深さに分離可能な条件の誤った実装。深さに分離可能なCONV2Dは、深さにconv2dおよびpointwise-conv2dとbiasaddです。2つのconv2dの後にはbiasaddのみがありますが、Signatrix/efficientdetは深さにconv2dに追加のバイアサッドを持っています。
MaxPooling2Dの最初のパラメーターを誤解すると、最初のパラメーターはSRIDEの代わりにkernel_sizeです。
EfficientNet出力の機能のダウンチャネル後のBNがありません。
EfficientNetの間違った出力機能を使用します。これは大きなものです。 Conv.Stride 2の出力が必要ですが、間違っています。次のConv.Strideが2またはEfficientNetの最終出力であるものである必要があります。
CONV2Dおよびプーリングに同じパディングを適用しません。
いくつかの操作の後にSwishの活性化が欠落しています。
BIFPN、リグレッサー、および分類器でのCONV/BN操作がありません。これは非常にトリッキーです。公式の実装を深く掘り下げなければ、重みが異なるのと同じ操作があります。
illustration of a minimal bifpn unit
P7_0 -------------------------> P7_2 -------->
|-------------| ↑
↓ |
P6_0 ---------> P6_1 ---------> P6_2 -------->
|-------------|--------------↑ ↑
↓ |
P5_0 ---------> P5_1 ---------> P5_2 -------->
|-------------|--------------↑ ↑
↓ |
P4_0 ---------> P4_1 ---------> P4_2 -------->
|-------------|--------------↑ ↑
|--------------↓ |
P3_0 -------------------------> P3_2 -------->
たとえば、P4はP4_0に下降してからP4_1になります。誰もがP4_0がP4_2に直接行くことを当然と思っているかもしれません。
それが彼らが間違っている理由です、P4はP4_0_Anotherとは異なる重みで再び反転する必要があります、そしてそれはP4_2に行きます。
そして最後に、いくつかの一般的な問題、アンカーデコーダーとエンコーダーは元の問題とは異なりますが、それがひどく機能する主な理由ではありません。
また、EfficientNet-PytorchからのConv2DStaticAmepaddingはTensorflowのように機能しません。パディング戦略は異なります。そこで、私は自分で実際のTensorflowスタイルのconv2dstaticsamepaddingとmaxpool2dstaticsamepaddingを実装しています。
上記の問題にもかかわらず、それらは私を啓発する素晴らしいリポジトリです。したがって、このリポジトリがあります。
このリポジトリは主にEfficientDetに基づいており、変更により、ペーパーと同じくらい近くにパフォーマンスを発揮することを確認します。
ところで、静的グラフTensorflow V1のデバッグは本当に苦痛です。 TF-onnxやMMDNNなどの自動化ツールでエクスポートしようとしないでください。カスタム/複雑な操作により、より多くの問題のみを引き起こします。
そして、あなたが成功したとしても、私がやったように、あなたは、ゼロから翻訳するよりも多くの時間がかかる同じクラスの下で、狂っためちゃくちゃになった機械で生成されたコードに対処する必要があります。
Q3:バグを見つけたらどうすればよいですか?
A3:更新ログが修正されている場合はチェックしてから、最新のコードを引いて再試行します。それが役に立たない場合は、新しい問題を作成し、詳細に説明してください。
結論:彼らはほぼ同じ精度を提供しています。ヒント:set force_input_size=1920 。公式リポジトリは元の画像サイズを使用し、このレポはデフォルトのネットワーク入力サイズを使用します。これら2つのレポを比較しようとする場合、入力サイズが一貫していることを確認する必要があります。
次のリポジトリからの素晴らしい仕事に感謝します。
このリポジトリが気に入っている場合、または何らかの理由で著者をサポートしたい場合は、著者に寄付できます。お気軽にあなたの名前を送ったり、ページを紹介したりしてください。スポンサーリストにあなたの名前を確認してください。
心から寛大に感謝します。
Cndylan Claire-S11