我有正在更新的 openCV 跟蹤器物件。為了使事情更快,我使用帶有 map_async 函式的多處理池來并行作業。它按預期作業,我得到了顯著的加速。但是有一點很奇怪/不起作用。當我使用 openCV 重新初始化我的跟蹤器(意味著給它們一個新的邊界框)時,跟蹤器不會更新,而是繼續使用之前的邊界框。這僅在使用多處理池時發生,但在跟蹤器串列上使用順序回圈時不會發生。我懷疑該行程制作了自己的跟蹤器物件副本,因此跟蹤器的重新初始化不適用于新創建的物件。然而,據我所知,當我呼叫函式 map_async 時,會創建一個新行程,并使用 process.wait() 等待該行程完成其作業。
每次呼叫 updateTrackers() 函式時,我已經嘗試創建一個新池。那并沒有解決問題。
作業重新初始化順序代碼:
def updateTrackers(self, frame):
for t in self.trackers:
t.update()
不作業重新初始化順序代碼:
def updateTrackers(self, frame):
processes = []
# create a process for each tracker
for t in self.trackers:
processes.append(self.ProcessPool.map_async(t.update, (frame, )))
# wait for the processes to finish
for p in processes:
p.wait()
在這兩種情況下,重新初始化跟蹤器物件的代碼是相同的:
def reInitTracker(self, index, frame):
if index >= self.nmbTrackers:
return
initBB = cv2.selectROI("Camera view", frame, fromCenter=False,
showCrosshair=True)
self.trackers[index].tracker.clear()
self.trackers[index].tracker = cv2.TrackerKCF_create()
self.trackers[index].tracker.init(frame, initBB)
編輯:我剛剛發現并行化跟蹤器時不會更新它們。現在更符合他們也沒有被初始化。
uj5u.com熱心網友回復:
如果我理解您的問題,t當您t.update在呼叫中作為作業函式傳遞時,(跟蹤器)物件不會更新map_async
是的,t將被序列化/反序列化到多處理池以執行該update方法,如果t的狀態被修改,update則不會反映回主行程。順便說一句,像您這樣做時,使用由單個元素組成的可迭代引數呼叫 map 方法是很不尋常的;apply_async會更合適。
解決方案是讓您的update方法(不幸的是您沒有顯示)回傳self,然后使用此回傳值更新主行程中的跟蹤器物件:
def updateTrackers(self, frame):
results = [self.ProcessPool.apply_async(t.update, (frame,)) for t in self.trackers]
# It is assumed that t.update now returns with t.self
# It is also assumed that self.trackers is a list or otherwise indexable:
for idx, result in enumerate(results):
# Wait for task to finish and update tracker with returned value:
self.trackers[idx] = result.get()
uj5u.com熱心網友回復:
參考您的 BooBoos 評論:
否 update 方法不添加任何屬性。你是對的,這確實很奇怪。我創建了一個最小的、可重現的示例,它會導致相同的錯誤:
import cv2
import numpy as np
from pathos.multiprocessing import ProcessPool
tracker = cv2.TrackerKCF_create()
Pool = ProcessPool()
# dummy values
frame = np.array((100,100,3))
initBB = (1,2,3,4)
tracker.init(frame, initBB)
p = Pool.apipe(tracker.update, frame)
p.get()
問題似乎是get方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358175.html
