AIによる部資材(鉄筋)の個数カウントについて課題から開発手順まで解説!

AI技術は色々な産業で活用されてきています。

最近ではAIサービスやライブラリが充実しており、AI技術を詳しく知らない人でも活用しやすくなっており、いろいろなところで活用が進められてきています。

今回は、建設業界における活用を紹介していきます。

部資材(鉄筋)の数をAIでカウント

人が何かを数えると、どうしても数え間違いのヒューマンエラーが発生してしまいます。

10個程度を数えている場合、発生率は低いですが、数百を数えるとなると発生率は一気に大きくなります。

人の作業を、機械に置き換えることができれば、ヒューマンエラーが起きにくく、かつ高速に処理ができるようになります。

従来より、パターンマッチングなどの画像処理によって、機械への置き換えはされてきましたが、対象の色味や種類などで見え方が異なるとうまく数えることができませんでした。

しかし、最近のAI技術では色味などの見え方が違っても、上手く数えることができるようになってきているので、このAI技術を使って鉄筋の数を数えるアプリを開発していきます。

今までの作業


人が部資材(鉄筋)のカウントする場合では以下のような課題がありました。

AIにより解決


今回は上記の人が数えるという作業を、AIで置き換えます。

スマフォで鉄筋の写真を撮影して、AIにカウントをしてもらいます。

AIを使うことで、次のように解決できます。

適用するAI技術

今回使ったAI技術について簡単に説明していきます。

画像の分類や物体の位置検出はAIモデルが決まっており、それをそのまま使うことで、AI技術を活用することができます。

今回は「セグメンテーション」+「ヒートマップ」の組み合わせた技術を使っています。

要件

まずは今回の要件について確認していきます。

最大600本を±2%ほどの精度でカウントしたい

どこまでの精度が許容できるかというのはとても大事ですが、今回は±2%ほどを目標としています。

AIの検出が、数本から10本ほどは数を間違えるということになります。

この未検出や誤検出は、AIが検出した結果を人が確認する事で、本数のカウント間違えを防ぐことができそうです。

鉄筋の種類の判定や高さ、幅、径のサイズは不要で数だけをカウントしたい

物体検出では、下記のように物体の種類、位置、幅高さの検知をします。

参照:YOLO論文

今回は、種類や幅、高さが不要で、鉄筋の数さえわかれば良いという特徴があります。

リアルタイムな検知は不要で、カウントに数秒かかってもよい

物体検出などでは、カメラから取得した画像をリアルタイムに処理できるように工夫をすることがあります。この場合、複雑なモデルを使わずに、高速に処理できるものを選定しますが、精度が落ちてしまいます。

今回は、リアルタイム性が不要なので、複雑なモデルを使って精度を狙っていけそうです。

課題

今回の例では、物体検出の技術が考えられるが、以下の課題があります

鉄筋同士が近接しており、バウンディングボックスを使うの技術では難しい

バウンディングボックスを使う物体検出(YOLO)では、最終的に7×7のように小さくなったグリッドごとに犬、自転車、車などを検出していきます。
1つのグリッドで1つの物体を検出できます。

今回のように、鉄筋が密接している場合、7×7のようなグリッドでは、1つのグリッドに検出したい鉄筋が複数含まれるため、検出漏れが出てしまいます。

そのため、グリッドが細かくなるように入力画像を大きくする必要があリます。しかし、撮影した鉄筋がグリッドより小さく写る場合には、やはり検出漏れが出てしまいます。

鉄筋同士が近接しており、セグメンテーションの技術も同様に難しい

他の物体検出する技術にセグメンテーションというものがあります。

これは、下記のように画像の1画素ずつを車、歩行者などクラス分けする技術です。

参照:PSPNet

今回の鉄筋も同様に、1画素ずつ「鉄筋」か「それ以外」かでクラス分けすることが、このセグメンテーション技術では可能です。

ただ、鉄筋同士が近接しているので、下記のように2つの鉄筋があたかも1つのように引っ付いた状態でセグメンテーションされる場合もあり、個数カウントが難しくなります。

鉄筋の数が多く、AIに教えるデータを作るアノテーション作業が大変

AIの学習データを作成するアノテーション作業は、とても大変なものですが、特に今回の鉄筋のアノテーション作業は数百本をアノテーションするためとても大変です。

アノテーション作業は、下記のように、鉄筋1つ1つに四角で囲って、ここに鉄筋があります!とラベル付けする作業です。

精度を上げるために学習データ数を増やす必要がありますが、この作業を簡単にしなければ、大量の学習データを用意することはできないでしょう。

解決案

これらの課題は次のように解決することができます。

セグメンテーションのモデルでヒートマップを学習する

課題であげたように、物体検出やセグメンテーションをそのまま使うのでは個数カウントが難しそうです。

そこで、画像サイズを変更しないセグメンテーションモデルで1画素ずつ「鉄筋」「それ以外」とするのではなく、OpenPoseなどで使われているヒートマップ(下図右上)を学習することで解決していきます。

*ヒートマップは0〜1のように段階的な値をとり、検出したい箇所を中心に山のような形のデータになっています。

参考:OpenPose

ヒートマップを学習し、ヒートマップの頂点の赤い箇所(鉄筋の中心)を数えれば、鉄筋同士が近接していてもうまくカウントできそうです。

数百のデータを学習させて、AIを使ってアノテーション作業の簡略化

学習データ作成には、物体検出のアノテーションでよく使われる、四角を囲っていくツールを使用していますが、このツールが読み込めるデータをAIで作ってあげれば、アノテーション作業が効率的に行えます。

具体的には下記手順を行い、2-4を繰り返すことで学習画像を増やしていきます。

下記は、AIで作ったデータを読み込んだ例です。

いくつか誤検出があるので削除したり、未検出は人が四角を追加して正しいアノテーションデータを作成します。

鉄筋全部を人が四角で囲っていくより断然早くできます。

開発の手順

下記の手順で1ヶ月ほどで、アプリ開発ができます。

学習画像は1000枚までとしてますが、精度アップのため学習データの蓄積と学習は継続して行なっていく必要があります。

【YOLOv5】物体検出の精度と学習結果mAPの読み方について

数百枚をアノテーション

最初は大変ですが、画像を集めて一つ一つアノテーションをします。

集める画像は、普段使うスマフォで普段撮れるような状態で撮影しましょう。

AIを学習

AIの学習では次の手順を踏みます。

数百本の鉄筋のヒートマップを作るのは時間がかかるので、学習しながらヒートマップに変換するのではなく、先にヒートマップのデータを用意しておきます。
ヒートマップでは、鉄筋を四角で囲っている幅や高さは無視して、中心位置の情報だけを使っています。

ヒートマップのデータできれば、そのデータを使って学習します。

AIのライブラリにはKeras、pytorchなどありますが、pytorchを使用しました。

セグメンテーションモデルは、segmentation-models-pytorchのライブラリを採用しました。

モデルはいろいろありますが、resnet34+PSPNetを使っています。

【PyTorch】Dataset、Dataloaderの作成過程 詳細な理解とよくあるミス

アノテーションの簡易化

AIの学習ができたら、それを使って、新しく集めてきた画像からアノテーションデータを作成します。

アノテーション作業について 注意点や工夫点、外注コストを解説

出力したXMLデータをアノテーションツールで読み込むことで、数百本全てを四角で囲わなくても、数本チェックしていくだけでアノテーションができるようになります。

これによって、学習データを一気に量産することができます。

【YOLO】簡易アノテーションについて【物体検知】

スマフォアプリ開発

今回は、社内での配布のしやすさから、アンドロイドのスマフォアプリ開発を行います。

アンドロイドはgoogle社のOSなので、tensorflowやKerasが実装しやすいかもしれませんが、pytorchも簡単に実装できます。

興味のある方は下記を参照ください。

https://pytorch.org/mobile/android/

スマフォの処理は、以下の4ステップです。

ヒートマップだけでは、アプリがカウントしている箇所なのか明確にならないので、赤い十字マークでカウントしている鉄筋を明確にして、人がダブルチェックできるようにします。

まとめ

完成したアプリです。
アルバムから画像を選んで、本数の確認をしています。

このように、AI技術は私たちが行う単純作業の代替ツールとして利用することができます。

人材不足が深刻な業界ではAIの導入を積極的に進める必要があり、若手の僕たちが先陣を切って開発技術を学んでいきましょう。

【PyTorch】GPUのメモリ不足エラーの対処方法