开发者社区> 问答> 正文

使用python的OpenCV读取文件花费的时间太长了

系统:ubuntu 18.04 LTS Python: 3.6.8 OpenCV 3.4.4: cpu:英特尔i5-7300HQ cpu@2.50ghz,4核 gpu:nvidia GTX 1050 mobile (4gb) 我尝试使用PyTorch(1.3.1)训练一个简单的图像分类神经网络模型 我在一个文件夹中存储了一堆图片(35.000张照片,175.6mb)。 我走过所有的路:

def _get_imgs_paths(path):
        _, _, imgs_paths = list(os.walk(path))[0]
        return imgs_paths

在我调用另一个加载所有照片的函数后:

def _get_xys(path):
        imgs_paths = DataSet._get_imgs_paths(path)
        imgs_paths = sorted(imgs_paths)
        cats_paths = list(filter(lambda path: 'cat' in path, imgs_paths))
        dogs_paths = list(filter(lambda path: 'dog' in path, imgs_paths))
        noise_paths = list(filter(lambda path: 'noise' in path, imgs_paths))
        balanced_paths = []
        for i in range(len(imgs_paths)):
            if i % 3 == 0:
                balanced_paths.append(cats_paths.pop())
            elif i % 3 == 1:
                balanced_paths.append(dogs_paths.pop())
            else:
                balanced_paths.append(noise_paths.pop())
        xs = []
        ys = []

        **
        for img_path in balanced_paths:
            if 'cat' in img_path:
                y = global_config.dataset.CAT
            elif 'dog' in img_path:
                y = global_config.dataset.DOG
            elif 'noise' in img_path:
                y = global_config.dataset.NOISE
            else:
                raise Exception('No such class')
            ys.append(y)
            // seems like this call causes the slowdown
            img = cv2.imread(os.path.join(path, img_path))
            r, g, b = cv2.split(img)
            img = np.stack([r, g, b])
            xs.append(img)
        **
        return xs, ys

现在开始:将图像写入内存的过程需要5分钟。这很荒谬,因为几天前一切都很快。有一天,我刚睡醒,开始检查夜间训练的结果,在什么再次启动了学习过程之后,我注意到这个巨大的减速。我不知道发生了什么。我点击Ctrl+C,得到以下回溯:

我做了好几次,它一直在这里。我打开htop,注意到: LMAO。我只是试图重现这个问题,令人惊讶的是,它做的一切都很完美,例如:相当快:

但是我停止了,再次运行,得到了我所说的问题。Htop: 谷歌说红色的D代表“不间断的睡眠”。 所以,问题是:这里发生了什么,为什么会发生? 问题来源StackOverflow 地址:/questions/59378710/reading-files-usin-pythons-opencv-takes-too-long

展开
收起
kun坤 2019-12-30 10:17:11 2078 0
1 条回答
写回答
取消 提交回答
  • 我看了下你使用了很多python原生的函数和功能,sorted,os.walk,filter,list用于构造机器学习的AI dataset。如果Python IO过慢,个人建议可以使用一些工具来分析比如:cProfile,line_Profile,这样更能准确定位到问题。此外os.walk,list,你创建很多数组内存,filter是个迭代器的对象,其返回的是一个迭代元素,能否将容器的对象元素全部转化为np.array,通过向量化处理,list 的append过程中会不断copy和检测,所以这都是造成性能过慢的原因,能否image的预处理和读取分开并且独立出来,然后通过协程处理操作,for的过程中会所创建的对象是否及时的创建和关闭,考虑一下上下文迭代器with as的实现,代码细节优化要依赖于性能测试和业务拆分,希望能帮到你。

    2020-01-02 14:07:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载