iTAC_Technical_Documents

アイタックソリューションズ株式会社

ブログ名

カート内の物体検出ブログ第1回:ブログの概要と背景差分法

はじめに

このブログでは、「AIカートの物体検出」について書いていきます。
カート内に物体が入ったときに、その物体を検出するようなプログラムを作成していく予定です。
カート内の物体を検出することで、カートレジにおいてスキャン忘れやスキャン漏れの心配がなくなったり、また、将来的にはカート内に何が入っているのかを自動的に把握できたりするようになると考えられます。
第1回のこの記事では、ブログの全体の流れと、主要技術である背景差分法について説明していきます。

AIカートの物体検出で得られるメリット

AIカートを導入することによって、得られるメリットは以下の通りです。

  • 買い物が快適になる
  • レジ待ちの時間がなくなる
  • 会計をスムーズに行える
  • レジの人員を削減することができる
  • スキャン漏れがなくなる

AIカートを導入することによって店舗側も顧客側も様々なメリットを享受することができます。
特に、レジを待つ必要がないということは、時間を無駄にしない、ということなので顧客にとって大きいメリットなのではないかと思います。

利用する技術

物体検出を行うAIカートを開発するために、利用しようと考えている技術について触れていきます。
はじめは、画像解析技術の背景差分法を利用して、物体検出をすることができるのかどうか確認していきます。
コンピューターで画像や動画を処理するためにOpenCVというオープンソースのライブラリを使用して実際に開発していきます。

背景差分法とは

背景差分法とは、移動物体の検出方法の1つです。
事前に用意した背景画像と、入力画像の差分を計算することによって移動物体を検出することが可能になります。
言葉で聞いただけではイメージが掴みにくいと思うので図で解説していきます。
以下の図を見てください。

f:id:shizuuuka0202:20191213223138p:plain

左上の背景画像と左下の入力画像の差分を取ったのが、右側の出力画像です。
移動してきた車を検出することができています。
このように、背景差分法を利用することによって、移動物体を検出することが可能になります。

開発環境

  • macOS 10.14.6
  • python3.7.3

開発環境はmacを想定しており,言語はpythonを利用します(プログラム自体は恐らくWindowsでも動作すると思います)。
pythonのバージョンはpython3です。
python2ではOpenCVの一部の関数が動作しないことがあるため、python3を利用します。

OpenCVとは

OpenCVはOpen Source Computer Vision Libraryの略です。
Intelが開発した画像や動画、機械学習に関するプログラミングに特化したオープンソースのライブラリで、画像処理や動画処理、物体検出を行ったり、モーション解析や物体追跡を簡単に行うことができます。
今回はpythonで利用するので、import cv2と記述することでライブラリを扱うことができるようになります。

OpenCVをインストールしよう

OpenCVを利用するためにインストールする必要があります。
ターミナルを開いて以下のコードを実行してください。

$ pip install opencv-python

実行できたら、ライブラリをimportできるかどうか確認してください。

プログラムの作成

OpenCVを扱うことができるようになったところで、早速プログラムを作成していきましょう。
先ほど紹介した図の例で用いたプログラムは以下になります。

# -*- coding: utf-8 -*-
import cv2

#閾値の設定
th=40
# 背景画像を読み込み
cap = cv2.VideoCapture('sample.png')
# 最初のフレームを背景画像に設定
ret, bg = cap.read()
# 最初のフレームをグレースケールに変換
bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)

#  入力画像を読み込み
cap = cv2.VideoCapture('sample2.png')
ret,frame = cap.read()
#入力した画像をグレースケールに変換
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 差分の絶対値を計算
mask = cv2.absdiff(frame, bg)

# 差分画像を二値化してマスク画像を算出
mask[mask < th] = 0
mask[mask >= th] = 255

# 画像を表示
cv2.imshow("output",mask)
# 画像を出力
cv2.imwrite("output.png",mask)
# キーが押されるまで画像を表示したままにする
cv2.waitKey(0)
# 今までに作成された全てのウィンドウを閉じる
cv2.destroyAllWindows()

プログラムの流れ

プログラムの流れは以下のようになっています。

  1. 閾値を設定
  2. 背景画像の取得
  3. 背景画像をグレースケールに変換
  4. 入力画像を取得
  5. 入力画像をグレースケールに変換
  6. 背景画像と入力画像の差分の絶対値を計算し、2値化
  7. 差分画像を出力

まず閾値を設定します。閾値の内容については後で解説します。
2で背景画像を取得し、3で画像をグレースケールに変換します。
4と5も同様です。
OpenCVでは一般的に、背景画像と入力画像をグレースケールに変換してから2値化を行います。このプログラムを実行することで、背景画像と入力画像の差分を取ることができます。
3と5を実行した後の図は以下のようになり、グレースケールになっていることがわかります。

f:id:shizuuuka0202:20191213223248p:plain

このプログラムでは、写真の名前が、sample.pngと、sample2.pngになっていますが、これを自分の画像ファイルの名前に変更して実行してください。

背景画像と入力画像がグレースケールに変換されたところで、6で2値化を行い、7で画像を出力します。出力された画像は以下です。

f:id:shizuuuka0202:20191213223314p:plain

閾値について

2値化を行う時に、閾値より明るい点を白(255)、暗い点を黒(0)とします。
このプログラムでは閾値を40と設定しています。
実際に閾値によって2値化の画像が変わる例を用意したのでご覧ください。thは閾値の値を表しています。

f:id:shizuuuka0202:20191213223342p:plain

この画像の色調は明るいので閾値が40ではほとんどが白色になりました。
閾値を上げていくごとに黒色が増えていることがわかると思います。
このように、画像の用途によって閾値を変えて使い分けることができます。

次回以降

次回は、動画、またはカメラを用いて開発してきます。
動画では、カート内に物を入れたら物体検出することができるのかどうか確認していこうと考えています。

最後に

この記事では、物体検出を行うことができるAIカート開発の概要についてまとめました。
また、AIカートを作ることで、どんなメリットを享受することができるのか、どのような技術を利用して今後の開発を進めていくのか紹介しました。
また、簡単なサンプルプログラムを作成したことで、OpenCVと背景差分法についてもなんとなく理解できたと思います。
今後は、実際にカメラ、または、保存した動画を利用してカート内の物体検出の挙動を確認していきたいと考えています。


次の記事へ

目次に戻る