Slide 1

Slide 1 text

Mobility Technologies Co., Ltd. 「Deep Fake Detection Challenge」 が⾟かったお話 2020/04/14 AIシステム部 データサイエンスG 島越 直⼈

Slide 2

Slide 2 text

Mobility Technologies Co., Ltd. n 名前 n 島越 直⼈ (シマコシ ナオト) 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

Slide 3

Slide 3 text

Mobility Technologies Co., Ltd. 概要 3 01

Slide 4

Slide 4 text

Mobility Technologies Co., Ltd. n Kaggle上で⾏われたFace swapとVoice swapを検知するCompetition n 独⾃データセット 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

Slide 5

Slide 5 text

Mobility Technologies Co., Ltd. データの特徴 5 02

Slide 6

Slide 6 text

Mobility Technologies Co., Ltd. n 全てhttps://www.kaggle.com/c/deepfake-detection-challengeのデータを⽤いてます スライド上の画像について 6

Slide 7

Slide 7 text

Mobility Technologies Co., Ltd. n ただの不均衡ではなく、あるSource Videoに対して複数Fakeが作られるという不均衡 n ⼀つの動画から⽣成される動画の数はRandom 不均衡 7 Real Fake

Slide 8

Slide 8 text

Mobility Technologies Co., Ltd. n 同じActorが違う動画で何回も出てくる。Actorについても不均衡。 n ⼀応データはFolder毎に提供され、Folderで分割すれば同じActorが出てくることはほとん どない 不均衡 8

Slide 9

Slide 9 text

Mobility Technologies Co., Ltd. データの⼀部のみSwapされているデータが存在 9

Slide 10

Slide 10 text

Mobility Technologies Co., Ltd. データの⼀部のみSwapされているデータが存在 10

Slide 11

Slide 11 text

Mobility Technologies Co., Ltd. n 分かりやすいFake ( 画像⼀枚で不整合を起こしている部分がある ) n 分かりにくいFake (diffを⾒れば分かるが単体画像としては分かりにくい) 分かりやすいFakeと分かりにくいFakeがある 11

Slide 12

Slide 12 text

Mobility Technologies Co., Ltd. n 両⽅にSwapがかかったりかからなかったり 顔が複数写っている動画 12

Slide 13

Slide 13 text

Mobility Technologies Co., Ltd. n Face swapが失敗しているが処理はかけているのでFakeとラベルがついていることがある n ラベルノイズ n 意図的に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

Slide 14

Slide 14 text

Mobility Technologies Co., Ltd. コンペ中の進め⽅ 14 03

Slide 15

Slide 15 text

Mobility Technologies Co., Ltd. n Voice swapは相当少なそうで無視している⼈が多かった。 n ⾃分もmel spectrogram -> CNN で少しVoice swap特化モデルを作成したが、訓練lossも 0.4くらいで全然下がらなかったので諦めた。 n データセットが1GB未満という制約のため、Ensemble祭りはできない 基本パイプライン 15 図はhttps://www.kaggle.com/c/deepfake- detection-challenge/discussion/140829から拝借

Slide 16

Slide 16 text

Mobility Technologies Co., Ltd. n 動画の読み込み -> 何frame読み込めるかに直結 n Nvidia 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

Slide 17

Slide 17 text

Mobility Technologies Co., Ltd. n Folderで⼤体Actorが分かれているという話があったので、同⼀Folder内の動画は同じFoldに⼊ るように n Fakeの数も動画によって変わるので、Fold毎になるべく同じFake数になるように n 要するに簡単なStratifiedGroupKFold n K=5とし、Stackingを考えてモデルを10個作っても⼤丈夫そうなペアを考えた。 n SeResNext50とEfficientnet-b3で⾏けそう Validation の作成 17

Slide 18

Slide 18 text

Mobility Technologies Co., Ltd. n Face detector : S3FD (100frames / 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

Slide 19

Slide 19 text

Mobility Technologies Co., Ltd. n Face detector : S3FD (100frames / 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 銀圏くらいなら余裕じゃね??

Slide 20

Slide 20 text

Mobility Technologies Co., Ltd. n 過学習の例 n Frameのindexに起因する過学習 n Fakeを奇数frame⽬、Realを偶数frame⽬などとするとFake部分ではなく、顔の傾きな どで学習してしまう。 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

Slide 21

Slide 21 text

Mobility Technologies Co., Ltd. n Validation Metricの調整 n FakeとRealのサンプル数に合わせて重み付け。 n 最初は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

Slide 22

Slide 22 text

Mobility Technologies Co., Ltd. n なんでペアで⼊れた? n ペアで同じFrame indexでモデルに⼊⼒すると、肌の⾊とか顔の向きとかFakeとは関係のな い情報ではなく、diffに起因した特徴を学習してくれる気がしませんか? Sampling Methodについて 22 これが正しいと思ってずっとやっていたが Publicで全くスコアが出ない

Slide 23

Slide 23 text

Mobility Technologies Co., Ltd. n StackingでLightGBMをかませて調整した n 単純に30 frameの平均だと⾃信度が低くなりがち n CNN-LSTM(GRU)とかCNN-Transformerとかめちゃくちゃ効きそう n 試したけど過学習が酷く、使えなかった。(Validationの時点で酷い) n ここの原因がいまだに分からない。何故Workしなかったのか n CNNをtrainした後freezeして学習でもダメ Fakeが動画⼀部分しか存在しないものに対しての対処 23

Slide 24

Slide 24 text

Mobility Technologies Co., Ltd. 常に出⼒の分布はモニタリング 24 n 下⼆つはほぼ同じのlog lossだが左のモデルの⽅が良さそう

Slide 25

Slide 25 text

Mobility Technologies Co., Ltd. n 分かりやすいFakeと分かりにくいFakeでLossに重みをつけたかったのでdiff情報を元にした Segmentation Maskを作成し、UNetモデルを作成 その他試したこと (Not 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

Slide 26

Slide 26 text

Mobility Technologies Co., Ltd. n Preprocessing n S3FDを使うため画質を半分に落としていたところをTest dataで既に画質が半分になってい るものはResizeしない。 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

Slide 27

Slide 27 text

Mobility Technologies Co., Ltd. n データセット作成は⾃⼒ n Face cropするだけで1⽇溶ける n 同じ顔を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

Slide 28

Slide 28 text

Mobility Technologies Co., Ltd. Public LBの上位解法 28 04

Slide 29

Slide 29 text

Mobility Technologies Co., Ltd. n Face Detector : RetinaFace n 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が上⼿くいかなかった要因かも

Slide 30

Slide 30 text

Mobility Technologies Co., Ltd. n Face Detector : MTCNN n 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の部分の差分が⼤きい気がする

Slide 31

Slide 31 text

Mobility Technologies Co., Ltd. Public 14th Place Solution 31 やっぱりFace Margin ⼤きめ。。 n BlazeFaceだと精度が悪いところをMTCNNで補完 n Median Prediction n Face Margin : (widthscale, heightscale) = (1.67, 1.43)

Slide 32

Slide 32 text

Mobility Technologies Co., Ltd. n Marginのことは頭をよぎりはしたが、Face cropまで⼿戻りする余裕がなかった n 1⽇かかることと、subが1⽇2回しかできないという制限からなかなか踏ん切りがつかな かった n 0.3切ってて公開されてるSolutionは⼤体Margin取ってる n Sampling Methodを変えてからPublicがなかなか改善しない沼にハマっていたが、そこに問題が あるとは考えれなかった。 n 実際問題あるのかは分からないが、初期モデルの⽅がいいので⼿戻りするべきだった。 n 5-foldモデルを作成してからPublicで性能を実験していたが、時間がかかりすぎるのでとりあえ ず1-foldで実験を回す⼯夫をした⽅が良かった。 n StackingならAudio情報もうまいこと取り込めそうと思い、初期のStacking脳から離れられな かった。 n その結果modelを⼩さくする⽻⽬になり、Augmentation情報を上⼿く学習できなかった可 能性がある 反省ポイント 32

Slide 33

Slide 33 text

Mobility Technologies Co., Ltd. まとめ 33 Face Margin は⼤きく取ろう