AITCシニア勉強会 OpenCV入門 ~ラズパイ3でOpenCVとTensorFlowを動かしてみよう~ 2019年4月13日 # ゴール1:顔画像を収集する # ゴール2:カメラに写っているものは何か? # OpenCVで使用するものをまとめてインストール # 今回はpython2とOpenCV2を使用 sudo apt update time sudo apt install libopencv-dev python-opencv xvfb imagemagick apache2 php git python-pip real 19m19.680s user 3m30.168s sys 1m10.862s # OpenCVのサンプルをダウンロード cd /home/pi wget http://aramoto.sakura.ne.jp/20180421/opencv-2.4.13.zip unzip opencv-2.4.13.zip wget http://aramoto.sakura.ne.jp/20180421/html.tar tar xvf html.tar ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ラズパイの画面をブラウザで確認 # Webサーバを起動(起動するたび) sudo service apache2 start # Webコンテンツを準備 sudo cp -rp /home/pi/html/viewx /var/www/html/ # PCのブラウザからアクセス http://ラズパイのIPアドレス/viewx/ # 仮想X-Windowを起動し、画像化し続ける(OSを起動するたび) # 画像化することで、ブラウザで参照できる # 最後の「&」は、裏で実行し続ける、という意味 cd wget http://cloud.aitc.jp/20190413_RaspberryPi2/capture.sh bash /home/pi/capture.sh & # おかしくなったら、capture.sh を止めるか、ラズパイを再起動(sudo reboot) ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ # カメラの画像を表示 cd /home/pi/opencv-2.4.13/samples/python2 export DISPLAY=:1 # capture.sh が動いていること python video.py # 顔認識 export DISPLAY=:1 # capture.sh が動いていること python facedetect.py ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 顔画像をひらすら収集 # 元ファイルをコピー cd /home/pi/opencv-2.4.13/samples/python2 # cp facedetect.py facesave.py # vi facesave.py ----- facesave.py 追加用 ------------------------------------------------- import datetime now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") cv2.imwrite("/var/www/html/faces/img/" + now +".jpg", vis[y1:y2, x1:x2]) print (now + ".jpg saved") -------------------------------------------------------------------------- # 変更結果をダウンロードする rm facesave.py; wget http://cloud.aitc.jp/20190413_RaspberryPi2/facesave.py # Webコンテンツを準備 sudo cp -rp /home/pi/html/faces /var/www/html/ ----- /var/www/html/faces/index.php -------------------------------------- $value){ if (is_dir($dir . $value)) continue; print ""; } ?> -------------------------------------------------------------------------- # Apacheを起動 sudo service apache2 start # 実行 export DISPLAY=:1 # capture.sh が動いていること python facesave.py # ブラウザで収集した顔を参照 http://ラズパイのIPアドレス/faces/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ OpenCV + TensorFlow TensorFlow を導入 # 「pip install tensorflow」は MemoryError で失敗してしまう # 手動で最新のものは、コンパイルエラーが発生してしまう # なので、古いものを手動で導入する cd wget https://www.piwheels.org/simple/tensorflow/tensorflow-1.1.0-cp27-none-linux_armv7l.whl time sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl real 0m58.365s user 0m36.994s sys 0m4.983s # TensorFlowによる画像分類をダウンロード cd wget https://raw.githubusercontent.com/tensorflow/models/master/tutorials/image/imagenet/classify_image.py # 実行 time python classify_image.py # 初回はデータのダウンロードを行うので、遅い real 1m3.187s user 0m34.298s sys 0m4.363s # 2回目はちょっとだけ早い real 0m39.243s user 0m32.379s sys 0m2.665s # 識別可能なもののリスト less /tmp/imagenet/imagenet_synset_to_human_label_map.txt # もしくは less /home/pi/imagenet/imagenet_synset_to_human_label_map.txt # うまくいかないときは、以下も実行 sudo pip uninstall mock sudo pip install mock # video.py を改造して、TensorFlowによる画像分類を呼び出す機能を追加 cd /home/pi/opencv-2.4.13/samples/python2 cp /home/pi/classify_image.py . # cp video.py video2.py # cp classify_image.py classify_image2.py # vi video2.py 追加機能 表示を邪魔せず、キー入力も受け付ける(意外と難しい) 画像保存を bmp → jpeg に変更(メモリ渡しは面倒なのでパス) classify_image2 を呼び出す機能を追加 # vi classify_image2.py 追加機能 外部から呼び出される機能を追加 2回目以降は、重複する処理を省略する ダウンロードしたデータの保存先を変更 # 変更結果をダウンロードする wget http://cloud.aitc.jp/20190413_RaspberryPi2/video2.py wget http://cloud.aitc.jp/20190413_RaspberryPi2/classify_image2.py # 変更点を確認する diff video.py video2.py diff /home/pi/classify_image.py classify_image2.py # 実行 # [Enter]キーを押すと、画面を保存して、imagenetによる画像分類を行う export DISPLAY=:1 # capture.sh が動いていること python video2.py