NYUv2生成边界GT(1)

news2025/7/31 4:39:22

看了cityscape和NYUv2生成边界GT的代码后,因为自己使用的是NYUv2数据集,所以需要对自己的数据集进行处理。CASENet生成边界GT所使用的代码是MATLAB,所以又重新看了一下MATLAB的代码,并进行修改,生成了自己的边界代码。
前提知识:
1:NYUv2有四十个类别,0像素代表空,1像素代表墙,所以标签上共有41个像素,在计算时候要忽略掉空像素。
2:MATLAB生成的是.bin文件,需要将.bin文件转化为.png文件,一是方便网络读取,二是对每一个通道都保存下来。
3:unit8可以保存2的8次方,共256个数字,unit32可以保存2的32次方个数字,unit64可以保存2的64次方个数字。
4:自己的NYUv2数据集存放结构:
在这里插入图片描述
MATLAB代码:

function demo()

clc; clear; close all;

%% Parameters
dataRoot = '../data_orig';
genDataRoot = '../data_proc';
%scaleSet = [1];
numCls = 40; % Number of defined semantic classes in SBD
radius = 2; % Defined search radius for label changes (related to edge thickness, default value of the CASENet CVPR paper)
edge_type = 'regular';

%% Setup Parallel Pool
numWorker = 4; % Number of matlab workers for parallel computing
matlabVer = version('-release');
if( str2double(matlabVer(1:4)) > 2013 || (str2double(matlabVer(1:4)) == 2013 && strcmp(matlabVer(5), 'b')) )
    delete(gcp('nocreate'));
    parpool('local', numWorker);
else
    if(matlabpool('size')>0) %#ok<*DPOOL>
        matlabpool close
    end
    matlabpool open 8
end

%% Generate Preprocessed Dataset
setList = {'train', 'test'};
for setID = 1:length(setList)
    setName = setList{setID};%train
 
    % Create output directories
    if(strcmp(setName, 'train'))%如果setname等于train
            % Train,生成文件夹
            if(exist([genDataRoot '/train/rgb'], 'file')==0)
                mkdir([genDataRoot '/train/rgb']);%生成train/rgb文件夹
            end
            if(exist([genDataRoot '/train/labels_40'], 'file')==0)
                mkdir([genDataRoot '/train/labels_40']);%生成train/label文件夹
            end
            if(exist([genDataRoot '/train/depth'], 'file')==0)
                mkdir([genDataRoot '/train/depth']);%生成train/label文件夹
            end
            if(exist([genDataRoot '/train/edge_labels_40'], 'file')==0)
                mkdir([genDataRoot '/train/edge_labels_40']);%生成train/label文件夹
            end
    else
        % Test (correspond to val set in the original SBD Dataset)
        if(exist([genDataRoot '/test/rgb'], 'file')==0)
            mkdir([genDataRoot '/test/rgb']);
        end
        if(exist([genDataRoot '/test/labels_40'], 'file')==0)
            mkdir([genDataRoot '/test/labels_40']);
        end
        if(exist([genDataRoot '/test/depth'], 'file')==0)
                mkdir([genDataRoot '/test/depth']);%生成train/label文件夹
        end
        if(exist([genDataRoot '/test/edge_labels_40'], 'file')==0)
            mkdir([genDataRoot '/test/edge_labels_40']);
        end
    end
    
    fidIn = fopen([dataRoot '/' setName '.txt']);%打开data_orig/train.txt,返回等于或大于 3 的整数文件标识符,当setName为test时
    fileName = fgetl(fidIn);%读取文件中的行,并删除换行符,
    fileList = cell(1,1);%创建一个元胞数组[]。
    countFile = 0;
    while ischar(fileName)%确定输入是否为字符数组
        countFile = countFile + 1;%1/2...train文件有多少行,countFile等于多少
        fileList{countFile} = fileName;%向元胞中添加filename即第一张图片的name。
        fileName = fgetl(fidIn);%data_orig/train.txt中第一行的名字,作为输出到while中
    end
    fclose(fidIn);
    
    % Compute boundaries and write labels
    disp(['Computing ' setName ' set boundaries'])
    parfor_progress(countFile);
    parfor idxFile = 1:countFile
    %for idxFile = 1:countFile %795
        fileName = fileList{idxFile};%根据idxFile索引去文件list里面查找
        if(strcmp(setName, 'train'))
            scaleSetRun = 1;
        else
            scaleSetRun = 1;
        end

        for idxScale = 1:length(scaleSetRun)
            %scale = scaleSetRun(idxScale);%取scaleSet第一个即1
            %img = imread([dataRoot '/img/' fileName '.jpg']);
            %imgScale = imresize(img, scale, 'bicubic');
            %变量的地方不能加''。
            rgb = imread([dataRoot '/' setName '/rgb/' fileName '.png']);
            depth = imread([dataRoot '/' setName '/depth/' fileName '.png']);
            label = imread([dataRoot '/' setName '/labels_40/' fileName '.png']);
            
            gt = imread([dataRoot '/' setName '/labels_40/' fileName '.png']);%载入标签
            
            %seg = gt.GTcls.Segmentation;%将mat文件转换为png文件,375X500
            %segScale = imresize(seg, scale, 'nearest');
            segScale = gt;
            [height, width, chn] = size(segScale);%480x640x1
            assert(chn==1, 'Incorrect label. Input label must have single channel.');
            labelEdge = zeros(height, width, 'uint64');%563X750全0矩阵
            for idx_cls = 1:numCls %1:40
                idxSeg = segScale == idx_cls;%将segScale中不等于idx_cls的全部设置为0。
                if(sum(idxSeg(:))~=0)%将idxSeg全部展开为一维数组,然后相加
                    idxEdge = seg2edge(idxSeg, radius, [], edge_type);
                    labelEdge(idxEdge) = labelEdge(idxEdge) + 2^(idx_cls-1);
                end
            end

            if(strcmp(setName, 'train'))
                % Write image file,将train/rgb的图片写入到data_proc/train/
                imwrite(rgb, [genDataRoot '/train/rgb/' fileName '.png'], 'png')
                % Write depth file,将train/rgb的图片写入到data_proc/train/
                imwrite(depth,[genDataRoot '/train/depth/' fileName '.png'], 'png')
                % Write label file,将train/label的图片写入到data_proc/train/
                imwrite(label, [genDataRoot '/train/labels_40/' fileName '.png'], 'png')
                
                % Write label file,打开data_proc\label\train,将数据写入二进制文件
                fidLabel = fopen([genDataRoot '/train/edge_labels_40/' fileName '.bin'], 'w');
                fwrite(fidLabel, labelEdge', 'uint64'); % Important! Transpose input matrix to become row major.
                fclose(fidLabel);
            else
                % Write image file
                imwrite(rgb, [genDataRoot '/test/rgb/' fileName '.png'], 'png')%imwrite将图像写入图形文件
                imwrite(depth,[genDataRoot '/test/depth/' fileName '.png'], 'png')
                imwrite(label, [genDataRoot '/test/labels_40/' fileName '.png'], 'png')
                
                % Write label file
                fidLabel = fopen([genDataRoot '/test/edge_labels_40/' fileName '.bin'], 'w');
                fwrite(fidLabel, labelEdge', 'uint64'); % Important! Transpose input matrix to become row major.将数据写入二进制文件
                fclose(fidLabel);
            end

        end
        parfor_progress();
    end
    parfor_progress(0);

    % Write file lists
    %disp(['Creating ' setName ' set file lists'])
    %if(strcmp(setName, 'train'))
        %fidListTrainAug = fopen([genDataRoot '/train_aug.txt'], 'w');
        %fidListTrain = fopen([genDataRoot '/train.txt'], 'w');
    %else
        %fidListTest = fopen([genDataRoot '/test.txt'], 'w');
    %end
    
    %parfor_progress(countFile);
    %for idxFile = 1:countFile
        %fileName = fileList{idxFile};
        %if(strcmp(setName, 'train'))
            %scaleSetRun = 1;%scaleSet = [0.5 0.75 1 1.25 1.5]
        %else
            %scaleSetRun = 1;
        %end
        %for idxScale = 1:length(scaleSetRun)
            %scale = scaleSetRun(idxScale);
            %if(strcmp(setName, 'train'))
                % Add to train_aug list
                %fprintf(fidListTrainAug, ['/image/train/scale_' num2str(scale) '/' fileName '.png '...
                    %'/label/train/scale_' num2str(scale) '/' fileName '.bin\n']);
                %if(scale == 1)
                    % Add to train list
                    %fprintf(fidListTrain, [' fileName ']);
                %end
            %else
                % Add to test list
                %fprintf(fidListTest, ['/image/test/' fileName '.png /label/test/' fileName '.bin\n']);
            %end
        %end
        %parfor_progress();
    %end
    %parfor_progress(0);
    
    %if(strcmp(setName, 'train'))
        %fclose(fidListTrainAug);
        %fclose(fidListTrain);
    %else
        %fclose(fidListTest);
    %end
end

end

1:首先指定所需要的参数,dataRoot 是原始数据的地址,genDataRoot 是生成的数据的地址。一共有40个类别,因为后面循环的时候是从1开始,40结束,所以会忽略掉0像素,因此numcls不需要设置为41,接着是半径等于2,和edge_type ,这是生成边界所需要的参数,和CASENet保持一致。

%% Parameters
dataRoot = '../data_orig';
genDataRoot = '../data_proc';
%scaleSet = [1];
numCls = 40; % Number of defined semantic classes in SBD
radius = 2; % Defined search radius for label changes (related to edge thickness, default value of the CASENet CVPR paper)
edge_type = 'regular';

2:MATLAB初始化并行操作(新手),线程为4。注意如果使用并行处理的话,无法进行单步调试,所以在debug时候需要将并行计算注释掉。

%% Setup Parallel Pool
numWorker = 4; % Number of matlab workers for parallel computing
matlabVer = version('-release');
if( str2double(matlabVer(1:4)) > 2013 || (str2double(matlabVer(1:4)) == 2013 && strcmp(matlabVer(5), 'b')) )
    delete(gcp('nocreate'));
    parpool('local', numWorker);
else
    if(matlabpool('size')>0) %#ok<*DPOOL>
        matlabpool close
    end
    matlabpool open 8
end

3:我们有两个set,分别是train和test,这个根据自己数据集修改就好了,执行for循环,首先取第一个setname=‘train’。

setList = {'train', 'test'};
for setID = 1:length(setList)
    setName = setList{setID};%train

4:生成输出文件夹,首先strcmp函数比较setname这个字符串是否等于train,如果不晓得函数的作用,选中函数,然后按F1即可。接着判断genDataRoot '/train/rgb,即D:\datasets\data_proc\train\rgb是否存在,如果==0的话那就是不存在,通过mkdir生成D:\datasets\data_proc\train\rgb文件夹存放RGB。同理生成D:\datasets\data_proc\train\depth生成Depth,生成D:\datasets\data_proc\train\label_40用于存放标签,最后生成一个D:\datasets\data_proc\train\edge_labels_40用于存放生成的边界GT。给每一个图片找一个自己的归属。

for
    % Create output directories
    if(strcmp(setName, 'train'))%如果setname等于train
            % Train,生成文件夹
            if(exist([genDataRoot '/train/rgb'], 'file')==0)
                mkdir([genDataRoot '/train/rgb']);%生成train/rgb文件夹
            end
            if(exist([genDataRoot '/train/labels_40'], 'file')==0)
                mkdir([genDataRoot '/train/labels_40']);%生成train/label文件夹
            end
            if(exist([genDataRoot '/train/depth'], 'file')==0)
                mkdir([genDataRoot '/train/depth']);%生成train/label文件夹
            end
            if(exist([genDataRoot '/train/edge_labels_40'], 'file')==0)
                mkdir([genDataRoot '/train/edge_labels_40']);%生成train/label文件夹
            end

5:这里的else连接的是train中的for,即下面是setname=test的代码,通train一样生成四个文件夹。

    else
        % Test (correspond to val set in the original SBD Dataset)
        if(exist([genDataRoot '/test/rgb'], 'file')==0)
            mkdir([genDataRoot '/test/rgb']);
        end
        if(exist([genDataRoot '/test/labels_40'], 'file')==0)
            mkdir([genDataRoot '/test/labels_40']);
        end
        if(exist([genDataRoot '/test/depth'], 'file')==0)
                mkdir([genDataRoot '/test/depth']);%生成train/label文件夹
        end
        if(exist([genDataRoot '/test/edge_labels_40'], 'file')==0)
            mkdir([genDataRoot '/test/edge_labels_40']);
        end
    end

6:假设我们现在setname还为true,打开data_orig的train.txt文件,里面存放的是所训练需要的数据文件名即索引。接着读取txt里面的数据作为文件名。train.txt里面的索引和RGB,label_40,depth都是一一对应的。
在这里插入图片描述
在这里插入图片描述

	fidIn = fopen([dataRoot '/' setName '.txt']);%打开data_orig/train.txt,返回等于或大于 3 的整数文件标识符,当setName为test时
    fileName = fgetl(fidIn);%读取文件中的行,并删除换行符,
    fileList = cell(1,1);%创建一个元胞数组[]。
    countFile = 0;
    while ischar(fileName)%确定输入是否为字符数组
        countFile = countFile + 1;%1/2...train文件有多少行,countFile等于多少
        fileList{countFile} = fileName;%向元胞中添加filename即第一张图片的name。
        fileName = fgetl(fidIn);%data_orig/train.txt中第一行的名字,作为输出到while中
    end
    fclose(fidIn);

然后创建一个元胞数组{},初始化一个计数器,执行一个循环,假设执行第一次,countFile =1,那么fileList{1} = fileName,就是向元胞数组里面添加第一张图片的name。接着执行第二次循环,不断的向元胞里面添加数组,直至结束,可以把元胞理解为python里面的字典,乡里面添加键值对。执行结束后,fileList里面就存放者全部的fileName 。
7:在窗口中显示如何标识和进程表:
在这里插入图片描述

    disp(['Computing ' setName ' set boundaries'])
    parfor_progress(countFile);

8:并行执行for循环,大大的运行减少时间。
8.1:countFile就是7中的txt文件中读取了几行,795行,假设idxFile=1,则去 fileList元胞数组中取文件名,即0003。因为SBD将原图进行了多个尺度的变换,这里代码只更改了不需要多尺度,idxScale 就为1。
8.2:接着读取RGB,depth,label,判断一下gt的形状,然后生成和gt大小一样的0矩阵。
8.3:然后执行for循环,假设idx_cls =1,和gt进行一个逻辑运算,将gt中等于1的全部设为1,不等于1的地方去全部设为0.
可视化:将全部像素拿出来,和0003.png比较发现背景为1,下面的阴影即桌子为0。
在这里插入图片描述
在这里插入图片描述
8.4:idxSeg就是480x640大小的逻辑矩阵,然后将idxSeg展平为1行,所有值相加,如果相加不等于0,则进行边界提取。
注:为什么全部像素要相加?
因为只有相加不为0说明才有有效像素,才能进行提边,当一张图片,假设0003中存在的几个类别相加才不为0,如果不存在某个类别,则idxSeg就全为0像素,0003.png就没有这个类别,就无法提边。
8.5:将idxSeg等参数输入到seg2seg,这个函数进行提边,这里暂时不考虑函数内部如何写的,把它看做一个包来调用它,有空再细看。
8.6:向labelEdge中添加idxEdge ,然后再添加2^(idx_cls-1),
假设idx_cls=9,则2^(idx_cls-1)=1024,即labelEdge中就会存在1024像素,至于为什么要这样写,是为了将.bin文件转换文.png文件,后面会进行解释,这里相当于一个加密过程,后面进行解密。将生成的labelEdge像素全部拿出来(显示不完全):
在这里插入图片描述
在这里插入图片描述

8.7:接着将train中orig的图片写入到proc中,test同理,这里也可以用copyfile,cityscape就是用的copyfile。同时将labelEdge写入到新建的文件夹edge_labels_40中,以.bin格式存储。

parfor idxFile = 1:countFile
    %for idxFile = 1:countFile %795
        fileName = fileList{idxFile};%根据idxFile索引去文件list里面查找
        if(strcmp(setName, 'train'))
            scaleSetRun = 1;
        else
            scaleSetRun = 1;
        end
        
        for idxScale = 1:length(scaleSetRun)
            %scale = scaleSetRun(idxScale);%取scaleSet第一个即1
            %img = imread([dataRoot '/img/' fileName '.jpg']);
            %imgScale = imresize(img, scale, 'bicubic');
            %变量的地方不能加''。
            rgb = imread([dataRoot '/' setName '/rgb/' fileName '.png']);
            depth = imread([dataRoot '/' setName '/depth/' fileName '.png']);
            label = imread([dataRoot '/' setName '/labels_40/' fileName '.png']);
            
            gt = imread([dataRoot '/' setName '/labels_40/' fileName '.png']);%载入标签
            
            %seg = gt.GTcls.Segmentation;%将mat文件转换为png文件,375X500
            %segScale = imresize(seg, scale, 'nearest');
            segScale = gt;
            [height, width, chn] = size(segScale);%480x640x1
            assert(chn==1, 'Incorrect label. Input label must have single channel.');
            labelEdge = zeros(height, width, 'uint64');%563X750全0矩阵
            for idx_cls = 1:numCls %1:40
                idxSeg = segScale == idx_cls;%将segScale中不等于idx_cls的全部设置为0。
                if(sum(idxSeg(:))~=0)%将idxSeg全部展开为一维数组,然后相加
                    idxEdge = seg2edge(idxSeg, radius, [], edge_type);
                    labelEdge(idxEdge) = labelEdge(idxEdge) + 2^(idx_cls-1);
                end
            end

            if(strcmp(setName, 'train'))
                % Write image file,将train/rgb的图片写入到data_proc/train/
                imwrite(rgb, [genDataRoot '/train/rgb/' fileName '.png'], 'png')
                % Write depth file,将train/rgb的图片写入到data_proc/train/
                imwrite(depth,[genDataRoot '/train/depth/' fileName '.png'], 'png')
                % Write label file,将train/label的图片写入到data_proc/train/
                imwrite(label, [genDataRoot '/train/labels_40/' fileName '.png'], 'png')
                
                % Write label file,打开data_proc\label\train,将数据写入二进制文件
                fidLabel = fopen([genDataRoot '/train/edge_labels_40/' fileName '.bin'], 'w');
                fwrite(fidLabel, labelEdge', 'uint64'); % Important! Transpose input matrix to become row major.
                fclose(fidLabel);
            else
                % Write image file
                imwrite(rgb, [genDataRoot '/test/rgb/' fileName '.png'], 'png')%imwrite将图像写入图形文件
                imwrite(depth,[genDataRoot '/test/depth/' fileName '.png'], 'png')
                imwrite(label, [genDataRoot '/test/labels_40/' fileName '.png'], 'png')
                
                % Write label file
                fidLabel = fopen([genDataRoot '/test/edge_labels_40/' fileName '.bin'], 'w');
                fwrite(fidLabel, labelEdge', 'uint64'); % Important! Transpose input matrix to become row major.将数据写入二进制文件
                fclose(fidLabel);
            end

        end
        parfor_progress();
    end
    parfor_progress(0);

9:这样生成的文件夹如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome开发使用技巧总结

Chrome一个程序员开发神器&#xff0c;但是好多猿子们不会或者没有正确使用。今天教大家如何利用它快速高效的开发调试工作。代码格式化有很多css/js的代码都会被 minify 掉&#xff0c;你可以点击代码窗口左下角的那个 { } 标签&#xff0c;chrome会帮你给格式化掉。强制DOM状…

基于同步整流技术的Buck变换器研究

基于同步整流技术的Buck变换器研究 摘要 B u c k 变换器作为一种基本的开关电源变换器&#xff0c;在电力变换场合具有广泛的应用。 为解决 B u c k 变换器工作在电感电流连续状态下&#xff0c;续流二极管关断时存在较大的反向电流过冲问题&#xff0c;采用了同步整流技术。…

Spark高手之路2—Spark安装配置

文章目录Spark 运行环境一、Local 模式1. 下载压缩包2.上传到服务器3. 解压4. 启动 Local 环境5. 命令行工具6. 退出本地模式7. 提交应用二、Standalone 模式1. 解压2. 修改配置文件1&#xff09;进入解压缩后路径的 conf 目录&#xff0c;复制 workers.template 文件为 worker…

人人都学会APP开发 提高就业竞争力 简单实用APP应用 安卓浏览器APP 企业内部通用APP制作 制造业通用APP

安卓从2009年开始流程于手机、平板&#xff0c;已经是不争的非常强大生产力工具&#xff0c;更为社会创造非常高的价值&#xff0c;现在已经是202X年&#xff0c;已经十几年的发展&#xff0c;安卓平台已经无所不在。因此建议人人都学学APP制作&#xff0c;简易入门&#xff0c…

JavaSe第6次笔记

1.不建议使用c语言的数组的表示方法。 2.二维数组表示方法 3.数组整体初始化时&#xff0c;只能在定义时初始化。 int[] array; array new int[]{1, 2}; 4. boolean类型数组&#xff0c;默认值是false&#xff0c;String类型数组&#xff0c;默认是null&#xff0c;其它是…

CHAPTER 2 目录及文件

目录及文件1 目录1.1 目录结构1.2 核心目录2 文件2.1 /etc/中的文件2.1.1 修改主机名(/etc/hostname)2.1.2 网卡配置文件2.1.3 开机自启动配置文件(/etc/rc.local)2.1.4 /etc/motd和/etc/issue2.2 /var/中的文件2.3 /proc/中的文件2.3.1 CPU信息(lscpu)3 文件类型3.1 类型说明3…

Golang中GC和三色屏障机制【Golang面试必考】

文章目录Go v1.3 标记—清楚(mark and sweep)方法Go V1.5 三色标记法三色标记过程无STW的问题强弱三色不变式插入写屏障Go V1.8的三色标记法混合写屏障机制混合写屏障场景场景1:对象被一个堆对象删除引用&#xff0c;成为栈对象的下游场景2:对象被一个栈对象删除引用&#xff0…

PyQt 做美*女GIF设置桌面,每天都很爱~

人生苦短&#xff0c;我用python 要说程序员工作的最大压力不是来自于工作本身&#xff0c; 而是来自于需要不断学习才能更好地完成工作&#xff0c; 因为程序员工作中面对的编程语言是在不断更新的&#xff0c; 同时还要学习熟悉其他语言来提升竞争力… 好了&#xff0c;学习…

python模块引入问题和解决方案_真方案不骗人

1.pycharm运行python脚本的过程 使用pycharm等编辑器run/debug运行python脚本时&#xff0c;编辑器会通过本地python命令全路径执行脚本&#xff0c;例如 D:\DevelopTools\Python\python.exe D:/Codes/一长串路径/bbss_nature_python/demo/test_no_param_in.py 并且会在pyth…

自动化框架如何搭建?让10年阿里自动化测试老司机帮你搞定!自动化测试脚本怎么写?

一、何为框架&#xff1f;何为自动化测试框架&#xff1f; 无论是日常技术交流&#xff0c;还是在自动化测试实践中&#xff0c;经常会听到一个词叫&#xff1a;框架。之前对“框架”这个词知其然不知其所以然。现在看过一些资料以及加上我自己的一些实践有了我自己的一些看法…

PowerJob中的Vert.x的应用,是点睛之笔还是大材小用?我感觉有点故意炫技啊

这是一篇为了参加活动写得文章&#xff0c;不知道为什么&#xff0c;写得时候网络巨差&#xff0c;我是顶着闹心发上来的&#xff0c;最后大家女神节快乐。 最近难得忙了一下&#xff0c;领导让我从Vert.x和lagom中技术选型&#xff0c;因为lagom是scala写得&#xff0c;我虽然…

2023高质量设计竞赛汇总,想证明自己实力的快来

对于设计师来说&#xff0c;参加设计比赛不仅能够提升自己的设计能力&#xff0c;也是一条证明实力最好的捷径。小编也收集整理了不少近期设计大赛&#xff0c;分别标注了截止日期和官网等&#xff0c;宝子们记得码住收藏&#xff0c;赶紧SHOW起来&#xff01;优酷X站酷 一千零…

湖南媒体资源有哪些?湖南媒体邀约怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 湖南位于中国中南部&#xff0c;以其美丽的自然风光、丰富的历史文化和独特的湖湘文化而著名&#xff0c;拥有丰富的媒体资源。以下是一些湖南省的媒体资源&#xff1a; 1.湖南日报社: …

Spark 应用调优

Spark 应用调优人数统计优化摇号次数分布优化Shuffle 常规优化数据分区合并加 Cache优化中签率的变化趋势中签率局部洞察优化倍率分析优化表信息 : apply : 申请者 : 事实表lucky : 中签者表 : 维度表两张表的 Schema ( batchNum&#xff0c;carNum ) : ( 摇号批次&#xff0c…

Java基础——Lambda表达式

一、函数式编程思想概述https://www.runoob.com/java/java8-lambda-expressions.html在数学中&#xff0c;函数就是有输入量、输出量的一套计算方案&#xff0c;也就是“拿数据做操作”面向对象强调“必须通过对象的形式来做事情”&#xff0c;做事情之前首先要创建一个对象函数…

B站游戏推广,怎样查看B站游戏推广榜数据?

近年来&#xff0c;B站发展得越来越大&#xff0c;越来越多的游戏商也加入B站进行推广&#xff0c;那么作为游戏运营商&#xff0c;怎样查看游戏在B站上的推广数据呢&#xff1f;游戏排行榜游戏商业推广榜包含视频推广榜、直播推广榜&#xff0c;按照日榜、周榜、月榜&#xff…

【Linux 网络编程1】使用UDP/TCP编写套接字,多进程/多线程版本的TCP编写的套接字,将套接字封装

目录 1.学习网络编程前的一些基础知识 2.UDP(user datagram protocol)协议的特点 3.使用有UPD编写套接字 4.使用TCP编写套接字 4.2.TCP客服端 4.3.TCP服务器端 4.4.单进程版本&#xff08;没有人会使用&#xff09; 4.5.多进程版本 4.6.多线程版本 5.把套接字封装 1…

扬帆优配|2600亿新能源巨头狂飙!外资唱多中国:再涨15%

全国停摆的危机&#xff0c;正在迫临法国。 大停工正在将法国推向风险境地。法国政府估计&#xff0c;当地时间3月7日&#xff0c;将迸发全国大型停工游行。法国总工会宣告&#xff0c;到时将让全法国停摆。法国担任交通业务的部长级代表克莱蒙博讷正告称&#xff0c;7日将成为…

JavaScript 混淆技术

根据JShaman&#xff08;JShaman是专业的JavaScript代码混淆加密网站&#xff09;提供的消息&#xff0c;JavaScript混淆技术大体有以下几种&#xff1a; 变量混淆 将带有JS代码的变量名、方法名、常量名随机变为无意义的类乱码字符串&#xff0c;降低代码可读性&#xff0c;如…

原神 Android 教程 —安卓版

准备材料 一台能读写 /system 分区的 Android 手机(或:一台安装了 Magisk 的 Android 手机) 有人搞出来免root端了,此条件不再必须私服客户端