高精度なアニメ顔検出をアノテーションなし(Domain Adaptation)で実現してみた

# はじめに
アニメ顔の検出器としてlbpcascade_animefaceが広く利用されています。
![43184241-ed3f1af8-9022-11e8-8800-468b002c73d9_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/a50d7fde-cff4-19cd-a443-3ebcc32d1688.png)

しかし、lbpcascade_animefaceは基本的に正面に近い姿勢の顔しか認識できないため、横向きなどの顔を認識することが困難です。
一方、（実写の）顔画像認識はDeepLearningにより高精度化が進んでいます。
![faster_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/a095ac59-e9cd-ebdf-7a30-3bd62250f7fb.png)

顔画像認識技術の進化をアニメ顔検出にも取り入れたいところですが、それには大量のアノテーション（学習データ作成）が必要であり、すぐに実現することはできません。

そこで本記事では、Domain Adaptationという手法を利用して、アニメ画像に対するアノテーションなしで、高精度なアニメ顔検出を実現する方法を紹介します。
以下の画像が本記事の手法によるアニメ顔検出の結果の一例です。
![EKIWbIZU4AAgykq.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/41396e54-3c0c-efcd-102d-cc1488ce968d.jpeg)

本記事で利用したソースコードは以下のGitHubリポジトリで公開しています。
まだ整備できていないので簡単に利用することはできないかもですが、参考にしてみてください。
https://github.com/kanosawa/anime-face-faster-rcnn-da.pytorch

# Domain Adaptation
まずはDomain Adaptationについて簡単に説明します。
本記事の手法は[Adversarial Discriminative Domain Adaptation](https://arxiv.org/abs/1702.05464)の論文を参考にしていますので、この論文の図を引用して説明します。
![Screenshot from 2019-11-26 03-43-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/35015ef1-790a-a4e5-2826-786da31c10ca.png)

図中にsource imagesとtarget imagesという２種類の画像群が載っています。
source imagesはラベル付けされた画像群であり、target imagesはラベル付けされていない画像群です。
この論文の問題設定は、「source imagesで学習したClassifierをtarget imagesの識別に利用できるようにする」ことです。
以下で、図の３つの過程についてそれぞれ説明します。

Pre-trainingは一般的な識別器の学習過程と同じです。
Source CNNで画像(source images)の特徴を抽出し、Classifierにその特徴を入力して、識別結果を出力します。

Adversarial Adaptationでは、Source CNNの重みを固定し、Target CNNとDiscriminatorを学習します。
Target CNNはSouce CNN同様、画像(target images)の特徴を抽出します。
Discriminatorは入力された特徴が、source imagesのものかtarget imagesのものかを判定します。
この学習によって、target imagesをTarget CNNに入力して得られる特徴が、source imagesをSource CNNに入力して得られる特徴と近い分布を持つことになります。

Testingでは、Target CNNでtarget imageの特徴を抽出し、Classifierで識別結果を出力します。
Adversarial Adaptationによって、source imagesで学習したClassifierがtarget imagesに対しても有効になっており、target imagesにはラベル付けしていないにもかかわらず、target imagesの識別が可能になります。

以上がDomain Adaptationの説明です。

# Domain Adaptationのアニメ顔検出への適用
続いて、Domain Adaptationをアニメ顔検出に適用します。
モデルアーキテクチャを以下の図に示します。
![Screenshot from 2019-11-26 04-46-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/fe6ab4c9-8063-31a3-d2d8-ff0c21cc59b9.png)

図がすべてを物語っている気がするので、データセットの説明だけしたいと思います。
[WIDER FACE](http://shuoyang1213.me/WIDERFACE/)は顔認識(実写)用のデータセットです。
[CelebA](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)は実写顔画像を集めたデータセットです。
[AnimeFace Character](http://www.nurs.or.jp/~nagadomi/animeface-character-dataset/)はアニメ顔画像を集めたデータセットです。

なお、現状のアーキテクチャが最適かは微妙です。
WIDER FACEからも実写顔画像の特徴はとれるのでCelebAは不要じゃないかとか、いろいろ改良の余地はありそうです。

# 比較
lbpcascade_animefaceの認識結果と比較を行います。
左がlbpcascade_animeface、右が本記事の手法です。
![001375_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/c659ea2b-8007-633f-91a0-3fec617d14a3.jpeg)　　![EKIWbIZU4AAgykq_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/39a6e8ee-6336-7278-3617-aad35eba0249.jpeg)
![001831_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/0899f9f5-afcc-3d89-0713-e9cbee6b8f3a.jpeg)　　![EKIWbIRU0AEew4c_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/b9b914c5-2d68-5559-a1fa-c36c5fff03cb.jpeg)
![001623_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/35ea8277-0986-afa6-c40d-c7ec06d423d2.jpeg)　　![EKIWbIRUUAAGIzV_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281858/a2727dfd-365c-46cc-2419-ef824b4eee7a.jpeg)

本記事の手法は横顔でもうまく認識できてますね。

ただ、じゃあlbpcascade_animefaceに取って代われるかというと、実はそんなことはなくて、正面顔はlbpcascade_animefaceの方がロバストに認識できますし、本記事の手法はアップの顔をほとんど認識できません。

Domain Adaptation全般に言えることだと思いますが、なにがなんでもアノテーション無しでやるんだということではなくて、手持ちのデータとか時間とかと相談しながら、既存の手法とうまく組み合わせて使うのが良さそうです。

# おわりに
本記事ではDomain Adaptationの技術を使って、アノテーションなしでアニメ顔検出を行う方法を紹介しました。
引き続き、アーキテクチャやパラメータの調整、lbpcascade_animefaceとの組み合わせなどによって実用化を目指していきたいと思います。