コードノート

コードノートはwebを中心にテクノロジー・クリエイティブを伝えるWebメディアです。コードリンク代表、片岡亮が執筆しています。

Google Colaboratoryで学ぶ、Pythonによる画像加工&DCGAN

f:id:moba13:20190923214439j:plain

非ITな人向けディープラーニング勉強会を、第3回目も実施したのでその内容をざっくり公開。前回・前々回の内容は以下に。

■第1回 [理論] 実際AIって今どんなことできるのよ?会。

blog.codelink.co.jp

■第2回 [実践] Googleの無料学習環境を使って、ポチポチGANとやらを体験してみよう会。

blog.codelink.co.jp

色々とご存知の方からすると、いきなりGANかよ、という話はありますがエンタメ重視で文系的な人も楽しめると良いなぁというゆるい方針でやっています。

今回の内容を実行した例。

AI勉強会、今回の概要 → Pythonの画像加工ライブラリを使ってみよう

前回(第2回)は、GAN(敵対的生成ネットワーク)による教師無し学習を体験してみよう、という会だったのですが、今回はその続編的な内容です。

最初は3分クッキング番組がごとく、「それでは、事前に用意した128x128の正方形画像500枚を読み込みます。」という流れで始めていたのですが、その部分もPythonで準備してみよう!というのが今回のおおまかな主旨でした。

ディープラーニングのプログラミングといえば大半がPython!というのが半ば常識となっている昨今ですが、それはPythonの文法がわかりやすいといったこともありつつ、ライブラリが豊富というのも大きな要因でしょう。

NumPyといった数値計算ライブラリはもちろん、画像加工のライブラリも充実しており、今回はその体験会というかんじでした。

プログラミングを日頃行う人からすれば、「ライブラリが豊富だから~」と話せば一発で通じますが、一般の人からすれば、「ライブラリー?何それ図書館?」という話なので、ライブラリとはなんぞやと説明するよりも、まず使ってみるのが一番では?という意図です。

そして加工した画像をそのまま使って、改めてDCGANの実行もしてみよう!という内容をまとめたGoogle Colabのノートブックをこちらにアップしてあるので、ご覧くださいませ。

colab.research.google.com

事前準備:
友達でも有名人でも良いので、加工したい人物画像いっぱい。サイズとかはプログラムでまとめて直すので変更不要。

短いコードは僕が適当に書いていますが、大半のコードはwebに公開されていたものをColab内で実行できるよう一部改変したものになっています。

だいたい全部コメントに引用元を書いている…はずですが、漏れがあったらご指摘いただければ幸いです。

ディープラーニングの画像学習データを作成する時のライブラリというと、「Pillow」「OpenCV」の2つをよく目にすることになりますが、それらを活用するサンプルコード集になっています。

また合わせて、画像の水増しをするために、ディープラーニング用のライブラリの一つ「Keras」に搭載された機能の一つ、ImageDataGeneratorクラスも使っています。

ディープラーニングの学習では、画像が多く(数百枚~数万枚)あった方が精度が向上することがあるのですが、中々それだけの画像を集めるのは大変です。

そこで学習手法として、1枚の画像を左右反転・色味変更・上下左右に少しずらす、といった方法でコピーするという処理を挟みます。全部オリジナル画像の方がもちろん良いですが、枚数が少ないよりは水増しした方が良いかんじに。

そんなこんなでノートブック内で行っている画像処理は、以下の5つです。

・画像のファイル形式の統一(今回はpngに統一) → Pillow
・複数の画像を1枚に統合 → Pillow
・人物画像から、顔部分だけを正方形に切り抜く → OpenCV
・画像のサイズを統一する → OpenCV
・画像の水増し → Keras

顔検出について

勉強会では、顔画像を切り抜く処理が「おぉ!」と盛り上がっていました。

こんなかんじで、プログラムが人物画像から顔部分を認識して切り抜いた画像を生成してくれます。

f:id:moba13:20190923205255j:plain
ディープラーニングの学習のために、顔画像を集めて1枚1枚手動で画像加工ソフトを使って正方形に切り抜いていきましょう、なんていうのはやってられないので、こんな形で自動化できる部分は自動化するのは重要な工程です。

『退屈なことはPythonにやらせよう』が7万部も売れているらしいので、間違いない。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

  • 作者: Al Sweigart,相川愛三
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/06/03
  • メディア: 単行本(ソフトカバー)

最終的な現場では、自動化できない部分を手動で一枚一枚加工したデータセットを作ることが重要だったりもしますが、個人の勉強ではそこに時間をかけられないですからね。

ちなみに、今回利用したコードでは顔画像検出精度は2/3程度という肌感でした。当然元データの質によりますが、少しでも斜めを向いていたりすると、うまく検出できないな、という感覚です。

顔検出は他にも色々方法があるようで、以前別の機会で使った、ディープラーニングによって構築された「Face Recognition」がもっと良いかんじでした。

github.com

静止画からの顔検出はもちろん、動画からの顔検出にも対応。

顔の類似度判定も可能で、以前、基本1人の顔写真、数百枚の中に数枚混じった別人の画像を除去する時にとてもお世話になりました。

「ライブラリを使えばたった数十行のコードでこんな便利なことが!」と言うのは、数百・数千行と書かれたライブラリのコードを軽視しているように聞こえてしまうかもしれないですが、感謝の念を込めつつ活用していくことがとても大切です。

Kerasで書かれたDCGANの実行

前回、DCGANの実行には、TensorFlowで書かれたこちらのコードを使っていました。

github.com

ただ以前はそのままcloneして実行できていたのですが、最近のGoogleColab内のアップデートの影響かそのままだとエラーが発生する事態に。

もう4年も前にPython2で書かれているものだし、仕方ない。

原因を特定して書き直しても良かったのですが、今回画像の水増しにKerasを使っていましたし、せっかくならとKerasで書かれたDCGANのコードを探してみました。

参考記事:

qiita.com

qiita.com

ベースは「keras GAN 自前データセットで画像生成」のコードを使わせていただきましたが、ちょっと生成結果が微妙だったので、generatorとdiscriminatorのモデル部分だけ「DCGANでISSEY MIYAKEをデザインする」のコードに変更し利用しました。

colabのノートブック内にも書いてますが、それをまとめたものはこちらに。

GitHub - ryryo/keras_dcgan_origin

GANの実行は、今回で終わりの予定でいます。

ディープラーニング=画像であれこれ、だけでは決してないですが、「ディープラーニングによってAIが目を持つようになった」と言われることもあり、画像を扱うのはとっかかりとして面白いですね。

ディープラーニング以前であれば、顔認証のプログラムを書くといったらめちゃ大変なことだったと思うのですが、制作にかかる時間が減り、精度は逆に向上しているのは驚きです。


次回以降は、名言生成・歌詞生成といった、文章生成をしてみたいね~と話しているところですが果たしてどうなるのか、乞うご期待。