1 和 2 并没有关联,2一般不会用到,这里只是放到这,需要时自取。
1、# 遍历文件夹,读取图片 并重命名。
注: 如果文件夹中的图片名称已存在,在重命名时,则会报错。
简单的解决办法: 换个符号先重命名一次,然后在换个符号再重命名一次。dst 和 dst2 用一个即可。
如: 已存在 pa_0。 那可以 先重命名为(符号 两个 _ ) :pa__0,然后在执行一次代码,(符号换为 一个 _):pa_0。
# 遍历文件夹,读取图片 并重命名
import os
outer_path = 'F:\Tensorflow-workspace\photos_11\picture'
folderlist = os.listdir(outer_path) #列举文件夹
all_picture_num = 0
for folder in folderlist:
inner_path = os.path.join(outer_path, folder)
total_num_folder = len(folderlist) #文件夹的总数
print ('total have %d folders' % (total_num_folder)) #打印文件夹的总数
filelist = os.listdir(inner_path) #列举图片
i = 0
for item in filelist:
total_num_file = len(filelist) #单个文件夹内图片的总数
if item.endswith(('.jpeg','.jpg','.png','.tif','.JPEG')):
src = os.path.join(os.path.abspath(inner_path), item) #原图的地址
# dst = os.path.join(os.path.abspath(inner_path), str(folder) + '__' + str(i) + '.jpg') #新图的地址(这里可以把str(folder) + '__' + str(i) + '.jpg'改成你想改的名称)
dst2 = os.path.join(os.path.abspath(inner_path), str(folder) + '_' + str(i) + '.jpg') #新图的地址(这里可以把str(folder) + '_' + str(i) + '.jpg'改成你想改的名称)
try:
# os.rename(src, dst)
# print ('----1---converting %s to %s ...' % (src, dst))
os.rename(src, dst2)
print ('----2---converting %s to %s ...' % (src, dst2))
i += 1
except:
continue
all_picture_num = all_picture_num + total_num_file
print ('total %d to rename & converted %d jpgs' % (total_num_file, i))
print("all_picture_num:" + str(all_picture_num))
2、 随机打乱 随机打乱文件中的图片,重命名保存到 另一个文件夹中。
older_path:picture 文件夹下有 6 个子文件夹。
new_path:picture_one 文件夹下没有子文件夹。
os.path.join(new_path, folder) 这个函数的作用是将 new_path 和 folder 拼接成新的路径。
if not os.path.exists(new_folder_path):
os.makedirs(new_folder_path)
这段代码 会判断 picture_one 文件夹下是否存在 picture 文件夹下的子文件夹。如果不存在则会自动创建该子文件夹。
# 随机打乱 随机打乱文件中的图片,重命名保存到 另一个文件夹中
import random
import os
older_path = 'F:\Tensorflow-workspace\photos_11\picture'
new_path = 'F:\Tensorflow-workspace\photos_11\picture_one'
folderlist = os.listdir(older_path) #列举文件夹
for folder in folderlist:
inner_path = os.path.join(older_path, folder)
new_folder_path = os.path.join(new_path, folder)
print('new_folder_path:'+str(new_folder_path))
if not os.path.exists(new_folder_path):
os.makedirs(new_folder_path)
total_num_folder = len(folderlist) #文件夹的总数
print ('total have %d folders' % (total_num_folder)) #打印文件夹的总数
filelist = os.listdir(inner_path) #列举图片
i = 0
total_num_file = len(filelist) #单个文件夹内图片的总数
L=random.sample(range(0,total_num_file),total_num_file)
for item in filelist:
if item.endswith(('.jpeg','.jpg','.png','.tif','.JPEG')):
src = os.path.join(os.path.abspath(inner_path), item) #原图的地址
dst = os.path.join(os.path.abspath(new_folder_path), str(folder) + '_' + str(L[i]) + '.jpg') #新图的地址(这里可以把str(folder) + '_' + str(i) + '.jpg'改成你想改的名称)
try:
os.rename(src, dst)
print ('converting %s to %s ...' % (src, dst))
i += 1
except:
continue
print ('total %d to rename & converted %d jpgs' % (total_num_file, i))
这里将图片均转换为 jpg 格式。
# 将所有的图片转换成为jpg格式(防止因为图片格式造成的cv2.imread()异常)
import PIL.Image as Image
import os
# 相对路径 和 绝对路径。 相对路径 这里的 people_pictures_train 与该代码文件在同一级目录下
# 如: people_pictures_train 和代码文件 retype_image.ipynb 均在 F 目录下,则图片路径可直接写 people_pictures_train/one_train_test_picture/。
# path='people_pictures_train/one_train_test_picture/' # 训练的 图片路径
path='F:\\Tensorflow-workspace\\photos_11\\picture_one\\' # 训练的 图片路径
def start(Path):
dirlist = os.listdir(Path)
for dir in dirlist:
print('dir:' + str(dir))
for file in os.listdir(Path+dir):
img = Image.open(Path + dir +'/'+ file).convert('RGB')
# print(img)
img.save(Path + dir +'/'+ file)
print('Done!')
if __name__ == '__main__':
start(path)
一般来说,训练集和测试集是 2:1的比例(可按7:3。0.7+ 0.3=1)比例来划分差不多是2:1。
由于训练集的图片后面要经过图片预处理,预处理后图片会翻倍,所以这里按1:1的比例划分为训练集和测试集。然后在执行一次代码将测试集以1:1比例(0.5 + 0.5 = 1)划分为 测试集和预测集。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 将一个文件夹下图片按比例分在两个文件夹下,比例改0.5这个值即可 0.5+0.5 = 1 即 1:1
import os
import random
import shutil
from shutil import copy2
# Path='people_pictures_train/one_train_test_picture/' # 训练的 图片路径
Path='F:\\Tensorflow-workspace\\photos_11\\test\\' # 总图片路径
train_dir = 'F:\\Tensorflow-workspace\\photos_11\\val\\' # 训练图片路径
test_dir = 'F:\\Tensorflow-workspace\\photos_11\\test2\\' # 测试图片路径
dirlist = os.listdir(Path)
for folder in dirlist:
print('dir:' + str(folder))
# 一下 4 行,判断文件夹是否存在,不存在则创建
train_new_folder_path = os.path.join(train_dir, folder) # 连接两个或更多的路径名组件
print('train_new_folder_path:'+str(train_new_folder_path))
if not os.path.exists(train_new_folder_path):
os.makedirs(train_new_folder_path)
# 一下 4 行,判断文件夹是否存在,不存在则创建
test_new_folder_path = os.path.join(test_dir, folder) # 连接两个或更多的路径名组件
print('test_new_folder_path:'+str(test_new_folder_path))
if not os.path.exists(test_new_folder_path):
os.makedirs(test_new_folder_path)
file_path = os.listdir(Path+folder) # 当前文件的路径 / pa
print('file_path:' + str(file_path))
num_pictures = len(file_path) # 每个文件夹中的图片数量
print('file:' + str(folder) + ' having pictures num: ' + str(num_pictures))
index_list = list(range(num_pictures)) # 生成随机索引序列
print(index_list)
random.shuffle(index_list) # 打乱序列
num = 0
i = 0
for i in index_list:
image_name = os.path.join(os.path.abspath(Path+folder), file_path[i]) #原图的地址
print('-----image_name:'+ str(image_name))
if num < num_pictures*0.5: # 差不多 1 : 1 的比例 存放图片
print(str(image_name))
copy2(image_name, train_new_folder_path)
else:
copy2(image_name, test_new_folder_path)
num += 1
print('Done!')