未来を創る、テックコミュニティー

OpenCVによるAIの実装方法

シンラボ編集部
2019/09/16

※本記事は、未来技術推進協会ホームページにて2017年12月5日に掲載されたものです。

OpenCVで機械学習が実現できる!?

前回は機械学習とディープラーニングのそれぞれの特徴をあげました。
機械学習を試してみたいと思う一方で、実際にどうやって実現されているのでしょうか?


実現方法の一つにOpenCVというものがあります。
OpenCVは、インテルが作成したオープンソースの画像処理ライブラリです。

インテルによって開発されたOpenCVは、すでに10年以上の実績があり、2006年にバージョン1.0がリリースされた後、いくつかのマイナーアップデートやメジャーアップデートが施され、最新のバージョン3.3がリリースされています(2017年11月現在)。
しかも、BSDライセンスに基づく限り、商用/非商用に限らず無料で使用できるという、取り組み易い代物なのです。

コンピュータプログラミングについて多少の知識がある方は、ぜひOpenCVを使ってみると機械学習と仲良くなれるかもしれません。

試してみたい方はこちらのOpenCVのダウンロードサイトより入手可能です。
https://opencv.org/

機械学習ができる3つのプロセス

OpenCVで機械学習を行うためには、大きく分けて3つのプロセスに分かれます。

  1. 前処理: 物体検出が行いやすいように、画像の前処理
  2. 物体検出: 物体の検出を行い、画像から物体を切り出す
  3. 機械学習の準備: 切り出した画像から、予測や学習を行うための準備

OpenCVによる機械学習のキーワードとなるのは、画像処理です。
デジタルカメラで静止画や動画を撮り、人物や車両といった「物体」が映っている画像を撮れば、機械学習の入り口に立ったも同然です。

画像処理は静止画に対して行うものですので、動画の場合はffmpeg などのソフトウェアを使って「静止画」を作り出します。

では、本題に戻って、機械学習の方法へ行ってみましょう。

ステップ1.前処理

前処理では、撮影した画像に対して物体検出をしやすいように加工を施すといったことを行います。
今の時代、撮影した画像はカラー画像であることがほとんどですが、物体検出のためには色情報はあまり必要ありません。
物体検出には色素情報ではなく輪郭情報が必要とされるのです。

OpenCVでカラー画像をグレースケール化するには、たった2行のおまじないなのです。

img = cv2.imread(path) // path は画像ファイルのパス。
grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

このグレースケール化した画像ですが、ノイズ(エラーとなる情報)が含まれています。
ノイズがあると物体を正しく検知できません。
物体を正しく検知するには、「輪郭がはっきりしていること」、「輪郭が連続していること」が必要になるのです。
そのためには、「閾値処理」と「フィルター処理」といった処理を行います。

閾値処理とは、「ある値」を境に取り込む値と取り込まない値とを区分けることです。
グレースケール画像は、一般的に 0 ~ 255 までの256段階の階調を持っています。
0 が黒、128 が灰色、255 が白といった表現をとります(最近ではHDR画像などが出てきてより多くの階調を扱うことができるようになりました)。

指定した階調(画素)の値を閾値として設定し、余分な情報を0(黒)または255(白)にすると、画像上にある意図しない点(ごみ)を消したり、逆に輪郭を強調するといったことができるのです。

もう一つ、フィルター処理は、輪郭がはっきりしないところをはっきりさせます。画像の平滑化ともいいます。
代表的なものに、「ガウシアンフィルター」があり、画像をぼかして、はっきりと見える部分だけを抽出することができるのです。

OpenCVでは、なんと、たった一行のおまじないでフィルターをかけることができるのです。

filtered = cv2.GaussianBlur(img, (11, 11), 0)

imgは対象画像、11はガウシアンフィルタのサイズ(縦、横)、0は標準偏差を表し、
数字は大きくするとぼけの度合いが強くなります。


OpenCVの標準機能として搭載されているフィルターは、ほかにも数多くあります。
しかも、OpenCVについて詳しければ、自分のオリジナルのフィルターをかけることも可能なのです
(ただし、行列や畳み込みといった知識が必要になります)。

次回は、物体検出と機械学習のための準備について追ってみましょう。

参考

この記事を書いた人
シンラボ編集部
エディター