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

OpenCV+pythonで機械学習をやってみた①_導入編

沖田はじめ
2021/08/01

※本記事は、「OpenCVによるAIの実装方法」「機械学習まであと1歩!写真から顔や物体を取り出すには? 実装編第2回」「OpenCVで機械学習をさせてみた!! 実装編第3回」を再編集したものです。

みなさんこんにちは。沖田はじめです。
今回は、今話題のAI(人工知能)について紹介したいと思います。

ここ10年程の間、世界中の様々なシステムが人間の手を介さない自動化の流れに向かっています。車の自動運転化をはじめ、無人コンビニ、Amazonなどの物流システムなど、自動化の流れはどんどん加速してくことでしょう(懐かしいことにAmazonは当初は書籍のECサイトでした)。

そこで、自動化に関連する技術の中で、今流行となっている「機械学習」に関する話と、実際に機械学習のシステムを使ってみてどのぐらい自動化できるかについて話していきたいと思います。

●機械学習とは何か?
まず、機械学習について簡単に説明します。

機械学習とは、人間などの生物が、生きている中で得た体験に対して学習するプロセスを、コンピュータに行わせる手法です。見たものや感じたものに対しての振舞いの定義を人間が決めるのではなく、データに含まれる様々な情報を抽出し学習しながら精度を高めていきます。

機械学習が生まれる過程には、「AI」が関わってきます。
AIとは「Artificial Intelligence (人工知能)」の略で、チェスや将棋、テレビゲームが好きな方にはお馴染みかと思われます。
AIの研究自体は1950年代から行われてきましたが、研究が始まって割とすぐに「機械学習」という研究分野が生まれました。1959年にIBMのエンジニアで「チェッカー」というゲームのプログラムを開発していたアーサー・サミュエル氏が機械学習という言葉を定義したとされています。
また、聞いたことがある方もいるかと思われますが、「ディープラーニング(Deep Learning, 深層学習)」の元となった技術である「ニューラルネットワーク」も同じ頃に、機械学習の研究の過程で誕生しました。ニューラルネットワークとは、人間の脳神経系の動きを数理モデル化するという発想から来た技術です。

しかし、当時のコンピュータの性能はあまり良くなく、計算に膨大な時間がかかるため研究が進まなかったのですが、少し経ったころに「エキスパートシステム」というエキスパート(専門家)が持つ知識を事前にコンピュータに教え込ませるという手法が流行りました(1980年頃)。ただし、こちらもあまり成果が出なかったため、AIの研究自体が再度下火になってしまいました(1990年代半ば頃)。

2000年代に入ると、AIとは別分野で、とある半導体デバイスが急成長していきます。それは、「GPU(Graphics Processing Unit)」と呼ばれる、コンピュータで3次元的な(立体的な)描画(=3DCG)を高速に行うための装置で、近年ではパソコンやプレイステーションといったゲーム機には標準で搭載されています。
GPUは、パソコンにとって人間の頭脳に相当する「CPU(Central Processing Unit)」とは違い、並列に計算を行うために特化した設計がされており、複雑な描画を高速に処理させることで、リアルタイムな画像処理が可能になりました。
この「高速に並列計算ができる」部分が注目され、2000年代の終わりごろには、3次元的な描画のみの用途を超えて、汎用的な並列計算装置として改良されました(GPGPUと呼ばれます)。

表:GPUの歴史

また、ネットワークとクラウドの進化や普及により、大量のデータにアクセスできるようになりました(ビッグデータの取得)。

GPUの進化やビッグデータへのアクセスは、下火になっていたAIの研究にも再び火をつけました。
機械学習の中でも、特に学習に時間がかかると言われているニューラルネットワークに対して、GPUを使って高速に計算させようという動きが出てきました。その過程で、ニューラルネットワーク自体の手法も変化を遂げ、今で言う「ディープラーニング」に生まれ変わりました。

表:AIの歴史

ここまで機械学習の歴史について振り返りましたが、現在の機械学習は大きく分けて「教師あり学習」「教師なし学習」「強化学習」の3つのタイプに分かれています。

・教師あり学習
人間がこれが正解だというデータをコンピュータに教え、コンピュータはそれを「特徴量」という形で溜め込み、学習していく方法です。
例えば、写真の中から猫を探したい場合、人間が様々な猫の写真をコンピュータに与えて学習させます。
人間が与えるデータは教示データとも呼ばれます。

・教師なし学習
人間が正解データを与えなくても、コンピュータは与えられたデータから「特徴量」を自身で抽出し、学習していく方法です。
この特徴量の抽出に、ディープラーニングが使われています。

・強化学習
ある環境下で対象物(エージェント)が得られる価値を最大化するために、試行錯誤を通じて探索する学習方法です。
例えば、ロボットが移動できる距離を最大にしたいという場合、「直進する」「曲がる」「登る」といった行動をまず起こしてみて、その結果を踏まえて別の行動を起こすという感じで、行動を何度も試行錯誤しながら学習していきます。
また、「深層強化学習」といって、ディープラーニングを強化学習に応用して学習精度を高める手法も取られているようです。

図:機械学習の棲み分け

●教師あり学習にチャレンジしてみる!
ここまで、機械学習についてお話しましたが、実際、機械学習はどうやればいいのかと思った方もいるかと思います。
機械学習は、「教師あり学習」「教師なし学習」「強化学習」3つのタイプがあると述べましたが、今回は始めやすいと思われます「教師あり学習」にチャレンジし、機械学習の過程を学んでみたいと思います。

教師あり学習の題材としては、「任意の写真の中に写っている自動車を検出する」というテーマで行います。

なお、今回チャレンジする教師あり学習では、プログラミングが登場します。プログラミングについて未経験の方や難しいと感じる方もいるかもしれませんが、できる限り解説を加えながら話していきたいと思います(驚くべきことに、現在の学校教育では小学校でプログラミングを導入しているところもあるようです)。

まず、画像を対象にした教師あり学習ができる環境を用意する必要があります。
そのソフトウェアの1つとして、「OpenCV(オープンシーブイ)」というものがあります。
OpenCVは、パソコンの頭脳に当たるCPUのメーカーとして有名な会社である「Intel」が開発した、画像処理ソフトウエアです。商用/非商用に限らず誰でも無料で使用できます(BSDライセンスに基づいたオープンソースと言います)。
OpenCVは、2006年にバージョン1.0としてリリースされた後、いくつかのアップデートが施され、2021年6月現在での最新バージョンは4.5.2となっています。

次に、OpenCVを動かすための環境を用意します。
OpenCVの一部の機能は単独では実行できなく、C++(シープラスプラス)やpython(パイソン)といったプログラミング言語を使って動かします。
C++言語はプログラミング初心者には難易度が高く、記述するプログラミングのソースコードの量が多くなるため、初心者が始めやすくコード量が少ないpythonを使用します。
pythonでプログラミングしたソースコードは、読み取って実行できるソフトウェアが必要になりますが、今回はMiniconda(ミニコンダ)というソフトウェアを利用します(無料で利用できます)。

OpenCVやMinicondaの具体的な構築方法は、別途紹介します。

次回は、OpenCVで教師あり学習を行うための基礎知識についてお話したいと思います。

●参考文献
OpenCVによるAIの実装方法
機械学習まであと1歩!写真から顔や物体を取り出すには? 実装編第2回
OpenCVで機械学習をさせてみた!! 実装編第3回
GPUコンピューティングの歴史とCUDAの誕生

この記事を書いた人
沖田はじめ
エディター