python dlib学習(四):単一目標追跡
前言
dlibはdlib.co rrelationを提供しています。トラッカー類は目標を追跡するために用いられます。公式文書の入り口:http://dlib.net/python/index.html#dlib.correlation_トレーラーは複雑ではないので、紹介しません。後は直接二つのプログラムを提供します。コメントがあります。
プログラム1
実行結果
初期の場合、ウィンドウには第一フレームの画像のみが表示されます。マウスで枠をドラッグして、赤い枠の中の目標を押した後、車を戻して、枠内を識別目標に設定します。リアルタイムで識別し、オレンジ枠で表示する。ESCキーを押して終了します。(csdnは2 Mの写真しかアップロードできません。本当につらいです。)
プログラム2
前のプログラムのせいで、関数だけを熟知して書いたので、卵が痛いと思います。もう一度包装しました。だいぶ楽になりました。
実行結果
操作にはいくつかの変更があります。最初は自動的にカメラから画像を採取して表示します。スペースを押して、一時停止します。またスペースを押すと、リアルタイム表示に戻りますが、目標トレースは行いません。一時停止する時、マウスをドラッグして赤い枠が表示されます。車を押して、赤い枠内の物体を目標として認識します。その後、リアルタイムに識別され、オレンジ枠で表示される。ESCキーを押して終了します。
公式ルーチン
dlibはdlib.co rrelationを提供しています。トラッカー類は目標を追跡するために用いられます。公式文書の入り口:http://dlib.net/python/index.html#dlib.correlation_トレーラーは複雑ではないので、紹介しません。後は直接二つのプログラムを提供します。コメントがあります。
プログラム1
# -*- coding: utf-8 -*-
import sys
import dlib
import cv2
tracker = dlib.correlation_tracker() # correlation_tracker()
cap = cv2.VideoCapture(0) # OpenCV
start_flag = True # , ,
selection = None #
track_window = None #
drag_start = None # ,
#
def onMouseClicked(event, x, y, flags, param):
global selection, track_window, drag_start #
if event == cv2.EVENT_LBUTTONDOWN: #
drag_start = (x, y)
track_window = None
if drag_start: # ,
xMin = min(x, drag_start[0])
yMin = min(y, drag_start[1])
xMax = max(x, drag_start[0])
yMax = max(y, drag_start[1])
selection = (xMin, yMin, xMax, yMax)
if event == cv2.EVENT_LBUTTONUP: #
drag_start = None
track_window = selection
selection = None
if __name__ == '__main__':
cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
cv2.setMouseCallback("image", onMouseClicked)
# opencv bgr rgb
# b, g, r = cv2.split(frame)
# frame2 = cv2.merge([r, g, b])
while(1):
ret, frame = cap.read() # 1
if start_flag == True: # ,
# , , , ; ?
while True:
img_first = frame.copy() # ,
if track_window: # ,
cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (0,0,255), 1)
elif selection: #
cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (0,0,255), 1)
cv2.imshow("image", img_first)
# ,
if cv2.waitKey(5) == 13:
break
start_flag = False # ,
tracker.start_track(frame, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) # ,
else:
tracker.update(frame) # ,
box_predict = tracker.get_position() #
cv2.rectangle(frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1) #
cv2.imshow("image", frame)
# ESC ,
if cv2.waitKey(10) == 27:
break
cap.release()
cv2.destroyAllWindows()
注:プログラムカードがあれば、cv 2.waitKey()のパラメータを調整します。つまり遅延時間です。小さくしてもいいです。実行結果
初期の場合、ウィンドウには第一フレームの画像のみが表示されます。マウスで枠をドラッグして、赤い枠の中の目標を押した後、車を戻して、枠内を識別目標に設定します。リアルタイムで識別し、オレンジ枠で表示する。ESCキーを押して終了します。(csdnは2 Mの写真しかアップロードできません。本当につらいです。)
プログラム2
前のプログラムのせいで、関数だけを熟知して書いたので、卵が痛いと思います。もう一度包装しました。だいぶ楽になりました。
# -*- coding: utf-8 -*-
import sys
import dlib
import cv2
class myCorrelationTracker(object):
def __init__(self, windowName='default window', cameraNum=0):
#
self.STATUS_RUN_WITHOUT_TRACKER = 0 # ,
self.STATUS_RUN_WITH_TRACKER = 1 # ,
self.STATUS_PAUSE = 2 # ,
self.STATUS_BREAK = 3 #
self.status = self.STATUS_RUN_WITHOUT_TRACKER #
# 1
self.track_window = None #
self.drag_start = None #
self.start_flag = True # ,
#
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)
cv2.setMouseCallback(windowName, self.onMouseClicked)
self.windowName = windowName
#
self.cap = cv2.VideoCapture(cameraNum)
# correlation_tracker() , , 1
self.tracker = dlib.correlation_tracker()
#
self.frame = None
#
def keyEventHandler(self):
keyValue = cv2.waitKey(5) # 5ms
if keyValue == 27: # ESC
self.status = self.STATUS_BREAK
if keyValue == 32: #
if self.status != self.STATUS_PAUSE: # , ,
#print self.status
self.status = self.STATUS_PAUSE
#print self.status
else: # , ,
if self.track_window:
self.status = self.STATUS_RUN_WITH_TRACKER
self.start_flag = True
else:
self.status = self.STATUS_RUN_WITHOUT_TRACKER
if keyValue == 13: #
#print '**'
if self.status == self.STATUS_PAUSE: #
if self.track_window: # , ,
self.status = self.STATUS_RUN_WITH_TRACKER
self.start_flag = True
#
def processHandler(self):
# ,
if self.status == self.STATUS_RUN_WITHOUT_TRACKER:
ret, self.frame = self.cap.read()
cv2.imshow(self.windowName, self.frame)
# , , , 1
elif self.status == self.STATUS_PAUSE:
img_first = self.frame.copy() # ,
if self.track_window: # ,
cv2.rectangle(img_first, (self.track_window[0], self.track_window[1]), (self.track_window[2], self.track_window[3]), (0,0,255), 1)
elif self.selection: #
cv2.rectangle(img_first, (self.selection[0], self.selection[1]), (self.selection[2], self.selection[3]), (0,0,255), 1)
cv2.imshow(self.windowName, img_first)
#
elif self.status == self.STATUS_BREAK:
self.cap.release() #
cv2.destroyAllWindows() #
sys.exit() #
# ,
elif self.status == self.STATUS_RUN_WITH_TRACKER:
ret, self.frame = self.cap.read() #
if self.start_flag: # ,
self.tracker.start_track(self.frame, dlib.rectangle(self.track_window[0], self.track_window[1], self.track_window[2], self.track_window[3])) #
self.start_flag = False #
else:
self.tracker.update(self.frame) #
# ,
box_predict = self.tracker.get_position()
cv2.rectangle(self.frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1)
cv2.imshow(self.windowName, self.frame)
#
def onMouseClicked(self, event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #
self.drag_start = (x, y)
self.track_window = None
if self.drag_start: # ,
xMin = min(x, self.drag_start[0])
yMin = min(y, self.drag_start[1])
xMax = max(x, self.drag_start[0])
yMax = max(y, self.drag_start[1])
self.selection = (xMin, yMin, xMax, yMax)
if event == cv2.EVENT_LBUTTONUP: #
self.drag_start = None
self.track_window = self.selection
self.selection = None
def run(self):
while(1):
self.keyEventHandler()
self.processHandler()
if __name__ == '__main__':
testTracker = myCorrelationTracker(windowName='image', cameraNum=1)
testTracker.run()
注:プログラムカードがあれば、cv 2.waitKey()のパラメータを調整します。つまり遅延時間です。小さくしてもいいです。実行結果
操作にはいくつかの変更があります。最初は自動的にカメラから画像を採取して表示します。スペースを押して、一時停止します。またスペースを押すと、リアルタイム表示に戻りますが、目標トレースは行いません。一時停止する時、マウスをドラッグして赤い枠が表示されます。車を押して、赤い枠内の物体を目標として認識します。その後、リアルタイムに識別され、オレンジ枠で表示される。ESCキーを押して終了します。
公式ルーチン
#!/usr/bin/python
# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
#
# This example shows how to use the correlation_tracker from the dlib Python
# library. This object lets you track the position of an object as it moves
# from frame to frame in a video sequence. To use it, you give the
# correlation_tracker the bounding box of the object you want to track in the
# current video frame. Then it will identify the location of the object in
# subsequent frames.
#
# In this particular example, we are going to run on the
# video sequence that comes with dlib, which can be found in the
# examples/video_frames folder. This video shows a juice box sitting on a table
# and someone is waving the camera around. The task is to track the position of
# the juice box as the camera moves around.
#
#
# COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
# You can install dlib using the command:
# pip install dlib
#
# Alternatively, if you want to compile dlib yourself then go into the dlib
# root folder and run:
# python setup.py install
# or
# python setup.py install --yes USE_AVX_INSTRUCTIONS
# if you have a CPU that supports AVX instructions, since this makes some
# things run faster.
#
# Compiling dlib should work on any operating system so long as you have
# CMake and boost-python installed. On Ubuntu, this can be done easily by
# running the command:
# sudo apt-get install libboost-python-dev cmake
#
# Also note that this example requires scikit-image which can be installed
# via the command:
# pip install scikit-image
# Or downloaded from http://scikit-image.org/download.html.
import os
import glob
import dlib
from skimage import io
# Path to the video frames
video_folder = os.path.join("..", "examples", "video_frames")
# Create the correlation tracker - the object needs to be initialized
# before it can be used
tracker = dlib.correlation_tracker()
win = dlib.image_window()
# We will track the frames as we load them off of disk
for k, f in enumerate(sorted(glob.glob(os.path.join(video_folder, "*.jpg")))):
print("Processing Frame {}".format(k))
img = io.imread(f)
# We need to initialize the tracker on the first frame
if k == 0:
# Start a track on the juice box. If you look at the first frame you
# will see that the juice box is contained within the bounding
# box (74, 67, 112, 153).
tracker.start_track(img, dlib.rectangle(74, 67, 112, 153))
else:
# Else we just attempt to track from the previous frame
tracker.update(img)
win.clear_overlay()
win.set_image(img)
win.add_overlay(tracker.get_position())
dlib.hit_enter_to_continue()
ツッコミ:もう4編のdlibに関する学習ノートを書きました。dlibというライブラリは確かに便利です。顔認識などの基礎的な識別任務を簡単に実現できます。しかし、各種の識別タスクにおいてより良い効果が得られたいなら、彼が与えたモデルだけを使うことはできないに違いない。つまり、自分で訓練しなければならないということです。公式文書を見て、トレーニングや自分で神経ネットワークを構築するなどのアプリインターフェースも提供されています。今度は時間があれば、もう一度プログラムを整理してみます。最近学校は学校運会で、数学も見ますが、このように時間を作って書いても気持ちがいいです。ヽ(・・ω・。)ノ