Tensorflow自己的数据集准备_2:将图片批量重命名,格式转换,按5:5比例分为训练集和测试集

一、图片批量重命名

 

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)    

三、按1:1比例分为训练集和测试集

一般来说,训练集和测试集是 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!')

 

你可能感兴趣的:(Tensorflow,训练自己的数据集记录)