データ分析実践試験のヒント「画像データ処理」

こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。

Python3エンジニア認定データ分析実践試験(2024年9月公開)では、時系列データ、テキストデータ、画像データ、グラフデータ、地理空間データという5つのデータの形の取り扱いに関する問題も出題されます。これらのデータは、データ分析の世界に身を置いていても、それに関わりがない人にとっては難しいものかもしれませんが、どれもデータ分析をする上では重要です。それぞれのデータの特徴を知り、扱えるようになっていれば、より実践的で、より良いデータ分析を行えるようになりますので、ぜひ身に着けて頂きたい項目です。

解説3回目となる今回は、8章の「画像データ」について取り上げます。

※Python 3 エンジニア認定データ分析実践試験

※前回までの解説コラムは以下よりご覧いただけます。

データ分析実践試験のヒント「時系列データ処理」(6章)

データ分析実践試験のヒント「テキストデータ処理」(7章)

■画像データの重要性

画像は人が見たときに、何が映っているかを目に見てわかりやすいものです。昨今は画像をデータとして扱い、そのデータを使った分析は幅広く行われています。特にAIの世界では画像から何人の人が映っているか、どんなオブジェクトが映っているかなどの物体検出の技術はすでに成熟していると言えるほどには浸透しています。

また、動画も一種の画像活用です。動画自体が連続した画像と音声からなっているというように分割して考えれば、動画も画像データ活用の世界では重要な一つの素材です。例えば、車の自動運転技術は、運転中の流れる映像から、物体を認識する、もしくは信号を認識する、標識を認識するという部分に、動画の中から分割されて取り出された画像データが非常に重要な技術として活用されています。

画像データは今まで扱ってきたような、数値や文字列とは一線を画しており、それまでとは違うイメージを持つ人は多いと思います。実際、画像を扱わないデータ分析者は多くいます。とはいえ、先ほども書いたように、AIの世界をはじめ、画像や動画から特徴を捉え、検出するという技術は目覚ましい発展を遂げており、昨今では色々なことができるようになっています。つまり、画像や動画を取り扱えるということは、今後、データ分析者としては重要な要素と言えますので、このデータ分析実践試験では試験問題として取り入れているという背景があります。

Python3エンジニア認定データ分析実践試験では、主に8章で画像の取り扱いについて解説されていますが、2章でもPillowというライブラリで画像を扱う方法を2ページほど利用して簡単に説明されています。

■データとしての画像とは何か

さて、そもそも画像とは何かという点ですが、一般的に写真はjpg/jpegという形式で保存されており、また、ネット上にはpngやgifというデータ形式もあるなど、その形式は様々です。

それぞれのデータ形式についてはここでは詳しく取り扱いませんが、これらの様々な形式の画像データを、どのように取り込んでデータ分析の世界に落とし込むかを中心にお話したいと思います。また、実際の画像形式として、圧縮の方法などを気にすることも出てきますが、データ分析の文脈として、ここではそこまで考えずに画像自体がどういったものかを見極めることから始めましょう。

まず、写真のデータがどういった構造になっているかですが、例えばjpegのカラー画像はRGBと呼ばれる光の3原色(赤緑青)の3つのデータをミックスすることでカラーを出しています。

縦600px×横800pxのjpeg画像があるとしたら、その画像は600×800のドットで画像が構成されています。これらのドット、一つずつに注目してみると、RGBがそれぞれどの程度の濃度で表され、またその3色がミックスされることによって、表現されるようになっています。

ではこれを、データ分析的に考えるとどうなっているかと言えば、600×800の画像の中に、3次元のデータが含まれているという事になります。つまり、2次元の考え方(x=600、y=800)に奥行を表すz軸をプラスするということです。z軸にRGBのそれぞれの色データが含まれている立体構造になったデータ構造であると考えられることが画像データ分析の世界では重要です。

■Pillowによる画像加工

主教材では、まず、Pillow(PIL)という昔から利用されているサードパーティ製ライブラリを用いた画像加工の説明をしています。Pillowを利用すると非常に簡単に画像の各種加工ができます。

データ分析の世界で画像加工が必要となる理由は、画像のサイズがバラバラなことがよくあるからです。複数の画像を同じデータ構造にしたい場合、もしくは、大きな画像データが必要ない場合には、サムネイルやクロップ(切り取り)によって大きさを全部同じものに整えることは大きなポイントとなります。加工の手法を身に着けておけば、例えば、大事なものがセンターに映っているであろうという仮定の下、センターだけを切り抜きたいということも容易に行えるようになります。

また、文字情報のようなカラーが必要ない画像だった場合、RGBで表現されていたものを、グレースケール化(モノクロ化)する事もよくあります。この場合は不要なRGBデータを削られ、2次元のモノクロデータとして扱われますので、データを縮小化するだけでなく、データ分析がしやすくなります。

これらの加工の手法を覚えておくと、サイズの統一や余分な部分を切り取り、色素の変更などが容易にできるようになりますので、データの管理がしやすく、データ分析に使いやすい画像にすることができます。

主教材では、for文を利用して画像をまとめて処理をするという方法が紹介されています。これはPythonファイルの扱いの部分になりますので、Pythonをやっている人にとっては簡単だと思います。Pillow自体は多機能で、いろいろなことができますが、データ分析に必要なものとして、ここで書かれているような手法は最低限、押さえておいていただければと思います。

■NumPyでの画像処理(画像の色合いを数値化)

さて、NumPyを使うことで実際に3次元のデータ操作ができます。主教材では8章第2節の部分です。

先ほど説明したRGBはそれぞれ、3次元のデータの中の1つとして入っていると考えてください。これらのRGBはそれぞれ数値で表すことができます。

例えば、赤の要素の濃淡を、0は黒、最大値は真っ赤というように数値で操作することでドットの中の赤の色合いを変化させることができるというわけです。なので、Pillowで作った画像をNumPyに持ってくることで、数値演算の世界に落とし、そして、それぞれのドットに含まれている次元数にあった数値データを直接取得できるようになれば、すべてを数値演算で処理できるようになります。これがNumPyを使った画像データ処理です。

3次元がイメージしにくいと感じると思いますが、イメージさえできれば比較的簡単に理解が進むかと思います。教科書でも、画像をシェイプして、データの数や形状を見るというようにやっていますが、そうやってデータの形状を見てみると、確かに画像が3次元のデータ構造になってるんだなというのがわかるかなと思います。

このデータ構造にできたのであれば、特定のポイントがどういう濃さになっているのかの数値を取れますし、切り方によってどのような色の分布になっているかもわかるようになります。

例えば、jpegの多くは8bitになっていますので、0~255までの間の数値で色が表現されています。それぞれの色の濃さを表す数値が大きければ大きいほど、明るい(白っぽい)ということになります。jpeg画像の左上の端のピクセルの色の数値を取ったとして、そこがどのような色なのか、濃さはどの値になっているかというのが、NumPyを使えば通常は整数値で返ってきます。返された整数値が該当のピクセルで表現されているデータが1つずつ取れたということになります。

■OpenCV+NumPyでの画像処理(拡大・縮小・切取り・貼付け)

次の節では、拡大と縮小を数値演算的に行う場合について説明しています。ここではOpenCVというライブラリを利用した説明がされています。

OpenCVは、Pythonのライブラリで、Pillowでやるよりも柔軟で、比較的簡単にいろいろなパターンの画像加工ができるなど、たくさんの機能があります。

これを使うと、切り取りや貼付けを、3次元で数値化した画像の一部を切り取ったり、画像の上に数値を足し算して重ね合わせて画像を張り付けたりということもできます。加えてNumPyも一緒に使えば、数値の操作ができるようになりますので、分割や回転などもの加工も簡単にすることができます。

ここまで次元操作についてずっとお話してきましたが、高さ、幅、色の3次元の配列を上手く組み合わせることでデータ加工に取り組むことができます。様々な加工の仕方ができますので、加工した画像データを使って何をしたいかに併せて挑戦してもらえればと思います。

■画像データの使い道

画像データがすべて数値化された後、どのように活用するかというお話もしておきたいと思います。

2次元の行列の数値で扱うことができるモノクロ画像の場合、機械学習の学習データや推論データにするイメージはしやすいかと思います。昨今のディープラーニングの世界では、3次元のままディープラーニングのモデルにデータを入れて処理をすると、物体検出の方向に持ち込むことができます。これは数値になっているからこそできることだと言えます。また、機械学習やディープラーニングの世界であれば、ポジティブやネガティブのようなものを当てるというようなこともできるようになります。

いずれにしても、計算で求める機械学習やディープラーニングというのは、何かしらの計算をした結果に基づいて結果を出力してます。この時、例えば中の値が整数値であって、整数値の分布から、「これはこういうものかもしれない」という計算をすることが可能になります。そもそも、この機械学習やディープラーニングの世界では、数値化し、評価するという世界であるため、そういった意味でも、画像が数値に置き換えられれば、上で言ったような処理や、この後の段階でやる作業に都合のいい形状にするということも、数値を使いさまざまな方法で、ほかのデータ分析の世界と同じようなものとして取り扱えるようにできます。

具体的な例としては、スキャナーで取り込んだ画像で斜めになっているものを、数値演算を行うことで、どの程度の角度を調整すればいいのかというのをアルゴリズムとして機能に実装するというようなことです。

■さいごに

最初に話した通り、画像というものは、人がモニターや印刷物を通して見るのが主な用途ですが、見方を変えて、データ分析的に考えてみれば、すべて数値の塊なのだということがわかります。その数値をデータ分析で使える様々なツールを使いコンピュータでデータ計算をさせれば、加工や処理をすることができるということが分かったかと思います。

普段、データ分析で画像を使ったことが無い人にとって少しわかりにくい部分もあったかもしれませんが、ぜひ挑戦して欲しいと思うところです。やったことがある人にとっては常識的にこういうことを改めて認識することになった章だと思います。

また、世の中には様々なアルゴリズムが実装されたプログラムやライブラリがあふれています。それらを上手く組み合わせて使いこなしていってもらえればと思います。

PAGE TOP