Closed kktsubota closed 4 years ago
原因は特定できたと思う。ライブラリのバージョンの違いだと思う。
直接的な原因は src/factories/model.py
が返すDetBenchTrainのインスタンスの forward
が
def forward(self, x, target):
class_out, box_out = self.model(x)
cls_targets, box_targets, num_positives = self.anchor_labeler.batch_label_anchors(
x.shape[0], target['bbox'], target['cls'])
....
と実装されているせい。bboxes, labelsじゃなくて target['bbox'], target['cls']。 ライブラリのバージョンの違いでAPIが変わっていると思われる。 他にも直す必要があるらしく、直しきるよりは、元コードが使っているバージョンを使う方が楽そう。 kaggle上で公開されているコードをダウンロードしてきてそれをレポジトリに直接追加 / submoduleで追加するのが良さそう。
なるほど、effdetのバージョンが違ってたのか。
そのURL見れない…
ちなみにefficientdetではなく、オレオレ実装のtimm-efficientdet-pytorchのようね。 →違うか、githubで公開されているのがそれってことか。 https://www.kaggle.com/shonenkov/timm-efficientdet-pytorch
なるほど。
1つ目のセルのこのプロセスを実行する必要があるのかな
1つ目のセルのこのプロセスを実行する必要があるのかな
だめだった
ああ、誤解が生じてしまったかもしれない。
間違いなくAPIが変わっているのは effdet
で実装されている DetBenchTrain
です。
他のライブラリ (timm, pycocotools) のバージョンはどうある必要があるかは分からない。
言っていることが逆になって申し訳ないけどREADMEを見る限り最新モデルの方が0.012も高いので、これで頑張るならeffdet は最新のものを使うべきかも… https://github.com/rwightman/efficientdet-pytorch
D0 モデルに関して、Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ]
での評価が
2020-05-04: 0.324
2020-05-27: 0.331
2020-06-04: 0.336251
なるほどなるほど。ありがとう。理解した。 最新実装のDetBenchTrainを使うのがそんなに難しそうでなければ、そっちのほうが良さそうだね
その場合はforwardの際にモデルに入力する形式が変わってるから、https://github.com/kiccho1101/kaggle_global_wheat_detection/blob/f9552d46117a084be91ccb53e9aac89569589d9a/src/factories/fitter.py#L103-L111 この部分を変更するべきなのかな?
まずはそこ。 そこを直したらlossの形式も辞書になったよってエラーが出て、 そこを直したらdatasetでbboxが空のときのエラーが出た -- effdet関係あるんだろうか? という現状
なるほど。まあgithubからSOTAモデル持ってきて変数の形式合わせて動くようにするっていうプロセスはこれからも無限にありそうだから、やってみる〜 githubにレポジトリにサンプルコードみたいなのあるはずだから、探してみる
ありがとうー、よろしくー。
ごめん、もしわかったらでいいんだけど、だいたいこのファイル見ればわかりそうとかあったりする?
そこまで丁寧にメンテナンスされているようなライブラリではないため、 エラーが出たときにはライブラリの中身を見ながらデバッグするよりないのかも。
一応今出ているエラーの話はnotebookの下の方で話がされている模様。 ページ内で "I thought the effdet package you are using is a months old"で検索してもらえると。 https://www.kaggle.com/shonenkov/training-efficientdet
validationのimg_scaleのエラーの回避方法についても描いてあるけど、 関数をさかのぼってみると予測用にresizeしていたbounding boxサイズを元画像の解像度に戻すような処理をするパラメータであることが分かるため、元画像の解像度である1024 / 学習に利用した解像度 の値を入れておけばよいのかな… https://github.com/rwightman/efficientdet-pytorch/blob/5332cfac6d82f135c080986b8df116104450afdb/effdet/anchors.py#L219 関数をたどるときはgithubのsourcegraphが便利。
bounding boxがemptyな問題とかはこのあたりが参考になるのかも? https://www.kaggle.com/c/global-wheat-detection/discussion/153191
ありがとう! notebookのコメントの方法で,fitまではエラーなく回るようになった
When running
notebook/cv.ipynb
, we got a following error.