テストスクリプトその 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)

サンプルスクリプトの動作例
図1:サンプルスクリプトの動作例

 同じディレクトリの output フォルダには顔画像が自動保存されます。認証された顔画像には名前が入ります。(図2)

自動保存された顔画像
図2:自動保存された顔画像。認証された顔画像には名前が入る。

 同じディレクトリに「顔認識動画.avi 」という出力動画が自動保存されます。

自動出力された上述の動画は次のスクリプト動作時に上書きされてしまいますので、この時点で適切な名前に変更してください。