V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zzcchh
V2EX  ›  Python

在 windows 下用 Python 和 opencv 做了一个视频分析程序,如何加速?

  •  
  •   zzcchh · 2017-05-22 11:24:23 +08:00 · 5484 次点击
    这是一个创建于 2503 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从视频中提取数据,开启视频窗口的话每秒处理 5-6 帧,一小时视频要 5-6 小时处理完,我想慢点也没关系,但是 cpu 占用率只有 2%。这就不让我淡定了,明显是偷懒了,安排了多线程,好像也是不能提升速度,请问 windows 就是不会给 python 太多资源么?我开了几路脚本一起做,cpu 仍然占用率也很低。这是怎么回事?
    32 条回复    2017-05-24 12:52:00 +08:00
    comesx4
        1
    comesx4  
       2017-05-22 11:29:06 +08:00
    用的是 GPU?
    misaka19000
        2
    misaka19000  
       2017-05-22 11:30:33 +08:00
    放代码
    zzcchh
        3
    zzcchh  
    OP
       2017-05-22 11:40:31 +08:00 via Android
    @misaka19000 不敢放,太丑了,流程比较简单,识别轮廓,拟和椭圆和质点,记录 csv,甚至没有定义函数。
    zzcchh
        4
    zzcchh  
    OP
       2017-05-22 11:41:04 +08:00 via Android
    @comesx4 没有就是 cpu。
    cnnblike
        5
    cnnblike  
       2017-05-22 11:41:49 +08:00 via iPhone
    用的是机械硬盘?或者内存比较小?
    laodao
        6
    laodao  
       2017-05-22 11:43:59 +08:00
    上异步,分分钟跑满你的 cpu。
    hand515
        7
    hand515  
       2017-05-22 11:44:33 +08:00
    多线程改为多进程
    XYxe
        8
    XYxe  
       2017-05-22 11:45:23 +08:00 via Android
    计算密集的任务试试多进程
    scream7
        9
    scream7  
       2017-05-22 11:48:43 +08:00
    是不是时间消耗在 IO 操作上了
    baicheng
        10
    baicheng  
       2017-05-22 11:56:47 +08:00 via iPhone
    试着多将几帧一次性读入内存看看行不行?运行的时候看下资源占用率是不是硬盘开销比较大,如果你 CPU 相当牛叉有十几个核可以试试用 MATLAB 并行。
    adodo1
        11
    adodo1  
       2017-05-22 12:14:12 +08:00   ❤️ 1
    5/6 帧一秒,视频好歹也 25 帧一秒最少
    zzcchh
        12
    zzcchh  
    OP
       2017-05-22 12:16:09 +08:00 via Android
    @adodo1 我说的是处理速度,不是播放速度,一小时视频 5 个小时处理完没毛病
    itfanr
        13
    itfanr  
       2017-05-22 16:14:35 +08:00 via Android
    建议用 go 或者 rust
    zhidian
        14
    zhidian  
       2017-05-22 16:17:56 +08:00
    1. 可以只处理部分帧(关键帧?); 2. 每帧太大的话,降采样变小点;
    itfanr
        15
    itfanr  
       2017-05-22 16:27:18 +08:00 via Android
    @adodo1 是处理速度
    zhidian
        16
    zhidian  
       2017-05-22 16:27:32 +08:00
    如果只是线、椭圆检测啥的,OpenCV 好像提供跟踪,应该快点吧。
    ytmsdy
        17
    ytmsdy  
       2017-05-22 16:40:40 +08:00 via iPhone
    应该是 io 没跟上,导致 cpu 工作不饱和
    uucloud
        18
    uucloud  
       2017-05-22 16:51:53 +08:00
    换 c++
    zhidian
        19
    zhidian  
       2017-05-22 16:56:50 +08:00
    @uucloud OpenCV 的 Python 绑定,调的也是 C++。
    zzcchh
        20
    zzcchh  
    OP
       2017-05-22 22:32:47 +08:00 via Android
    @ytmsdy 我觉得可能是,其实硬盘没有跟忙。
    zzcchh
        21
    zzcchh  
    OP
       2017-05-22 22:37:41 +08:00 via Android
    @itfanr 初级菜鸟,还不会那些语言。我也不会多进程,就是在系统下一次运行了 9 个脚本分别处理 9 个视频。发现内存占用多了一些,cpu 仍然是 2-10%。关闭 imshow 函数会快一点,大概是 3 个小时能处理一个小时视频。 @zhidian 采样量已经非常小了 288:100。我觉得可能是 io 的问题
    zzcchh
        22
    zzcchh  
    OP
       2017-05-22 22:39:10 +08:00 via Android
    @zhidian 请问具体是哪个函数呢?
    bookit
        23
    bookit  
       2017-05-22 23:01:40 +08:00
    把事情分解开来做

    比如一段视频,2000 帧,提取出 100 帧出来,把这个时间算一下,花了多长时间
    然后分析其中 1 帧,看多长时间,

    这样来找出瓶颈在哪里,

    如果 cpu 利用率不高,可以开 50 个进程,同时分析 50 帧嘛
    Hzzone
        24
    Hzzone  
       2017-05-22 23:26:19 +08:00
    给自己一个入 1080 的理由
    ironstars
        25
    ironstars  
       2017-05-22 23:58:07 +08:00
    首先,和 GPU 没关系,上 1080 也没用,不单独写针对 GPU 的特定版本是在 CPU 上跑的;
    其次,换 GO 和 RUST,也要 OpenCV 支持,现在只支持 python、Java、C 和 C++;
    最后没有代码的话,猜测是 IO 跟不上或者后面一直在等前面处理完?
    建议一次读入比如 10 张图像,开 10 个线程并行处理。语言换 C++也行,速度会快一点。
    zzcchh
        26
    zzcchh  
    OP
       2017-05-23 07:18:43 +08:00 via Android
    @ironstars 谢谢,我试下
    Michaelssss
        27
    Michaelssss  
       2017-05-23 07:49:53 +08:00
    CPU 不高肯定是非 CPU 瓶颈,你得先找出瓶颈再分析。。。
    zhuangzhuang1988
        28
    zhuangzhuang1988  
       2017-05-23 09:32:07 +08:00
    上 tbb 直接让你的 cpu 100%
    Justkkk
        29
    Justkkk  
       2017-05-23 10:53:17 +08:00
    放代码出来看看。。如果处理是可并行的,可以考虑多线程,or 用 gpu 来加速,但做这些可能都还是用 C++来做方便些
    zhidian
        30
    zhidian  
       2017-05-23 12:33:59 +08:00
    There are at least 5 types of tracker algorithms that can be used:

    - MIL
    - BOOSTING
    - MEDIANFLOW
    - TLD
    - KCF

    [OpenCV: Introduction to OpenCV Tracker]( http://docs.opencv.org/3.1.0/d2/d0a/tutorial_introduction_to_tracker.html )
    Trim21
        31
    Trim21  
       2017-05-24 08:01:17 +08:00 via Android
    多线程换多进程。。
    itfanr
        32
    itfanr  
       2017-05-24 12:52:00 +08:00 via Android
    @zzcchh 加时延统计 慢慢分析
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3607 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:41 · PVG 12:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.