import cv2
import glob
import numpy as np
import os
import random
import cv2
import matplotlib.pyplot as plt
from tqdm import tqdm
import pandas as pd
def npz():
#原图像路径
path = r'F:/COVID-19 CT scan lesion segmentation dataset/images/*.png'
#项目中存放训练所用的npz文件路径
path2 = r'F:/COVID-19 CT scan lesion segmentation dataset/1111/test//'
for i,img_path in enumerate(glob.glob(path)):
#读入图像
image = cv2.imread(img_path)
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
#读入标签
label_path = img_path.replace('images','labels')
label = cv2.imread(label_path,flags=0)
#将非目标像素设置为0
label[label!=255]=0
#将目标像素设置为1
label[label==255]=1
#保存npz
np.savez(path2+str(i),image=image,label=label)
print('------------',i)
# 加载npz文件
# data = np.load(r'F:\COVID-19 CT scan lesion segmentation dataset\1111\test\0.npz', allow_pickle=True)
# image, label = data['image'], data['label']
print('ok')
if __name__=="__main__":
ret_arr=npz()
print('ok')
上边生成NPZ文件其中要将lable设置好,从0开始,就是把其中表示不同类的像素点更改成新的像素值,这样才能被网络读取。
将文件夹中的文件统计命名后写入TXT文件
#文件夹记录到TXT中
# -*- coding:utf-8 -*-
import sys
sys.path.append('E:\\Anaconda\\libs')
import os #os:操作系统相关的信息模块
import random #导入随机函数
#存放原始图片地址
data_base_dir = "F:/COVID-19 CT scan lesion segmentation dataset/1111/tran"
file_list = [] #建立列表,用于保存图片信息
#读取图片文件,并将图片地址、图片名和标签写到txt文件中
write_file_name = 'F:/COVID-19 CT scan lesion segmentation dataset/1111/train.txt'
write_file = open(write_file_name, "w") #以只写方式打开write_file_name文件
for file in os.listdir(data_base_dir): #file为current_dir当前目录下图片名
if file.endswith(".png"): #如果file以jpg结尾
write_name = file.split('.')[0] #图片路径 + 图片名 + 标签
file_list.append(write_name) #将write_name添加到file_list列表最后
sorted(file_list) #将列表中所有元素随机排列
number_of_lines = len(file_list) #列表中元素个数
#将图片信息写入txt文件中,逐行写入
for current_line in range(number_of_lines):
write_file.write(file_list[current_line] + '\n')
#关闭文件
write_file.close()
将数据集划分(训练集,验证机,测试机)
#########################生成训练集和数据集
# 从总的数据集中(有规律)选取固定大小部分作为训练集验证集测试集的总和。如此处选取总数据集的前10000句作为需要使用的数据集。
# 两次使用train_test_split()将选取的固定大小的数据集,按照一定的比例,如8:1:1随机划分为训练集,验证集,测试集。
# 并分别将划分好的数据集进行写入到固定目录下
from sklearn.model_selection import train_test_split
def write_data(datapath, line_sen_list):
'''
datapath: 需要写入的文件地址
line_sen_list: 需要写入的文件内容行列表
'''
with open(datapath, 'w', encoding = 'utf-8') as o:
o.write(''.join(line_sen_list))
o.close()
def main():
raw_data_path = 'F:/COVID-19 CT scan lesion segmentation dataset/1111/train.txt'
train_data_path = 'F:/COVID-19 CT scan lesion segmentation dataset/1111/tr.txt'
validate_data_path = 'F:/COVID-19 CT scan lesion segmentation dataset/1111/111.txt'
test_data_path = 'F:/COVID-19 CT scan lesion segmentation dataset/1111/test.txt'
line_sen_list = []
with open(raw_data_path, 'r', encoding = 'utf-8') as f:
lines = f.readlines()
# 按某种规律选取固定大小的数据集..需要更改循环数为数据集数量
for line in lines[0:2729]:
line_sen_list.append(''.join(line))
f.close()
label_list = [0] * 2729 # 由于该数据形式为文本,且形式为数据和标签在一起,所以train_test_split()中标签可以给一个相同大小的0值列表,无影响。
# 先将1.训练集,2.验证集+测试集,按照8:2进行随机划分
X_train, X_validate_test, _, y_validate_test = train_test_split(line_sen_list, label_list, test_size = 0.1, random_state = 42)
# 再将1.验证集,2.测试集,按照1:1进行随机划分
X_validate, X_test, _, _ = train_test_split(X_validate_test, y_validate_test, test_size = 0.1, random_state = 42)
# 分别将划分好的训练集,验证集,测试集写入到指定目录
write_data(train_data_path, X_train)
write_data(validate_data_path, X_validate)
write_data(test_data_path, X_test)
if __name__ == '__main__':
main()