人の検出を行いたくてpythonでopencvを使い検出するプログラムを作って(コピペ)みたのですが
デフォルトで用意されているカスケード分類器だと検出精度が非常に悪く、これを実用的に使うのは厳しい・・・
カスケード分類器を自作して学習させるという方法があるのを見つけたのですがこれがまた準備がすごく大変で
きちんと検出させるには7000枚くらい画像を用意しなければいけないらしく今すぐやりたい僕としては他の方法を探していました。
さんざん検索しまくって見つけたのが下記
https://punhundon-lifeshift.com/object_detection_python
10行のコードで物体検出ができるという記事、正確にはこの記事もその紹介記事になるんですが日本語で説明してあってわかりやすかったのでこちらを参考にやってみました。
python3.xがインストールされているという前提になります。
まずはライブラリのインストール
pip3 install tensorflow
pip3 install numpy
pip3 install scipy
pip3 install opencv-python
pip3 install pillow
pip3 install matplotlib
pip3 install keras
上記の記事だとpip3だと駄目だと書いてありましたが、エラーはかなり出ましたけど検出自体はできました。
もと記事を書かれた作者の方がライブラリを作っていてそれも必要なのでインストール
pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl
モデルファイルをダウンロード
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
適当なディレクトリを作りすべてのファイルをそこに保存します。
testとかなんでもいいです。
cd test
testディレクトリ内に例の10行pythonコードを保存
from imageai.Detection import ObjectDetection
import os
execution_path = os.getcwd()
detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
for eachObject in detections:
print(eachObject["name"] , " : " , eachObject["percentage_probability"] )
とりあえずtest.py とします。
結果のdetectionsには色々種類があってpersonで集計すると人のカウントが可能です。
どこかから検出させたい画像を拾ってきてimage.jpgで同じディレクトリに保存
そして実行!
python3.6 test.py
検出結果が
imagenew.jpg に保存されます。
パーフェクト!検出力がすごいです!
では、opencvのみだと
3つのみ
(haarcascade_fullbody.xmlを利用しました。)
ただ、1つ目の方も問題点があって処理時間が1分くらいと長いこと。
それに下記のようなエラーが実行時に出ます。
エラーが出た原因が調べてみるとおそらくtensorflowのバージョンの問題のようで
WARNING:tensorflow:From /usr/local/lib64/python3.6/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.
のようなエラーがたくさん出ていました。
tf.global_variablesは推奨されていないのでtf.compat.v1.global_variablesを使いましょうってことみたいなんですが
tensorflowの新しいバージョンを入れてもうまく動作しませんでした。
ひとまず、動かしたかったので1.14.0でやってみました。
10行コードが速ければ言うことないんですが
次は自作のカスケード分類器を造って物体検出を行ってみようかと思います。