AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Deepfake Detection Challenge - 8

gDeepfake Detection Challenge - 8

Identify videos with facial or voice manipulations

 

<課題> 

 *400の動画から、各10枚の静止画像を抽出し、fakeファイルとrealファイルに名前を付けて投げ込む。次に、この2種類の画像をCNNで分類できるかどうか、試してみる。

・2週間日以上、停滞中。

・この間、動画の読み込みから静止画像の取り出し方法を検討することに始まり、画像処理技術全般に対する知識レベル、コーディングレベルを上げるために、1冊のテキストを読み込むことに集中している。

・Deepfake Detection Challengeにおいて、個人的に、どのような課題があるのか、それを克服するにはどのような知識や技術が必要になるのか、を意識しながら取り組んでいる。

 

*この間の状況をメモっている。

 

*テキストは、Hands-On Computer Vision with TensorFlow 2 by B. Planche and E. Andresで、動画に直接関係しているのは、Chapter 8: Video and Recurrent Neural Networksである。

・このChapter 8で扱われているのは、ヒトの動画から動作の種類を分類するもので、UCF101 datasetを用いて学習・評価する。

・用いられている手法は、CNNによる前処理の後、RNN(LSTM)で学習し動作分類する手法。

・CNNによる前処理は、学習済みCNNを用いて特徴量抽出したもので結果としてデータ量が削減される。

・このpretrain modelによる特徴量抽出は、feature volume (a stack of feature maps) と表現されている。

・RNNに入力させるための、動画からの画像抽出に関する何通りかの方法について説明され、プログラム例が示されている。

・RNNで動作分類することから、各動画から取り出した画像の並びを保持することと、画像の枚数を揃えることが重要とのこと。

 

*こんな感じで、Hands-On Computer Vision with TensorFlow 2 by B. Planche and E. Andresを用いて、画像処理技術の基礎をしばらく学ぶことにする。

 

・このテキストは、モノクロで、紙質も良くなく、説明も懇切丁寧というほどではない。

・良いところは、オリジナルの良質な参考文献やウエブサイトを紹介していることと、なによりも、実用的な観点からストーリーが組み立てられており、説明の仕方は総じて具体的で簡潔である。

・2/28追記:YOLOの説明が込み入っていて、理解するのに時間を要しているが、著者らは、テキストをささっと読んで、YOLOの発明者らの論文をしっかり読むようにアドバイスしている。つまり、著者らは、限られたスペースに要点を詰め込んでいるが、それでは、十分に説明しきれないので、著者らの解説をベースにして、原著論文に挑みなさいということのようである。確かに、各所に、関連論文・資料が明記されている。この本は、動画の前処理に不慣れな自分を助けてくれるだろうという理由で購入したが、今は、コンピュータビジョン全般の最新のテクノロジーを習得するに必要な最低限の基礎知識を提供してくれるもので、この本をベースにして、各所に紹介されている付加情報を参考にして、自分の力で、最新の知識と技術を深めていかなければならないと理解した。TensorFlow2に関しては、まだまだ理解できていないが、これも、Keras/TensorFlowを使っていた自分には、非常にありがたいと感じ始めているところである。

 

・以下にB. Planche, E. Andresのテキストを読みながら感じたこと、要点等を示す。

 

*AlexNet:LeLUとdropoutを初めて使ったモデル。

 

*VGG16,VGG19:AlexNetは11x11のフィルターを使っているが、VGGは3x3のフィルターを使っている。フィルターサイズによって受容野(receptive field)が異なるが、3x3のフィルターを5回連続して使えば、11x11のフィルターと同等の受容野になる。なおかつ、3x3を5回使う方が、トータルパラメータ数が減少し、非線形活性化関数を使う回数が増えて、より複雑な処理ができる。

・感想:これを知らずに、ファイルターサイズを大きくしたモデルで計算していたことが、馬鹿みたいに思えてきた。

・VGGの開発者らは、data augmentationを使っていた。しかも、テストデータにも使い、予測結果の平均値を採用したとのこと。AlexNetの著者らも実施していたらしい。

・テキストの著者らは、AlexNetとVGGが最後の方で何層かの全結合層を使っているのに対して、全て畳み込み層(fully convolutional network : FCN)とし、オリジナルとFCNの両方の予測結果を平均して予測するというmodel averagingを試みたとのこと。

・複数のDNNを用いて予測値を評価する使う方法は、Kaggleのトップレベルの人たちが使っているようだ。

 

*GoogLeNet:inception moduleの採用が最大の特徴で、パラメータの数は少なく、情報量は多く、ということを実現している。

・1x1の畳み込み。どう理解すればよいのか。理論より結果かな。

・最後の畳み込みブロックの後に、平均プーリング層を使って、情報量を大きく削減し、代わりに計算速度を大きく向上。

・非常に極端な条件が用いられているように見えるが、いまだ、正解のない世界なのかもしれない。

・Inception moduleのコーディング:TensorFlow and Kerasのfunctional APIを用いてコーディングした例が掲載されている。

・部分的なコーディング例は掲載されているが、それは、基礎を理解しましょうということであって、使いたいときは、自分で組み上げるのではなく、TensorFlow HubとかGitHubなどで公開されているコードをダウンロードして、上手に使いましょう、というのがこのテキストの著者らのスタンスであり、車輪の再発明は不要、ということである。

・Kaggleコンペのスタンスは、トップコーダーたちには、本物の発明を期待し、発展途上の人たちには、公開されているコードを上手に使いましょう、ということかな。

 

*2012年のILSVRCでAlexNetが1位、2014年はVGGNetが2位でGoogLeNetが1位、では、2013年はというと、ZFNetが優勝したとのことであるが、革新的なところがなく、当事者以外に理解できる者がおらず、その後再利用されることはなかったということのようである。

 

*ResNet(2015年の1位)画像認識のエラー率がヒトの5.1%を上回る3.6%を達成:Microsoftの研究者(Kaiming He et al.,)により開発された。

・Inceptionのような構造をもっているが、4列ではなく2列で、concatenationではなくadditionで結合している。

・テキストの著者は、ResNetはiterative improvementによってつくられてきたと記している。どういう意味かと思い、開発者の論文をみると、1つ1つパーツを取り換え、組み合わせ、種々の条件を変更しながら、逐一、収束状況を観察し、新たな組み合わせを探索しているように記述されている。読者に理解しやすいようにそうしているのかもしれないが、先行する理論があるわけでも、原理があるわけでもなく、先人たちの創意工夫の結果があるだけである。パラメータの数が非常に多いので、計算環境も必要である。もちろん、単なるトライアンドエラーではないだろう。

・基本的なモデルの解説とコードの利用のしかたはここまでであるがvisual recognitionの進展速度は速く、様々なモデルがすでにたくさん開発されているので、最新の情報をチェックしなさいと記述し、最後に、車輪の再発明をするな、でしめくくっている。 

 

*次に、転移学習の説明がある。

・Leveraging transfer learning

・テキストの著者らは、このtransfer learningを、知識の伝承ととらえ、何千年にもわたって受け継がれてきた知識や、専門家による知識の蓄積と教育など、転移学習を、知識の移転として広くとらえ、これがヒトの知能の源泉であると捉えているようにみえる。

・ヒトの知能、知識は、基礎的なものから応用的なものまで多岐にわたるがゆえに、分野が違っていても、つぶしがきく、すなわち知識の活用範囲が広いのだが、CNNの場合には、用途別に分かれていて、転移学習にはそのあたりの考慮が必要である。

 

・転移学習の場合、MNISTで学習したモデルをImageNetの画像分類に適用するとか、スマホの画像分類のモデルを高精細画像の分類に適用するには、何らかの変換作業が必要になるだろう。

・taskによっても違う。ImageNetの画像を入力しても、分類と検出は別物である。

・画像処理であれば、データが少なくてどうしようもなければ、ImageNetやCOCOの学習済みモデルを試すのも良いかもしれない。

・学習したパラメータを類似のモデルに移転できると書かれているが・・・。

・taskが違う場合には、fine tuningがある。学習済みモデルとのtaskの違いの程度に応じて、追加学習する層を新たに設けたり、既存の層の一部を学習可能にしたり、場合によっては大部分の層を、小さめの学習率で学習させたり、種々の使い方がある。

・どの層を固定し、どの層を学習可能にするか。

・公開されているビッグデータがあれば、ビッグデータで学習させた後に、少し異なるtaskの小さいデータベースでファインチューニングするのもよい。

・似てないtaskの場合でも、同じ画像認識であれば、ランダムな初期値から学習させるよりも、学習済みのモデルの重みから学習を開始したほうが良い結果が得られるということが経験的に知られているようだ。

・ただし、同じ2次元画像でも、画像認識と音声認識では、違いすぎるので、要注意。

・似てないtaskで、かつ、学習データが少ない場合、入り口に近い層の抽象的な特徴量を保持して、出口に近いいくつかのCNN層を学習可能にして学習させることで、良好な結果が得られることがある。

 ・テキストでは、この後、TensorFlowとKerasで、層を除去したり、挿入したり、入れ替えたり、重みを固定したり、特定の層を学習可能にするためのコードが紹介されている。

 

*もうそろそろ、deepfake detection challengeのコンペに戻らないと、とは思うのだが、このテキストを読んでいると知らないことが多すぎるということと、実務的で役に立ちそうなので、もう少し勉強を続けよう。

・2/28追記:基礎から応用まで幅広く取り上げられているので、全部読んでしまおう!

 

Chapter 5  Object Detection Models

・Precision and recall, Precision-recall curve, Average precision and mean average precision, Average precision threshold, など、モデルのパフォーマンスを測る方法が説明されているが、すっと頭にはいってこない。ディープラーニングのG検定でも勉強したけど・・・。慣れないとな。

・how to measureは非常に重要で、損失関数の設計にもかかわってくる。モデルの予測性能を高めるためには、これを頭に叩き込んでおかないとダメだな。

 

*YOLO:2015年に世に出て、2016年にYOLO9000、2018年にYOLOv3となった。高速だが、accuracyでは、Faster R-CNNが優るとのこと。

・画面を等分割しているgrid cellsと検出した物体を囲むbounding boxの区別が重要。

・例示されている画像は、5x5のグリッドと2つのバウンディングボックスだが、グリッドとボックスが多重になっている。

・複数の物体が同一グリッド内に存在したり、1つの物体が複数のグリッドにまたがって存在する場合など、どのように記述し、trainのためのlossをどう計算するのだろうか。

・InferenceとTrainingに分けて説明。

・Backbone CNNで特徴抽出、anchor boxesを使う、分類でなく、回帰問題である。

・16ページくらいあって、容易に理解できるものではなく、ポイントを押さえようとしてもコピペ翻訳になるだけだし、誤解した内容になってもいけないので、YOROに関するメモはここまで。

 

*Faster RCNN:YOLOと同様に、この節は、さっと読んで、論文から深く学び理解するよう勧めている。そのために、記号等は論文に倣っている、とのこと。

・ベースは、R-CNNとFast R-CNN。

・2つのステージ、領域の抽出(約2000か所)と分類・検出に分かれている。

・R-CNNとFast R-CNNで使われていた領域抽出法selective searchは、Faster R-CNNでは使われておらず、ディープラーニングの技術ではないので説明しないとのこと。

・anchor boxes, backbone, grid, bounding box fittingなど、YOLOと同様の技術要素を使っている。ゆえにYOLOを学んだ後では、非常に理解しやすく感じる。

・一通り目を通したので、この章のプログラムを確認したところ、Faster R-CNNはなく、YOLOだけであった。YOLOは著者らによって運営されているサイトがあるので、それを利用するようになっている。

・とりあえず、テキスト読みを続ける。

 

*Chapter 6  Enhancing and Segmenting Images

・第6章は、画像分類・検出を、ピクセル単位で行えるようにするための手法を扱う。

・自動運転のための物体識別の例が最後に紹介されている。

・キーワードはエンコーダ・デコーダである。

ピクセル単位で正確に識別された画像にするためには、様々な後処理手法が用いられ、中にはディープラーニングとは無関係に見えるものもある。

 

私見

・きれいに色分けされた画像とその説明文から、そこで使われている手法を安易に評価してはいけない。そんなことできるわけない、との直感や第一印象は大切で、仕掛けを詳細に見ていくと、答え合わせをしているだけで、技術とは呼べないような処理が施されていることがある。

・画像分類のように、かなり確立されたように思われている技術でも、正確さを上げるための種々のテクニックが使われている。(良くも悪くも)

・書籍を読み、論文を読み、プログラムを作り・動かし・修正し、様々な経験を積み上げることによって、評価能力、プログラム作成能力を向上させよう。

ディープラーニングの場合には、計算資源をどこに求めるかも重要であり、日々、状況は変化しているので、柔軟に対応し、誰でも使える技術にする技術を身に着けよう。

 

*Transforming images with encoders-decodders

・エンコーダ・デコーダでイメージを変換することによって、ピクセル集合体レベルの識別から、ピクセルレベル、ピクセル単位、1ピクセル毎の識別が可能になる。

・CNNによるイメージ処理において、パラダイム転換が起きるのである。

・そのパラダイム転換において、エンコード・デコードはどういう役割を果たすのか、そもそもCNNとエンコード・デコードとの間にはどのような関係があるのか(私見)。

・Encoding and decording

・エンコーダで検索しても何もわからない。ウイキペディアも役に立たない。

・オートエンコーダで検索して、やっと、謎が解けた。

オートエンコーダ(自己符号化器、autoencoder)とは、機械学習において、ニューラルネットワークを使用した次元圧縮のためのアルゴリズム2006年ジェフリー・ヒントンらが提案した[1]。(ウイキペディア)

・元の論文:Reducing the Dimensionality of Data with Neural Networks, G. E. Hinton and R. R. Salakhutdinov, Science, 313 (2006) 504

・Hinton先生は、顔認証用のデータセットを使ってこのオートエンコーダの性能を調べているのだが、augmentationから、train、validation、testへの割り振りまで、筋が通っている。(このような表現は大先生に対して、失礼にあたるかもしれません)

・fake detectionの場合、fake画像にはorijinal画像があり、動画をtrain,validation,testに分ける際に、orijinal画像は重複しないようにこの3種類に振り分け、fake画像も、orijinal画像と同じところに振り分けなければならない。orijinal画像はfake画像よりかなり少ないようだから、fake画像と同レベルまで枚数を増やすことが必要になる。

・もし、意図的に、orijinal画像とfake画像が同じところに入らないようにしたら、originalとfakeの分類ではなく、加工ありと加工無しの分類となる?。

・Hinton先生は、MNISTのデータにも同様のモデル(エンコーダのみ)を適用し、良好な結果(エラー率1.2%)を得ているが、そのモデルが、784-500-500-2000-10となっている。2000の位置に興味が湧いた。

 

*Fully convolutional networks(FCN)

・典型的なCNNであるVGG16は、5つのconvolutional blocksを有しており、これらは、feature extraction機能、すなわちエンコーダとして機能している。

・この5つのブロックの後ろのイメージ分類のための全結合層を除去して畳み込み層を付けると、エンコーダ・デコーダとして機能するFCNが出来上がる。

・ただし、入力画像のサイズに戻すには、ストライドsが32となり、荒い画像しか得られない(FCN-32s)。

・そこで、4ブロック目のプーリング層の後ろに変換用の畳み込み層を付けて解像度を上げ(FCN-16s)、さらには3ブロック目のプーリング層の後ろに変換用の畳み込み層を付けることも同時に提案された(FCN-8s)。

・FCN-8sは現在でも使われているが、他のCNNモデルへも展開され、なかでも、U-Netがもっともポピュラーなものになっている。

 

*U-Net

・その名の通り、U字型に組まれている。

・5ブロック目からtransposeを繰り返すことによる画像の劣化を防ぐために、対応するエンコード側のブロックとconcatenationによりスキップコネクションしている。

・最初に提案されたU-NetはVGGに似ていたが、ResNet構造をベースにしたり更に層を増やしたものなどがある。

 

*Understanding semantic segmentation

・入力イメージのピクセル毎にラベルを付ける。

・trainにおいて適切に収束させるためには、適切な損失が必要である。

・デフォルトでは、trainモデルが疎な分類でも密な分類でも、cross-entropy損失が使われるが、密な分類では、注意が必要である。

・イメージレベルの分類でもピクセルレベルの分類でも、データセット中のクラスの出現頻度のバランスが重要である。

ピクセルレベルの出現頻度のアンバランスについては、画像の枚数のコントロールでは対応できず、クラス毎のロスの調整、出現頻度が少ない物体やサイズが小さい物体のロスに大きな重みを課す、というような操作が必要である。

・さらに、ピクセルレベルでの、他の物体との位置関係も考慮する必要がある。

・クロスエントロピー微分可能で、良く用いられるが、semantic segmentationでは、目的に応じていくつか提案されている中から適切なものを選択する。

・DiceとIoUは重要で、TensorFlowによるDice lossの計算コードが例示されている。

・輪郭が正しくないとか、小さな誤評価領域が残るのはよくあることで、そのような場合の処置方法として、conditional random fields (CFRs)がある。

・このCRFsが使えるサイトが紹介されている。

 

*Advanced example - image segmentation for self-driving cars

・テキストでは、Cityscapes datasetが紹介されている。

・このデータベースを使って、FCNとU-Netを動かせるjupyter note bookが用意されている。

・From object segmentation to instance segmentation

・ノウハウの類で、理解も説明も難しい。

・From object detection to instance segmentation - Mask R-CNN

・今の段階では、特にメモすることはない。

 

*このままテキストについての学習を続ける。

・fake detectionコンペはあと31日で終了する。学習中も、このコンペのことを考えている。500GBのtrainデータをどう扱うか、どのモデルを使うか、公開されているモデルの使い方をこのテキストからの情報と付属のnotebookの中の情報を使って学べると思っている。Kaggle kernelのGPUやTPUも活用していく。

 

*Chapter 7  Training on Complex and Scarce Dataset

・データセットディープラーニングの生命線である。

・目的に応じた適切なデータセットとモデルを準備し、データをモデルにスムーズに投入することが必要である。

・これを妨げるデータセット側の問題として、次のようなものがある。

1.データセットの構造が複雑である。

2.データセットが様々な媒体に保存されている。

3.データセットのモデルへの投入プロセスが複雑である。

4.データセットの数が少ない。

・1から3については、スキルアップ、ここでは tf.data の習熟。

・4については、data augmentationとdata generationで、後者の方法としてVAEsやGANsが取り上げられている。

・ここで、テキストの第1章から3章で解説されている、ディープラーニングの基礎とTensorFlow2の基礎に戻りたいところだが、そこは、適宜参照しながらということで、本節を読み進める。

・ 良く定義された入力パイプラインを効果的に動作させるには、トレーニングデータの適切な前処理が必要である。

ニューラルネットワークは、データハングリーである。

・トレーニングに用いる良質なデータの量が多ければ多いほど、より正しい予測ができて、より頑健なニューラルネットワークができあがる。

・ゆえに、トレーニングには、何時間も、ときには何日もかかる。

GPUやTPUにより演算速度は飛躍的に向上しているが、問題もある。

・トレーニングデータがテンソル変換された後の演算速度は向上しても、データベースの読み込みや前処理など大容量のデータを処理する時間の短縮が課題となっている。

・tf.data APIの説明:ここから、TF2の世界が始まる。TF2をインストールして使ってみたいのだが、数か月前、TF2をインストールしたら、TF1.4のコードがエラーになったので、躊躇してしまう。

・そのときは、別環境を作ろうと、環境設定方法を調べていたのだが、実行できないままになっていた。

 

*先に進むには、TF2をインストールするしかないので、やってみることにする。

・クローン環境を作成し、クローン環境に、pipで、TF2をインストールした。

・どうやったかを示しますが、これは個人のメモであって、動作保証はできません。実際、自分の場合も、理解できないトラブルが発生している。

  conda create -n your-env-name --clone base:your-env-nameに適当な名前を入れる。

  conda activate your-env-name:新しい環境をアクティベートする。

  conda list -n your-env-name:新しい環境ができていることを確認する。

  conda create tf2-gpu:これでインストールできたが、動作保証なし!!!

・クローン環境でjupyter notebookを立ち上げ、TF1.4のstyle transferを走らせてみたがやはり、エラーが出た。ここまでは想定通り。

・次に、クローンサイトをdeactivateし、TF1.4をインストールしている元のAnaconda3環境で立ち上げたjupyter notebook上で、TF1.4のソフトを走らせた。当然、TF2に由来するエラーは生じなかったが、なぜか、scipy.misc.imsave、に関するエラーが発生した。scipyのバージョンの違いが原因のようだ。

・こうやって、次から次へと問題が生じて、止まってしまう。

・クローン環境の作成ができるようになったのは大きな進歩だが、エラーが・・・。

 

*とりあえず、次に進もう。

*Efficient data serving:well-defined input pipelines

*Inspirations from lazy structures

・数年前からビッグデータが増えてきて、その処理に関する文献、フレームワーク、ベストプラクティスの提案などが次々と現れ、膨大なデータをあらゆる種類の問題に対応できるように処理したり提供できるようにする新しい解決法が提案されてきた。

・tf.data APIは、ニューラルネットワークビッグデータを供給するための明快で効率のようフレームワークを提供するものである。

*Structure of TensorFlow data pipelines

*Extract, Transform, Load (ETL process)

・データサイエンス系の経験がないので、要するに、ここでいうところの、Extractが弱いのだと、はっきり、自覚した。

・Extraction:データのファイル名とラベルはCSVファイルで提供されることが多い。ファイル形式が多少違っていても、pandasで読める。CSVファイルに画像のファイル名とラベルが入っているので、その扱いに慣れることが自分には最優先課題となっている。データセットが大きくて、何回かに分けてダウンロードすることになる場合の処理手順をきちんと知っておきたい。(3/3追記:tf.dataを読み進むと、tf.dataで大抵のことはできるようになっていて、tf.dataを習得すれば、ETL pipline作成には、pandasは不要かなと思ってしまう。)

・Transform:イメージファイルのテンソル変換と、データ量が少ないときの増量data augmentationが話題。ここで、単純な拡大縮小ではなく、特定の物体を検出して適度な大きさに変更する方法もきちんと知っておきたい。

・Loading:元データが非常に大きくて、画像データを一度に送り込めない場合の対処方法を知っておきたい。

・データセットは、目的があってつくられている。それゆえ、データ構造もデータフォーマットも全て違っていて当然であるということを前提に、TensorFlowの開発者は種々のツールを開発した、とのことである。

*Parsing images and lables:イメージとラベルの解析、ということだろうか。解析というのは、前処理、くらいの意味か。イメージを読み込んで、テンソルに変換して、リサイズする、というような作業のことらしい。

・和訳するのがいやになってきた。が、ボケ防止にはなっているかもしれない。

 

<つぶやき>

・当然のことだが、英語のテキストでは、説明文の中にプログラミング用語が溶け込んでいる。

・例えばこんな感じだ:In the parse_fn() method we wrote in the previous subsection for dataset.map(), tf.io.read_file() was called to read the file corresponding to each filename listed by the dataset, and then tf.io.decord.png() converted the bytes into an image tensor

・こんなの、和訳しても理解が進むわけではない。むしろ訳さない方が、プログラム用語が頭に入りやすいし、記憶しやすいかもしれない。

・7章は、最後の1/3くらいで解説されているvariational autoencoders (VAEs)とgenerative adversarial networks (GANs)に期待するところが大きかったのだが、TensorFlowが前処理に力を入れていることがわかってきたのがよかった。

・Aurelien GeronのHands-On Machine Learning with Scikit-Learn, Keras & TensorFlowの2nd Editionも購入しているのだが、Updated for TensorFlow 2と明記されていて、章立てを見ても、初版の12. Distributing TensorFlow Across Devices and Serversが、第2版の12. Custom Models and Training with TensorFlowと13. Loading and Preprocessing Data with TensorFlowの2つの章になっている。この13章では、The Data APIとThe TFRecord Formatという項目が目立っている。

・昨年の夏ごろからKaggleに取り組んできて、もっともしんどいと感じたのが、まさに、この部分なので、自分のために用意してくれたものと思って、習得する。 

・Deepfake Detection Challengeの500GBの訓練データに、早く挑戦したいものだ。このデータベースは、どこに保存してあっても、3月31日を過ぎると、必ず消去しなければいけないものだと思うので、前処理方法を、もっと早く深く学んで使えるようにしないと、間に合わないし賞金も狙えない!

 

*Parsing TFRecord files:TFRecord filesは、GoogleのProtocol Buffersをベースにしたものとのこと。

Protocol Buffers (Protobuf) is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data.(From Wikipedia)

・イメージとラベルとメタデータをまとめてバイナリーファイルにすることによって、ディスクからの読み込み、前処理が高速化できる、らしい。

・TFRecordDatasetを作って、前処理するコード例(一部のみ)

dataset = tf.data.TFRecordDataset(['file1.tfrecords', 'file2.tfrecords'])

# Dictionary describing the features/tf.trainExample structure:

feat_dic = {'img' : tf.io.FixedLenFeature(・・・

                  'label' : tf.io.FixedLenFeature(・・・

def parse_fn(example_proto) :

      sample = tf.parse_single_example(example_proto, feat_dic)

      return tf.io.decode_image(・・・

dataset = dataset.map(parse_fn)

・TensorFlowのホームページでドキュメントを確認するようにと、記述されている。日本語表記があればそれが表示される。ちなみに、parsingは、パースする、と訳されているようだ。自然言語処理分野で構文解析を意味する用語のようだが、"Parsing images and lables"のように使われるときには、パースする、でいいのかもしれない。

・TFRecordの使い方は、テキスト著者が用意しているjupyter notebookにより、具体的な事例を用いて、より詳しく説明されている。

・上記の、一部だけ表示したコードではわからないが、TFRecord fileは、どこからどのデータをどのような手順でどのような構造で格納するのか、データの置かれた状況とデータの使用目的に応じた前処理が必要である。ファイルのある場所を指定したら何でもやってくれるわけではない。そうして適切に準備されたデータが、バイナリ変換されてTFRecord fileとなる。それをデータ源として、tf.dataパイプラインを構築する。と書いてもよくわからないから、あとで、用意されたjupyter notebookを見てみよう。

 

*Editing samples

・.map( ):tf.dataパイプラインで中心的な役割を果たす。少し見返してみると、コード例の最終行に多く使われている。しかも、.map(parse_fn)が多い。

*Structuring dataset

・.batch( batch_size, ...)

・.repeat( )

・.shuffle(buffer_size, seed, ...)

・.filter(predicate)

・.take(count)

・.skip(count)

 

*Merging dataset

・.concatenate(dataset)

・.zip(datasets)

・.interleave(map_func, cycle_length, block_length, ...)

・cycle_length

・block_length

 

*Why augment datasets?

・データセットの数が少ないと、overfittingになりやすい。

・データセットの数が十分であっても、ライティングとかノイズが特定の物体の画像に偏っていると、NNは、物体固有の特徴ではなく、明るさやノイズの量で学習してしまうことがある。例えばペンとブラシで、ブラシの画像の方が暗くてノイズが多いと、このデータセットで学習したNNは、暗くてノイズが多いと、ペンの画像をブラシと判定する確率が高くなる。

・このような場合には、ランダムにノイズを付加したり、ランダムに明るさを変更することで、正しく判定できるようになる。これも、augmentationの1種である。バイアス条件に対するoverfittingであるといえる。

・さらに、ペンとブラシの画像のすべてが同じ照明で、画質も揃っていると、このようなデータセットで学習させたNNは、明るさやノイズレベルが物体とは無関係であることを学んでいないので、明るさやノイズレベルの異なる画像を識別する場合に、精度が悪くなる可能性がある。

・こういう場合にも、augmentationをうまく適用した画像でNNを学習させることが重要であろう。

*そういえば、Kaggleの眼底写真の画像認識のとき、train画像に前処理をして評価精度が上がってもtest画像にも同じ前処理をしないとダメなのだが、前処理方法で大いに悩んだことを思い出した。クラス毎のデータ量の違いの大きさと、全体のデータ量の少なさも問題だった。あのときは、transfer learningもfine tuningも使いこなせていなかったように思う。

 

*Augmenting images with TensorFlow:How:TensorFlowによるコーディング

・数多くの手段が存在している。

OpenCV

Python Imaging Library

・imgaug by Alexander Jung

・Augmentor by Marcus D. Bloice

・Keras:ImageDataGenerator

・PyTorch:torchvision.transforms

・fastai:vision.transform

・TensorFlow:tf.image

    tf.image.central_crop(), tf.image.flip_left_right(), tf.image.adjust_jpeg_quality()

    tf.image.random_crop(), tf.image.random_flip_left_right, tf.image.random_jpeg_quality()

 

*Example - augmentation images for our autonomous driving application

・picture (img)とそのground truth lable maps (gt_img)をconcatenateし、まとめて画像変換するという方法

    stacked_imgs = tf.concat([img, tf.cast(gt_img, img.dtype)], -1)

    stacked_imgs = tf.image.random_flip_left_right(stacked_imgs)

・random croppingの例

    rand_factor = tf.random.uniform([ ], minval=0.8, maxval=1.)

    crop_shape = tf.cast(tf.cast(img_dim, tf.float32) * rand_factor, tf.int32)

    crop_shape = tf.concat([crop_shape, tf.shape(stacked_imgs)[-1]], axis=0)

    stacked_image.random_crop(stacked_imgs, crop_shape)

・imgとgt_img(ground truth lable maps)とではデータ構造が違うので、要注意。

 

*Rendering synthetic datasets

・CityscapeのCG版のようなものとして、SYNTHIA、Grand Theft Auto V (GTA 5)というのがあるそうだ。トレーニングデータをCGで作ろうということ。

*Generating systhetic images from 3D models

・いくつかのツールが紹介されている。

・PyOpenGL

・vispy:VisPy is a Python library for interactive scientific visualization that is designed to be fast, scalable, and easy to use.

BlenderOpen source 3D creation. Free to use for any purpose, forever.

・BlenSor

・HOME-Platform

フリーソフトだということだけで、Blenderをダウンロードし、インストールしてみた。get startedのビデオを少し見たが、簡単には使えそうにない。しかし、プロが使うレベルのソフトのようだ。本題とは関係ないが、物理シミュレーションのようなこともできるようで、使ってみようかなと思う。

 

*Leveraging domain adaptation and generative models (VAEs and GANs)

・leverage:to use something that you already have in order to achieve something new or better

・domain : an area of interest or an area over which a person has control

・adaptation : the process of changing to suit different conditions

・監視カメラの画像に例えた説明:監視カメラは、それぞれが固定した場所に設置されている。そのため、監視カメラAの画像で訓練したモデルは、監視カメラBの画像の分類の正確さが低くなることがある。その原因の1つに、設置場所により背景が固定されてしまうことがあげられる。

・データの持つドメインの違いが、訓練や予測に及ぼす影響を、どうすれば、小さくできるか、無くすことができるか。

 

<思うに>

・ヒトの識別能力を上回ったとかいってはしゃいでいるのはおかしいと思うようになってきたし、NNの汎化性能にも疑いの目を持つようになってきた。

・ヒトは、確率で判定しているのではない。分類の判定は、確からしさや不確かさで判定するというのは、NNモデルもヒトも同じである。

・ヒトが、100%の確からしさで判定できる場合に、NNは、確からしさとしてどのような値を出力しているのだろうか。

・ImageNetの分類において、ヒトのエラーを5.1%だとして、ResNetのtop-5エラーが3.6 %であったことをもって、ヒトを超えたと称賛した。

・そのような比較の仕方で良いのだろうか。

・ヒトは何をどう間違えて、ResNetは何をどう間違えたのか。

・更に気になるのは、ResNetのラベルの推定の方式はどうなっているのか。

・憶測にすぎないが、ヒトはおそらくラベルの判定は100%自信があるか、迷うかのどちらかだと思うが、ResNetの判定は、最終的に正解していても確率としての数値は、かなり低いものがある程度含まれているのではないだろうか。

・眼底写真による病気の進行度の判定コンペについては、大きな疑問がある。

・我々が必要としているのは、正しい判定基準で判定したものかどうかであって、偶然、正答ラベルの確率が高かったというだけではだめである。

・どこに何がどれだけ存在しているかを基にラベルが付けられ、その情報をトレーニングデータとし、NNは、どこに何がどれだけ存在しているかを検知して、診断できるようにしなければならないのではなかろうか。

・医療診断NNは、100%正解、仮に間違っていたとしても、その判断の根拠が明確でなければならない。

・ 言うは易し、行うは難し。

 

*Supervised domain adaptation 

・教師データを用いて訓練する場合に、trainnデータとtestデータのドメインが違う場合に、どのような対応方法があるか。

 

*Unsupervised domain adaptation:教師データを用いない場合

・Deep Adaption Networks、Domain-Adversarial Neural Network

・何を分類しているのかの具体例、ドメインの具体的な内容などが記述されていないこともあって、議論が抽象的で、ついていけない。

・Domain randomization

・transfer learningが前提にあるようで、ドメインの違いが問題になる場合にはドメインの異なるデータと合わせるということかな。

・CGで作成したデータベースと、撮影した画像との違いが問題となる。augmentationは、通常、ドメインを変える効果はない。

 

<第7章のまとめと感想:VAEとGANを除く>

 

・第7章は、訓練データに関する様々な問題に対処するための指針を示したもので、TensorFlowのコードを示して具体的な対応方法も例示されている。

・訓練データのデータ構造が複雑な場合と、訓練データが少ない場合に分けて説明されている。

・訓練データのデータ構造が複雑な場合は、データ構造を詳細に調べ、整理し、1つ1つ対処していくしかない。そのときに使える道具についての知識は、事前に、ある程度は、持っていなければならない。そのために、用意されているnorebookを利用する。

・訓練データが少ない場合の対応方法は、データを増やすことで、そのためのいくつかの対応方法が示されている。

・TensorFlowによる増量手段は、非常に重要で、完全な訓練データは存在しない、という大前提のもとに、常に、適切に使う方法を考え、適用するべきである。

・訓練データの役割は、見たことがないテストデータ(標的データ、目的データ)に対しても、目的に適合した処理ができるように、モデルを作りこむことである。

 

・MNISTが、実用的には画像認識が成功した最初の例なのだろう。好意的なヒトは、汎化性能が高いので、ヒトでも見分けにくい数字まで正しく分類できるという。各数字の特徴をうまく抽出して見分けているのだと。懐疑的なヒトは、膨大な数の事例から、入力画像と同一の画像を探しているだけで、同じ画像が無い場合には間違うだろうという。2次元画像をCNNで分類する場合、1次元ベクトルをNNで分類する場合、SVMやGBなどの機械学習で分類する場合に分けたら、評価は変わってくるだろうか。機械学習の例では、同じものを探しているのではないことを、適切な作図データで示せる。CNNとNNによる分類についても、なんちゃら空間の中で、どの数字に近いかを探索しているだということはできる。ベクトル同士、テンソル同士、直接比較しているのでないことは明らかだが、どう理解すればよいのかは説明しにくい。SVMやGBでも、なぜと聞かれたら合理的な説明は難しそうである。この場合は、訓練データとテストデータ(実データ)のドメインは完全に一致するのだから、ここで深堀してもたいして役に立たないかな。

・第7章を読んでいると、NNの難しさ、問題点が次から次へとあげられていて、その解決方法を説明されているのだが、全ては膨大なデータに対する条件付き確率の世界であり、因果関係を把握するのは容易でない。したがって、訓練データとテストデータを、少なくとも数十枚くらいは実際に確認して、特徴量を探索したり、機械学習で分類したりすることで、ドメインの違いを把握することが必要となる。このような作業を通して、テストデータに対するタスクの内容に合致した訓練データなのかどうか、natural intelligenceで確かめるしかない。

・domain adaptionは、transfer learningに関する説明でも議論されている。どのデータベースを使って訓練されたのかによって、効果が違ってくるので、訓練データとテストデータの違いを把握したうえで、モデル、訓練データベース、パラメータの凍結層、学習率、層の入れ替えなどを選定するのだが、目的やドメインの違いは多岐にわたり程度の差など測りかねるので、結局のところ、1つ1つ確かめる作業が待っている。

・transfer learningに関する図書:Hands-On Transfer Learning with Python: Implement advanced deep learning and neural network models using TensorFlow and Keras (2018/8/31)  D. Sarkar, R. Bali and T. Ghosh:TF2じゃないから迷うな。

 

*Generating larger or more realistic datasets with VAEs and GANs

・Discriminative versus generative models

・discriminative:膨大な量の入力データxとラベルyによってNNの膨大な量のパラメータWの値が適切に調整される。その結果、x'を入力すると、正しいラベルy'を予測(識別:discriminate)できるようになる。

・generative :(テキストの説明とは違うかもしれない):discrimitiveと同じように訓練したNNを用いる。あるラベルy'(ネコ)に関係した特徴量を抽出する。抽出した特徴量から像x'(ネコ)を形成する。得られた像x'(ネコ)は、ラベルy'(ネコ)に属するが、訓練に用いたどのネコの画像とも異なる新たなネコの画像が得られる。

・VAEs:variational auto encoders

・オートエンコーダ(AE)は、エンコードにより凝縮された潜在空間から手を加えずにデコードするのに比し、VAEでは、エンコーダにより平均ベクトルと分散ベクトルの2つを形成し、標準偏差ベクトルとガウシアンノイズの積と平均ベクトルの和をデコードしたものである。

・GANs:2014年にIan Goodfellow氏によって提案された。

・画像生成ネットワークと識別ネットワークからなり、生成と識別を繰り返すことによって、よりリアルな画像を生成できるネットワーク。

・fake画像を生成して、realかfakeかを識別させ、その判定結果のフィードバックを利用して、よりrealな画像を生成する。deep fake detectionのfake画像の作成技術として重要な役割を果たしているのだろうと思う。

 

*Augmenting datasets with conditional GANs

・pix2pix

・CycleGAN

・PixeiDA : can be used as a domain adaptation method, to map training images from the source domain to the target domain.

・ GAN-generated portraits are already being exibited in many art galleries.

・ふむふむ、このあたりは、まったくフォローできていなかった。

・と言いながら、目の前にこんな本がある。Generative Deep Learning : Teaching Machines to Paint, Write, Compose and Play, David Foster, O7REILLY 2019

1. Generative Modeling

2. Deep Learning

3. Variational Autoencoders

4. Generative Adversarial Networks

5. Paint

6. Write

7. Compose

8. Play

9. The Feature of Generative Modeling

 

*第9章 Optimizing Models and Deploying on Mobile Devices

・実際に使えるプログラムにするために克服すべき制約・課題に対する解決手段を知ることが重要:トピックスは以下のようになっている。

・How to reduce model size and boost speed without impacting accuracy

・Analyzing model computational performance in depth

・Running models on mobile phones (iOS and Android)

・Introducing TensorFlow.js to run models in the browser

*Technical requirement

・モバイルフォンでは、

・Swift for iOS, Java for Android, JavaScript for computer vision in the browser

*Optimizing computational and disk footprints

・モデルは小さく、推論速度は速く、予測精度は高く、搭載メモリー量は少なく

*Measuring inference speed

・推論速度を上げるには、推論速度を測定する道具が必要。

・推論速度を測る場合、リアルタイム用途とオフライン用途では、データの流し方が異なる。シリアルとパラレルの使い分け。待機時間の有無と計測方法。プロセス毎に計測することの必要性。

・自動運転:画像取得から機器制御までの時間が重要:イメージ入力から推論結果の出力まで:最高性能を保持したまま速度を上げる:モデルの最適化:推論モデルの並列化:推論モデルの高速化

*Measuring latency

・プログラムの立ち上げから推論結果の出力までの間に、待機時間が生じるので、画像1枚当たりの処理時間を正確に計測するのは種々の注意が必要。

・ソフトの立ち上げ、GPUやその制御ソフトの立ち上げなど。

・計測目的によって、計測手順を変えることが重要。

・データロード、データ前処理、データ後処理等は、処理時間に占める割合が多いので、それら自体の高速化手段を考えることが重要である。

*Using tracing tools to understand computational performance

・jupyter notebookを使ってDNNを動かすときに、途中でKernelがダウンすることがあった。それ以外にも、GPUのメモリー不足とか、何かのオーバーフローで、プログラムが停止することは多い。

・タスクマネージャーによって、全体的なパフォーマンスは追えるが、エラーになった時にどう対処したらよいかはわかりにくい。

・TensorFlowを使う場合には、trace toolがある。

・これを使いこなすには、第7章のTraining on Complex and Scarce Datasetの前半の前処理のプロセスとそのTensorFlowによるコーディングに習熟することが必要である。

・コーディング例

    logdir = './logs/model'

    writer = tf.summary.create_file_writer(logdir)

    tf.summary.traceeeee_on(profile=True)

    model/predict(train_images)

    with writer.as_default():

        tf.summary.trace_export('trace_model', profile_outdir=logdir)

・まあ、こんな感じらしい。

。このツールをうまく使えば、レイヤー毎の所要時間とか、モデルの変更による所要時間の変化とか、・・・。

・モデルのパフォーマンスの評価に役に立ちそうだ。

*Improving model inference speed

*Optimizing for hardware

Google's TPU (for servers), Apple's Neural Engine (on mobile), NVIDIA Jetson (for portable hardware)など。

*Optimizing on CPUs

・行列演算をスピードアップする方法がある:Math Kernel Library for Deep Neural Networks (MKL-DNN)

*Optimizing on GPUs

・CUDAとcuDNN:tensorflow-gpuのインストールと、CUDAバージョンのマッチング

GPUにおけるFloating Point 16 (FP16)の使用:GPUが対応しているか否か、要確認。

*Optimizing on specialized hardware

・ハードとソフトのマッチングが重要。

*Optimizing input

・画像サイズと予測精度はトレードオフの関係にあるので目的に応じて設定する。

*Optimizing post-processing

・後処理はCPUを使うことが多いので、要注意。Non-Maximum Supression (NMS)は正しく使わないと長時間かかる。

*When the model is still too slow

*Interpolating and tracking

・ビデオの全フレームにおいて物体検出するのは、現実的ではなく、通常は、毎秒数フレーム程度づつ使うのだが、それでもコンピュータへの負荷は大きい。

・リアルタイム処理では、それもできないことがある。

・object tracking:背景との識別性と形状保持の程度に依存するが、多くの目的に有効なアルゴリズムがある。OpenCVも選択肢の1つ。

*Model distillation

・大きなモデルが使えない場合の最後の手段:小さなモデルでは、例えばイヌの種類を見分けるのが難しいときにどうするかという例。大きなモデルでも、出力される確率が大きくない場合は、小さいモデルで訓練する際に、元のラベルを使わずに、大きなモデルで出力された確率分布をラベルにする、という方法である。例えばA,B,Cを分類する場合、元のラベルA[1, 0, 0,], B[0, 1, 0], C[0, 0, 1]ではなく、大きなモデルの出力値A[0.9, 0.7, 0.1,], B[0.7, 0.9, 0.1], C[0.2, 0.1, 0.9]をつかうというものである。

・この手法はknowledge distillationと呼ばれているとのこと。

*Reducing model size

・ブラウザやモバイルでは、小さなモデルしか使えない。

*Quantization

・パラメータを32-bit floatsから、16-あるいは8-bit floatsに変更することで、パフォーマンスの低下を抑えながら、メモリー使用量を削減することが可能である。簡単にできて、効果は大きい。

*Channel pruning and weight sparsification

・convolution layerのチャンネル数の削減:16から512チャンネルまで使われているが、減らせるところはある。しかしトライアンドエラーで確かめるしかない。

・学習済みモデルのウェイトで、ゼロに近いものを省くという方法。

*On-device machine learning

ディープラーニングは、計算量が多いことから、それなりの計算環境が必要で、限られた機関でしかできなかった。その後、クラウドコンピューティングが普及し、GPUも個人で保有できるようになって、爆発的に普及してきたが、モバイルでは、学習済みのパラメータをネットから持ってきて、推論のみ行えるようになっている。

*Concideration of on-device machine learning

*Benefits of on-device ML

・Latency:自動運転への応用などでは、サーバーとのやりとりの時間が問題になる。途中で通信が途絶えることも考慮する必要がある。したがって、on-deviseでなければならない。

・Privacy:プライバシー保護の観点からも、on-deviseの方がよい。:ちょっと気になることが書かれている。iPhoneは、自分の写真が、分類できるようである。猫と入力すれば、自分の写真の中から、猫の写真を選んで表示してくれるのだろう。これをどうやって実現しているのか。夜間の充電時間に(そういえば、夜間に、朝まで充電します、と表示されるようになっている)各自のiPhonecomputer visionのモデルを動作させて物体検出をしてその情報を使える状態にしているとのことだ。

・Cost:サーバー提供側の視点では、サーバーに次々とデータを送り込まれたのでは、コストがかかるだけである。

・以上の3つの要素がon-devise MLのbenefitとなっているが、誰のベネフィットなのかよくわからない。

*Limitations of on-devise ML

・ここでは、on-device MLのレベルを、少し低めに抑えて説明している。

・つまり、ここまでの記述も、最新の高級モデルのことを指しているのではないということのようだ。モバイルフォンの機能は飛躍的に向上し、あっと驚くような機能をもったアプリが次々と登場しているようだ。車載も自動運転は高級車ならすぐにでも実現できるだろうし、ノートパソコンでもRTX2080Tiを搭載していれば、かなりのレベルの計算は可能になっている。

*Practical on-device computer vision

・On-devise computer vision particularities

・モデルは小さく、パラメータは少なく、ディスク容量は少なく、操作は簡単に、結果として消費電力も少なくする。

スマホで撮影した画像は、普通に撮影されたものとみなして、正しい配向の画像だけで訓練すれば良い。

*Generationg a SavedModel

・モバイルフォンの用途からして、訓練は不要で、学習済みモデルを使えるようにすればよい。TF2には、そのためのコードが用意されている。その1例は、

    tf.saved_model.save(model, export_dir='./saved_model')

*Generationg a frozen graph

・省略

*Impoetance of preprocessing

・データの表現様式の違いに注意して、適切に前処理すべきことが述べられている。

*Example app - recognizing facial expressions

・以下に項目のみ示す。

・Introducing MobileNet

・Deploying models on-devise

・Running in iOS devices using Core ML

・converting from TensorFlow or Keras

・Loading the model

・Using the model

・Running on Android using TensorFlow Lite

・Converting the model from TensorFlow or Keras

・Loading the model

・Using the model

・Running in the browser using TensorFlow.js

・Converting the model to the TensorFlow.js format

・Using the model

・Running on other devices

・Summary

 

*とりあえず、終了

 

f:id:AI_ML_DL:20200225150359p:plain

style=111 iteration=1

f:id:AI_ML_DL:20200225150450p:plain

style=111 iteration=20

f:id:AI_ML_DL:20200225150539p:plain

style=111 iteration=500

 

Deepfake Detection Challenge - 7

Deepfake Detection Challenge - 7

Identify videos with facial or voice manipulations

 

*今日は、400の動画から、各10枚の静止画像を抽出し、fakeファイルとtrueファイルに名前を付けて投げ込む。

・それがうまくいけば、次に、この2種類の画像をCNNで分類できるかどうか、試してみる。

・ここまでが第一ステップとなる。

 

*今日こそは、と、毎日やっているのだが、なかなか、うまくいかない。

・三日でやると宣言して、停滞中。

・ならば、三連休にやるぞ。

 

*三連休にかける。

 

 つづく

 

f:id:AI_ML_DL:20200221090107p:plain

style=110 iteration=1

f:id:AI_ML_DL:20200221090159p:plain

style=110 iteration=20

f:id:AI_ML_DL:20200221090247p:plain

style=110 iteration=500

 

Deepfake Detection Challenge - 6

Deepfake Detection Challenge - 6

Identify videos with facial or voice manipulations

 

*今日は、400の動画から、各10枚の静止画像を抽出し、fakeファイルとtrueファイルに名前を付けて投げ込む。

・それがうまくいけば、次に、この2種類の画像をCNNで分類できるかどうか、試してみる。

・ここまでが第一ステップとなる。

 

*trueの1つの動画から、trueの画像を30枚ごとに、10枚取り出す。

*fakeの1つの動画から、fakeの画像を30枚ごとに、10枚取り出す。

・note.nkmk.meの、「Python, OpenCVで動画ファイルからフレームを切り出して保存」を参考に、作業中である。

・サンプルコードはこんな感じである。(コピペ)

・難しいところは殆どなく、自分の目的に合わせやすそうである。

def save_frame_range(video_path, start_frame, stop_frame, step_frame,
                     dir_path, basename, ext='jpg'):
    cap = cv2.VideoCapture(video_path)

    if not cap.isOpened():
        return

    os.makedirs(dir_path, exist_ok=True)
    base_path = os.path.join(dir_path, basename)

    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

    for n in range(start_frame, stop_frame, step_frame):
        cap.set(cv2.CAP_PROP_POS_FRAMES, n)
        ret, frame = cap.read()
        if ret:
            cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)
        else:
            return

save_frame_range('data/temp/sample_video.mp4',
                 200, 300, 10,
                 'data/temp/result_range', 'sample_video_img')

 

 

<雑談>

・基礎を勉強するために、画像処理に関する本を発注した。

・Hands-On Computer Vision with TensorFlow2: Leverage deep learning to create powerful image processing with TensorFlow 2.0 and Keras, P. Benjamin and A. Eliot

・内容はこんな感じで、じっくりコーディングに取り組んで、基礎固めをしたいと思っている。著者紹介によれば、著者らは実戦的で、実務経験豊富でかつ先端技術開発者でもあるということで、レベルが高そうで不安だが、楽しみでもある。

・Create your own neural networks from scratch

・Classify images with modern architectures including Inception and ResNet

・Detect and segment objects in images with YOLO, Mask R-CNN, and U-Net

・Tackle problems in developing self-driving cars and facial emotion recognition systems

・Boost your application's performance with transfer learning, GANs, and domain adaptation

・Use recurrent neural networks for video analysis

・Optimize and deploy your networks on mobile devices and in the browser

 

<雑談>

ググることは、簡単に知らなかったことを知ることができて非常にありがたい。

・しかし、検索キーワードが適切でなかったり、内容が込み入っていたりして、適切なサイトが見つからず、行き詰ることも多々ある。

OpenCVは、自分にわかりやすいものを見つけられず困っていたが、少しわかりやすいものがあった。

・note.nkmk.meというサイトである。誰が運営しているのか不明であり、正確性等に関しても責任を負うものではないと明記されている。

・良いところは、デフォルトでの印刷サイズが適切で、印刷画面内での宣伝が、比較的少ないことである。

・サンプルコードは、GitHubで公開されている。

 

つづく

 

f:id:AI_ML_DL:20200219073839p:plain

style=109 iteration=1

f:id:AI_ML_DL:20200219073933p:plain

style=109 iteration=20

f:id:AI_ML_DL:20200219074020p:plain

style=109 iteration=500

 

Deepfake Detection Challenge - 5

Deepfake Detection Challenge - 5

Identify videos with facial or voice manipulations

 

*今日は、400の動画から、各10枚の静止画像を抽出し、fakeファイルとtrueファイルに名前を付けて投げ込む。

・それがうまくいけば、次に、この2種類の画像をCNNで分類できるかどうか、試してみる。

・ここまでが第一ステップとなる。

 

*さて、昨日は進捗がなかったので、今日もこのページでプログラム作成を続ける。

・お手本は、F. CholletさんのDeep Learning with Pythonの、5.2 Training a convnet from scratch on a small dataset

*Listing 5.4  Copying images to training, validation, and test direction

・最初に作業用のdirectoryを作る。(catとdogを、trueとfakeにする。)

・base_dir

・train_dir, validation_dir, test_dir

・train_true_dir, train_fake_dir

・validation_true_dir, validation_fake_dir

・test_true_dir, test_fake_dir(今回、testは使わない)

 

*次は、動画から、画像を抽出して、各ホルダーに格納する。

・400の動画からtrueとfakeを同数取り込む。trueは77だから、trueは全部取り込んで、fakeは77だけ、取り込むことにする。両方で154使うことになる。

・trainとvalidationの数は、validationを約2割として、それぞれ、62と15にしよう。

・各動画から10枚ずつ取り込めば、train画像は1240枚、validation画像は300枚になる。

 

*まずは手作業で!

・ うまくいかないな!

 

<雑談>

・コーディングが進まず、雑談など書いている場合ではないのだが・・・。

・Aurélien GéronさんのHands-On Machine Learning with Scikit-Learn & TensorFlowの第2版、今のコーディング力を補うために、購入することにした。よく見るとタイトルが少し変更されている。Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow(Kerasが追加されている)

・日本発のChainerが気になって、Google Scholarで検索したら、本家の方々による紹介記事があった。Chainer: A Deep Learning Framework for Accelerating the Research Cycle, S. Tokui et al., Preferred Networks, Inc., arXiv:1908.00213v1, 1 Aug 2019

・そういえば、半年くらい前に、Chainerのチュートリアルをコピーしたことがある。数学・統計等の基礎知識のパート以外は、Google Colabでjupyter notebook環境を使って学習できるようになっている。当時は気付かなかった。  

 

*予定の3日間が経ったが、だめだった。

*明日は、手作業でもなんでもよいので、小さなDNNで、trueとfakeの分類を学習させるところまでは、やっておきたい。

 

つづく 

 

f:id:AI_ML_DL:20200217080401p:plain

style=108 iteration=1

f:id:AI_ML_DL:20200217080500p:plain

style=108 iteration=20

f:id:AI_ML_DL:20200217080542p:plain

style=108 iteration=500

 

Deepfake Detection Challenge - 4

Deepfake Detection Challenge - 4

Identify videos with facial or voice manipulations

 

*本日の予定:ミニモデルを作り始めよう。

 

*スコアの計算ができるようにしよう。

・jupyter notebookを立ち上げて、計算式をつくる。

・自分で式をつくっていたが、scikit-learnにあった。

>>> from sklearn.metrics import log_loss
>>> y_true = [0, 0, 1, 1]
>>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]
>>> log_loss(y_true, y_pred)
0.1738...
sklearn.metricsには、Classificationだけでも、これだけある。

‘accuracy’

metrics.accuracy_score

 

‘balanced_accuracy’

metrics.balanced_accuracy_score

 

‘average_precision’

metrics.average_precision_score

 

‘neg_brier_score’

metrics.brier_score_loss

 

‘f1’

metrics.f1_score

for binary targets

‘f1_micro’

metrics.f1_score

micro-averaged

‘f1_macro’

metrics.f1_score

macro-averaged

‘f1_weighted’

metrics.f1_score

weighted average

‘f1_samples’

metrics.f1_score

by multilabel sample

‘neg_log_loss’

metrics.log_loss

requires predict_proba support

‘precision’ etc.

metrics.precision_score

suffixes apply as with ‘f1’

‘recall’ etc.

metrics.recall_score

suffixes apply as with ‘f1’

‘jaccard’ etc.

metrics.jaccard_score

suffixes apply as with ‘f1’

roc_auc’

metrics.roc_auc_score

 

roc_auc_ovr’

metrics.roc_auc_score

 

roc_auc_ovo’

metrics.roc_auc_score

 

roc_auc_ovr_weighted’

metrics.roc_auc_score

 

roc_auc_ovo_weighted’

metrics.roc_auc_score

・y_trueは、0か1であるが、y_predはどう表現するのか。

・結果は、log-lossの数値が小さいほど良い。

・log-lossは対数なので、予測結果を、真が偽かで、全て0か1にしてしまうと、それが間違っている場合には、かなり大きな値になってしまうようだ。

・evaluationの説明のところで、そのように書いているように思う。

・ここは、考えどころかもしれない。

 

*データベースの内容を確認する。

・小さいデータベースをダウンロードした。

・次に、大きな訓練用データベースの50分の1をダウンロードした。

・trainデータのfake, trueのテーブルを、pandasで確認した。

・横長で見づらかったので、transpose()で、縦に変換した。

 meta = pd.read_json(metadata).transpose()

 

*次は、動画(mp4)を読み込もう。(動画を扱うのは初めてなので手間取るかも)

・ 何を使えばいいのかな。

・やっぱり、cv2、かな。

・指定したファイルパスの動画の読込:cap_video = cv2.VideoCapture(path_video)

・動画の枚数:cap_video.get(cv2.CAP_PROP_FRAME_COUNT)

・動画のサイズ:

 幅:cap_video.get(cv2.CAP_PROP_FRAME_WIDTH)

 高さ:cap_video.get(cv2.CAP_PROP_FRAME_HEIGHT)

・numpy配列に読み込む:ret, frame = cap_video.read()

 

*明日は、400の動画から、各10枚の静止画像を抽出し、fakeファイルとtrueファイルに名前を付けて投げ込む。

・それがうまくいけば、次に、この2種類の画像をCNNで分類できるかどうか、試してみる。

・ここまでが第一ステップとなる。

 

つづく 

 

f:id:AI_ML_DL:20200216085455p:plain

style=107 iteration=1

f:id:AI_ML_DL:20200216085628p:plain

style=107 iteration=20

f:id:AI_ML_DL:20200216085721p:plain

style=107 iteration=500

 

Deepfake Detection Challenge - 3

Deepfake Detection Challenge - 3

Identify videos with facial or voice manipulations

 

*本日の予定:方針を考えなおす。

 

*賞金総額$1,000,000、約1億1千万円とはすごいな。ノーベル賞級だな。

・1位の賞金は$500,000、約5千5百万円だ。

・ほんとかな、と、何度も見にいってしまう。

 

*注意事項がたくさんあるので、わからないことは、Discussionで確認してみよう。

・とりあえず、Kaggleのkernel経由、であることは重要だな。

 

*データ量がハンパないので、学習するだけでも大変そうだ。

・zipファイルで500GBもある。分割ダウンロードできるようになっているが、それにしても、プロ仕様だな、と感じる。

・モデルは、正確さだけでなく、早さも必要だ。

 

*動画であるが、基本は画像分類だから、とりあえず、ResNetとかResNextなんかが、普通に使われるんだろうな。

・自分の今のパソコンは、ResNet50でパンクしたからな。

・そうすると、もう、GPU(11GB以上)やTPUの世界だし、RAMだって32GB以上は必要だろうな。

・正確さをサブ%レベルで競うようになると、高性能ネットワークのアンサンブルになってきて、そういうものをどれだけ使いこなせるかという世界になるんだろうな。

・そうすると、クラウドを使えるようになっておかないとだめなのかな。

 

*このあたりで、くじけそうになる。

*昨日、いいお手本だなと思ったものは、自分には合わないことがわかった。

*論文の読み込みが不足している。

 

*3日以内に、小さなデータベースを使って、fakeかtrueかを予測するプログラムを作ってみよう。 

・動画をダウンロードして、何枚かの静止画像を使う。

・fakeとtrueをそれぞれ1000枚づつくらい用意しよう。

・犬か猫かと同じように、fakeかtrueかの2者択一だ。

・Kerasの小さなCNNを使おう。

・これなら、できるでしょう。

・fake動画がどうやって作成されたかなどおかまいなしに、CNNは、教えられたとおりの答えが得られるように、延々と、計算を繰り返すでしょう。

・延々と計算しても、lossが減らない:学習が進まない可能性が高い。

・そうすると、次は、顔認証して、顔にフォーカスする必要があるかもしれないな。

 

*シリーズの初回の最初の論文、Detecting Face2Face Facial Reenactment in Videos、これが最適かどうかはわからないが、通読してみる。

・1つの動画から、ランダムに10フレーム選んで処理している。

・前処理として顔を抽出するのは必須。

・Resnetの層数(18, 50, 152)とfake識別性能の関係は、圧縮率の高い画像に対しては、通常とは逆に総数が少ないほど性能が高くなる傾向がみられている。

・顔の全体画像に加えて、上下左右に4分割した画像を並列に流して損失関数の配合割合を調節してfake検出性能を詳細に検討したものであるが、元々、データ数がそれほど多くないので、結果としては、画像を5倍に増やしたのと同程度の性能向上となったのかもしれない。

 

*明日のことは、明日考えよう!

 

f:id:AI_ML_DL:20200215085937p:plain

style=106 iteration=1

f:id:AI_ML_DL:20200215090157p:plain

style=106 iteration=20

f:id:AI_ML_DL:20200215090058p:plain

style=106 iteration=500

 

Deepfake Detection Challenge - 2

Deepfake Detection Challenge - 2

Identify videos with facial or voice manipulations

 

*今日は、コンペのdiscussionやnotebookに学ぼうかなと思う。

 

*やっぱりすごい、情報の量と質が違う。一人ではとても調べられるものではない。

・外部の情報源としては、やっぱりGitHubだなと感じさせられるが、Kaggle内に蓄積された情報の質と量もすごいんだろうな。

GitHubの情報は、活用できてなんぼ、ということだな。

 

*理想的には、既存の論文、コード、データベースを集積して、最適化したのち、経験や議論やさらなる調査と試行錯誤を重ねて、独自の手法を編み出して、予測精度を上げていくということかな。

*コンペ固有の課題としては、コンペのデータベースを適切に処理することで、この作業に難点をもつ自分としては、公開されているnotebooksで、前処理の方法を学ぶということになる。

*前処理の部分も含めて、GitHubで探してみよう。

 

*コンペ内で、良さそうなお手本がみつかったので、それを勉強する。

・ここでその内容を具体的に記述するわけにはいかないので、同じものがGitHubにあれば、それをここで示しながら解読していきたいと思う。 

 

つづく 

 

f:id:AI_ML_DL:20200214085133p:plain

style=105 iteration=1

f:id:AI_ML_DL:20200214085228p:plain

style=105 iteration=20

f:id:AI_ML_DL:20200214085348p:plain

style=105 iteration=500