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 相关文章推荐
详解Python的Django框架中的中间件
Jul 24 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
python对excel文档去重及求和的实例
Apr 18 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
Python如何实现转换URL详解
Jul 02 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python爬虫添加请求头代码实例
Dec 28 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 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
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
JavaScript学习笔记(十)
2010/01/17 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
python操作xml文件示例
2014/04/07 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
智能钱包:Ekster
2019/11/21 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
中班中秋节活动反思
2014/02/18 职场文书
部门年终奖分配方案
2014/05/07 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
高考升学宴主持词
2019/06/21 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
redis实现的四种常见限流策略
2021/06/18 Redis
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS