神戸のデータ活用塾!KDL Data Blog

KDLが誇るデータ活用のプロフェッショナル達が書き連ねるブログです。

新卒社員がSIGNATEの「間取り図解析アルゴリズム作成」に挑戦してBronzeを獲得した話(4):部屋領域検出編

株式会社神戸デジタル・ラボ Data Intelligenceチームのプラタマです。

前回の記事で、建具検出課題に関して紹介しました。

kdl-di.hatenablog.com

この取り組みを最初から見たい方は、こちらからご覧いただけます。

kdl-di.hatenablog.com

今回は、部屋領域検出をする際に起こった問題や工夫を紹介します。

「間取り図解析アルゴリズム作成」コンペについて

まず初めにコンペ全体について振り返ります。

コンペの目的は、間取り図画像から部屋領域と建具(たてぐ:開口部に設けられた窓や戸、ドア、ふすま、障子といった可動部分とそれを支える枠などの総称)の検出を行うことでした。

私たちのチームでは以下の図のように、部屋領域と建具の検出を別々のAIを用いることで、間取り図解析アルゴリズムを作成する方針を立てました。

f:id:kdl-di:20220110102719p:plain

建具検出のロジックができたことで、次は部屋領域AIを作っていきます。

部屋領域検出で利用したデータについて確認します。

部屋領域検出の際に利用したデータ

f:id:kdl-di:20220111091546p:plain

本コンペでは、約2000枚の訓練データが与えられます。建具はバウンディングボックスで表されましたが、部屋領域はポリゴンで表されています。本コンペでは間取り図から「浴室」「廊下」「LDK」、この3種類の部屋領域を検出できるようになる必要があります。

検出する部屋領域の定義を確認していきましょう。

浴室:バスルーム・シャワーが入った部屋の領域。

廊下:家の中の部屋と部屋を繋ぐ領域。

LDK:リビング・ダイニング・キッチンのどれか一つが入った領域。

LDKの定義は一般的な定義と異なるので注意が必要です。今回の定義の場合、DKの部屋やリビングのみの部屋もLDKと認識することになります。

補足で洋室のアノテーションも付与されていましたが、洋室の検出は評価対象外になっていました。

AI構築に入る前に、定義に従って正しくアノテーションが付与されているか確認する必要があります。

訓練データを見る限り、アノテーションは上記の定義に従って行われているはずですが、いくつかの画像では定義と一致しない場合も見られましたので、その際は修正が必要です。

一般的に良い精度を得るためには、アノテーションを統一基準で行ってから検出を行います。

データセットの変更

アノテーション基準に変動があるため、目視で確認し手動で修正を行いました。アノテーション変更に関して、詳しく解説していきます。 ※アノテーションの修正はLabelMeというツールで行いました。

f:id:kdl-di:20220111141529p:plain

例として、上図のような間取りのLDKがあるとします

今回の間取りでは洗面台部分がLDK領域に存在しています。よって、LDKの領域に洗面台を入れるのも間違っていないでしょう。

ところが、洗面台は必ずしもLDK領域に隣接しているとは限りません。

洗面台をLDKに含んで学習を行ってしまうと、AIは洗面台のある領域を全部LDKだと認識してしまうという問題が発生します。このような場合、洗面台をLDK領域から外すことでアノテーションによる揺らぎを防ぐことができます。

LDKの定義は、リビング・ダイニング・キッチンのどれかが存在する領域です。キッチンとリビングが別の部屋にある間取り図も存在し、この場合LDKの領域が二つになります。こういった間取り図に対してアノテーションがされていない部分が存在したので、こちらの問題も手動で修正しました。

f:id:kdl-di:20220112143248p:plain

最後に廊下です。他の部屋領域と比べて廊下はアノテーションの定義が曖昧だったため「アノテーションの揺れ」が最も多く発生してしまいました。 ※アノテーションの揺れ:定義とはずれた状態でアノテーションがつけられている状態

例えば、玄関のみに繋がるスペースは廊下ではありません(玄関は部屋ではないため)。これに従わないアノテーションは手動で修正しました。

また、家の中に存在する廊下のみが検出対象となるので、上の図のような寮内・アパートの廊下などのアノテーションは除去する必要があります。

部屋領域検出の実際の取り組み

領域検出タスクといえば、よく用いられるAIがいくつかあります。特に有名なのは、「Mask R-CNN」「Cascade Mask R-CNN」「YOLACT」「DeepLab」などです。(課題によって精度が異なります)

建具検出と同様、よく使う領域検出手法のいくつかを比較して本課題で最も精度の良かったものを採用しました。

注意点として、各領域検出AIが利用するデータ形式に従わせるため、それに応じてコンペデータのフォーマットの変換も必要となります。たとえば、Mask R-CNNはCOCO形式のデータを利用しますが、DeepLabはビットマスクを利用します。

実際、領域検出AIは物体検出にも利用できます。領域を出力する以外に、その領域を囲われるバウンディングボックスを出力することも可能です。

領域検出AIの問題点

領域検出AIは、常にくっきりとした境界線を検出できるわけではありません。出力した検出にノイズが発生することがあります。

例えば、領域検出AIがビットマスクで結果を出力すると、ビットマスクからポリゴンに変換する工程でノイズも持ち込まれてポリゴンになってしまう問題が発生しました。

このようにノイズが発生してしまう場合、ノイズを削除する工程を入れ、信頼度の高い領域のみを用いるのが理想的です。

壁で囲われていない部屋の領域を指定するのは難しいです。壁で分けられた部屋だと、どこまでが部屋領域を認識するのがより簡単にできます。ただ、壁で分けずに部屋領域を検出をすると、境界が曖昧になり部屋領域の漏れが発生しやすくなります。

まとめ

今回はコンペ課題の建具認識・部屋領域認識のうち、部屋領域の認識についてお話ししました。

複雑な問題はアノテーションするのが大変で、変動も起こりやすいです。今回のコンペで前処理と後処理が特に重要になるので、AIモデルの強さは必ずしもすべてではないことを実感できました。

次回は順位発表編、連載最終回になります!お楽しみに!


プラタマタウフィクムハンマド

データインテリジェンスチーム所属
データパイプラインとMLOpsを担当。機械学習システムを端から端まで構築します。信頼性・拡張性・保守性のあるシステムを目指します。