Create MLでBromptonを機械学習する

これまでディープ・ラーニング(深層学習、機械学習の手法のひとつ)を用いて映画などの映像から自転車を見つけ出してきた。これは、コンピュータなどの機械が自転車を学習しているからだ。ただし、どのような車種であっても単に自転車として扱われる。そこでBromptonを学習させて、Bromptonとして検出することを試みる。そのためにAppleの機械学習トレーニング・ツールCreate MLを利用する。

icrawlerによる画像の自動収集

機械にBromptonを学習させるには、Bromptonの画像を見せて、これがBromptonだよと教えれば良い。このような画像の集まりをデータセットと呼び、画像のどの部分が何であるか示すことをアノテーションと呼ぶ。そこでインターネットで画像を検索してBromptonの画像を集める。ただし、手動でダウンロードするには手間がかかるので、Pythonのicrawlerフレームワークを使って自動収集する。

まず、ターミナルを開き、以下のコマンドを入力してreturnキーを押す。これでicrawlerがインストールされる。

pip install icrawler

次に、以下のPythonコードをcrawler.pyというファイル名で保存する。処理の内容としては、検索エンジンとしてBingを用いてicrawlerを使用し(1行目)、同時ダウンロード数を4としてimagesフォルダに保存することを指定している(2行目)。そして、検索する画像のキーワードを「brompton」と「ブロンプトン」として、最大1,000ファイルまでダウンロードする(3行目)。

from icrawler.builtin import BingImageCrawler
crawler = BingImageCrawler(downloader_threads=4,  storage={'root_dir': 'images'}) 
crawler.crawl(keyword="brompton ブロンプトン", max_num=1000)   

そして、Pythonでcrawler.pyを実行すれば、Brompton画像の収集が始まる。

python3 crawler.py

これで筆者の環境では、5分ほどかけて607枚の画像が取得された。このうちBrompton用のアクセサリーやタイヤなどの画像は除外する。また、Bromptonの車体の一部しか写っていない画像も扱わないことにする。また、折り畳んだ状態のBromptonも除外するのが良いだろう。そしてBromptonの全体が写っており、背景が複雑すぎない画像に絞れば150枚ほどになった。

自動収集されたBromptonの画像
自動収集されたBromptonの画像のうち適さないもの

IBM Cloud Annotationsによるアノテーション

次に画像のどの部分がBrompotonであるかを示すアノテーションを行う。これは手作業でも可能だが、Create MLに対応したアノテーション・ツールであるIBM Cloud Annotationsを使えば簡単にできる。このためにIBMアカウント(IBMid)を作成し、これをIBM Cloudアカウントとして利用する。IBM Cloudアカウントは無料のライト・アカウントで良いだろう。

IBM Cloud Annotationssでは、まずStart  a new projectをクリックしてプロジェクトを作成し、Bucket nameは「brompton」と入力し、アノテーション・タイプはLocalizationを選ぶ。

次に画像ファイルをウィンドウにドラッグ&ドロップする。ここでは横向きのBrompton画像10枚を用いる。そして、すべて画像について、エリア指定ツール(四角形のアイコン)でBromptonを囲み、ラベル名として「Brompton」と入力する。

作業が完了すれば、FileメニューからExport as Create MLを選ぶ。これでZipファイルがダウンロードされる。

ダウンロードしたzipファイルを解凍すれば、画像ファイルとannotations.jsonが含まれているはずだ。これが機械学習用のデータセットとなる。

Create MLによる機械学習トレーニング

次にCreate MLで機械学習のトレーニングを行う。Create MLはXcodeのDeveloper Tooldとして提供されるので、Xcodeをインストールしておく。そしてCreate MLを起動し、FileメニューからNew Project…を選んで新しいプロジェクトを作成する。さまざまなテンプレートがあり、今回の物体検出のためにはObject Detectionを選ぶ。プロジェクト名はBromptonDetectorとする。

プロジェクト・ウィンドウが開けば、Training Dataの+ボタンをクリックし、データセットのフォルダを選ぶ。パラメータはデフォルトのままで良いだろう。

以上で準備ができたので、左上のTrainボタン(再生アイコン)をクリックする。これでトレーニングが始まり、進行に沿ってLoss(損失率)のグラフが描かれる。

トレーニングが完了すればPreviewタブを選び、任意の画像をドラッグ&ドロップする。画像にBromptonが見つかれば青線で囲まれる。トレーニングした画像が横向きのBromptonだったので、そのような画像は問題なく検出される。一部が隠れていても大丈夫だった。

次に斜め向きやフロント・バッグを付けたBromptonなど種類を増やして、50種類の画像のデータセットでトレーニングを行う。これで、それまでは検出できなかった写り方のBromptonでも検出できるようになる。しかも、昔の試作モデルまで検出されるようになったのは微笑ましい。試作モデルは学習していないが、その連続性が認められたわけだ。

さらにさまざまな種類の画像を追加して100枚の画像でトレーニングを行うと、人が乗っていたり、背景が複雑であったりしてもBromptonを検出するようになった。一方、比較としてPreviewでロード・バイクの画像を用いても、Bromptonだと検出することはない。これは正しい処理だと言えるだろう。

最後にOutputタブでGetボタンをクリックしてモデル・ファイルを出力すれば、一連の作業は完了だ。

Core MLによる物体検出

出力されたモデル・ファイルは拡張子がmlmodelで、VisionフレームワークなどCore MLで利用できる。Appleが提供しているサンプル・コードRecognizing Objects in Live Captureなら、プロジェクトのモデル・ファイルを入れ替えて (1) 、ソース・コードでファイル名を指定すれば良い (2) 。これでアプリをビルドしてiPhoneで起動し、カメラを向ければBromptonが検出されるはずだ。

以上のように、機械学習のトレーニングは簡単に行える。文章では煩雑に感じられるかもしれないが、手順は少なく、操作方法は明快だ。作成した学習モデルを使えば、見事にBromptonが検出される。もっとも、検出した領域は安定しない。正面からカメラを向けると検出されない問題もある。ママチャリなどを間違えることはないが、他のメーカーの小径車をBromptonだと誤認することがある。

Appleは物体の種別(クラス)ごとに30枚以上の画像用いることを推奨している。つまり、今回用いた100枚は十分な数ではあるものの、学習材料が最適でないか、過学習かもしれない。インターネット検索ではカタログ的な整った画像が多く見つかり、実世界に見られる雑多な状況には必ずしも対応していない。適切な画像セットを選ぶには、経験を積んだノウハウや達観したセンスが必要だと思われる。

ここで重要になるのは、トレーニングの処理時間だ。当初用いたMacBook Proでは100枚の画像の処理時間は1時間20分だった。同じ処理をiMac Proで行っても33分もかかる。これでは手を変え品を変えて素早く試行錯誤することができない。M1プロセッサを搭載したMacBook Airに期待していたものの、これは1時間46分もかかる結果となった。まだNeural Engineが活用されていないのかもしれない。

ともあれ、さらなる改善が必要だ。折り畳んだ状態でも検出され、ハンドルや変速のタイプも判別したい。年式も判断できるだろうか…などと考えていて、気がついた。これはBromptonが会社として行うべきことだ。製品のスペックや写真を提供するように、遠からずメーカーは製品を的確に検出する学習モデルを提供するに違いない。こうして自転車はマシン・レコグナイザブル(機械認識可能)になる。

Leave a Reply

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA