RustConf:Rustを使ったイメージ処理のセッションを紹介

2022年2月3日(木)
松下 康之 - Yasuyuki Matsushita
RustConf 2021から、ポケモンカードの画像認識をRustで行ったセッションを紹介する。

「セキュアなシステムのためのプログラミング言語」という肩書で紹介されることが多いRustだが、今回は画像認識をRustで行ったというセッションを紹介したい。プレゼンターはHugo Peixoto氏だ。Peixoto氏の経歴は自身のブログに短く紹介されているだけだが、現在はフリーランスのプログラマーということだろうか。

趣味で保持しているポケモンカードをRustで認識する処理を解説

趣味で保持しているポケモンカードをRustで認識する処理を解説

Peixoto氏が持っているカード

Peixoto氏が持っているカード

まず、処理の大まかな流れを説明した。ここではWebCamのストリームデータから任意の画像を抜き出す、抜き出された画像からカードの画像を抽出、そして同じようなカードをマスターとなるデータセットから同定、という流れだ。英語版の公式サイトにはAPIなどが用意されていなかったために、Rubyのスクリプトでスクレイピング(Webサイトからデータを抽出する技術)を行ってデータを用意したという。

大まかな処理の流れを説明

大まかな処理の流れを説明

認識する際のマスターデータとなるデータセットは、公式サイトのhttps://pkmncards.comを利用した。ここには約1万4千枚のカードが存在するという。

公式サイトのカードデータを利用

公式サイトのカードデータを利用

実際に取り込まれた写真は、影が写っていたり、バックグラウンドがテーブルだったりしたため、背景を白に統一し、影が写りこまないようにするなどの下準備を行ったことも解説された。ここではグレイスケールの画像とマスターデータセットを比較している。これが結果であって、ここに行き着くためにはどういう処理が必要か? を解説するのがこのセッションの目的だ。

取り込まれたデータとマスターデータが一致している

取り込まれたデータとマスターデータが一致している

取り込まれたカードの画像から画像の特徴をエッジとして抽出し、どの部分がカードなのか? を認識するための方法として、Sobel Operatorを紹介している。Sobel Operatorは「局所積和演算を行ってグラジエントの強度(微分値)を求める方法」である。C言語での実装を日本語で解説しているブログを紹介する。

参考:http://image.onishi-lab.jp/002.html

この記事は産総研の大西正輝氏によるもので大学生向けに画像処理を解説したものだ。この記事ではC言語で書かれているエッジ処理を、Peixoto氏のセッションではRustで書いたということになる。

エッジの認識を行うのが最初の仕事

エッジの認識を行うのが最初の仕事

その後にカードの画像の傾きを補正するという処理に移る。

エッジの認識の後に辺の傾きを検知してカード全体を補正する

エッジの認識の後に辺の傾きを検知してカード全体を補正する

その後にPerceptual Hashingというアルゴリズムを使って画像のハッシュ値を求め、それが同じか近似していれば同じカードと判断するという方法を紹介した。この重複する画像かどうかを判断する処理は、YouTubeなどでも著作権侵害などを防ぐためにも使われているという。

Perceptual Hashingを使って同じカードを検出

Perceptual Hashingを使って同じカードを検出

同定したいカードの中身を、カラーのままではなくバイナリー化することでハッシュとして比較するというのがポイントだ。

ハッシュ値を使って同じカードを見つける

ハッシュ値を使って同じカードを見つける

処理の概要は、カラー画像からグレイスケールに変換、エッジの検出、傾きの検出と補正、ハッシュを使ったマッチングということになる。

画像処理の流れを紹介

画像処理の流れを紹介

ただここで難しい状況に遭遇したとして紹介されたのが、同じカードであってもセット(日本語ではタイプ)が違うとカードを認識できないという問題だ。

英語版ポケモンカードの右隅に表示されるセット

英語版ポケモンカードの右隅に表示されるセット

これを認識するにはPerceptual Hashingでは上手くいかなかったとして、予め同じ画像をテンプレートとして用意して、それとの比較を行うという方法を取ったことを解説した。

デモを実施

デモを実施

ここから、実際にPCのWebCamの前にカードを出して認識させるデモを行った。表面に特殊な印刷がされているカードの同定には手間取っている感じはあるものの、ある程度の処理速度で画像認識処理が行われているのがわかる。

最後に、この画像認識プログラムで利用したライブラリーを紹介してセッションを終えた。約14分という短いセッションだが、画像処理という分野にもメモリーセーフで高速なRustが応用できることを紹介したことに意味があると思われる。

利用した画像処理ライブラリーを紹介

利用した画像処理ライブラリーを紹介

image
v4l
nalgebra
img_hash

Rustで書かれた線形代数ライブラリーのnalgebraについては、公式サイトも存在するので参考にして欲しい。

nalgebra公式サイト:https://www.nalgebra.org/

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

サーバー技術解説

Tigeraのアドボケイトが、x86とARMのマルチアーキテクチャークラスターを解説

2022/4/7
ARMの優位性を解説しながら、ARMをx86クラスターに追加するマルチアーキテクチャークラスターを、デモを用いて解説。
システム開発イベント

KubeCon NA 2021からサービスメッシュの2セッションを紹介

2022/3/18
KubeCon NA 2021からサービスメッシュのLinkerdの最新情報とIstioを使ったユースケースのセッションを紹介する。
セキュリティイベント

KubeCon NA 2021、ソフトウェア開発工程のタンパリングを防ぐSLSAを解説

2022/3/9
KubeCon NA 2021のプレカンファレンスから、ソフトウェアサプライチェーンを実装するフレームワークSLSAを取り上げたセッションを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています