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 字符串定义
Sep 25 Python
分享几道你可能遇到的python面试题
Jul 24 Python
Python KMeans聚类问题分析
Feb 23 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
python 设置输出图像的像素大小方法
Jul 04 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
python实现126邮箱发送邮件
May 20 Python
Python列表推导式实现代码实例
Sep 09 Python
如何获取numpy array前N个最大值
May 14 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
python基础之入门必看操作
2017/07/26 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
python读取文本中的坐标方法
2018/10/14 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
python实现的Iou与Giou代码
2020/01/18 Python
详解django中Template语言
2020/02/22 Python
python3 xpath和requests应用详解
2020/03/06 Python
Python ellipsis 的用法详解
2020/11/20 Python
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
物流管理应届生求职信
2013/11/07 职场文书
会计应聘求职信范文
2013/12/17 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
保险公司开门红口号
2014/06/21 职场文书
群教班子对照检查材料
2014/08/26 职场文书
运动员入场前导词
2015/07/20 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
公历12个月名称的由来
2022/04/12 杂记
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技