本文实例为大家分享了python多进程读图提取特征存npy的具体代码,供大家参考,具体内容如下
import multiprocessing import os, time, random import numpy as np import cv2 import os import sys from time import ctime import tensorflow as tf image_dir = r"D:/sxl/处理图片/汉字分类/train10/" #图像文件夹路径 data_type = 'test' save_path = r'E:/sxl_Programs/Python/CNN/npy/' #存储路径 data_name = 'Img10' #npy文件名 char_set = np.array(os.listdir(image_dir)) #文件夹名称列表 np.save(save_path+'ImgShuZi10.npy',char_set) #文件夹名称列表 char_set_n = len(char_set) #文件夹列表长度 read_process_n = 1 #进程数 repate_n = 4 #随机移动次数 data_size = 1000000 #1个npy大小 shuffled = True #是否打乱 #可以读取带中文路径的图 def cv_imread(file_path,type=0): cv_img=cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1) # print(file_path) # print(cv_img.shape) # print(len(cv_img.shape)) if(type==0): if(len(cv_img.shape)==3): cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) return cv_img #多个数组按同一规则打乱数据 def ShuffledData(features,labels): ''' @description:随机打乱数据与标签,但保持数据与标签一一对应 ''' permutation = np.random.permutation(features.shape[0]) shuffled_features = features[permutation,:] #多维 shuffled_labels = labels[permutation] #1维 return shuffled_features,shuffled_labels #函数功能:简单网格 #函数要求:1.无关图像大小;2.输入图像默认为灰度图;3.参数只有输入图像 #返回数据:1x64*64维特征 def GetFeature(image): #图像大小归一化 image = cv2.resize(image,(64,64)) img_h = image.shape[0] img_w = image.shape[1] #定义特征向量 feature = np.zeros(img_h*img_w,dtype=np.int16) for h in range(img_h): for w in range(img_w): feature[h*img_h+w] = image[h,w] return feature # 写数据进程执行的代码: def read_image_to_queue(queue): print('Process to write: %s' % os.getpid()) for j,dirname in enumerate(char_set): # dirname 是文件夹名称 label = np.where(char_set==dirname)[0][0] #文件夹名称对应的下标序号 print('序号:'+str(j),'读 '+dirname+' 文件夹...时间:',ctime() ) for parent,_,filenames in os.walk(os.path.join(image_dir,dirname)): for filename in filenames: if(filename[-4:]!='.jpg'): continue image = cv_imread(os.path.join(parent,filename),0) # cv2.imshow(dirname,image) # cv2.waitKey(0) queue.put((image,label)) for i in range(read_process_n): queue.put((None,-1)) print('读图结束!') return True # 读数据进程执行的代码: def extract_feature(queue,lock,count): ''' @description:从队列中取出图片进行特征提取 @queue:先进先出队列 lock:锁,在计数时上锁,防止冲突 count:计数 ''' print('Process %s start reading...' % os.getpid()) global data_n features = [] #存放提取到的特征 labels = [] #存放标签 flag = True #标志着进程是否结束 while flag: image,label = queue.get() #从队列中获取图像和标签 if len(features) >= data_size or label == -1: #特征数组的长度大于指定长度,则开始存储 array_features = np.array(features) #转换成数组 array_labels = np.array(labels) array_features,array_labels = ShuffledData(array_features,array_labels) #打乱数据 lock.acquire() # 锁开始 # 拆分数据为训练集,测试集 split_x = int(array_features.shape[0] * 0.8) train_data, test_data = np.split(array_features, [split_x], axis=0) # 拆分特征数据集 train_labels, test_labels = np.split(array_labels, [split_x], axis=0) # 拆分标签数据集 count.value += 1 #下标计数加1 str_features_name_train = data_name+'_features_train_'+str(count.value)+'.npy' str_labels_name_train = data_name+'_labels_train_'+str(count.value)+'.npy' str_features_name_test = data_name+'_features_test_'+str(count.value)+'.npy' str_labels_name_test = data_name+'_labels_test_'+str(count.value)+'.npy' lock.release() # 锁释放 np.save(save_path+str_features_name_train,train_data) np.save(save_path+str_labels_name_train,train_labels) np.save(save_path+str_features_name_test,test_data) np.save(save_path+str_labels_name_test,test_labels) print(os.getpid(),'save:',str_features_name_train) print(os.getpid(),'save:',str_labels_name_train) print(os.getpid(),'save:',str_features_name_test) print(os.getpid(),'save:',str_labels_name_test) features.clear() labels.clear() if label == -1: break # 获取特征向量,传入灰度图 feature = GetFeature(image) features.append(feature) labels.append(label) # # 随机移动4次 # for itime in range(repate_n): # rMovedImage = randomMoveImage(image) # feature = SimpleGridFeature(rMovedImage) # 简单网格 # features.append(feature) # labels.append(label) print('Process %s is done!' % os.getpid()) if __name__=='__main__': time_start = time.time() # 开始计时 # 父进程创建Queue,并传给各个子进程: image_queue = multiprocessing.Queue(maxsize=1000) #队列 lock = multiprocessing.Lock() #锁 count = multiprocessing.Value('i',0) #计数 #将图写入队列进程 write_sub_process = multiprocessing.Process(target=read_image_to_queue, args=(image_queue,)) read_sub_processes = [] #读图子线程 for i in range(read_process_n): read_sub_processes.append( multiprocessing.Process(target=extract_feature, args=(image_queue,lock,count)) ) # 启动子进程pw,写入: write_sub_process.start() # 启动子进程pr,读取: for p in read_sub_processes: p.start() # 等待进程结束: write_sub_process.join() for p in read_sub_processes: p.join() time_end=time.time() time_h=(time_end-time_start)/3600 print('用时:%.6f 小时'% time_h) print ("读图提取特征存npy,运行结束!")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]