YouTube APIと顔認識を使ってYouTubeから見どころを抽出するツールを作る

## 開発したもの
YouTubeのURLを入力として、動画についているコメントから視聴者が面白い・可愛い・かっこいいなど印象に残ったシーンを抜き出すツール. グループYouTuberから自分の応援したいメンバーのシーンを抜き出せるように顔認識を使って抽出できるツール。
Qiita記事上では出力される動画を公開できませんが、ご自身で出力を確認したい方は以下のレポジトリから試してみてください！
成果物: https://github.com/kenoharada/YouTube-Highlight

## 背景
- 2ch創設者のひろゆきさんがYouTubeに投稿している動画を、切り抜いて編集してまたアップロードした動画の再生回数が伸びているという記事を見て(参考: https://getnews.jp/archives/2970894)
- 自分自身YouTubeをよく見るが、2倍速や10秒飛ばしで見どころを探しながら見ている
- 今まで見たことのないYouTuberの動画でも、TikTokでファンの人が応援のためにあげている動画や、〇〇集みたいなものから対象の動画を見たことがある

といった経験からこれらの活動をうまく自動化して活発化できないかな〜と思い立ったのがきっかけです。

## 処理の流れ
1. [youtube-dl](https://github.com/ytdl-org/youtube-dl)を使って見どころを抽出したい動画を取得, [url_to_highlight.py](https://github.com/kenoharada/YouTube-Highlight/blob/main/url_to_highlight.py)
2. [YouTube API](https://developers.google.com/youtube/v3/getting-started?hl=ja)を使用して動画から良いシーンと視聴者が思う場面のタイムスタンプ付きコメントを取得, [url_to_highlight.py](https://github.com/kenoharada/YouTube-Highlight/blob/main/url_to_highlight.py)
3. タイムスタンプを昇順に並べて[ffmpeg](https://www.ffmpeg.org/)を用いて切り抜き、切り抜かれた部分を結合する(ハイライト動画の作成完了), [url_to_highlight.py](https://github.com/kenoharada/YouTube-Highlight/blob/main/url_to_highlight.py)
4. (複数人YouTuberの場合)ハイライト動画から登場人物ごとに登場シーンを記録する、登場シーンを繋げて登場人物ごとの動画を作成, [distinguish.py](https://github.com/kenoharada/YouTube-Highlight/blob/main/distinguish.py) [make_each_person_highlight.py](https://github.com/kenoharada/YouTube-Highlight/blob/main/make_each_person_highlight.py)

## 工夫した点
登場人物の過去の動画から顔認識で用いるクエリ画像を準備して最初行ってみたものの精度が悪かったです。
動画の特性上認識したい登場人物が写り続けているため、また前もって準備している画像との距離が離れている問題を解消するために、動画で顔が出てくるたびに顔特徴ベクトルを登録し、既存の登録ベクトルから離れているものを新しく顔特徴ベクトルとして登録したところ顔認識の精度が上がりました。
またこの工夫によってさらに暗いシーンや企画で顔の写り方が変わっている場面でも新しく顔を登録できたので、よりロバストに個人を抜き出せるようになりました。
(後からどのidがどの人に対応しているかを見ないといけないが、その一助となるように既存の登録ベクトルで一番似ていたものを記録するようにしました。)
[該当部分](https://github.com/kenoharada/YouTube-Highlight/blob/8b0bb23302e65c48f64f54638579b2486a50a859/distinguish.py#L31)

また顔検出で手などが誤検出された例もあったため連続して10frame登場していないと顔としてみなさない、みたいな処理を入れることで顔だけが動画として選ばれるようにしました。
[該当部分](https://github.com/kenoharada/YouTube-Highlight/blob/8b0bb23302e65c48f64f54638579b2486a50a859/make_each_person_highlight.py#L7)

顔検出・顔認識の部分に関しては精度を良くしたかったので、そしてリアルタイムで処理する必要なかったのでなるべく最新の手法を使おうと調査してみました。
そこで[FaceX-Zoo](https://github.com/JDAI-CV/FaceX-Zoo)という素晴らしいレポジトリ(retinaface搭載)を発見し、今回のツールで開発しやすいようにface_sdkを修正して使用しました。

## 出力イメージ
僕が最近ハマっているグループYouTuberのコムドットで試してみました
input: [【超豪邸】港区に引っ越したあむぎりの家に突撃したらブチギレたwwwwww](https://www.youtube.com/watch?v=TNEGP-725Rk)
動画21分

抽出されたコメント例
```
20:24, 20:24 やまとくんその髪型めっちゃいいまたマッシュにして欲しい
10:02, 10:02 あっちゃんの不器用じゃーんカメラマンが好きすぎるんだけど同志いる？
20:41, 20:41くらいの3人の笑う時前に倒れる感じ好きすぎる
4:09, 4:09のひゅうがくんとやまとくんの間にいるゆうまくんの子犬みたいな可愛さえげつい、、🤦🏻‍♀️🤦🏻‍♀️🤍
3:31, 3:31 やまとくんのいじられリアクション大好き😂
```

ハイライト動画(2分10秒)
顔認識を使用して得られた登場人物毎のハイライト動画
![スクリーンショット 0003-05-15 13.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471807/929c3772-bab2-10b9-20c9-f25752ce972a.png)


## コメント
動画要約を大学院の研究として取り組もうかなとぼんやり考えており、YouTubeのコメントを教師データに学習とかできるかな？とりあえずコメントの部分を繋げたらどうなるんだろう?と思って作ってみたのですがそもそも動画の要約ってどう評価するんだ？？と少し詰まり、今後どのように深掘って行こうかと悩んでいます。
CyberAgentさんから発表されている以下の論文面白かったです
[Rethinking the Evaluation of Video Summaries](https://arxiv.org/abs/1903.11328)
https://www.cyberagent.co.jp/news/detail/id=22952

動画クリエイター支援としてYouTuberがTikTokとかに作った動画をすぐ配信できるように縦型に切り取るとかそういう方向に突き詰めていく可能性はありそう?
既存のサービスだとこれとかすごい
https://kamua.com/
Softbank vision fundの投資先の一つ
https://www.jellysmack.com/

## おまけ
プルリク、改善点のご指摘など是非お願いします！
普段情報収集しているTwitterです: https://twitter.com/kh_ls_ippon