Pytorch中使用ImageFolder读取数据集时忽略特定文件


Posted in Python onMarch 23, 2022

一、使用ImageFolder读取数据集时忽略特定文件

如果事先知道需要忽略哪些文件,当然直接从数据集里删除就行了。但如果需要在程序运行时动态确认,或者筛选规则比较复杂,人工不好做,就需要让ImageFolder在读取时使用自定义的筛选规则。

ImageFolder有一个可选参数为is_valid_file,参数类型为可调用的函数,该函数传入一个str参数,返回一个bool值。当返回值为True时保留该文件,否则忽略。

例如,读取时想要忽略所有文件名带‘invalid’的文件,

代码如下:

import platform
from torchvision.datasets import ImageFolder


class Check(object):
    def __init__(self,
                 key_word: str):
        self.key_word = key_word
        self.separator = '\\' if platform.system() == 'Windows' else '/'

    def __call__(self, 
                 file_name: str) -> bool:
        folders = file_name.split(self.separator)
        return folders[-1].find(self.key_word) < 0

dataset = ImageFolder('./data', is_valid_file=Check('invalid'))

这里定义了一个实现了__call__方法的Check类,相比于直接定义函数的好处在于可以在构造函数里指定想要忽略的字符,并且能够根据操作系统的不同把文件目录分隔符给确定了。

更加复杂的功能可以自行修改代码逻辑实现,但是要注意如果某个类别的所有文件都被筛选掉了,ImageFolder会报FileNotFoundError错误。

如果想要忽略整个类别可以使用下面方法!!!

二、ImageFolder只读取部分类别文件夹

直接继承并且重写ImageFolder类的find_classes方法即可

from torchvision.datasets.folder import *
from typing import *


class FilterableImageFolder(ImageFolder):
    def __init__(
            self,
            root: str,
            transform: Optional[Callable] = None,
            target_transform: Optional[Callable] = None,
            loader: Callable[[str], Any] = default_loader,
            is_valid_file: Optional[Callable[[str], bool]] = None,
            valid_classes: List = None
    ):
        self.valid_classes = valid_classes
        super(FilterableImageFolder, self).__init__(root, transform, target_transform, loader, is_valid_file)

    def find_classes(self, directory: str) -> Tuple[List[str], Dict[str, int]]:
        classes = sorted(entry.name for entry in os.scandir(directory) if entry.is_dir())
        #增加了这下面这句
        classes = [valid_class for valid_class in classes if valid_class in self.valid_classes]
        if not classes:
            raise FileNotFoundError(f"Couldn't find any class folder in {directory}.")

        class_to_idx = {cls_name: i for i, cls_name in enumerate(classes)}
        return classes, class_to_idx

使用时,例如有mousecatdog三个类别的数据集文件夹,只想读取catdog

代码如下:

dataset = FilterableImageFolder('./data', valid_classes=['cat', 'dog'])

到此这篇关于Pytorch中使用ImageFolder读取数据集时忽略特定文件的文章就介绍到这了,更多相关ImageFolder读取数据集内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
python获取本地计算机名字的方法
Apr 29 Python
Python打印斐波拉契数列实例
Jul 07 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
Python pip 常用命令汇总
Oct 19 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
Python借助with语句实现代码段只执行有限次
Mar 23 #Python
python3 字符串str和bytes相互转换
Mar 23 #Python
对象析构函数__del__在Python中何时使用
详解Python内置模块Collections
Mar 22 #Python
Python中 range | np.arange | np.linspace三者的区别
Python中非常使用的6种基本变量的操作与技巧
python使用torch随机初始化参数
Mar 22 #Python
You might like
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
javascript如何创建对象
2016/08/29 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
vue组件实例解析
2017/01/10 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python、Matlab求定积分的实现
2019/11/20 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
python定义具名元组实例操作
2021/02/28 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
男方父母证婚词
2014/01/12 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
基于JavaScript实现省市联动效果
2021/06/22 Javascript
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js