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如何import文件夹下的文件(实现方法)
Jan 24 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
python实现机器学习之元线性回归
Sep 06 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
django框架两个使用模板实例
Dec 11 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Python如何急速下载第三方库详解
Nov 02 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的FTP学习(二)
2006/10/09 PHP
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
测试您的 PHP 水平的题目
2007/05/30 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python 基于opencv实现图像增强
2020/12/23 Python
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
大学生专科毕业生自我评价
2013/11/17 职场文书
给分销商的致歉信
2014/01/14 职场文书
《社戏》教学反思
2014/04/15 职场文书
民族学专业求职信
2014/07/28 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
人事任命书范本
2015/09/21 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
Java 定时任务技术趋势简介
2022/05/04 Java/Android
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript