AIの学習データを「水増し」する魔法!TensorFlowのtf.image.randomで始めるデータ拡張入門
こんにちは。ゆうせいです。
新人エンジニアのみなさん、画像認識のモデルを学習させていて、「もっとデータがあれば精度が上がるのに!」と頭を抱えたことはありませんか?
機械学習、特にディープラーニングの世界では、データは多ければ多いほど良いとされています。でも、質の高い学習データを大量に集めるのは、時間もお金もかかって本当に大変ですよね。
そんなときに強い味方になってくれるのが、TensorFlowに用意されている便利な道具箱、 tf.image.random で始まるメソッドたちです。これらを使えば、手持ちの画像を「自動で」「ランダムに」変化させて、擬似的にデータを増やすことができるんです。これを専門用語で データ拡張(Data Augmentation) と呼びます。
今日は、この魔法のようなツールたちについて、どんなことができるのか、どうやって使うのかを一緒に見ていきましょう!
なぜ画像を「ランダムに」変化させるの?
そもそも、なぜわざわざ画像を加工する必要があるのでしょうか?
人間は、少しくらい写真が暗くても、逆さまになっていても、それが「猫」であれば「猫」だと認識できます。でも、コンピュータはそうはいきません。コンピュータにとって画像は、ただの数字の羅列です。少し明るさが変わったり、向きが変わったりするだけで、それはもう全く別のデータに見えてしまうことがあるのです。
もし、明るい場所で撮った猫の写真ばかりをAIに学習させたらどうなるでしょうか?AIは「猫とは明るい場所にいるものだ」と勘違いして覚え、少し薄暗い部屋にいる猫を見せられたときに「これは猫ではありません」と答えてしまうかもしれません。これが、学習データだけに過剰に適応してしまう 過学習 という状態です。
これを防ぐために、学習させる画像にあえて色々な変化を加えます。
「ちょっと暗い猫」「左右反転した猫」「色が少しあせた猫」など、様々なバリエーションをAIに見せることで、「どんな状況でも変わらない猫の本質的な特徴」を学習させることができるのです。
例えるなら、試験勉強で過去問を解くときに、全く同じ問題を丸暗記するのではなく、数字が変わったり、問いかけ方が変わったりした応用問題をたくさん解いて応用力をつけるイメージですね。
tf.image.random の愉快な仲間たち
TensorFlowには、画像をランダムに変化させるためのメソッドがたくさん用意されています。ここでは、特によく使われる代表的なものをいくつか紹介しますね。どれも、元の画像データを入れると、加工された画像データが出てくる仕組みです。
1. 明るさを変える:random_brightness
これは、画像の明るさ(輝度)をランダムに変化させるメソッドです。
部屋の照明を少し暗くしたり、逆に窓際で太陽の光を浴びたりしたような状況を作り出します。使い方は簡単で、「最大でどれくらい明るさを変えていいか」という範囲を指定するだけです。そうすると、その範囲内で毎回サイコロを振るように、明るくなったり暗くなったりします。
2. コントラストを変える:random_contrast
コントラストとは、画像の「明暗の差」のことです。
コントラストを上げると、明るいところはより明るく、暗いところはより暗くなり、くっきりとしたメリハリのある画像になります。逆に下げると、全体的に灰色っぽく、ぼんやりとした画像になります。テレビの画質設定で触ったことがあるかもしれませんね。これも、変化させる範囲を指定して使います。
3. 左右を反転させる:random_flip_left_right
これは非常にシンプルで強力な方法です。まるで鏡に映したように、画像の左右を確率50%で反転させます。
多くの物体(例えば、動物、車、家具など)は、左右が逆になってもその物体であることに変わりはありませんよね。たったこれだけで、学習データのバリエーションを簡単に倍増させることができるので、非常によく使われます。
ちなみに、上下を反転させる random_flip_up_down というメソッドもありますよ。
4. 鮮やかさを変える:random_saturation
ここでは少し専門的な「彩度(さいど)」という言葉が出てきます。彩度とは、色の鮮やかさの度合いのことです。
彩度が高い画像はビビッドで派手な色使いになり、彩度が低い画像は色がくすんで、最終的には白黒写真(グレースケール)に近づいていきます。このメソッドを使うと、写真の色の濃さをランダムに変えることができます。
5. 色合いを変える:random_hue
最後は少し変わり種の「色相(しきそう)」です。色相とは、赤、青、緑といった、色味そのもののことです。
このメソッドを使うと、画像全体の色味をずらすことができます。極端な話、赤いリンゴを青いリンゴに変えてしまうようなことも可能です。
これは非常に強力な変化なので、使い方には注意が必要です。例えば、信号機の色を認識するタスクで赤信号を青信号に変えてしまったら、AIは混乱してしまいますよね。でも、花の種類の認識のように、色があまり重要でないタスクでは、形の認識能力を鍛えるのに役立つこともあります。
使うときのメリットとデメリット
これらのメソッドを使うことには、大きなメリットと、知っておくべきデメリットがあります。
メリット
最大のメリットは、手軽に学習データを水増しでき、モデルの汎用性(応用力)を高められることです。過学習を防ぎ、未知のデータに対しても強いAIを作ることができます。しかも、TensorFlowの計算グラフの中に組み込めるので、学習中にリアルタイムで効率よく処理できるのも嬉しいポイントです。
デメリット(注意点)
一方で、やりすぎは禁物です。例えば、明るさを変えすぎて真っ黒や真っ白な画像になってしまったり、色相を変えすぎて現実にはありえない色の物体になってしまったりすると、かえって学習の妨げになることがあります。
また、タスクによっては不適切な変換もあります。先ほどの信号機の例や、文字認識で「6」を上下反転させて「9」にしてしまうようなケースです。対象となるデータや解決したい課題に合わせて、適切な変換を選ぶ必要があります。
今後の学習の指針
いかがでしたでしょうか。 tf.image.random を使ったデータ拡張の世界、少し面白そうだなと思っていただけたなら嬉しいです。
まずは、お手持ちの画像(例えば、自分のペットの写真やフリー素材など)を1枚用意して、これらのメソッドを実際に適用してみてください。どんなパラメータを設定すると、どんな風に画像が変化するのか、自分の目で見て確かめるのが一番の近道です。
Google Colabなどの環境を使えば、すぐにPythonコードを書いて試すことができますよ。
次のステップとしては、Kerasなどの上位APIに用意されている ImageDataGenerator や、さらに高度なデータ拡張ライブラリである Albumentations などと比較してみるのも面白いでしょう。
データ拡張は奥が深く、工夫次第でAIの性能をぐっと引き上げることができる面白い分野です。ぜひ色々と試行錯誤してみてくださいね。