Amazon SageMakerの「画像の分類」アルゴリズムにおける「マルチラベル」での分類について

2018.09.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

こんにちは、yoshimです。 先日、SageMakerの「画像分類」ビルトインアルゴリズムにて「マルチラベル分類」機能が追加されていたのでご紹介しようと思います。 このアップデートが来るまでは、「1画像に写っている物体」を「1つのクラス」への分類しかできていなかったのですが、複数のクラスへ分類することができるようになりました。

AWSのGit

目次

1.最初に

今回ご紹介する「マルチラベル」での分類とは、具体的にどのようなことができるようになったのでしょうか。

下記の画像で実際にやってみて結果を見てみましょう。 (人間、自転車、自動車、オートバイ、飛行機、5クラス分類です)

この画像には「人間」、「自転車」、「自動車」の3つが写っているので、3クラスとも「画像中に存在する」ことを推論結果として返して欲しいところです。

しかしながら、従来は「1画像に写っている物体」を「1つのクラス」への分類しかできなかったので、下記のような結果が返ってきます。

Person:0.016675 Bicycle:0.034501 Car:0.429352 Motorcycle:0.519470 Airplane:0.000002

これは、「1つのクラス」への分類をする際は、全てのクラスの推論結果の合計値が「1」になってしまうためです。 自転車とバイクの識別ができていないのは一旦置いておくとして、「人間」が写っているにも関わらず全く推論できていません。 また、画像分類を利用する際は閾値を設定して、「ある程度以上の確度を持った結果」のみを利用することも多いかと思いますが、「1つのクラスへの分類」の場合は、閾値で足切りされてしまう可能性が高くなります。

以上から、この画像のように「複数のクラスが写っている画像」に対して、「1クラスに分類」するのは筋が悪いように思えます。 また、実際に画像分類を実施する際は「1つの画像が複数のクラスに属する」といったシーンはよくある光景かと思います。 (ex.そばを「日本料理」、「麺料理」の2クラスに属するようにしたい)

そんな時に、今回ご紹介する「マルチラベルでの分類」で推論を行うと「対象画像が、対象クラスに属する確率」をクラスごとに返してくれます。 つまり、下記のような結果が返ってきます。

Person:0.997278 Bicycle:0.460747 Car:0.875142 Motorcycle:0.238543 Airplane:0.000000

「1つのクラス」への分類とは異なり、「各クラスごとに」最大が1となる形で結果を返してくれます。 これで、「1つの画像が複数のクラスに属する」シーンでも、ある程度応用が効きそうです。

2.やり方

具体的なソースコードはAWSのGitをご参照ください。

基本的には従来の「画像分類アルゴリズム」と同じですが、異なる点が2点あるので、その点だけ下記に記載します。 (lstファイルを利用する場合、で説明します)

2-1.ハイパーパラメータ

マルチラベルに分類する際は、学習時に引き渡すハイパーパラメータで「multi_label=1」と指定する必要があります。 ハイパーパラメータ

本機能と同時に追加されたハイパーパラメータです。

2-2.「lst」ファイル

画像分類アルゴリズムでは、「lst」ファイルを「どの画像がどのクラスに属するか」といったインデックス的な位置付けとして利用します。 なので、「1クラスへの分類」と「マルチラベルでの分類」となるとそのフォーマットが若干異なります。 具体的には、下記のような違いがあります。

2-2-1.「1クラスへの分類」

「1クラスへの分類」の場合は、下記のようなフォーマットです。

Index クラスID 対象画像のパス
Index クラスID 対象画像のパス
Index クラスID 対象画像のパス
・    ・      ・
・    ・      ・
・    ・      ・

具体的には、このようなフォーマットになります。 (あくまでも、一例です)

14204 236.000000 237.vcr/237_0070.jpg
14861 247.000000 248.yarmulke/248_0062.jpg
10123 168.000000 169.radio-telescope/169_0061.jpg

特徴としては「対象クラス数が増えても、列数は3つ」といったところでしょうか。

2-2-2.「マルチラベルでの分類」

「マルチラベルでの分類」の場合は、下記のようなフォーマットになります。 (対象クラス数が多くなると横に長くなるので、3クラスへの分類の場合で説明します)

Index クラスID1が写っているかFLG クラスID2が写っているかFLG クラスID3が写っているかFLG 対象画像のパス
Index クラスID1が写っているかFLG クラスID2が写っているかFLG クラスID3が写っているかFLG 対象画像のパス
Index クラスID1が写っているかFLG クラスID2が写っているかFLG クラスID3が写っているかFLG 対象画像のパス
・        ・              ・              ・           ・
・        ・              ・              ・           ・
・        ・              ・              ・           ・

具体的には、下記のような形になります。

103 1 0 1 000000057672.jpg
2266 1 0 0 000000129812.jpg
847 0 0 1 000000084477.jpg
2109 1 1 0 000000579902.jpg

これは「000000057672.jpgはクラス1,3が写っている画像」、「000000129812.jpgはクラス1のみが写っている画像」、「000000579902.jpgはクラス1,2が写っている画像」、といった意味合いになります。

このように、マルチラベル分類用の「lst」ファイルはクラス数の分だけ横に長くなる点が「1クラス分類用のlstファイル」との違いです。

3.「Amazon Rekognition」との使い分け

もし分類対象が一般的なものなら、まずはAmazon Rekognitionの利用を優先的に考えた方がいいでしょう。 学習済の高性能なモデルがすぐに利用でき、こちらも「複数のラベルの推論結果」を返却します。

例えば、こちらは「Amazon Rekognition」の紹介ページに貼られている画像ですが、複数のラベルの推論結果を返却していることがわかります。

「Amazon Rekognition」でやりたいことが実現できそうなら、「Amazon Rekognition」を利用するといいのですが、「分類対象をカスタマイズする必要がある」場合はSageMakerの利用を検討した方がいいでしょう。

4.まとめ

最近追加された「画像分類」ビルトインアルゴリズムの「マルチラベルでの分類」機能をご紹介しました。 この機能が追加されたことで、より柔軟にニーズに対応できるようになったのではないでしょうか。

5.引用

AWSのGit ハイパーパラメータ Amazon Rekognition