ナオト) n Twitter n @nt_4o54 n 経歴 n 奈良県⽣まれ n Kyoto Univ. 機械系⼤学院卒 n 2019/04 ~ 2020/03 DeNA n 2020/04 ~ DeNAよりMobility Technologiesに出向 n Kaggle n @shimacos (⾦ 1, ソロ銀 2) n Kaggle Master n ドメイン問わず参加 n 銅メダル。。お前はもういいよ。。 ⾃⼰紹介 2
n Fake or Realのbinary classification n 評価指標はLogloss n Face swapとVoice swapの⼿法は⾮公開 n 動画総数 約120,000 (470GB) n 総賞⾦$1,000,000 (!) n 動画というやりにくいタスクに2,281 Teamが参加 n Code Competition n 4000videoに対してKaggle Notebook上で9hour n Uploadできるデータセットは合計1GB未満 n 2020/04/14現在 Privateはまだ計算中 Deep Fake Detection Challengeについて 4
意図的にtrain dataとtest dataの分布が(多分)変わっている。CVとLBがだいぶ乖離。 n https://arxiv.org/pdf/1910.08854.pdf 1. Reduce the FPS of the video to 15. (2/9) 2. Reduce the resolution of the video to 1/4 of its original size. (2/9) 3. Reduce the overall encoding quality. (2/9) 4. Original (1/3) 5. Real : Fake = 1 : 1 n Privateは更に以下のような記述 (shake要因得る) その他 13
Dali n 速いがKernel上で動かず断念 n ffmpeg n 速度は分からないが、⼀度DiskにI/Oしなければいけないため除外 n cv2.VideoCapture n 遅いけど仕⽅なくこれを使うことに n Face Detector -> Face Cropの精度に直結 n MTCNN n 速いが精度が気になる(training setでも結構Errorを吐く) n Blaze Face n MTCNNより速いが、精度はもっと悪い n S3FD n Inputの画質を半分にしてもMTCNNより精度が良く、要件も満たせそう。これを採⽤。 推論条件を満たすように⾊々調査 16
/ video) n 100frameからrandom sampling, 推論は30frameのaverage, MultiFaceについてはmax n 過学習めちゃくちゃするので、いつもよりLR⼩さめAdam (この部分めちゃくちゃ敏感だった) n Efficientnet-b3とSeResNext50のアンサンブル n Weighted sampler (Fake : Real = 1 : 5) n Sigmoid -> logit -> s倍 -> sigmoid のpostprocess (sigmoidのゲインを上げることに相当) n Privateでは画質が下がったりするため、⾃信度が低くなりがちになると考えた。 n Public 0.33 (この時点の60thくらい) n めちゃくちゃ過学習するな。。。という感じ n Train loss 0.05, Validation loss 0.11とか 初期モデル 18
/ video) n 100frameからrandom sampling, 推論は30frameのaverage, MultiFaceについてはmax n 過学習めちゃくちゃするので、いつもよりLR⼩さめAdam (この部分めちゃくちゃ敏感だった) n Efficientnet-b3とSeResNext50のアンサンブル n Weighted sampler (Fake : Real = 1 : 5) n Sigmoid -> logit -> s倍 -> sigmoid のpostprocess (sigmoidのゲインを上げることに相当) n Privateでは画質が下がったりするため、⾃信度が低くなりがちになると考えた。 n Public 0.33 (この時点の60thくらい) n めちゃくちゃ過学習するな。。。という感じ n Train loss 0.05, Validation loss 0.11とか 初期モデル 19 銀圏くらいなら余裕じゃね??
どで学習してしまう。 n Actorに起因する過学習 n RandomにWeighted Samplingすると、Actor AをFakeとして多くSampling、BをRealと して多くSamplingなどの問題が発⽣してしまう (かもしれない)。 n Aの顔が来たらFake, Bの顔が来たらRealみたいになる n 訓練データの分布に起因する過学習 n Testデータは画質が落ちていたり、FakeとRealの分布が1 : 1だったりするので、 Validation Setもその分布に合わせなければいけない n Face Swapの元になっている顔画像に起因する過学習 n Preview Datasetの論⽂によれば、恐らくCross Swap n Training dataに存在するActorの顔同⼠で属性が似ているもの同⼠の顔をSwapする (Test については別) n 多分Test Set内には同じActorが存在しない? (ValidationをActor uniqueにする?) 過学習について真⾯⽬に考え始めた (このコンペのポイント) 20
最初はReal VideoからランダムにペアのFake Videoを⼀つサンプリングしていたが、なるべ く多くのFakeパターンが認識できているか確認したかったのでこの形に n Testと同じAugmentationをかける (TrainのAugmentationにも追加) n 2/9 にJpegCompression (Encodingクオリティを下げることに相当) n 2/9 にDownscale n MiniBatchのSampling⽅法変更 n 同じMiniBatch内に必ずReal VideoとペアのFake Videoが存在するように n Fake Videoはepoch毎にペアの中からRandom Sampling n RealとFakeのFrameのindexも同じに n 同じindexはその動画の全てのindexを使い切るまで使わない(1 ~ 8 あるFrameの中で 1epoch⽬で1, 3, 4, 7使ったとしたら、次は2, 5, 6, 8から選ぶということ) n 各epochでそれぞれのVideoからサンプルするFrame数を1にする。 n 20とか選んでしまうとそのペアにLossが強くかかってしまう。 過学習を防ぐためにやったこと 21
CNN-LSTM(GRU)とかCNN-Transformerとかめちゃくちゃ効きそう n 試したけど過学習が酷く、使えなかった。(Validationの時点で酷い) n ここの原因がいまだに分からない。何故Workしなかったのか n CNNをtrainした後freezeして学習でもダメ Fakeが動画⼀部分しか存在しないものに対しての対処 23
worked in validation) 25 n Diffが少ないsingle frame画像はノイズになるので、 それをSegmentation Maskを同時に学習させるこ とで軽減できないか n 学習が重いし、そこまでValidationの差がなく1GB の制限もあるのでやめた n Remove Hard Example n Large Batch Training n TPU training n 動いたけど、Lossが下がらない問題に直⾯し早々 に断念 n Focal Loss, Weighted BCE Loss n Triplet Loss n Label Smoothing
n 顔が最初から写っていないものに関しての対処として、初めて顔が写った時から等間隔あけ て30 frameを抽出 n そもそも顔が写っていないものなどErrorを吐いたものには0.5を出⼒ n 複数の顔が写っているときは上⼿く座標からTrackingするように n 閾値より⼩さかったり⼤きすぎるcropは顔ではないとして弾く n 前述のValidationとSampling Methodを取り⼊れたSeResNext50とEfficientnet-b3のStacking n 30 frames n Validation loss 0.16, Public 0.33 n CVとLBの乖離は改善されたが、初期モデルと性能変わらず。。⾟い。。 n Label noiseが多く、pairで⼊⼒することによる正則化が強く働きすぎた? n 前述したとおり、Privateは更に分布が変わるのでshakeに期待するしかない 最終的なモデル (Public 125th ) 26
同じ顔をtracking (face align)するようにとか、 顔でないものは弾くなど本番の学習を始める前 に考えることが多い。ミスったらまた作り直し で1⽇かかる。 n 最初の1 frameだけ抜き出しとかだとすごく過学 習する。 n CVとLBの乖離 n CVとLBを近づけるために頑張るか、CVを下げ ることを頑張るか n しかも⼀⽇2sub n 7hour推論を回した後のSubmission Error n 気をつけないとDataLoaderがLeakしていたりし て、すぐMemory Errorになる n testの分布が異なるため、想定外のデータに対す る対処をミスると死ぬ ⾟かったこと 27
Unet Architecture n Tuned by LB n RAdam + ReduceLROnPlateau & Tune Learning Rate n Use different frames of each video every epoch n Hard Augmentations & Large Model(efficientnet-b5) (0.3 -> 0.27 boost) n shift, scale, rotate, rgbshift, brightness, contrast, hue, saturation, value, noise and blur n JpegCompression and Downscale n Increase Face Margin (0.27 -> 0.214 boost) n 7 efficientnet-b4 and 3 efficientnet-b5 with different seeds and did simple average by 30 frames Public 2nd Place Solution 29 Face Marginを⼤きく取るというところの差分が⼤きい 恐らく顔周辺にミスでSwapしてしているということがあるのでその分Robustになるのか? Augmentation後の情報も上⼿く学習させるにはMarginが必要なのかも(ScaleやRotate, Shift) Modelが⼩さかったのもAugmentationが上⼿くいかなかった要因かも
Self-Attention based Model n Backbone: efficientnet-b4 n Imagenet pretrained & first 4 blocks freeze n 2x extra margin n Actor Clustering & cluser based split Kfold n 2 model ensemble n Label smoothing n TTA n Different margin, Different y-axis offset and Horizontal Flip Public 7th Place Solution 30 Transformer Likeで成功していてすごい 最初の4Blockをfreezeしてることで上⼿く正則化されているのか? やはりExtra Marginの部分の差分が⼤きい気がする
n 0.3切ってて公開されてるSolutionは⼤体Margin取ってる n Sampling Methodを変えてからPublicがなかなか改善しない沼にハマっていたが、そこに問題が あるとは考えれなかった。 n 実際問題あるのかは分からないが、初期モデルの⽅がいいので⼿戻りするべきだった。 n 5-foldモデルを作成してからPublicで性能を実験していたが、時間がかかりすぎるのでとりあえ ず1-foldで実験を回す⼯夫をした⽅が良かった。 n StackingならAudio情報もうまいこと取り込めそうと思い、初期のStacking脳から離れられな かった。 n その結果modelを⼩さくする⽻⽬になり、Augmentation情報を上⼿く学習できなかった可 能性がある 反省ポイント 32