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中使用不同编码读写txt文件详解
May 28 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
Python变量和数据类型详解
Feb 15 Python
Python文件的读写和异常代码示例
Oct 31 Python
python+django加载静态网页模板解析
Dec 12 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
python矩阵转换为一维数组的实例
Jun 05 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
python实现事件驱动
Nov 21 Python
Python如何实现强制数据类型转换
Nov 22 Python
基于Python实现射击小游戏的制作
Apr 06 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文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
python计算最大优先级队列实例
2013/12/18 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
python实现AES加密与解密
2019/03/28 Python
微信小程序python用户认证的实现
2019/07/29 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
高中同学聚会邀请函
2014/01/11 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
简历里的自我评价范文
2014/02/24 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
社会实践的活动方案
2014/08/22 职场文书
朋友聚会开场白
2015/06/01 职场文书
太行山上观后感
2015/06/05 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
golang 实现并发求和
2021/05/08 Golang