YouTubeからサムネイルを集めてGANで画像を生成する


経緯

今回、これを企画した理由はVtuberのさくらみこさんの夏休み自由工作に投稿するためです。

概要

YouTube Data APIを用いて、YouTubeから特定のチャンネルのサムネイルを集める。
それを材料にGAN(Generative Adversarial Network)(敵対的生成ネットワーク)で画像を生成する。

YouTube Data APIで動画のサムネイルを取得

GANで画像を生成

以上の3つの記事を大変参考にさせて頂きました。
ありがとうございました。

私のソースコードはgithubにあるのでご覧ください。

手順

YouTube Data APIを使えるようにする

Google Cloud Platformにプロジェクトを立ち上げ、APIのキーを発行する。
YouTube Data APIを有効にすることで、使用することができる。

詳しくは以下をご覧ください。

特定のチャンネルのIDを調べる

searchメソッドを用いて、得られる情報の中にchannelIdがある。
これを用いることで、特定のチャンネルの情報だけを集めることができる。

以下にsearchメソッドの使用例を記載する。

search_response = youtube.search().list(
#動画を検索
part='snippet',
#検索したい文字列を指定
q='ホロライブ',
#視聴回数が多い順に取得
order='viewCount',
type='video',
).execute()

IDのチャンネルのサムネイルを取得

searchメソッドを繰り返して、大量のサムネイルを取得する。
一回のsearchメソッドで得られる情報は50件まである。
しかし、2回繰り返しても同じ情報が返ってくるだけなので、50件目から99件までの50件を得たい。
そのために、1回行うために出力される「nextPageToken」をsearchメソッドに与えることで解決できる。

def youtube_search_video():
    youtube = build(YOUTUBE_API_SERVICE_NAME,YOUTUBE_API_VERSION,developerKey=DEVELOPER_KEY)

    videos_response = youtube.search().list(
        part='snippet',
        channelId=channel_id,
        maxResults=50,
        order='date',
        pageToken=next_page_token
    ).execute()

    #ここの「nextPageToken」を表示
    print(videos_response['nextPageToken'])
    thumbnail_list=[]

    for result in videos_response.get('items',[]):
        thumbnail_url = result['snippet']['thumbnails']['default']['url']
        try:
            video_id = result['id']['videoId']
        except:
            print('エラー発見:' + thumbnail_url)
            pass
        else:
            req.urlretrieve(thumbnail_url,'./image/' + youtuber_name + '/' + result['id']['videoId'] + '.jpg')
        print('Saved:' + thumbnail_url)

サムネイルを元にGANで画像を生成

ここの部分に関しては詳しい事は理解できていないので、詳しい事は参考にさせて頂いた記事をご覧ください。

しかし、そのままでは自分の環境では利用できなかったためその点を記述する。
プログラムの随所に「cuda」と記述されていた。
どうやろこれはGPUに関連することだそうだ。
しかし、私はラップトップPCだからかそこでエラーがでた。
「cuda」の部分を全て「cpu」に変更することで実行できた。

結果

自分のPCのCPUはIntel(R) Core(TM) i7-8565U CPU @ 1.80GHz 1.99 GHzでしたが、合計46時間かかった。

出力結果は以下のようになった。

特にepoch=7750のあたりが良く感じたのでそこで画像を生成させた。

この中でも特に8番が気にいっている。
ピンクの髪で緑色の瞳とう点ではさくらみこの特徴をとらえている。
しかし、epoch=7900あたりから真っ黒になったのでこれ以上の精度は期待できない。

感想

企画に投稿するために思い立ったわけですが、最初は「絶対にじゃんけんに負けるエリートみこち」みたいなちょっとしたプログラムを書こうかと考えていました。
夏休みに入り時間に余裕ができたため、せっかくなら少し手の込んだことをしようと思い取り組みました。
機械学習の概要ぐらいしか知らなかったため、実際のプログラムと成果物を見てとても興味を惹かれました。
YouTube Data APIの使い方など今後、他の事にも応用ができそうな事を覚えたので実生活でも生かしたい。
またこういった企画があった際に新しいことをしたいです。
また、さくらみこ、ホロライブとても面白いのでぜひご覧ください。

参考