Developer Blog AIフレームワーク 開発ブログ

2026年07月06日 2026年06月02日

ニューラルネットワークで画像を

研修会の内容

先の記事で社員研修会の話を書きました。そこで「内容」については参加者自身の発表の話を書きました。しかしそれ以外については詳しい内容を書いていなかったので触れておこうと思います。

MNISTとcelebA

今年の社員研修会は表題を「画像モデル入門」としたのですが、その教材として使ったのがMNISTとcelebAです。MNISTは、縦横28x28の白黒画像で、0から9の手書き文字を訓練用に60000枚、テスト用に10000枚集めたものです。

いっぽうcelebAは有名人の顔画像とその属性情報をまとめた大規模(>20万枚)な画像データセットで、縦横218x178のカラー画像ですが、このままでは大きすぎるので、縦横64x48に縮小して教材にしました。その画像の例を以下に掲載します。

ニューラルネットワークで文字認識 MNIST

まずはMNISTを使ってニューラルネットワークで文字認識です。これは画像を入力としてニューラルネットワークに入れて、それを0~9の10通りに分類するタスクです。これについては、ごく簡単なニューラルネットワークで扱うことができます。例えば;

model = Neuron.SequentialWithLoss(
            Neuron.Conv2dLayer(100, activate='Sigmoid', optimize='AdamT'),
            Neuron.Pooling2dLayer(),
            Neuron.Flatten(),
            Neuron.NeuronLayer(10, activate='Softmax', optimize='AdamT'),
            LossFunctions.CrossEntropyError(),            
            )

このモデルで以下のように簡単に学習が進んで、

  epoch |  elapse | error train test | accuracy train test
  0/ 10 |     0.0 |    0.242   0.244 |      11.70%   9.90%
  1/ 10 |    30.2 |    0.052   0.053 |      86.00%  85.80%
  2/ 10 |    30.2 |    0.040   0.038 |      87.90%  88.70%
  3/ 10 |    30.2 |    0.033   0.032 |      90.20%  90.10%
  4/ 10 |    30.3 |    0.030   0.029 |      91.20%  90.30%
  5/ 10 |    30.2 |    0.029   0.028 |      91.60%  92.10%
  6/ 10 |    30.2 |    0.026   0.026 |      93.10%  92.20%
  7/ 10 |    30.3 |    0.024   0.023 |      92.60%  93.30%
  8/ 10 |    30.2 |    0.025   0.025 |      93.50%  92.70%
  9/ 10 |    30.2 |    0.022   0.022 |      93.90%  93.30%
 10/ 10 |    30.1 |    0.021   0.020 |      94.50%  93.60%

あっという間に、testデータで90%を超えます。そしてもっとじっくり学習させれば、まだまだ向上します。因みにデータは訓練用trainを学習に使い、testの方は評価のみを行っています。だから、trainはニューラルネットワークにとって、すでに見た画像であるのに対し、testの方ははじめて見る画像になるわけです。さまざまな手法を駆使すれば、さらに向上しますから、初めて見る画像でも100%近い識別が可能になるわけです。

ニューラルネットワークで顔画像認識 celebA

次はcelebAの顔画像です。これはもちろん画像そのものがカラーである点は違うのですが、それ以上に、画像のヴァリエーションがMNISTとは大きく異なります。つまり顔が主役という点は画像として共通ではあるのですが、背景には様々なものが写りこんでいてバラバラです。ついでに顔の大きさもあまり揃っていません。だからMNISTのように簡単ではないことが、やる前からわかります。
そしてもう一つ大きな違いは、認識した結果として何を出力するのか、です。MINISTは0~9の数字なので出力としては0~9のいずれであるかであって一つの項目で、その区別すべき種類が10通りです。
これに対してcelebAの場合には40種類のラベルが付けられています。
例えば、'5_o_Clock_Shadow'(5時髭)、'Arched_Eyebrows'(三日月眉毛)、'Attractive'(魅力的)、'Bags_Under_Eyes'(目の下のクマ)、'Bald'(禿)、などなどです。
それがはなはだ主観的と思われるのですが、それぞれ-1と1の数値で、そうでない・そうだ、のラベルが付けられているのです。
つまり個々の項目については2通りしかないけれども、項目が40種類もあるのです。

マルチラベルの属性分類

この40項目は必ずしもすべて見分けなければならないわけではありませんが、せっかく顔画像認識をやるのなら、ということで、この40項目すべてを使うことにしました。あれこれ述べましたが、これも意外に簡単なモデルで扱うことができます。例えば(敢えてMNISTより簡単な)以下です。

kwargs = {'optimize' : 'AdamT'}     
model = nn.SequentialWithLoss(
    nn.Conv2dLayer(32, activate='ReLU', **kwargs),
    nn.NeuronLayer(n_attrs, full_connection=True, activate='Sigmoid', **kwargs),
    lf.CrossEntropyError2(reduction='sample') # 要素それぞれの損失のバッチ平均
)

このモデルでMNIST同様に簡単に学習が進んで、

  
epoch |  elapse | error    | accuracy
  0/ 50 |     0.0 |   27.483 |  54.44%
  1/ 50 |     0.5 |   16.298 |  83.23%
  2/ 50 |     0.5 |   13.761 |  84.66%
  3/ 50 |     0.5 |   12.473 |  86.57%
  4/ 50 |     0.5 |   10.112 |  88.86%
  5/ 50 |     0.5 |    9.087 |  91.20%
  6/ 50 |     0.5 |    7.922 |  92.03%
  7/ 50 |     0.5 |    6.850 |  94.00%
  8/ 50 |     0.5 |    6.284 |  94.90%
  9/ 50 |     0.5 |    5.584 |  95.50%

 # 途中省略 

 48/ 50 |     0.5 |    0.358 | 100.00%
 49/ 50 |     0.5 |    0.330 | 100.00%
 50/ 50 |     0.5 |    0.317 | 100.00%

あっという間に100%です。とはいえ、実はこのケースは活性化関数にSigmoid、損失関数にCrossEntropyError2(正解不正解の両方向のクロスエントロピー)を使うことと、正解値データを-1/1から、0/1に変換しておくこと、などツボと言えることをちゃんと押さえておくことが肝要です。 

画像認識の最後に、ちょっと面白いことを...

celebAの学習が済んだら、少し面白い遊びができます。それは、誰かの顔画像を持ってきて、学習済みのニューラルネットワークのモデルにそれを認識させるのです。
かなり言いにくいことも含まれていますが、顔画像を見たモデルがどう判断するのかを試してみるのです。
このためにjpgからモデルに入れられるデータを作るパスも用意しました。そして私の顔写真の場合には、'Male'(男)や'Wearing_Necktie'(ネクタイをしめている)、そして、'Bags_Under_Eyes'(目の下のクマ)や'Receding_Hairline'(頭髪後退)が出たりしました。その場でPCで写真を撮って、これをくわせた受講者もいました。
何かのイベントで、来訪者の方々に試してもらうのも、おもしろいかもしれませんが、場合によっては怒られそうですね?

初日はMNISTまで。あとは夜の宴会でした。

宴会の前に顔画像認識までやっておきたかったので、ちょっとだけ残念でした。

ブログのご感想やAIフレームワーク「ufiesia」「pyaino」に関するお問い合わせは、
問い合わせフォームからお送りください。

お問い合わせ
  • お問い合わせ内容によりましては、ご期待に添えない場合やご回答が出来ない事が有ります。