Loading [MathJax]/extensions/tex2jax.js

2020-03-31

PythonでFirebaseを用いる際のサービスアカウント情報の設定

最近、ボチボチとGAEとかFirebaseとか、いわゆるGCP周りのサービスを触っているのですが、それらを利用するための認証系のところがいまいち理解できてなくて、急にプログラムが認証できなくなったりして、、、ということがあったのでメモ書きです。

エラーの例
以下のようなエラーがでた場合、認証系のところでトラブってることになります
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or
explicitly create credential and re-run the application.

サービスアカウントの設定方法
GCPの管理画面でサービスアカウントキーを作成してダウンロード(jsonファイル)しておきます。認証設定しないといけない箇所は
  • 環境変数の設定
  • CREDENTIALS情報の読み込み
の2つです。実は、前者の環境変数を設定しておけばコード内に認証情報を明示的に指定する必要はありません。環境変数の設定はシェルで設定するPythonかプログラムで明示的に設定するかのいずれかですが、認証ファイルの情報をコード内で明示的に書かないほうがいいので、シェルで環境変数を設定するのがベターです。Pythonの場合は下記の通りです。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import os
#環境変数
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './xxxxx-credentials.json'
#credentialsの読み込み
cred = credentials.Certificate('xxxxx-credentials.json')
firebase_admin.initialize_app(cred)
db = firestore.Client()


2020-03-11

Python:OpenCVで動画再生時の各フレームの絶対時間を取得する方法

OpenCVで再生している動画(mp4など)に対して、「○時○分○秒の動画を再生したい」という時の各フレームの絶対時間を利用したい場合、そのフレームの絶対時間がわかればいいんですが、どうやら記録されていないようです。そこで、次のアプローチが考えられます。

再生開始時からの経過時間は取得できる
cv2.CAP_PROP_POS_MSECを利用することで、再生中のフレームの経過時間(相対時間)を取得できます。つまり、動画の再生開始の絶対時間さえわかれば、この時間をプラスすることで再生時間がわかります。

再生開始時間を取得するには
動画ファイルの保存時間が1つの手がかりになりますが、それは動画が終了した時の時間になります。ただ、経過時間はわかるわけですから逆算すれば求めることができるでしょう。ただし、ファイルのタイムスタンプは秒が最小ですので、ミリ秒単位での誤差(最大999ミリ)が生じます。

録画時に細工をする
もし、動画録画のアプリケーションに細工ができるなら、録画開始時間を記録しておくとよいでしょう。録画アプリケーションをOpenCV等を利用して作成して、各フレームの時間を記録することもできると思います。どちらがスマートかは As you likeで。。。。

2020-03-09

Python:TkInterを用いてウェブカメラの映像を表示する(OpenCV利用)

前回の記事では、OpenCVのGUIを利用してウェブカメラの映像を表示しましたが、今回はPythonの標準的GUIライブラリであるTkInterを用いて表示してみます。

プログラムのポイント
ポイントは次の2点です。
  • TkInterでの表示形式に画像を変換する
  • TkInterのafter関数を利用して再帰的にループ処理を実現する
このプログラムだと、FPSの数値もほぼ変わりません(数値的にも若干落ちているような気もするという程度)。GUIを操作してもフレーム読み込みの処理が止まりませんので、OpenCVだけのよりはこちらのほうがいいかもしれません。

root=tk.Tk()
root.title("RGB Recorder")
root.geometry("800x600")
root.resizable(width=False, height=False)
canvas=tk.Canvas(root, width=640, height=480, bg="white")
canvas.pack()
def update():#update
global img
global camera
ret, frame =camera.read()
#TkInterで表示できる形式に変換する
img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
canvas.create_image(w/2,h/2,image=img)
root.after(1,update) #本関数を再帰的に呼び出す
#Cameraの設定などは省略してます
update()
root.mainloop()


2020-03-07

Python: Webカメラの映像をOpenCVを用いて表示&録画する

OpenCVを用いて通常のWebカメラの映像を表示&録画するサンプルです。この程度の処理であれば、Pythonでも速度は問題なく出ます。利用したカメラの仕様が30FPSでしたが、このプログラムを計測するとほぼ30FPS出ることを確認しました。(ただし、シングルスレッドなので、ウィンドウ操作をするとFPSがガクンと落ちます)
コーディングにおいて特筆するべきところは、以下の通り。
  • VideoWriter_fourcc関数で動画のフォーマットを決める(どんなフォーマットがあるかは調べてみましょう)
  • readメソッドの戻り値は、読み込みのTrue/Falseとフレーム
#!/usr/bin/env python
from PIL import Image
import cv2 as cv
# FPS
fps = 30
# Frame size
WIDTH=1920
HEIGHT=1080
size = (WIDTH, HEIGHT)
#Setting recording format
fourcc = cv.VideoWriter_fourcc(*'XVID')
#fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G')
#Recording file Setting
video = cv.VideoWriter('sample.avi', fourcc, fps, size)
#Camera Setting
camera = cv.VideoCapture(0)
camera.set(cv.CAP_PROP_FRAME_WIDTH, WIDTH)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, HEIGHT)
try:
while True:
#frame read
_, frame = camera.read()
cv.imshow('image', frame)
#record frame
video.write(frame)
key = cv.waitKey(1)
if key == 27: # ESC key for closing
video.release()
f.close()
break
except KeyboardInterrupt:
print("Close me? -> Enter ESC")


2020-03-04

Python: RealsenseのRGBとデプスのカメラ映像をOpenCVを利用して表示する

おちラボではMicrosoft Kinectを利用したソフトウェア開発をしていますが、御存知の通りKinectは要求するマシンスペックが高いので、なかなか使いづらいというのがあります。単純にデプスカメラとして使うなら、IntelのRealSenseがオススメです。

SDKとライブラリのインストール
リンク先を見てもらえばわかりますが(特にpyrealsense2の方)、Windows環境では何も気にすることなくSDKをとってきて、ライブラリはpipでインストールできます。Macの場合、いろいろ手間がかかりますね。
なおSDKについては、旧ライブラリでは各種認識系のサンプルプログラムが掲載されていたようですが、2.0になってからはないようです。おそらく、認識系のやつはサードパーティの優秀なライブラリを使ってねということなんでしょう(OpenPoseとかOpenFaceとか)。

ソースコードとポイント
1. configの設定
ここでどのストリームを読み込むのかを設定します。解像度やフレームレートなどを決めますが、それ以外のパラメーターについてもconfigで設定するんだと思います。

2.開始後はループ処理で
pipelineクラスを呼び出してstart呼び出し後、ループでフレームを呼び出します。

3.フレームの変換
numpyのasanyarrayで配列変換。depthフレームの場合は、CV2.applyColorMapでカラーマップに変換

あとの処理は通常のOpenCVプログラミングの世界、、ということで思った以上に簡単です。C#でKinectのプログラムを書いたときは、もっと面倒だったような気がしますが。。。。
以下にサンプルを載せます。クリックで全表示です。

import pyrealsense2 as rs
import numpy as np
import cv2
# Configulation of Realsense
config = rs.config()
#The case of reading from bag gile
config.enable_device_from_file('xxxx.bag')
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# start
pipeline = rs.pipeline()
pipeline.start(config)
try:
while True:
frames = pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
depth_frame = frames.get_depth_frame()
if not color_frame or not depth_frame:
continue
# translation to OpenCV Format
color_image = np.asanyarray(color_frame.get_data())
depth_image = np.asanyarray(depth_frame.get_data())
# depth image to Colormap
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.08), cv2.COLORMAP_JET)
# Show Color images
cv2.namedWindow('color_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('color_image', color_image)
# Show Depth images
cv2.namedWindow('depth_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('depth_image', depth_colormap)
#enter q key to exit
key = cv2.waitKey(1) & 0xff
if key == ord("q"):
break
#If it does not work, try below code
#cv2.waitKey(1)
finally:
pipeline.stop()


2020-03-03

OpenFaceを入れてみた(Windows編)


うちは歴史的にKinect使ってモーションとか顔とかの認識をしてきたので、知識がそこで止まってしまっていたのですが、今さらOpenPoseとかOpenFaceとかCV系(画像認識系)のガチンコの方々が作られたライブラリを試すことになり、、、、いや、すごいですよ!!OpenFace!!!

公式ページはこちらっ!
OpenFaceというキーワードで調べると、
の2つが引っかかります。雰囲気的に後者のほうがCMUのラボのライブラリっぽい感じでで由緒正しいような気がしたのですが、違いました。前者のほうが現在も更新しているライブラリです。作者の方もIEEEで学会発表しているアカデミックな方で、今はMicrosoftのSenior Scientistのようです。

インストール方法
公式サイトに行くと、WIKIにいけって書いてあるのでそこへ移動します。
Windowsの場合、バイナリがあるのでそれをダウンロードして展開しましょう。単なるZIPファイルですので展開したら使えます。

モデルファイルのダウンロード
展開したら使えますと書きましたが、正確に言うと顔認識するためのモデルファイルが必要です。モデルファイルは、展開したファイルの中で
  • download_models.ps1
というPowerShell Scriptファイルを実行することで入手します。コマンドプロンプトではなく、PowerShellのコマンドプロンプトを開いて実行(上記ファイル名を入力するだけ)してください。

アプリ構成
Pythonとかのライブラリを想像していたのですが、そういうものはなく(私の勘違いでなければ)、顔画像解析のアプリケーションを提供していてそれを使ってねという感じですね。アプリは、
  • GUIアプリ系
  • コマンドラインアプリ系
と2系統に分かれている感じで、コマンドライン系のアプリは、他のプログラムから呼び出したりする時に使うのでしょう。

OpenFaceの使い方
OpenFaceOffline.exeというのがGUIアプリの記録ツールのようです。GUI系のアプリを動かすとリアルタイムに認識するんですが、想像以上に軽量ですごいです!Kinectとかで同じことをしようと思ったらマシンパワーがすごく必要で手元にあるノートPC(超ハイスペックです)でも重くてだめだったんですが、、、CV系の研究者の技術の高さには感心します。
扱うデータとしては、
  • 動画ファイル
  • イメージファイル
  • ウェブカメラ
からの入力を受け付けるようです。イメージファイルについては、ディレクトリ指定すると複数枚を一括して処理するようです。解析結果は、Processedディレクトリに保存されています。何が記録されるのかは、GUI画面のメニューで指定することができます。

なお、ソースコードを眺めると、Socket経由で呼び出すPythonのサンプルプログラムみたいなのが書いてました。そういう連携方法もあるんですね。後でチェックです。ただ、個人的には自分のGUIアプリ内でリアルタイムの処理を書きたいので、そうなるとソースコードを解読するしかないか、、、

とにかく、OpenFaceは凄いです。お試しあれ!