なになれ

IT系のことを記録していきます

【初心者向け】Pythonによる画像処理について(人物認識)

2018年にやったこととしてPythonによる画像処理に取り組みました。
顔検出、顔認識、人物検出、人物追跡といった「人」が画像処理の対象でした。
そこで得られた知識をまとめたいと思います。

筆者は主にWeb領域のソフトウェアエンジニアで画像処理を専門に取り組んできたわけではないです。
本投稿は、そこそこプログラムが書ける立場で画像処理に取り組んだ経験を元にした内容になっています。
Pythonに関してもほぼ経験がない状態でした。

画像処理における前提

  • 画像処理にはPythonが良い
    • OpenCVが手軽に使える
    • 計算処理が簡単にできる
    • そのほか機械学習系のライブラリが充実している

OpenCVは画像処理に必要な機能が豊富なライブラリです。
OpenCV-Pythonチュートリアルとは — OpenCV-Python Tutorials 1 documentation

顔検出の機能もあります。
Haar Cascadesを使った顔検出 — OpenCV-Python Tutorials 1 documentation

Pythonの環境構築

Anaconda

Anacondaという諸々のライブラリが入ったPythonパッケージを使うのが良かったです。
www.python.jp

Jupyter Notebookでインタラクティブな開発環境を作ることができますし、NumPyなど計算処理向けのライブラリが同梱されています。

opencv-python

非公式ながらOpenCVを簡単にインストール可能なPythonパッケージがあります。
pypi.org

OpenCVを使う時にはとりあえず使っています。

画像処理向けのWebAPIサービス

画像処理をするにあたって、手始めに画像処理サービスをいくつか使いました。
この手のサービスでは、WebAPIを実行するだけで画像の処理を行うことが可能になっていて非常に手軽に利用できるので、入門としては適当だと思います。

Cognitive Services

Microsoftが提供するAIのWebAPIサービスです。

FaceAPIを使いました。顔を検出して、年齢、性別といった属性情報を取得できます。
azure.microsoft.com

Amazon Rekognition

Amazonが提供するAIのWebAPIサービスです。

顔の検出や分析の機能を利用しました。
aws.amazon.com Cognitive Servicesとの違いとしては以下のような点がありました。

  • 動画をそのまま扱える
  • 得られる年齢の幅が広い
  • 横顔の顔検出にも対応できている

こういったWebAPIで利用できるAIのサービスには大きな違いはないというのが印象です。

オープンな手法を活用した実装

実際の状況に当てはめると画像処理サービスでは対応できないことが多いため、自分たちで実装を行う必要があります。
特に実際の状況に応じて画像処理の精度を高めたい場合には作りこみが必要になります。
OpenCVなどを活用しながら実装を進めます。

今回は物体認識という分野の画像処理になります。
対象とする物体は「人」ということになります。
昨今の物体認識ではディープラーニングを元にした手法が主流になっていて、その中でも代表的な以下の手法があります。

  • SSD(Single Shot Multibox Detector)
  • YOLO(You only look once)
  • R-CNN(Region CNN)

Mask R-CNNという手法は画像から物体の領域を特定することが可能になっていて、物体の検出精度も高い手法になっています。

github.com

ただ物体の検出は処理時間とのトレードオフになっています。 精度が高い手法はその分だけ処理時間もかかってしまうという問題を抱えていて、ユースケースに応じて使用する手法を選ぶ必要があります。
リアルタイムでの処理が必要な場合、処理時間が短い手法を選ぶ必要がありそうです。
R-CNN系の手法に比べて、SSDやYOLOは処理時間が短い手法になっています。

SSD
GitHub - weiliu89/caffe at ssd

YOLO
YOLO: Real-Time Object Detection

人物検出および人物追跡

検出は追跡に比べて時間がかかります。また、物体に識別子をつけることで同じ人物を誤認識することを回避できます。
物体に識別子をつけるという処理は追跡でしか出来ないために人物検出と人物追跡を組み合わせる必要があります。
この点に関して、こちらの内容が参考になりました。

www.pyimagesearch.com SSDと物体追跡の手法を組み合わせたものになります。

物体追跡では、OpenCVにもいくつかの手法があります。

www.pyimagesearch.com

追跡には様々な手法が提供されていますが根本的な問題があります。
それは追跡では物体の重なりによって追跡対象が切り替わる可能性があることです。これは追跡の根本的な欠陥です。
追跡の手法にリソースをかけても根本的な解決にはならないので、処理時間が短く精度がそれなりに高い手法を選ぶのが良いと思います。
本当に正確な追跡を行いたい場合、3Dのデータを活用して物体の奥行きを把握しなければなりません。

まとめ

Pythonによる画像処理という課題を通して、画像処理の現状を知ることが出来ました。
取り組んでみての所感としては、画像処理というのはまだまだ専門的な領域であるということです。
この領域ではディープラーニングを元にした多くの手法が短期間で提案されて発展しています。
このような状況をいちソフトウェアエンジニアがキャッチアップすることは難しく、画像処理の専門家が必要な状況です。
今回は実施していないのですが、精度を求めていくとその状況に応じたデータを用意してモデルを作成しなければ難しいという結論になり、そのための専門的なスキルが新たに必要になります。

機械学習を簡単に実施可能なライブラリがオープンに利用できるような状況になっていて、いちソフトウェアエンジニアが機械学習の範囲でやれることが増えたことは間違いないと思います。ただし、その領域を本格的に実施する場合には、ただライブラリを利用できるだけでは難しく、その分野での専門的なスキルが必要だということを感じました。