20210810 所有图像数据准备一条龙(labelme_json转mask、数据增强Augmentor、随机种子设比例生成train.val、转格式(.jpg转.png)、尺寸、位深度变换
0. 图像批量处理一步到位:转格式(.jpg转.png)、尺寸(640*480)、位深度(RGB)等
import os
import glob
import os.path
from PIL import Image
from PIL import ImageFile #批量修改尺寸2048*1024(此时也可能32位)
ImageFile.LOAD_TRUNCATED_IMAGES = Truepath = "G:\\Aerial\\"
files = os.listdir(path) #会按顺序排列1,2,3,4,.png格式
i=0
for file in files:original = path + os.sep+ files[i]new = path + os.sep + str(i+1) + ".png"os.rename(original,new)i +=1
def Resize(file, outdir, width, height):imgFile = Image.open(file)try:newImage = imgFile.resize((width, height), Image.BILINEAR)newImage.save(os.path.join(outdir, os.path.basename(file)))except Exception as e:print(e)i = 0
a = 0
for file in glob.glob("G:\\Aerial\\*.png"): # 图片所在的目录# print(file)i += 1Resize(file, path, 640, 480)img = Image.open(file).convert('RGB')# 新图片存放的目录img.save(file)img1 = Image.open(file)# print(img1.getbands()) # ('P',) 这种是有彩色的,而L是没有彩色的# print(img1.size)if len(img1.getbands()) == 3:a +=1print(file)print('需要重新训练的图片数量:', i)
print('总图像是RGB的数量:', a)
检查下是否转化成功:
import os.path
from PIL import Image
from PIL import ImageFile #批量修改尺寸2048*1024(此时也可能32位)
ImageFile.LOAD_TRUNCATED_IMAGES = True
import cv2path = "G:\\000\\image_ground150\\"files = os.listdir(path)
print(files)
i = 0
a = 0
c = 0
for pic in files:img = Image.open(os.path.join(path, pic))print(pic)print(img.getbands()) # ('P',) 这种是有彩色的,而L是没有彩色的print(img.size)i +=1# Img = np.array(img)# a = np.unique(Img)# print(a) #看像素值if len(img.getbands()) == 3:a +=1size = img.sizew = size[0] # 宽度h = size[1] # 高度if w == 640:if h == 480:c += 1print('图像image的总数量: ', i)
print('总图像是RGB的数量:', a)
print('总图像是640*480的数量:', c)
1.批量排列1.2.3.4 统一成.png格式
import os
path = "F:/1207garbage classification/unknown"
files = os.listdir(path) #会按顺序排列1,2,3,4,.png格式
i=0
for file in files:original = path + os.sep+ files[i]new = path + os.sep +"N12_"+ str(i+1) + ".png"os.rename(original,new)i+=1
有时候可能直接jpg转png就行,不用排序,转完格式和原图文件名保持一致:
# 以jpg转png为例,其他格式同理,
# 代码中路径更改为自己图像存放路径即可
from PIL import Image
import osimagesDirectory=r"D:\Images" # jpg图片所在文件夹路径
distDirectory = os.path.dirname(imagesDirectory)# 保证jpg图像文件夹与png图像文件夹在同一目录下
distDirectory = os.path.join(distDirectory, "A")# 要存放png格式的文件夹路径
for imageName in os.listdir(imagesDirectory):imagePath = os.path.join(imagesDirectory, imageName)image = Image.open(imagePath)# 打开jpg图像distImagePath = os.path.join(distDirectory, imageName[:-4]+'.png')# 更改图像后缀为.png,并保证与原图像同名image.save(distImagePath)# 保存png图像
2.批量修改尺寸
import glob
import os.path
from PIL import Image
from PIL import ImageFile #批量修改尺寸2048*1024(此时也可能32位)
ImageFile.LOAD_TRUNCATED_IMAGES = Truedef Resize(file, outdir, width, height):imgFile = Image.open(file)try:newImage = imgFile.resize((width, height), Image.BILINEAR)newImage.save(os.path.join(outdir, os.path.basename(file)))except Exception as e:print(e)for file in glob.glob("A/*.png"): # 图片所在的目录Resize(file, "1/", 2048, 1024) # 新图片存放的目录
3.批量统一到RGB三通道
from PIL import Image #改成统一RGB通道
import ospath = "2"
save_path = "3"files = os.listdir(path)
print(files)for pic in files:img = Image.open(os.path.join(path, pic)).convert('RGB')print(pic)print(img.getbands()) # ('P',) 这种是有彩色的,而L是没有彩色的print(img.size)pic_new = os.path.join(save_path, pic)img.save(pic_new)
另一版本:
import glob
import os.path
import numpy as np
from PIL import Image
from PIL import ImageFile #批量修改尺寸2048*1024(此时也可能32位)
ImageFile.LOAD_TRUNCATED_IMAGES = Truepath = "3"files = os.listdir(path)
print(files)for pic in files:img = Image.open(os.path.join(path, pic))print(pic)print(img.getbands()) # ('P',) 这种是有彩色的,而L是没有彩色的print(img.size)Img = np.array(img)a = np.unique(Img)print(a) #看像素值
4.输出结果顺序、格式、位深通道、尺寸
5.labelme_json转mask
一步到位:
import cv2
import numpy as np
import json
import os.path
from PIL import Image
import globcategory_types = ["unlabeled","water"]h = 480
w = 640path = "G:\\V5_water\\json87"
filenames = os.listdir(path)
# for filename in filenames:
for filename in glob.glob("G:\\V5_water\\json87\\*.json"):mask = np.zeros([h, w, 1], np.uint8)# json_all = "G:\\0906\\json\\1.json" # 原json路径json_all = os.path.join(path, filename)with open(json_all, 'r') as f: #json文件路径label = json.load(f)shapes = label["shapes"]for shape in shapes:category = shape["label"]points = shape["points"]#填充points_array = np.array(points, dtype=np.int32)mask = cv2.fillPoly(mask, [points_array], category_types.index(category))# if category == "road": #高亮显示其中一个标签图像# mask = cv2.fillPoly(mask, [points_array], 1)# # else:# if category == "sidewalk":# mask = cv2.fillPoly(mask,[points_array], 2)# str = filename(len(ff):-5)name_json = os.path.split(json_all)[-1] # '1.json'name = str(name_json)[0:-len('.json')] # '1'savename = "G:\\V5_water\\mask87\\" + name + ".png" # 需要在此路径下新建一个mask文件夹,结果图保存在此文件夹下面cv2.imwrite(savename, mask)img = Image.open(savename)Img = np.array(img)a = np.unique(Img)print(savename)print(mask.shape)print(img.getbands())print('像素值:',a)
不放心的话可以再试一次看看mask可视化效果:
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import cv2
import osdef create_pascal_label_colormap():colormap = np.zeros((256, 3), dtype=int)ind = np.arange(256, dtype=int)for shift in reversed(range(8)):for channel in range(3):colormap[:, channel] |= ((ind >> channel) & 1) << shiftind >>= 3return colormapdef label_to_color_image(label):if label.ndim != 2:raise ValueError('Expect 2-D input label')colormap = create_pascal_label_colormap()if np.max(label) >= len(colormap):raise ValueError('label value too large.')return colormap[label]def vis_segmentation(image, seg_map):"""输入图片和分割 mask 的可视化."""plt.figure(figsize=(15, 5))grid_spec = gridspec.GridSpec(1, 4, width_ratios=[6, 6, 6, 1])plt.subplot(grid_spec[0])plt.imshow(image)plt.axis('off')plt.title('input image')plt.subplot(grid_spec[1])seg_image = label_to_color_image(seg_map).astype(np.uint8)plt.imshow(seg_image)plt.axis('off')plt.title('segmentation map')plt.subplot(grid_spec[2])plt.imshow(image)plt.imshow(seg_image, alpha=0.5)plt.axis('off')plt.title('segmentation overlay')unique_labels = np.unique(seg_map)ax = plt.subplot(grid_spec[3])plt.imshow(FULL_COLOR_MAP[unique_labels].astype(np.uint8), interpolation='nearest')ax.yaxis.tick_right()plt.yticks(range(len(unique_labels)), LABEL_NAMES[unique_labels])plt.xticks([], [])ax.tick_params(width=0.0)plt.grid('off')# plt.imsave('G:\\1\\' + image)# plt.show()LABEL_NAMES = np.asarray(['background', 'water']) # 假设只有两类
FULL_LABEL_MAP = np.arange(len(LABEL_NAMES)).reshape(len(LABEL_NAMES), 1)
FULL_COLOR_MAP = label_to_color_image(FULL_LABEL_MAP)img_path = 'G:\\V5_water\\image87\\' # img原图路径
png_path = 'G:\\V5_water\\mask87\\' # mask输出全黑路径
i = 0
for img in os.listdir(img_path):print(img)imgfile = img_path + imgpngfile = png_path + imgnew_path = "G:\\V5_water\\plt\\" + img #保存新的验证集val.txt测试结果可视化路径!!!img = cv2.imread(imgfile, 1)img = img[:, :, ::-1]seg_map = cv2.imread(pngfile, 0)vis_segmentation(img, seg_map)plt.savefig(new_path)plt.close()i +=1print('可视化总数量:',i)
print('Done.')
结果可视化如下:
如果原图是jpg,需要生成png格式进行训练的话:
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import cv2
import os
from PIL import Imagedef create_pascal_label_colormap():colormap = np.zeros((256, 3), dtype=int)ind = np.arange(256, dtype=int)for shift in reversed(range(8)):for channel in range(3):colormap[:, channel] |= ((ind >> channel) & 1) << shiftind >>= 3return colormapdef label_to_color_image(label):if label.ndim != 2:raise ValueError('Expect 2-D input label')colormap = create_pascal_label_colormap()if np.max(label) >= len(colormap):raise ValueError('label value too large.')return colormap[label]def vis_segmentation(image, seg_map):"""输入图片和分割 mask 的可视化."""plt.figure(figsize=(15, 5))grid_spec = gridspec.GridSpec(1, 4, width_ratios=[6, 6, 6, 1])plt.subplot(grid_spec[0])plt.imshow(image)plt.axis('off')plt.title('input image')plt.subplot(grid_spec[1])seg_image = label_to_color_image(seg_map).astype(np.uint8)plt.imshow(seg_image)plt.axis('off')plt.title('segmentation map')plt.subplot(grid_spec[2])plt.imshow(image)plt.imshow(seg_image, alpha=0.5)plt.axis('off')plt.title('segmentation overlay')unique_labels = np.unique(seg_map)ax = plt.subplot(grid_spec[3])plt.imshow(FULL_COLOR_MAP[unique_labels].astype(np.uint8), interpolation='nearest')ax.yaxis.tick_right()plt.yticks(range(len(unique_labels)), LABEL_NAMES[unique_labels])plt.xticks([], [])ax.tick_params(width=0.0)plt.grid('off')# plt.imsave('G:\\1\\' + image)# plt.show()LABEL_NAMES = np.asarray(['background', 'water']) # 假设只有两类
FULL_LABEL_MAP = np.arange(len(LABEL_NAMES)).reshape(len(LABEL_NAMES), 1)
FULL_COLOR_MAP = label_to_color_image(FULL_LABEL_MAP)# img_path = 'E:\\add_water1102\\FloW_IMG(water_segementation)\\image640x320\\' # img原图路径
img_path = 'E:\\add_water1102\\FloW_IMG(water_segementation)\\all_images\\'
png_path = 'E:\\add_water1102\\FloW_IMG(water_segementation)\\all_masks\\' # mask输出全黑路径
i = 0
new_input_path = 'E:\\add_water1102\\FloW_IMG(water_segementation)\\all_image_png\\' # 如果是jpg的话会有生成png的路径
plt_path = "E:\\add_water1102\\FloW_IMG(water_segementation)\\plt\\"if not os.path.exists(new_input_path):os.makedirs(new_input_path)for img in os.listdir(img_path):print(img)imgfile = img_path + imga = Image.open(imgfile)a = a.resize((640, 480), Image.BILINEAR)a.save(imgfile)if img.endswith('.jpg'):img = img.replace(".jpg", ".png")if not os.path.exists(new_input_path):os.makedirs(new_input_path)else:passpngfile = png_path + imgb = Image.open(pngfile)b = b.resize((640, 480), Image.BILINEAR)b.save(pngfile)a = cv2.imread(imgfile)cv2.imwrite(new_input_path + img, a)new_path = plt_path + img # 保存新的验证集val.txt测试结果可视化路径!!!img = cv2.imread(new_input_path + img, 1)img = img[:, :, ::-1]seg_map = cv2.imread(pngfile, 0)vis_segmentation(img, seg_map)plt.savefig(new_path)plt.close()i += 1else:# 原图pngpngfile = png_path + imgb = Image.open(pngfile)b = b.resize((640, 480), Image.BILINEAR)b.save(pngfile)new_path = plt_path + img.split(".")[0] + ".png" #保存新的验证集val.txt测试结果可视化路径!!!img = cv2.imread(imgfile, 1)img = img[:, :, ::-1]seg_map = cv2.imread(pngfile, 0)vis_segmentation(img, seg_map)plt.savefig(new_path)plt.close()i +=1print('可视化总数量:',i)
print('Done.')
另一种bat大法:
1.bat文件
for %%m in (G:\haha\1\*.json) do (
python G:\labelme_json.py %%m
)
python文件:
import cv2
import numpy as np
import json
import sysdef main(argv):category_types = ["unlabeled","road line","sidewalk line"]h = 480w = 640mask = np.zeros([h, w, 1], np.uint8)filename = argv[1]with open(filename, "r") as f: #json文件路径label = json.load(f)shapes = label["shapes"]for shape in shapes:category = shape["label"]points = shape["points"]#填充points_array = np.array(points, dtype=np.int32)mask = cv2.fillPoly(mask, [points_array], category_types.index(category))# if category == "B": #高亮显示其中一个标签图像# mask = cv2.fillPoly(mask, [points_array], 255)# else:# mask = cv2.fillPoly(mask,[points_array],category_types.index(category))ff = "G:/0811json/json/" #原json路径str = filename[len(ff):-5]savename = "G:/0811json/mask/" + str + ".png" # 需要在此路径下新建一个mask文件夹,结果图保存在此文件夹下面print(savename)cv2.imwrite(savename, mask)#cv2.waitKey(0)if __name__ == '__main__':main(sys.argv)
6.增强后!生成train.txt和val.txt路径
# 导入数据增强工具
import Augmentor# 确定原始图像存储路径以及掩码文件存储路径
p = Augmentor.Pipeline("image200") # 原图和mask的标签要一一对应!!扩充后的图都在原图里面新生成output的文件夹!
p.ground_truth("mask200") #标签图mask# 图像旋转: 按照概率0.8执行,最大左旋角度10,最大右旋角度10
p.rotate(probability=0.8, max_left_rotation=10, max_right_rotation=10)# 图像左右互换: 按照概率0.5执行
p.flip_left_right(probability=0.5)# 图像放大缩小: 按照概率0.8执行,面积为原始图0.85倍
p.zoom_random(probability=0.3, percentage_area=0.85)# 最终扩充的数据样本数(200到2000张,扩充了十倍)
p.sample(2000)
随机种子(比例9:1)生成训练和验证集666:(最新版)
from __future__ import absolute_import, print_function, division
import os
import randomimg_root = '.\\1\\'train_labeltxt = ".\\1\\train.txt"val_labeltxt = ".\\1\\val.txt"def get_img_mask_from_dir(data_dir, split_rate=0.1, random_seed=666):""":param data_dir: 图片数据存放路径:param split_rate: 拆分验证集的比例:param random_seed: 随机种子:return:"""train_paths = []val_paths = []for sub_dir in os.listdir(data_dir):if sub_dir == 'a30': # 原图文件夹sub_path = os.path.join(data_dir, sub_dir)image_names = os.listdir(sub_path)nrof_img = len(image_names)indx = list(range(nrof_img))random.shuffle(indx, random.seed(random_seed))mask_dir = 'b30' # mask文件夹mask_path = os.path.join(data_dir, mask_dir)mask_names = os.listdir(mask_path)# 原图和MASK名字对应索引# train_paths.extend([(os.path.join(sub_dir, image_names[i]).replace('\\', '/'), os.path.join(mask_dir, f'{os.path.splitext(image_names[i])[0]}.png').replace('\\', '/')) for i in indx[int(nrof_img*split_rate):]])# 原图和MASK名字按顺序索引train_paths.extend([(os.path.join(sub_dir, image_names[i]).replace('\\', '/'), os.path.join(mask_dir,f'{os.path.splitext(mask_names[i])[0]}.png').replace('\\', '/')) for i in indx[int(nrof_img*split_rate):]])val_paths.extend([(os.path.join(sub_dir, image_names[i]).replace('\\', '/'), os.path.join(mask_dir, f'{os.path.splitext(mask_names[i])[0]}.png').replace('\\', '/')) for i in indx[:int(nrof_img*split_rate)]])else:continuereturn train_paths, val_pathsif __name__ == '__main__':train_path, val_path = get_img_mask_from_dir(img_root, split_rate=0.1, random_seed=666)print('训练集数量train_path:',len(train_path))print('验证集数量val_path:',len(val_path))with open(train_labeltxt, 'a') as f:for line in train_path:f.write(line[0]+','+line[1]+'\n')with open(val_labeltxt, 'a') as f:for line in val_path:f.write(line[0]+','+line[1]+'\n')
随机生成训练和验证集:(旧版本)
from __future__ import absolute_import, print_function, division
import os
import randomimg_root = 'G:/water/'train_labeltxt = "G:/water/train.txt"val_labeltxt = "G:/water/val.txt"def get_img_mask_from_dir(data_dir, split_rate=0.1, random_seed=666):""":param data_dir: 图片数据存放路径:param split_rate: 拆分验证集的比例:param random_seed: 随机种子:return:"""train_paths = []val_paths = []for sub_dir in os.listdir(data_dir):if sub_dir == 'test0':sub_path = os.path.join(data_dir, sub_dir)image_names = os.listdir(sub_path)nrof_img = len(image_names)indx = list(range(nrof_img))random.shuffle(indx, random.seed(random_seed))mask_dir = 'mask0'train_paths.extend([(os.path.join(sub_dir, image_names[i]).replace('\\', '/'), os.path.join(mask_dir, f'{os.path.splitext(image_names[i])[0]}.png').replace('\\', '/')) for i in indx[int(nrof_img*split_rate):]])val_paths.extend([(os.path.join(sub_dir, image_names[i]).replace('\\', '/'), os.path.join(mask_dir, f'{os.path.splitext(image_names[i])[0]}.png').replace('\\', '/')) for i in indx[:int(nrof_img*split_rate)]])else:continuereturn train_paths, val_pathsif __name__ == '__main__':train_path, val_path = get_img_mask_from_dir(img_root, split_rate=0.1, random_seed=666)print('train_path:',len(train_path))print('val_path:',len(val_path))with open(train_labeltxt, 'a') as f:for line in train_path:f.write(line[0]+','+line[1]+'\n')with open(val_labeltxt, 'a') as f:for line in val_path:f.write(line[0]+','+line[1]+'\n')
不用新建train.txt 自动生成(旧版本)
(旧版本)
import ostrain_image_path = 'image/'
train_label_path = 'mask/'label_list = []
image_list = []train_image_dir = sorted(os.listdir(train_image_path))
train_label_dir = sorted(os.listdir(train_label_path))#print(train_label_dir)
file = './train.txt'
with open(file, 'w') as f:for n1, n2 in zip(train_image_dir, train_label_dir):train_single_image = os.path.join(train_image_path, n1)train_single_label = os.path.join(train_label_path, n2)# print(train_single_label)f.write(train_single_image + ',' + train_single_label + '\n')f.close()
生成train.txt(旧版本)
7.用linux命令将.txt按照行打散
shuf 6.txt -o output.txt
打散前:
打散后:
可视化mask:
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import cv2def create_pascal_label_colormap():colormap = np.zeros((256, 3), dtype=int)ind = np.arange(256, dtype=int)for shift in reversed(range(8)):for channel in range(3):colormap[:, channel] |= ((ind >> channel) & 1) << shiftind >>= 3return colormapdef label_to_color_image(label):if label.ndim != 2:raise ValueError('Expect 2-D input label')colormap = create_pascal_label_colormap()if np.max(label) >= len(colormap):raise ValueError('label value too large.')return colormap[label]def vis_segmentation(image, seg_map):"""输入图片和分割 mask 的可视化."""plt.figure(figsize=(15, 5))grid_spec = gridspec.GridSpec(1, 4, width_ratios=[6, 6, 6, 1])plt.subplot(grid_spec[0])plt.imshow(image)plt.axis('off')plt.title('input image')plt.subplot(grid_spec[1])seg_image = label_to_color_image(seg_map).astype(np.uint8)plt.imshow(seg_image)plt.axis('off')plt.title('segmentation map')plt.subplot(grid_spec[2])plt.imshow(image)plt.imshow(seg_image, alpha=0.7)plt.axis('off')plt.title('segmentation overlay')unique_labels = np.unique(seg_map)ax = plt.subplot(grid_spec[3])plt.imshow(FULL_COLOR_MAP[unique_labels].astype(np.uint8), interpolation='nearest')ax.yaxis.tick_right()plt.yticks(range(len(unique_labels)), LABEL_NAMES[unique_labels])plt.xticks([], [])ax.tick_params(width=0.0)plt.grid('off')plt.show()LABEL_NAMES = np.asarray(['background', 'water']) # 假设只有两类
FULL_LABEL_MAP = np.arange(len(LABEL_NAMES)).reshape(len(LABEL_NAMES), 1)
FULL_COLOR_MAP = label_to_color_image(FULL_LABEL_MAP)imgfile = '1.png'
pngfile = '2.png'
img = cv2.imread(imgfile, 1)
img = img[:,:,::-1]
seg_map = cv2.imread(pngfile, 0)
vis_segmentation(img, seg_map)print('Done.')
20210810 所有图像数据准备一条龙(labelme_json转mask、数据增强Augmentor、随机种子设比例生成train.val、转格式(.jpg转.png)、尺寸、位深度变换相关推荐
- Radiology:影像组学:图像不仅仅是图片,它们还是数据
在过去十年中,随着模式识别方法的增加和数据集大小的增加,医学图像分析领域的研究越来越多.这些研究促进了对图像定量特征高通量提取过程的发展,从而将图像转换为可挖掘数据特征,并随后对这些数据进行分析,以提 ...
- (1)【数据隐藏】一起入门隐写吧,宝?word、图像、移动设备、文件压缩数据隐藏
目录 第2章 数据隐藏简单练习4则 2.1 在word中隐藏数据 如何在word中隐藏数据?(包含不易被发现的傻瓜方法) 如何设置显示隐藏文字?(微软自带) 如何检测隐藏在文档里的信息?(避 ...
- JPG图像exif和XPM信息中GPS数据姿态数据航向角数据的提取
JPG图像的编码相关内容太多不在多说了大家随手能查很多资料. 今天重点说说图像数据中的GPS信息以及飞机.相机姿态角度数据提取. JPG作为复杂的图像数据很多人都知道存在一个叫做EXIF的数据规范,在 ...
- 图像位深度 8位 16位 24位 32位区别对比 RGB 真彩色 基本概念:(大小,深度,通道)位深度数据类型转换原理 Mat数据读取(opencv里的imread)
位深度 位深度是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的二进制数值位数来表示的.计算机之所以能够显示颜色,是采用了一种称作"位"( bit ) 的记数单位来记录所表 ...
- 使用 LJ1-01 夜间灯光图像检测县域经济发展:与 NPP-VIIRS 数据的比较
抽象的 夜间灯光(NTL)遥感数据已被广泛用于推导国家和区域尺度的社会经济指标,以研究区域经济发展.然而,以往的研究大多只选择单一的衡量指标(如GDP),采用简单的回归方法,基于DMSP-OLS或NP ...
- 图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像
图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像 这篇博客将介绍如何从头到尾创建图像搜索引擎.第一步是选择一个图像描述符--使用3D RGB直方图来表征图像的颜色.然后通过提取 ...
- 耕耘数据,融合发展——2018年度数据科学研究院RONG教授座谈会成功举办
2018年05月07日,以"耕耘数据.融合发展"为主题的2018年度数据科学研究院(以下简称"数据院")RONG教授座谈会于双清大厦拉开帷幕.数据院院长俞士纶. ...
- 《企业大数据系统构建实战:技术、架构、实施与应用》——第3章 企业大数据解决方案 3.1 企业大数据解决方案实现方式...
本节书摘来自华章计算机<企业大数据系统构建实战:技术.架构.实施与应用>一书中的第3章,第3.1节,作者 吕兆星 郑传峰 宋天龙 杨晓鹏,更多章节内容可以访问云栖社区"华章计算机 ...
- 四说大数据时代“神话”:从大数据到深数据\n
作为国内最大的电商平台之一,苏宁每天要处理数量巨大的数据.为了更快速高效地处理这些数据,苏宁调度平台采取了哪些措施呢? 本文是苏宁大数据离线任务开发调度平台实践系列文章之上篇,详解苏宁的任务调度模块. ...
最新文章
- linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...
- mark一下总是记混的重定向与转发的区别
- Ubuntu12.04安装中文字体,解决导出图片乱码
- java textfield 数字,如何将整数转换为文本以便在textfield java-blackberry中使用
- 第十四章:详解Jenkins节点配置
- Android之在linux环境不通过TAG快速过滤日志
- starter_您是否尝试过MicroProfile Starter?
- sharepoint 2007功能增强解决方案,资料收集
- 设置office首字母不变大小的手段
- 十大算法 — 插入排序法【C语言代码诠释】
- 讲解NPN与PNP三极管做开关管使用方法与计算
- Zookeeper,集群管理之独孤求败
- android6 wifi耗电,移动端耗电量测试方法总结
- Oracle Database 10g for Windows安装
- [易飞]关于自制件调整为虚设件的处理方案
- 提取DWI数据的FA和MD
- 基于飞凌i.MX6Q-C核心板搭建3D相机
- js前端base64转码解码
- [QNX 自适应分区用户指南]12 APS开发实践
- 程序员职场规划:你的命运不是一头骡子