TECH
公開日:

PythonとOpenCVを組み合わせた画像認識について

今回の記事では、PythonとOpenCVを組み合わせた画像認識についてご紹介します。

Python(パイソン)は簡単な文法と多様なライブラリが魅力でもあるプログラミング言語です。そして、OpenCVは静止画や動画を扱うことのできるライブラリです。プログラミング言語であるPythonと画像処理ライブラリであるOpenCV、この2つを組み合わせることによって、静止画や動画に対していろいろな画像認識を行うことができます。

静止画、動画は文字情報よりも圧倒的に多い情報量を持っていることが特徴でもあります。この多い情報量を人間の目で見分けるのではなく、パターン認識によってAIに任せることができるようになってきています。その背景にはビッグデータの活用とコンピュータ性能の進化があります。
この記事では、PythonとOpenCVの紹介に加えて、両者を組み合わせることによって可能となる画像認識についても紹介します。

Pythonの特徴とは?

シンプルさ

Pythonは少ないコード量で簡単にプログラムが書けること、またコードが読みやすいというメリットがあるプログラミング言語です。Python以外のプログラミング言語を経験した方はその比較を通してPythonの構文の読みやすさを感じることでしょう。Pythonは、書くこと読むこと両方において素晴らしいプログラミング言語です。

通常、プログラムの規模が大きく複雑になってくるとコードも複雑になり、読みづらくなります。さらに、見づらくなることで文法ミスが起こりやすくなり、一般的に開発効率が落ちる傾向がみられます。
その点、Pythonは規模が大きくなっても複雑になりづらく、とてもシンプルで読みやすい文法が特徴です。したがって、習得するのも他の言語に比べて、容易と言われています。
実際、子供のプログラミング教育用として導入されているほどです。学習の障壁が低いというのは子供向けとしても適していると言えるでしょう。シンプルなプログラミング言語ほど、その後の学習意欲の継続もしやすいです。

幅広い用途

Pythonは用途としても、人工知能(AI)やWeb開発、教育など幅広い分野で使われています。科学技術計算に強いという特長があり、最先端分野で必要とされるプログラムを効率よく作成することができます。
それを可能とするのは、標準ライブラリとサードパーティのモジュールが用意されているからでもあります。機能を拡張したいときに、拡張モジュールをC言語やC++で書くことが容易です。

Pythonは、Windows、Linux、Macなど多くのオペレーティング・システム(OS)で使うことができます。用途は今後もさらに広がり、Python需要はますます高まるでしょう。

Python人気は急上昇!?

【出典:TIOBE Programming Community Indexc

プログラミング言語の人気ランキングを発表しているサイトTIOBE Programming Community Index(以下、TIOBE)の2018年プログラミング言語人気ランキングでPythonが上位3位に入りました。JavaとCに続く第3位です。

前述した「シンプルで読みやすい」コードで初心者にも学びやすく、「多様なライブラリやモジュール」を容易に活用できる点などの特徴から、Pythonは、産業界だけでなく、大学でもプログラミングを必要とする全ての科目で最初に選ばれる言語となっています。
TIOBEでは、これまでPythonが3位以内に入ったことはありませんでした。Pythonは大規模な組み込みシステムで使用されることが増えているため、いずれは現時点で首位のJavaを超える可能性もあります。

オープンソースのライブラリ集 OpenCVとは?

OpenCVはインテル社が開発したオープンソースのライブラリ集で、静止画や動画を処理するのに必要な各種機能がまとまっている、とても便利な存在です。クロスプラットフォームであり、WindowsやiOS、Androidなどもサポートしています。また、対応しているプログラミング言語にはC言語、C++、Python、Javaがあります。

具体的には、主に以下の機能が用意されています。

  1. 直線や曲線,テキストなど画像への描画
  2. OpenCVで使用したデータの読み込みや保存
  3. エッジ等の特徴抽出や画像の幾何変換
  4. 物体追跡や動き推定
  5. 物体検出などのパターン認識
  6. カメラ位置や姿勢の検出
  7. コンピュータにパターンを学習させる
  8. 静止画・動画の読み込みや保存・表示・ビデオ入出力

OpenCVを使うことによって、専門知識がない人でも、エッジを抽出したり、ぼかしたりといった画像処理プログラムを簡単に書くことができます

OpenCVには、画像の中から物体を検出してくれる画像認識のプログラムが既に用意されています。他にもサンプルプログラムが用意されていますので、それらをベースにして、プログラムとして実装したい機能を追加していくと良いでしょう。1から全部プログラミングすると大変であるためです。
BSDライセンスで配布されているため、学術用途だけでなく商用目的でも利用できます。また、マルチプラットフォーム対応でもあるため、幅広い場面で利用されていることが特徴です。

画像認識の基礎知識

「画像認識」とはいったい何でしょうか。
画像というのはコンピュータ上では、全てピクセル単位で扱われています。コンピュータは「⁠このピクセルは赤で、このピクセルは青で」ということは理解しているのですが「⁠この画像には人の顔が映っている」ということは理解することはできません。
コンピュータに対して、画像の中に何が映っているのかを理解させるのが画像認識技術です。人間が当たり前のように無意識・無自覚で行っている視覚の機能をコンピュータにも持たせようという研究分野なのです。

画像の内容をコンピュータに理解させるためには、ピクセルの集合からなんらかのパターンを抽出する必要があります。ピクセル1個1個を個別に見ていくのではなく、1つの集合として見ることによって、集合が持つパターンをもとに、画像が何を表しているのかを判断していきます。

人間は、画像に写っているものが何であるか、それまでの人生で蓄積した経験から理解して判断することができます。しかし、コンピュータは人間と同じような経験を蓄積しているわけではないので、画像に何が写っているかを理解することができません。
その代わり、多くの学習用画像データから、対象物の特徴を学習させることによって、未知の画像を与えた時、対象物が何であるかを表現することができます。
画像認識の歴史は古く、1960年頃から研究されてきました。昔はコンピュータの性能が低かったため、限られた分野での利用が主でしたが、性能が高くなってきた現在ではパソコン、デジタルカメラやスマートフォンなど、多くの電子機器に画像認識が取り入れられています。

また、画像認識はAIにおけるディープラーニング技術とコンピュータ性能の進化により、近年著しい進化を遂げています。

PythonとOpenCVを使った画像認識の実例紹介

PythonとOpenCVを使った画像認識の実例を2つご紹介します。

実例①映画マトリックス風映像を作る

映画マトリックスで使われた特撮技法を実現するシステムがあります。
具体的には、スローモーションで動く被写体を、カメラが移動しながら撮影しているように見える動画を撮影できるシステムです。USBカメラ60個を円形に配置し、30台のRaspberry Piでコントロールし撮影します。

ちなみに、Rasberry Piは、一般人でも購入することのできる小型コンピュータです。LinuxベースのOSをインストールすることができるため、小さいパソコンのようなイメージですね。ハードウェアを追加するなど、活用範囲も幅広く、趣味から仕事まで使うことができます。
60個のカメラは、全て同じ一点に視点を合わせておかないと、静止画を動画化した場合、画像にブレが生じて見づらくなってしまいます。このため、カメラ設置時に目印となるマーカーを置いて、マーカーが画面の中央になるようにカメラの視線を手動で合わせます。

OpenCVを使うことで、画像の中に写っているマーカーを検出することができ、画面中央とマーカーのずれを求めることができます。さらに、そのズレを修正することも可能です。ズレの修正機能はPythonで実装しています。
【参考】ラズパイにつないだカメラ60台でマトリックス風の特撮を実現、視線のズレをOpenCVで補正

実例②ゲームの勝敗自動記録システム

任天堂Wii Uのゲームソフト「スプラトゥーン」はアクションシューティングゲームです。
1ゲームが約3~5分という短時間でプレイすることが可能で各ゲームの最後に「WIN」や「LOSE」という言葉が画面に表示されるのですが、通算のバトル履歴や勝率を確認する機能はついていません。その不便さに気づき、自分の勝率を自動記録する仕組みを作った人がいます。
仕組みとしては、まずRaspberry Piを使ってゲーム画面をキャプチャします。そして、段ボール箱の上にカメラを固定して、ディスプレイの方向にカメラを向けて撮影します。

次に、キャプチャ画像の中に「WIN」か「LOSE」の文字が表示されているかどうかをOpenCVによる画像認識で判定します。OpenCVを使えば、画像の中にある特徴から、特定の文字が含まれているかを調べることができます。
手順は以下です。これら一連のアルゴリズムをPythonで実装しています。

  1. サンプル画像の取得
    「WIN」か「LOSE」のどちらかが表示されている画像と、どちらも表示されていない画像の3種類のサンプルを用意します。
  2. 特徴の抽出
    結果画面の「WIN」「LOSE」が表示される場所の座標を示していきます。特徴点を検出していくことによって、文字の表示場所を全ての画像で指定していくのです。
  3. 検出器の生成
    生成された特徴点が含まれるテキストファイルをもとに、次はOpenCVのコマンドを使用して検出器を生成します。
  4. OpenCVの画像認識コードの実装
    最後に、検出器を使って画像認識のコードを実装します。

検出結果は、結果画面のキャプチャ画像と勝敗結果をアップロードすることで、web上に自動で記録して勝率を算出しているそうです。

このように、Raspberry Piのカメラ機能とPythonとOpenCVを使った画像認識のプログラムを組み合わせることができます。大量の画像、映像の中から特定の文字、特定のものを検出することができるのです。
【参考】スプラトゥーンの対戦勝率を自動で記録する仕組みを自作したプレイヤーが登場

PythonとOpenCVを組み合わせた画像認識についてのまとめ

今回はPythonとOpenCVを組み合わせた画像認識についてまとめました。
Pythonは最近、人気が高まってきているプログラミング言語で、AIの分野でもよく使われていることから、これからさらに需要が高まっていくことが予想されます。

OpenCVは多様な画像処理機能を持ったライブラリであり、画像認識にも不可欠な存在です。PythonとOpenCVを組み合わせることによって、いろいろな画像認識が可能となることがお分かりいただけたのではないでしょうか。
ビッグデータとディープラーニングの進化によって、AIの導入に対する障壁は確実に下がりました。事例でも分かる通り、今後様々な業界で画像認識や機会学習が活用されることになるでしょう。

日本にはまだまだ機会学習を習得しているエンジニアは少ないため、是非この機会にPythonと機会学習などを学んでみてはいかでしょうか?

おすすめ案件


・  【Python】《Fintech X AI》サービスの開発・研究の案件・求人情報
月額支払額 1,050,000 〜1,200,000円
契約形態 業務委託
勤務地 東京都千代田区

・ 【Python】AIベンチャーのデータサイエンティストの案件・求人情報
月額支払額800,000 〜900,000円
契約形態 業務委託
勤務地 東京都港区

・ 【Python/データ分析】ディープラーニング系スタートアップ某社 自社ソリューション開発のデータ分析の 案件・求人情報
月額支払額 550,000 〜850,000円
契約形態 業務委託
勤務地 東京都品川区

フリーランス専門の案件紹介サービス【エミリーエンジニア】が多くの方に選ばれる『理由』

① 月額70万円以上の高単価案件、週5日案件が多数!

フリーランスの一番の不安は、安定的な収入の確保。【エミリーエンジニア】では、あなたの条件やスキルにマッチした週5日案件を中心に紹介できるから、安定的な収入確保が可能。平均年収800万円以上と高単価案件も多数。安定的な報酬の確保したいエンジニアに選ばれています。

② 成長企業の直案件にこだわり、他社にはない独自の優良案件が豊富!

【エミリーエンジニア】では、ベンチャー企業や成長企業の直エンド案件にこだわっているため、高単価」「最新技術」「やりがい」等が揃った優良案件を多数取り揃えています。10年以上の実績と独自のネットワークをもつ会社だから紹介できる他社にはないPython案件もあります。優良案件にこだわりたいエンジニアに選ばれています!

③ 専任担当者によるフォロー体制と手厚い福利厚生!

【エミリーエンジニア】では、キャリアカウンセリング、企業への営業や条件交渉、契約周りや参画後のフォローまで、専任担当者が一気通貫でサポートします。契約終了時にも、新たな案件提案も行うため途切れなく働くことが可能です。また、補償制度や、定期的な健康診断、業務過誤など福利厚生もサポート安心して働きたいエンジニアに選ばれています。

おすすめ案件

関連タグ

フリーランスエンジニアの案件をお探しします!
上記案件のほか、非公開のPython案件も多数あります