python多进程读图提取特征存npy

本文实例为大家分享了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,运行结束!")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python提取频域特征知识点浅析

    在多数的现代语音识别系统中,人们都会用到频域特征.梅尔频率倒谱系数(MFCC),首先计算信号的功率谱,然后用滤波器和离散余弦变换的变换来提取特征.本文重点介绍如何提取MFCC特征. 首先创建有一个Python文件,并导入库文件:     from scipy.io import wavfile     from python_speech_features import mfcc, logfbank     import matplotlib.pylab as plt1.首先创建有一个Pytho

  • Python实现的特征提取操作示例

    本文实例讲述了Python实现的特征提取操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- """ Created on Mon Aug 21 10:57:29 2017 @author: 飘的心 """ #过滤式特征选择 #根据方差进行选择,方差越小,代表该属性识别能力很差,可以剔除 from sklearn.feature_selection import VarianceThreshold x=[[100

  • python实现图片处理和特征提取详解

    这是一张灵异事件图...开个玩笑,这就是一张普通的图片. 毫无疑问,上面的那副图画看起来像一幅电脑背景图片.这些都归功于我的妹妹,她能够将一些看上去奇怪的东西变得十分吸引眼球.然而,我们生活在数字图片的年代,我们也很少去想这些图片是在怎么存储在存储器上的或者去想这些图片是如何通过各种变化生成的. 在这篇文章中,我将带着你了解一些基本的图片特征处理.data massaging 依然是一样的:特征提取,但是这里我们还需要对跟多的密集数据进行处理,但同时数据清理是在数据库.表.文本等中进行.这是如何

  • 使用python实现语音文件的特征提取方法

    概述 语音识别是当前人工智能的比较热门的方向,技术也比较成熟,各大公司也相继推出了各自的语音助手机器人,如百度的小度机器人.阿里的天猫精灵等.语音识别算法当前主要是由RNN.LSTM.DNN-HMM等机器学习和深度学习技术做支撑.但训练这些模型的第一步就是将音频文件数据化,提取当中的语音特征. MP3文件转化为WAV文件 录制音频文件的软件大多数都是以mp3格式输出的,但mp3格式文件对语音的压缩比例较重,因此首先利用ffmpeg将转化为wav原始文件有利于语音特征的提取.其转化代码如下: fr

  • python利用小波分析进行特征提取的实例

    如下所示: #利用小波分析进行特征分析 #参数初始化 inputfile= 'C:/Users/Administrator/Desktop/demo/data/leleccum.mat' #提取自Matlab的信号文件 from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它 mat = loadmat(inputfile) signal = mat['leleccum'][0] import pywt #导入PyWavelets co

  • 使用python进行文本预处理和提取特征的实例

    如下所示: <strong><span style="font-size:14px;">文本过滤</span></strong> result = re.sub(r'[^\u4e00-\u9fa5,.?!,.::" "' '( )< >〈 〉]', "", content)#只保留中文和标点 result = re.sub(r'[^\u4e00-\u9fa5]', ""

  • python多进程读图提取特征存npy

    本文实例为大家分享了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/" #图像文件夹路径 da

  • Python基于Pytorch的特征图提取实例

    目录 简述 单个图片的提取 神经网络的构建 特征图的提取 可视化展示 完整代码 总结 简述 为了方便理解卷积神经网络的运行过程,需要对卷积神经网络的运行结果进行可视化的展示. 大致可分为如下步骤: 单个图片的提取 神经网络的构建 特征图的提取 可视化展示 单个图片的提取 根据目标要求,需要对单个图片进行卷积运算,但是Pytorch中读取数据主要用到torch.utils.data.DataLoader类,因此我们需要编写单个图片的读取程序 def get_picture(picture_dir,

  • python多进程提取处理大量文本的关键词方法

    经常需要通过python代码来提取文本的关键词,用于文本分析.而实际应用中文本量又是大量的数据,如果使用单进程的话,效率会比较低,因此可以考虑使用多进程. python的多进程只需要使用multiprocessing的模块就行,如果使用大量的进程就可以使用multiprocessing的进程池--Pool,然后不同进程处理时使用apply_async函数进行异步处理即可. 实验测试语料:message.txt中存放的581行文本,一共7M的数据,每行提取100个关键词. 代码如下: #codin

  • Python利用卡方Chi特征检验实现提取关键文本特征

    目录 理论 代码 题外话 理论 类别classi 非类别classi 包含单词wordj的文档数 A B 不包含单词wordj的文档数 C D 卡方特征提取主要度量类别classi和单词wordj之间的依赖关系.计算公式如下 其中N是文档总数,A是包含单词wordj且属于classi的文档数,B是包含单词wordj但不属classi的文档数,C是不包含单词wordj但属于classi的文档数,D是不包含单词wordj且不属于classi的文档数.值得注意的是 最终单词wordj的CHI值计算公式

  • python多进程中的内存复制(实例讲解)

    比较好奇python对于多进程中copy on write机制的实际使用情况.目前从实验结果来看,python 使用multiprocessing来创建多进程时,无论数据是否不会被更改,子进程都会复制父进程的状态(内存空间数据等).所以如果主进程耗的资源较多时,不小心就会造成不必要的大量的内存复制,从而可能导致内存爆满的情况. 示例 举个例子,假设主进程读取了一个大文件对象的所有行,然后通过multiprocessing创建工作进程,并循环地将每一行数据交给工作进程来处理: def parse_

  • 手把手教你使用Python绘制时间序列图

    目录 01从Quandl检索数据集 02绘制收盘价与成交量的关系图 03绘制烛台图 导读:分析时间序列数据的一种简单而有效的方法就是将时间序列数据可视化在一个图表上,这样我们就可以从中推断出某些假设.本文将以股价数据集为例,指导你从Quandl下载股价数据集,并将这些数据绘制在价格和成交量图表上.还将教大家绘制烛台图,比起直线图表,这将给我们更多的信息. 01从Quandl检索数据集 Quandl简介 Quandl是一个为金融.经济和另类数据服务的平台,这些数据由各种数据发布商提供,包括联合国.

  • Python PaddleNLP信息抽取提取快递单信息

    目录 5 条标注数据,搞定物流快递单信息抽取 智能立体库盘点 近几年,制造业作为国民经济主体,是国家创造力.竞争力和综合国力的重要体现.作为制造强国建设的主攻方向,可以说,智能制造发展水平关乎我国未来制造业的全球地位. 制造业与物流结合紧密,随着制造业的高速发展,对自动化率.全产业链协同和生产效率再提高等方向均提出了更高的要求,需要物流仓储能够匹配相应的生产节奏. 同时,据统计,我国制造业生产成本中,物流占比高达三成,降低物流成本成为了制造业利润提升的关键一环. 今天,我将基于智能制造 - 精益

  • Python多进程机制实例详解

    本文实例讲述了Python多进程机制.分享给大家供大家参考.具体如下: 在以前只是接触过PYTHON的多线程机制,今天搜了一下多进程,相关文章好像不是特别多.看了几篇,小试了一把.程序如下,主要内容就是通过PRODUCER读一个本地文件,一行一行的放到队列中去.然后会有相应的WORKER从队列中取出这些行. import multiprocessing import os import sys import Queue import time def writeQ(q,obj): q.put(o

随机推荐