多文件夹图片预处理:清除空值、重置大小、分割训练集

清理空值 防止出现cannot identify image file

参考Python数据清洗----删除读取失败图片__简单版_python用pil读取图片出错删除掉-CSDN博客

#%pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
#可能需要重启jupyter
import os
import shutil
import warnings
import cv2
import iofrom PIL import Image
warnings.filterwarnings("error", category=UserWarning)
PATH = "data" #文件路径
i = 0def is_read_successfully(file):try:imgFile = Image.open(file)return Trueexcept Exception:return Falseif __name__=="__main__":#子文件夹for childPATH in os.listdir(PATH):#子文件夹路径childPATH = PATH + '/'+ str(childPATH)for parent, dirs, files in os.walk(PATH):for file in files:if not is_read_successfully(os.path.join(parent, file)):print(os.path.join(parent, file))i = i + 1#os.remove(os.path.join(parent, file)) print(i)

重置大小 参考python批量修改图片尺寸(含多个文件夹)_python 修改路径下多个子文件下图片尺寸并重新保存-CSDN博客

# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
import os
import re
import sys
from PIL import Image
import string
import numpy as np
PATH = "data" #文件路径i=0
def resizeImage(file,NoResize):image = cv2.imread(file,cv2.IMREAD_COLOR)#如果type(image) == 'NoneType',会报错,导致程序中断,所以这里先跳过这些图片,#并记录下来,结束程序后手动修改(删除)if image is None:NoResize += [str(file)]else:resizeImg = cv2.resize(image,(100,100))cv2.imwrite(file,resizeImg)cv2.waitKey(100)def resizeAll(root):global i#待修改文件夹fileList = os.listdir(root)currentpath = os.getcwd()   os.chdir(root)NoResize = []  #记录没被修改的图片for file in fileList:       #遍历文件夹中所有文件i+=1file = str(file)resizeImage(file,NoResize)print("---------------------------------------------------")os.chdir(currentpath)       #改回程序运行前的工作目录sys.stdin.flush()       #刷新print('没被修改的图片: ',NoResize)if __name__=="__main__":#子文件夹for childPATH in os.listdir(PATH):#子文件夹路径childPATH = PATH + '/'+ str(childPATH)# print(childPATH)resizeAll(childPATH)print(f'{i}张图片修改完成')

划分训练集测试集 参考【深度学习】使用python划分数据集为训练集和验证集和测试集并放在不同的文件夹_深度学习中有没有直接划分训练集、验证集和测试集的函数-CSDN博客

import os
import random
import shutil
from shutil import copy2"""os.listdir会将文件夹下的文件名集合成一个列表并返回"""
def getDir(filepath):pathlist=os.listdir(filepath)return pathlist"""制作五类图像总的训练集,验证集和测试集所需要的文件夹,例如训练集的文件夹中装有五个文件夹,这些文件夹分别装有一定比例的五类图像"""
def mkTotalDir(data_path):os.makedirs(data_path)dic=['train','test']for i in range(0,2):current_path=data_path+dic[i]+'/'#这个函数用来判断当前路径是否存在,如果存在则创建失败,如果不存在则可以成功创建isExists=os.path.exists(current_path)if not isExists:os.makedirs(current_path)print('successful '+dic[i])else:print('is existed')return
"""传入的参数是n类图像原本的路径,返回的是这个路径下各类图像的名称列表和图像的类别数"""
def getClassesMes(source_path):classes_name_list=getDir(source_path)classes_num=len(classes_name_list)return classes_name_list,classes_num
"""change_path其实就是制作好的n类图像总的训练集,验证集和测试集的路径,sourcepath和上面一个函数相同
这个函数是用来建训练集,测试集,验证集下五类图像的文件夹,就是建15个文件夹,当然也可以建很多类
"""
def mkClassDir(source_path,change_path):classes_name_list,classes_num=getClassesMes(source_path)for i in range(0,classes_num):current_class_path=os.path.join(change_path,classes_name_list[i])isExists=os.path.exists(current_class_path)if not isExists:os.makedirs(current_class_path)print('successful '+classes_name_list[i])else:print('is existed')#source_path:原始多类图像的存放路径
#train_path:训练集图像的存放路径
#validation_path:验证集图像的存放路径D:\RSdata_dir\NWPU-RESISC45\\
#test_path:测试集图像的存放路径def divideTrainValidationTest(source_path,train_path,test_path):"""先获取五类图像的名称列表和类别数目"""classes_name_list,classes_num=getClassesMes(source_path)"""调用上面的函数,在训练集验证集和测试集文件夹下建立五类图像的文件夹"""mkClassDir(source_path,train_path)mkClassDir(source_path,test_path)"""先将一类图像的路径拿出来,将这个路径下所有这类的图片,就是800张图片的文件名做成一个列表,使用os.listdir函数,然后再将列表里面的所有图像名进行shuffle就是随机打乱,然后从打乱后的图像中抽7成放入训练集,3成放入测试集的图像名称列表"""for i in range(0,classes_num):source_image_dir=os.listdir(source_path+classes_name_list[i]+'/')random.shuffle(source_image_dir)train_image_list=source_image_dir[0:int(0.7*len(source_image_dir))]test_image_list=source_image_dir[int(0.7*len(source_image_dir)):]"""找到每一个集合列表中每一张图像的原始图像位置,然后将这张图像复制到目标的路径下,一共是五类图像每类图像随机被分成三个去向,使用shutil库中的copy2函数进行复制,当然也可以使用move函数,但是move相当于移动图像,当操作结束后,原始文件夹中的图像会都跑到目标文件夹中,如果划分不正确你想重新划分就需要备份,不然的话很麻烦"""for train_image in train_image_list:origins_train_image_path=source_path+classes_name_list[i]+'/'+train_imagenew_train_image_path=train_path+classes_name_list[i]+'/'copy2(origins_train_image_path,new_train_image_path)for test_image in test_image_list:origins_test_image_path=source_path+classes_name_list[i]+'/'+test_imagenew_test_image_path=test_path+classes_name_list[i]+'/'copy2(origins_test_image_path,new_test_image_path)if __name__=='__main__':source_path = './data/'data_path = './datadev/'        #脚本新建的文件夹train_path = './datadev/train/'test_path = './datadev/test/'mkTotalDir(data_path)divideTrainValidationTest(source_path, train_path, test_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity动画】状态机添加参数控制动画切换(Animator Controller)

Unity - 手册:动画参数 在Unity中,动画状态的切换是通过Animator Controller中的过渡(Transition)来实现的。过渡是状态之间的连接,控制过渡一般都是靠调用代码参数 我们来实现一个案例: 创建动画状态机&a…

构造函数的定义

当定义一个构造函数时,它的格式如下: ClassName(parameters) : member1(initializer), member2(initializer), ... {// 构造函数的主体 }其中: ClassName 是结构体或类的名称,表示构造函数所属的结构体或类。parameters 是构造函…

leetcode 142.环形链表2

我来更新 leetcode 题目了,接着上一次,这一次是上一道题目的提升(有点数学题的感觉) 142.环形链表2 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表…

识KDJ指标,看懂超买超卖信号

一、认识KDJ 1、KDJ的含义 KDJ分析股票中短期趋势的一个常用指标,中文名称“随机指标”。它是一个综合考虑股票最高价、最低价和收盘价的技术指标,能够帮助我们根据历史价格预测出股票未来的价格走势。在实际应用的过程中,它的短期预测功能要…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离,本系统分为管理员、用户两种角色 用户角色包含以下功能: 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里,我们见证了许多重要的贡献,如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时,大型语言模型(LLM)近来在流行度方面取得了很大的成功,例如Ch…

PMP-01

考纲 需要看的书籍 学习计划

04-数据库操作对象Statement对象和PreparedStatement对象的区别,SQL注入的优缺点

Statement对象和查询结果集 Statement对象相关的方法 Connection接口中获取数据库操作对象Statement对象的方法 方法名功能Statement createStatement()创建Statement对象 Statement对象执行增删改查的SQL语句(不含占位符"?")的方法,JDBC中的SQL语句不需要提供分…

Verilog 入门(八)(验证)

文章目录 编写测试验证程序波形产生值序列重复模式 测试验证程序实例从文本文件中读取向量实例:时序检测器 测试验证程序用于测试和验证设计方法的正确性。Verilog 提供强有力的结构来说明测试验证程序。 编写测试验证程序 测试验证程序有三个主要目的:…

minigpt4安装的一系列问题

问题一 合并权重: python -m fastchat.model.apply_delta --base /data/qq/llama2-7b-chat-hf --target /data/qq/MiniGPT-4/vicuna_weights/ --delta /data/qq/vicuna-7b-delta-v0fastchat版本与模型版本 不兼容 解决方法: 第一种:用低版…

程序的未定义行为(Undefined Behavior)

未定义行为(Undefined Behavior,简称UB)是编程中一个重要而复杂的概念,尤其在像C和C这样的低级语言中更为常见。下面是对未定义行为的详细介绍: 定义 未定义行为指的是程序中的某些操作,其效果没有在编程…

【算法】滑动窗口题单——5.多指针滑动窗口醒醒⭐

文章目录 930. 和相同的二元子数组解法1——前缀和 哈希表解法2——滑动窗口 ⭐ 1248. 统计「优美子数组」1712. 将数组分成三个子数组的方案数⭐⭐⭐2444. 统计定界子数组的数目解法——多指针滑动窗口代码2——简洁写法:一次遍历O(1) 空间🐂⭐ 992. K…

linux之buildroot(4)配置项目

Linux之buildroot(4)配置项目 Author:Onceday Date:2023年12月3日 漫漫长路,才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。 参考文档: Buildroot - Making Embedded Linux Easy 文章目录…

leetcode977. 有序数组的平方

题目描述 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后&#xff0c…

《Junit单元测试》

目录 SpringBoot2.2.0版本之前的单元测试模式 SpringBoot2.2.0版本之后的单元测试模式 SpringBoot2.4以上版本移除了默认对Vintage的依赖 SpringBoot2.2.0版本之前的单元测试模式 SpringBooot 2.2.0 版本开始引入Junit5作为单元测试默认库,之前的版本是使用Junit…

Centos图形化界面封装OpenStack Centos镜像

目录 背景 环境 宿主机环境安装 创建与安装Centos7.8虚机 虚机设置 安全相关 安装ACPI服务 安装cloud-init 安装cloud-utils-growpart 停⽌虚拟机 删除个性化信息 模板化与压缩 登录与验证 背景 今天早上在Centos官网下载的CentOS-7-aarch64-GenericCloud-2003.…

计算机网络——习题

目录 一、填空题 二、选择题 一、填空题 1、在TCP/IP层次模型的网络层中包括的协议主要有 ARP、RARP、ICMP、IGMP 。 2、传输层的传输服务有两大类: 面向连接(TCP)和 无连接服务(UDP)。 3、Internet所提供的三项…

nodejs介绍

nodejs官网支持的各种库api https://nodejs.org/docs/latest-v21.x/api/http.html nodejs包括vp8引擎和内置的基本库如fs,path,http,querystring等,也可以用npm按转第三方库 npm是nodejs环境的包管理工具,可以为这个环境安装卸载各种包。 npm install pk…

首款跨语言RPC框架发布

开发历程 2019 ~ 2019 什么跨语言呢?比如你学了Java,你会写Service去调用业务代码,运用了OCP原则,可以使用接口编程,老师告诉我们,这样让接口开放,这样你新增功能的时候,就不用在源…

Javase | 贪吃蛇小游戏

目录: 1.贪吃蛇游戏介绍:(该游戏代码不是很完善,可后续不断优化哦)2.贪吃蛇游戏的代码操作步骤/讲解:3.贪吃蛇游戏的详细代码 :3.1MPanel.java3.2 Msnake.java 4.贪吃蛇游戏的代码分享 (获得代码 和 其中游戏图片)5.(继…