Je suis d'essayer d'utiliser caffe et python pour faire des images en temps réel de la classification. Je suis à l'aide d'OpenCV en continu à partir de ma webcam dans un processus, et dans un processus séparé, à l'aide de caffe pour effectuer la classification des images sur les images extraites de la webcam. Alors je suis de passage le résultat de la classification au thread principal de sous-titrer le flux de la webcam.
Le problème est que même si j'ai une NVIDIA GPU et je suis d'effectuer le caffe des prédictions sur le GPU, le thread principal obtient ralenti. Normalement, sans faire de prédictions, ma webcam stream tourne à 30 fps; cependant, avec les prédictions, ma webcam stream obtient, au mieux, de 15 fps.
J'ai vérifié que caffe est, en effet, l'utilisation du GPU lors de la réalisation de ces prédictions, et que ma carte graphique ou GPU, la mémoire n'est pas plafonnait. J'ai aussi vérifié que mon CPU cores ne sont pas arriver au maximum à tout moment au cours du programme. Je me demande si je fais quelque chose de mal ou si il n'y a aucun moyen de garder ces 2 processus véritablement distincte. Tout conseil est le bienvenue. Voici mon code pour la référence
class Consumer(multiprocessing.Process):
def __init__(self, task_queue, result_queue):
multiprocessing.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
#other initialization stuff
def run(self):
caffe.set_mode_gpu()
caffe.set_device(0)
#Load caffe net -- code omitted
while True:
image = self.task_queue.get()
#crop image -- code omitted
text = net.predict(image)
self.result_queue.put(text)
return
import cv2
import caffe
import multiprocessing
import Queue
tasks = multiprocessing.Queue()
results = multiprocessing.Queue()
consumer = Consumer(tasks,results)
consumer.start()
#Creating window and starting video capturer from camera
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
#Try to get the first frame
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
frame_copy[:] = frame
task_empty = True
while rval:
if task_empty:
tasks.put(frame_copy)
task_empty = False
if not results.empty():
text = results.get()
#Add text to frame
cv2.putText(frame,text)
task_empty = True
#Showing the frame with all the applied modifications
cv2.imshow("preview", frame)
#Getting next frame from camera
rval, frame = vc.read()
frame_copy[:] = frame
#Getting keyboard input
key = cv2.waitKey(1)
#exit on ESC
if key == 27:
break
Je suis assez sûr que c'est le caffe prédiction ralentissement de tout, parce que quand je commenter la prédiction et passer un texte factice et-vient entre les processus, j'ai 30 fps à nouveau.
class Consumer(multiprocessing.Process):
def __init__(self, task_queue, result_queue):
multiprocessing.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
#other initialization stuff
def run(self):
caffe.set_mode_gpu()
caffe.set_device(0)
#Load caffe net -- code omitted
while True:
image = self.task_queue.get()
#crop image -- code omitted
#text = net.predict(image)
text = "dummy text"
self.result_queue.put(text)
return
import cv2
import caffe
import multiprocessing
import Queue
tasks = multiprocessing.Queue()
results = multiprocessing.Queue()
consumer = Consumer(tasks,results)
consumer.start()
#Creating window and starting video capturer from camera
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
#Try to get the first frame
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
frame_copy[:] = frame
task_empty = True
while rval:
if task_empty:
tasks.put(frame_copy)
task_empty = False
if not results.empty():
text = results.get()
#Add text to frame
cv2.putText(frame,text)
task_empty = True
#Showing the frame with all the applied modifications
cv2.imshow("preview", frame)
#Getting next frame from camera
rval, frame = vc.read()
frame_copy[:] = frame
#Getting keyboard input
key = cv2.waitKey(1)
#exit on ESC
if key == 27:
break