テストスクリプトその 1
こちらの記事は古くなっており非推奨となりました。
最新のドキュメントは以下から閲覧可能です。
・GitHub FACE01
・FACE01 document
【追記】
wxPython は Python2 専用です。Python3 になってからは wxPython Pheonix に変わっています。
記事執筆時には Python2.7 でしたので ‘Classic’ wxPython のコードとなっています。
Python3 系を使用する場合は最新の wxPython Pheonix のコードに直してください。
‘Classic’ wxPython か Pheonix かどちらがインストールされているか分からない場合、端末から
$ python3 -c “import wx; print(wx.version())”
4.0.1 gtk3 (phoenix)
のようにして確認してください。
‘Classic’ から Pheonix への移行ガイドは wxPython Project Phoenix Migration Guide から確認できます。
また Pheonix 用のサンプルコードは「データベースと GUI のサンプルを紹介!」に記載しましたのであわせてご参照ください。
ではFace01 を用いたテストスクリプトのソースコードを掲載します。
顔認証の検証にはこちらのサンプルスクリプトを用いています。
【追記】
Face01 シリーズの 1.0.4 からは Face01 の呼び出し方が変わりました。
# Face01 ===============================================================
import face01_linux_for_testscript as f
kaoninshoDir, pictures_of_people_i_knowDir = f.home()
known_face_encodings, known_face_names = f.load_priset_image(kaoninshoDir, pictures_of_people_i_knowDir, jitters = 1)
xs = f.face_attestation( kaoninshoDir, known_face_encodings, known_face_names, tolerance=0.5 )
移植性を高めるため等から内部プログラムが変更されています。ご注意ください。
# -*- coding:utf-8 -*-
print 'Start test_script'
# Face01 ================================================================
import face01 as f
known_face_encodings, known_face_names = f.load_priset_image(2)
xs = f.face_attestation( known_face_encodings, known_face_names, 0.45)
# opencv =================================================================
import cv2
import numpy
# wxPython ===============================================================
import wx
import threading
class Sample(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(1400, 600))
splitter = wx.SplitterWindow(self, wx.ID_ANY, style=wx.SP_3DBORDER)
splitter.SetMinimumPaneSize(100)
right_panel = wx.Panel(splitter, wx.ID_ANY, style=wx.BORDER_SUNKEN, size=(600, 600))
left_panel = wx.Panel(splitter, wx.ID_ANY, style=wx.BORDER_SUNKEN, size=(800, 600))
splitter.SplitVertically(left_panel, right_panel)
# メニューバー
menubar = wx.MenuBar()
file = wx.Menu()
quit = wx.Menu()
quit = wx.MenuItem(file, 1, '&Quit\tCtrl+Q')
file.AppendItem(quit)
self.Bind(wx.EVT_MENU, self.OnQuit, id=1)
menubar.Append(file, '&File')
self.SetMenuBar(menubar)
right_panel = wx.ScrolledWindow(right_panel, -1, size=(600,600))
left_panel = wx.Panel(left_panel, -1, size=(800,600))
right_panel.SetBackgroundColour('white')
left_panel.SetBackgroundColour('black')
vbox_right_panel = wx.BoxSizer(wx.VERTICAL)
vbox_left_panel = wx.BoxSizer(wx.VERTICAL)
# grid 設定
grid1 = wx.GridSizer(1000, 4)
# 一行目
grid1.Add(wx.StaticText(right_panel, -1, '記録された画像', (0, 1)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(right_panel, -1, 'プリセットデータ', (0, 2)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(right_panel, -1, '検出人物名', (0, 3)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(right_panel, -1, '日時', (0, 4)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
def repeat_grid():
num = 0
for x in xs:
for n in x:
(name, pict, date, img) = (x['name'], x['pict'], x['date'], x['img'])
print 'name is ', name
print 'pict is ', pict
print 'date is ', date, "\n"
# left_panel の描画
height, width = img.shape[:2]
(width, height) = (800, 600)
img = cv2.resize(img, (width, height))
cv2_image_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
bitmap = wx.BitmapFromBuffer(width, height, cv2_image_rgb)
movie = wx.StaticBitmap(left_panel, -1, bitmap, (0, 0), (width, height))
vbox_left_panel.Add(movie, 0)
img_known_picture = name
img_croped_picture = pict
# ~ exit(0)
if not img_known_picture == 'Unknown.jpg':
file_name = img_known_picture
else:
file_name = 'Unknown'
# img_croped_picture の描画
image2 = wx.Image(img_croped_picture)
self.bitmap = image2.ConvertToBitmap()
img_croped_picture = wx.StaticBitmap(right_panel, -1, self.bitmap, (0, 0), (100, 100))
img_croped_picture.SetBackgroundColour('#ededed')
grid1.Add(img_croped_picture, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL , 5)
# img_known_picture の描画
if not img_known_picture == 'Unknown.jpg':
img_known_picture = 'pictures_of_people_i_know/' + img_known_picture
image = wx.Image(img_known_picture)
self.bitmap = image.ConvertToBitmap()
img_known_picture = wx.StaticBitmap(right_panel, -1, self.bitmap, (0, 0), (100, 100))
img_known_picture.SetBackgroundColour('#ededed')
grid1.Add(img_known_picture, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL , 5)
# 名前の描画
grid1.Add(wx.StaticText(right_panel, -1, file_name, (0, 0)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
# date の描画
grid1.Add(wx.StaticText(right_panel, -1, (date), (0, 0)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
num = num + 1
if num > 990:
break
thread1 = threading.Thread(target=repeat_grid)
thread1.start()
right_panel.SetSizer(grid1)
right_panel.SetScrollRate(10,10)
vbox_right_panel.Add(right_panel, 0, wx.TOP, 10)
vbox_left_panel.Add(left_panel, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL, 10)
self.Centre()
self.Show(True)
thread1.join()
def OnQuit(self, event):
self.Close()
app = wx.App()
Sample(None, -1, 'Sample.py')
app.MainLoop()
wxPython を使っています。右画面は 1000 行まで記録してその後自動で停止します。(図1)
同じディレクトリの output フォルダには顔画像が自動保存されます。認証された顔画像には名前が入ります。(図2)
同じディレクトリに「顔認識動画.avi 」という出力動画が自動保存されます。
自動出力された上述の動画は次のスクリプト動作時に上書きされてしまいますので、この時点で適切な名前に変更してください。