小编use*_*300的帖子

神经网络的Python实时图像分类问题

我正在尝试使用caffe和python进行实时图像分类.我在一个过程中使用OpenCV从我的网络摄像头流式传输,并在一个单独的过程中,使用caffe对从网络摄像头拉出的帧执行图像分类.然后我将分类结果传回主线程以标注网络摄像头流.

问题是即使我有一个NVIDIA GPU并且正在执行GPU上的caffe预测,主线程也会变慢.通常没有做任何预测,我的网络摄像头流以30 fps运行; 但是,根据预测,我的网络摄像头流最多可获得15 fps.

我已经验证了caffe在执行预测时确实使用了GPU,而且我的GPU或GPU内存并没有最大化.我还验证了我的CPU内核在程序中的任何时候都没有达到最大限度.我想知道我是做错了什么,或者是否有办法让这两个过程真正分开.任何建议表示赞赏.这是我的代码供参考

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 …
Run Code Online (Sandbox Code Playgroud)

python gpgpu multiprocessing deep-learning caffe

30
推荐指数
1
解决办法
2825
查看次数

如何在Python中优化多处理

编辑:我对视频流有什么疑问,所以我会提供更多的清晰度.该流是我网络摄像头的实时视频,通过OpenCV访问.我在摄像机读取每个帧时得到它,并将其发送到一个单独的进程进行处理.该过程基于对图像进行的计算返回文本.然后将文本显示在图像上.我需要实时显示流,如果文本和正在显示的视频之间存在延迟(即如果文本适用于前一帧,那就没问题),这是可以的.

也许更容易想到这一点的是我正在对网络摄像头看到的图像进行识别.我一次发送一个帧到一个单独的进程来对帧进行识别分析,并将文本发送回作为实时源的标题.显然,处理过程比简单地从网络摄像头抓取帧并显示它们需要更多的时间,因此如果标题是什么以及网络摄像头馈送显示的延迟,这是可接受的和预期的.

现在发生的事情是我正在显示的实时视频由于其他进程而滞后(当我不向计算进程发送帧时,没有滞后).我还确保一次只排队一帧,这样可以避免队列过载并导致延迟.我已经更新了下面的代码以反映这个细节.

我在python中使用多处理模块来帮助加快我的主程序.但是我相信我可能会做错误的事情,因为我认为计算并不是完全并行发生的.

我希望我的程序从主进程中的视频流中读取图像,并将帧传递给两个对其进行计算的子进程,并将文本发回(包含计算结果)到主进程.

然而,当我使用多处理时,主要过程似乎滞后,运行速度只有没有它的一半,导致我认为进程没有完全并行运行.

在做了一些研究之后,我推测滞后可能是由于使用队列在进程之间进行通信(将图像从main传递给子进程,以及将文本从child传回main).

然而,我评论了计算步骤,只是让主进程传递一个图像,并且子进程返回空白文本,在这种情况下,主进程根本没有减速.它全速奔跑.

因此,我相信

1)我没有最佳地使用多处理

要么

2)这些过程不能真正并行运行(我会理解有点滞后,但它会使主要过程减慢一半).

这是我的代码大纲.只有一个消费者而不是两个消费者,但两个消费者几乎完全相同.如果有人能提供指导,我将不胜感激.

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):
        while True:
            image = self.task_queue.get()
            #Do computations on image
            self.result_queue.put("text")

        return

import cv2

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 …
Run Code Online (Sandbox Code Playgroud)

python queue multithreading multiprocessing python-2.7

12
推荐指数
2
解决办法
2294
查看次数

Caffe迭代损失与火车净损失

我正在使用caffe在底部训练一个带有Euclidean损失层的CNN,并且我的solver.prototxt文件被配置为每100次迭代显示一次.我看到这样的事情,

Iteration 4400, loss = 0
I0805 11:10:16.976716 1936085760 solver.cpp:229]     Train net output #0: loss = 2.92436 (* 1 = 2.92436 loss)
Run Code Online (Sandbox Code Playgroud)

我对迭代损失和火车净损失之间的差异感到困惑.通常迭代损失非常小(大约为0),并且列车净输出损失稍微大一些.有人可以澄清一下吗?

python euclidean-distance neural-network caffe pycaffe

8
推荐指数
1
解决办法
4831
查看次数