IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 处理数据集的python代码 -> 正文阅读

[人工智能]处理数据集的python代码


image与label

缩放一个文件夹中的所有图片

import numpy as np
import glob
import os
from PIL import Image
#image_path表示图片所在文件夹的路径
#new_image_path 表示存新图片的文件夹路径
#new_size 表示长度为2的列表,两元素分别是宽和高
def img_resize(image_path,new_image_path,new_size):
    # 找出image_path下的所有.jpg/png/jpeg图片路径,并排序
    imgs = sorted(glob.glob(image_path + "*.jpg") )
    print(len(imgs))

    for img in imgs:
        image = Image.open(img)
        image=image.resize(new_size,Image.BILINEAR)
        print(image.size)

        # os.path.splitext() 将文件名和扩展名分开
        # os.path.split() 返回文件的路径和文件名
        img_name=os.path.split(img)[1]
        print(img_name)
        image.save(new_image_path+img_name) #保存图片

使用一个阈值将文件夹中的标签图变为二值图

import numpy as np
import glob
import os
from PIL import Image


#该函数用于把只有一个类别的标签图变为二值图(因为用ps弄出的不是二值图,边缘部分会有灰度值过渡的情况,除非用labelme制作标签图)
#max_value表示二值图的大的那个值,默认为1  , samll_value表示二值图的小的那个值,默认为0
#new_size表示是否缩放图片,默认为False,若要缩放图片就传一个长度为2的列表(宽和高)
def annotation_prepare(ann_path,new_ann_path,threshold,new_size=False,max_value=1,samll_value=0): #用来将标图变为1或255的二值图
    anns = sorted(glob.glob(ann_path + "*.jpg"))
    for ann in anns:
        ann_name = os.path.split(ann)[1] #得到带扩展名的图片名字用于后面的图片命名
        print(ann_name)
        ann = Image.open(ann)
        ann = ann.convert("L") #变为灰度图
        if (new_size!=False):  #new_size!=False表示需要缩放图片,
            w, h = new_size
            ann=ann.resize((w,h),Image.BILINEAR)

        else:
            w,h=ann.size

        ann=np.array(ann)
        #进行阈值转化
        new_ann=(ann>threshold)*max_value
        new_ann=new_ann+(ann>=threshold)*samll_value

        new_ann = new_ann.astype(np.uint8)  # 再还原成uint8格式,图片需要以这种格式来保存
        new_ann = Image.fromarray(new_ann)  # 从数组形式转为图片形式,这样可以使用save函数
        new_ann.save(new_ann_path+ann_name) #保存图片

给标签图重命名


#用于标签图比原图名字(不算扩展名)的基础上多了一些后缀的情况,且一张原图对应1或多张标签图。可将标签图的多余的一些后缀去掉,用统一的_0N代替(如原图名为10.jpg  而其对应的标签图为10_water_1,10_w_2 , 可将标签图重命名为10_01,10_02)。
#把多余的原图也也去掉,因为数据集比较乱的话,有的原图可能对应0张标签图
#img_path 原图所在文件夹的路径
#ann_path 标签图所在文件夹的路径
def annNameChange(img_path,ann_path,new_img_path,new_ann_path): #用来将标图变为1或255的二值图new_ann_path,
    imgs = sorted(glob.glob(img_path+"*.jpg"))

    for img in imgs:
        img_save=Image.open(img)  #读取img图片用于待会转移路径保存
        img = os.path.split(img)[1] #得到带后缀的图片名字
        img_name=os.path.splitext(img)[0]  #去掉扩展名

        print(img_name)

        ann_list=glob.glob(ann_path+img_name+"[_.]*")   #找出这张图片对应的所有标签图。 [ ] 表示匹配[]中的任意字符 。 这里需要根据自己图片的名字特征重改匹配规则
        print(len(ann_list))

        i=1
        for ann in ann_list:

            ann = Image.open(ann) #读取图片是为了下面的重新保存

            new_img_name=new_img_path+'/'+img_name+'.jpg'
            new_ann_name=new_ann_path+'/'+img_name+"_0{}.jpg".format(i) #这也是重点。


            print(new_ann_name)
            i =i+1
    
            img_save.save(new_img_name) #重新保存图片
            ann.save(new_ann_name)


给原图与标签图都重命名并保存

#和上面类似,但是这里是把原图与标签图全部重新命名,从1开始,第n张原图命名为n.jpg,而其对应的标签图命名为n_0x.jpg
def annNameChange_new(img_path,ann_path,new_img_path,new_ann_path): #用来将标图变为1或255的二值图new_ann_path,
    imgs = sorted(glob.glob(img_path+"*.jpg"))
    i_name=0    #表示正处理第i_name张图,命名是也以i_name命名
    for img in imgs:
        i_name = i_name+1
        img_save=Image.open(img)  #读取img图片用于待会转移路径保存
        img = os.path.split(img)[1] #得到带后缀的图片名字
        img_name=os.path.splitext(img)[0]  #去掉扩展名
        print(img_name)

        ann_list=glob.glob(ann_path+img_name+"[_.]*")   #找出这张图片对应的所有标签图。 [ ] 表示匹配[]中的任意字符
        print(len(ann_list))

        i=1
        for ann in ann_list:
            ann = Image.open(ann) #读取图片是为了下面的重新保存


            new_img_name=new_img_path+'/{}.jpg'.format(i_name)
            new_ann_name=new_ann_path+'/{}_0{}.jpg'.format(i_name,i) #这也是重点。

            print(new_img_path)
            print(new_ann_name)
            i =i+1

            img_save.save(new_img_name) #重新保存图片
            ann.save(new_ann_name)

取出数据集的图片、对应label图以及对应的名字分别放置于list中

#下面是我自定义的函数,用于只取出图片用测试,并且把对应的名字取出来用保存最后的结果。用于water数据集
def get_image(data_dir):
    img_list = glob.glob(data_dir+'\img\*')
    mask_list=glob.glob(data_dir+r'\annotation_255\*')
    print(len(img_list))
    print('mask_list',len(mask_list))
    imgs = []
    names=[]
    masks=[]
    # for img_path in img_list:
    #     names.append(os.path.basename(img_path))
    #     img=Image.open(img_path)
    #     imgs.append(img)
    for img_path in img_list:
        names.append(os.path.basename(img_path))
        img=Image.open(img_path)
        imgs.append(img)
    for mask_path in mask_list:
        mask = Image.open(mask_path)  # 读取图片,读取
        masks.append(mask)
    # return names,imgs
    return names,imgs,masks

同时把img与对应的mask resize 到统一尺寸并保存


"""用来同时把img与对应的mask resize 到统一尺寸"""
def resize_image(args):
        img_names,imgs=get_image(args.imgs_dir) #get_image在上文
        mask_names,masks=get_image(args.masks_dir)
        assert len(imgs)==len(masks), 'len(imgs_dir) and len(masks_dir) must be the same'
        for i in range(len(imgs)):
            re_img = imgs[i].resize((args.w, args.h), Image.BICUBIC) # args.w,args.h指的是宽和高
            re_mask= masks[i].resize((args.w, args.h), Image.BICUBIC) #插值以后还需要再经过阈值处理
            re_label_1,re_label_255=make_label(re_mask,args.Threshold)  # make_label 在下文
            re_img.save(os.path.join(args.re_img_dir, img_names[i]))
            re_label_1.save(os.path.join(args.re_mask_dir_new, mask_names[i]))
            re_label_255.save(os.path.join(args.re_mask_dir, mask_names[i]))


#这个函数用于把mask图经过阈值处理,然后分别返回灰度值为1 和 灰度值为255的图
def make_label(mask,Threshold):
    mask = mask.convert("L")  # 把打开的图片变为灰度图
    mask = np.array(mask).astype(int)  # 把打开的图片变成数组,并且把类型从uint8变为了int32,因为下面要进行像素的相加,使用uint8会超出范围的


    label_1 = (mask > Threshold) *1  # 选取一个阈值,把像素变为1,如果有多个类,其他的应该变为2,3,4等等
    label_255=label_1*255
    # label2 = np.zeros((512,512))
    # label_1=label1+label2
    label_1 = label_1.astype(np.uint8)  # 再还原成uint8格式,图片需要以这种格式来保存
    label_255 = label_255.astype(np.uint8)  # 再还原成uint8格式,图片需要以这种格式来保存
    # label_1=np.where(mask > Threshold, 1, 0)
    # label_255 = label_1 * 255
    label_1 = Image.fromarray(label_1)  # 从数组形式转为图片形式,这样可以使用save函数
    label_255= Image.fromarray(label_255)
    return label_1,label_255

用于把一个数据集划分为训练集、验证集、测试集存起来(按比例随机)


def split_dataset(args):
    img_names, imgs = get_image(args.re_img_dir) #get_image在上文中有
    # mask_names, masks = get_image(args.re_mask_dir_new)
    mask_names_255, masks_255 = get_image(args.re_mask_dir)
    assert len(masks_255) == len(imgs), 'len(imgs_dir) and len(masks_dir) must be the same'
    indexs=[i for i in range(len(imgs))]
    print(len(imgs))
    random.shuffle(indexs)  #打乱索引
    print(indexs)
    print(type(indexs))

    if args.is_split_test:  #若是要划分测试集,则比例为6:2:2
        cnt_train=int(round(len(imgs)*0.6,0)) #四舍五入,0表示保留0个小数点
        print(cnt_train)
        cnt_val = int(round(len(imgs) * 0.2, 0))  # 因为在需要做索引,所以强制转换为整型
        print(cnt_val)
        cnt_test = int(round(len(imgs) *0.2, 0))

        #下面使用列表切片得到train/val/test数据的索引
        train_indexs=indexs[0:cnt_train]
        print(train_indexs)
        val_indexs=indexs[cnt_train:(cnt_train+cnt_val):1]
        test_indexs=indexs[(cnt_train+cnt_val):]

        # for i in test_indexs:   #储存测试集数据
        #     imgs[i].save(os.path.join(args.test_dir, 'img', img_names[i]))
        #     masks[i].save(os.path.join(args.test_dir, 'annotation', mask_names[i]))
        #     masks_255[i].save(os.path.join(args.test_dir, 'annotation_255', mask_names[i]))
    else:  # 只划分训练集与验证集
        cnt_train = int(round(len(imgs) * 0.7, 0))  # 四舍五入,0表示保留0个小数点
        # print(cnt_train)
        cnt_val = int(round(len(imgs) * 0.3, 0))  # 因为在需要做索引,所以强制转换为整型
        # print(cnt_val)
        #cnt_train = 580
        #cnt_val=90
        train_indexs = indexs[0:cnt_train]
        print(train_indexs)
        val_indexs = indexs[cnt_train:]

    for i in train_indexs:
        imgs[i].save(os.path.join(args.train_dir,'imgs', img_names[i]))
        # masks[i].save(os.path.join(args.train_dir, 'annotation', mask_names[i]))
        masks_255[i].save(os.path.join(args.train_dir, 'anns', mask_names_255[i]))
    for i in val_indexs:
        imgs[i].save(os.path.join(args.val_dir, 'imgs', img_names[i]))
        # masks[i].save(os.path.join(args.val_dir, 'annotation', mask_names[i]))
        masks_255[i].save(os.path.join(args.val_dir, 'anns', mask_names_255[i]))

语义分割数据集数据增强

import Augmentor
from glob import glob
import os
import random
from PIL import Image
import cv2
import numpy as np

def augmentor(image_path,label_path,num):
    #num表示想要生成的图片张数
    p = Augmentor.Pipeline(image_path)
    # Point to a directory containing ground truth data.
    # Images with the same file names will be added as ground truth data
    # and augmented in parallel to the original data.
    p.ground_truth(label_path)
    # Add operations to the pipeline as normal:
    p.rotate(probability=0.5, max_left_rotation=10, max_right_rotation=10)
    p.flip_left_right(probability=0.5)
    p.zoom_random(probability=0.5, percentage_area=0.8) #随机放大放小,但保持原尺寸
    p.flip_top_bottom(probability=0.5)
    p.rotate_random_90(probability=0.5)
    p.random_distortion(probability=0.2, grid_width=4, grid_height=4, magnitude=8)  #表示随机扭曲与些地方
    p.sample(num)
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:30:57  更:2022-01-17 11:32:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 21:36:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码