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中isalnum()方法的使用
May 18 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
使用python编写监听端
Apr 12 Python
wxPython实现窗口用图片做背景
Apr 25 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
Python实现FLV视频拼接功能
Jan 21 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
Python Django ORM连表正反操作技巧
Jun 13 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
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
vue实现扫码功能
2020/01/17 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
特步官方商城:Xtep
2017/03/21 全球购物
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
优秀党支部事迹材料
2014/01/14 职场文书
企业年度评优方案
2014/06/02 职场文书
大学迎新生标语
2014/10/06 职场文书
队名及霸气口号大全
2015/12/25 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
golang为什么要统一错误处理
2022/04/03 Golang