主要内容gydF4y2Ba

利用深度学习开发相机处理管道gydF4y2Ba

这个例子展示了如何使用U-Net将RAW相机数据转换为美观的彩色图像。gydF4y2Ba

单反相机和许多现代手机相机提供了将直接从相机传感器收集的数据保存为RAW文件的能力。RAW数据的每个像素直接对应于相应的相机感光传感器捕获的光量。这些数据取决于相机硬件的固定特性,例如每个光电传感器对电磁波谱特定波长范围的灵敏度。这些数据还取决于相机的采集设置,如曝光时间,以及场景的因素,如光源。gydF4y2Ba

Demosaicing是将单通道RAW数据转换为三通道RGB图像所需的唯一操作。然而,如果没有额外的图像处理操作,得到的RGB图像主观上视觉质量较差。gydF4y2Ba

传统的图像处理管道执行一系列附加操作,包括去噪、线性化、白平衡、颜色校正、亮度调整和对比度调整[gydF4y2Ba1gydF4y2Ba].设计管道的挑战在于优化算法,优化最终RGB图像的主观外观,而不考虑场景和采集设置的变化。gydF4y2Ba

RAWtoRGBintro.pnggydF4y2Ba

深度学习技术可以直接实现RAW到RGB的转换,而不需要开发传统的处理管道。例如,一种技术在将RAW图像转换为RGB时补偿曝光不足[gydF4y2Ba2gydF4y2Ba].这个例子展示了如何将低端手机相机的RAW图像转换为接近高端单反相机质量的RGB图像。gydF4y2Ba

下载苏黎世RAW到RGB数据集gydF4y2Ba

本例使用苏黎世RAW到RGB数据集[gydF4y2Ba3.gydF4y2Ba].数据集的大小为22 GB。该数据集包含48,043对空间注册的RAW和RGB训练图像补丁,大小为448 × 448。该数据集包含两个独立的测试集。一个测试集由1,204对空间注册的RAW和RGB图像补丁组成,大小为448 × 448。另一个测试集由未注册的全分辨率RAW和RGB图像组成。gydF4y2Ba

指定gydF4y2BadataDirgydF4y2Ba作为数据的期望位置。gydF4y2Ba

dataDir = fullfile (tempdir,gydF4y2Ba“ZurichRAWToRGB”gydF4y2Ba);gydF4y2Ba

要下载数据集,请使用gydF4y2Ba苏黎世RAW到RGB数据集gydF4y2Ba的形式。方法指定的目录中提取数据gydF4y2BadataDirgydF4y2Ba变量。当提取成功,gydF4y2BadataDirgydF4y2Ba包含三个名为gydF4y2Bafull_resolutiongydF4y2Ba,gydF4y2Ba测验gydF4y2Ba,gydF4y2Ba火车gydF4y2Ba.gydF4y2Ba

为培训、验证和测试创建数据存储gydF4y2Ba

创建RGB镜像补丁训练数据存储gydF4y2Ba

创建一个gydF4y2BaimageDatastoregydF4y2Ba读取使用高端佳能单反相机获取的目标RGB训练图像补丁。gydF4y2Ba

trainImageDir = fullfile (dataDir,gydF4y2Ba“训练”gydF4y2Ba);dsTrainRGB = imageDatastore (fullfile (trainImageDirgydF4y2Ba“佳能”gydF4y2Ba), ReadSize = 16);gydF4y2Ba

预览RGB训练图像补丁。gydF4y2Ba

groundTruthPatch =预览(dsTrainRGB);imshow (groundTruthPatch)gydF4y2Ba

为RAW映像补丁培训数据创建数据存储gydF4y2Ba

创建一个gydF4y2BaimageDatastoregydF4y2Ba读取使用华为手机摄像头获取的输入RAW训练图像补丁。RAW图像以10位精度捕获,并表示为8位和16位PNG文件。8位文件提供了数据范围为[0,255]的补丁的紧凑表示。没有对任何RAW数据进行缩放。gydF4y2Ba

dsTrainRAW = imageDatastore (fullfile (trainImageDirgydF4y2Ba“huawei_raw”gydF4y2Ba), ReadSize = 16);gydF4y2Ba

预览一个输入RAW训练图像补丁。数据存储将此补丁读取为8位gydF4y2Bauint8gydF4y2Ba图像,因为传感器计数在[0,255]的范围内。为了模拟训练数据的10位动态范围,将图像强度值除以4。如果你把图像放大,你可以看到RGGB拜耳模式。gydF4y2Ba

inputPatch =预览(dsTrainRAW);inputPatchRAW = inputPatch / 4;imshow (inputPatchRAW)gydF4y2Ba

为了模拟最小的传统处理管道,用gydF4y2BademosaicgydF4y2Ba函数。显示处理过的图像,并使显示亮。与目标RGB图像相比,最小处理的RGB图像颜色较暗,颜色不平衡,有明显的伪影。经过训练的RAW-to-RGB网络执行预处理操作,使输出的RGB图像与目标图像相似。gydF4y2Ba

inputPatchRGB = demosaic (inputPatch,gydF4y2Ba“rggb”gydF4y2Ba);imshow(重新调节(inputPatchRGB))gydF4y2Ba

将测试图像划分为验证和测试集gydF4y2Ba

测试数据包含RAW和RGB图像补丁和全尺寸图像。此示例将测试映像补丁划分为验证集和测试集。该示例仅将全尺寸测试图像用于定性测试。看到gydF4y2Ba在全尺寸图像上评估训练过的图像处理管道gydF4y2Ba.gydF4y2Ba

创建读取RAW和RGB测试映像补丁的映像数据存储。gydF4y2Ba

testImageDir = fullfile (dataDir,gydF4y2Ba“测试”gydF4y2Ba);dsTestRAW = imageDatastore (fullfile (testImageDirgydF4y2Ba“huawei_raw”gydF4y2Ba), ReadSize = 16);dsTestRGB = imageDatastore (fullfile (testImageDirgydF4y2Ba“佳能”gydF4y2Ba), ReadSize = 16);gydF4y2Ba

随机将测试数据分成两组进行验证和训练。验证数据集包含200张图像。测试集包含剩余的图像。gydF4y2Ba

numTestImages = dsTestRAW.numpartitions;numValImages = 200;testIdx = randperm (numTestImages);validationIdx = testIdx (1: numValImages);testIdx = testIdx (numValImages + 1: numTestImages);dsValRAW =子集(dsTestRAW validationIdx);dsValRGB =子集(dsTestRGB validationIdx);dsTestRAW =子集(dsTestRAW testIdx);dsTestRGB =子集(dsTestRGB testIdx);gydF4y2Ba

预处理和增加数据gydF4y2Ba

该传感器以重复的拜耳模式获取颜色数据,其中包括一个红色、两个绿色和一个蓝色光电传感器。方法将数据预处理为网络预期的四通道图像gydF4y2Ba变换gydF4y2Ba函数。的gydF4y2Ba变换gydF4y2Ba方法中指定的操作处理数据gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。gydF4y2Ba

的gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2BaHelper函数将gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba-by-1 RAW图像到angydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba/2 × 4多通道图像,由一个红通道、两个绿通道和一个蓝通道组成。gydF4y2Ba

RAWto4Channel.pnggydF4y2Ba

该函数还将数据转换为数据类型gydF4y2Ba单gydF4y2Ba缩放到[0,1]的范围。gydF4y2Ba

dsTrainRAW =变换(dsTrainRAW @preprocessRAWDataForRAWToRGB);dsValRAW =变换(dsValRAW @preprocessRAWDataForRAWToRGB);dsTestRAW =变换(dsTestRAW @preprocessRAWDataForRAWToRGB);gydF4y2Ba

目标RGB映像作为无符号8位数据存储在磁盘上。为了方便指标的计算和网络设计,对目标RGB训练图像进行预处理gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BapreprocessRGBDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。gydF4y2Ba

的gydF4y2BapreprocessRGBDataForRAWToRGBgydF4y2BaHelper函数将图像转换为数据类型gydF4y2Ba单gydF4y2Ba缩放到[0,1]的范围。gydF4y2Ba

dsTrainRGB =变换(dsTrainRGB @preprocessRGBDataForRAWToRGB);dsValRGB =变换(dsValRGB @preprocessRGBDataForRAWToRGB);gydF4y2Ba

结合训练、验证和测试图像集的输入RAW和目标RGB数据gydF4y2Ba结合gydF4y2Ba函数。gydF4y2Ba

dsTrain =结合(dsTrainRAW dsTrainRGB);dsVal =结合(dsValRAW dsValRGB);dst =结合(dsTestRAW dsTestRGB);gydF4y2Ba

随机增加训练数据使用gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BaaugmentDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。gydF4y2Ba

的gydF4y2BaaugmentDataForRAWToRGBgydF4y2Ba辅助函数随机应用90度旋转和水平反射对输入RAW和目标RGB训练图像。gydF4y2Ba

dsTrainAug =变换(dsTrain @augmentDataForRAWToRGB);gydF4y2Ba

预览增强训练数据。gydF4y2Ba

exampleAug =预览(dsTrainAug)gydF4y2Ba
exampleAug =gydF4y2Ba8×2单元阵列gydF4y2Ba{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}{224×224×4单}{448×448×3单}gydF4y2Ba

以蒙太奇的方式显示网络输入和目标图像。网络输入有四个通道,所以显示第一个通道缩放到范围[0,1]。输入RAW和目标RGB图像具有相同的增强。gydF4y2Ba

exampleInput = exampleAug {1};exampleOutput = exampleAug {1,2};蒙太奇({重新调节(exampleInput (:,: 1)), exampleOutput})gydF4y2Ba

批量培训和培训期间的验证数据gydF4y2Ba

本例使用自定义训练循环。的gydF4y2BaminibatchqueuegydF4y2Ba(深度学习工具箱)gydF4y2Ba对象对于在自定义训练循环中管理观察的小批处理非常有用。gydF4y2Ba的gydF4y2BaminibatchqueuegydF4y2Ba对象还将数据转换为gydF4y2BadlarraygydF4y2Ba(深度学习工具箱)gydF4y2Ba对象,该对象可在深度学习应用中实现自动区分。gydF4y2Ba

miniBatchSize = 2;valBatchSize = 10;trainingQueue = minibatchqueue (dsTrainAug MiniBatchSize = MiniBatchSize PartialMiniBatch =gydF4y2Ba“丢弃”gydF4y2BaMiniBatchFormat =gydF4y2Ba“SSCB”gydF4y2Ba);validationQueue = minibatchqueue (dsVal MiniBatchSize = valBatchSize MiniBatchFormat =gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba

的gydF4y2Ba下一个gydF4y2Ba(深度学习工具箱)gydF4y2Ba的函数gydF4y2BaminibatchqueuegydF4y2Ba生成下一个小批数据。控件的一个调用预览输出gydF4y2Ba下一个gydF4y2Ba函数。输出具有数据类型gydF4y2BadlarraygydF4y2Ba.数据已经转换为gydF4y2BagpuArraygydF4y2Ba,并准备训练。gydF4y2Ba

[inputRAW, targetRGB] =下一个(trainingQueue);谁gydF4y2BainputRAWgydF4y2Ba
名称大小字节类属性inputRAW 224x224x4x2 1605640 dlarraygydF4y2Ba
谁gydF4y2BatargetRGBgydF4y2Ba
名称大小字节类属性targetRGB 448x448x3x2 4816904 dlarraygydF4y2Ba

设置U-Net网络层gydF4y2Ba

本例使用的是U-Net网络的变体。在U-Net中,初始的卷积层序列中穿插着最大池化层,依次降低了输入图像的分辨率。这些层之后是一系列的卷积层,其中穿插着上采样算子,依次增加输入图像的分辨率。U- net的名字来源于这样一个事实:这个网络可以画成一个像字母U一样的对称形状。gydF4y2Ba

本例使用了一个简单的U-Net体系结构,并进行了两个修改。首先,该网络将最终的转置卷积操作替换为自定义像素洗牌上采样(也称为深度到空间)操作。其次,该网络使用自定义双曲切线激活层作为网络的最后一层。gydF4y2Ba

像素洗牌UpsamplinggydF4y2Ba

卷积后的像素洗牌上采样可以定义超分辨率应用的亚像素卷积。亚像素卷积可防止由转置卷积引起的检查板伪影[gydF4y2Ba6gydF4y2Ba].因为模型需要映射gydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba/2 × 4的原始输入gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2BaHgydF4y2Ba-by-3 RGB输出,模型的最后上采样阶段可以被认为类似于超分辨率,其中空间样本的数量从输入到输出增长。gydF4y2Ba

该图显示了像素洗牌上采样对于2 × 2 × 4的输入是如何工作的。前两个维度是空间维度,第三个维度是渠道维度。一般来说,像素洗牌上采样的因子是gydF4y2Ba年代gydF4y2Ba以一个gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2BaCgydF4y2Ba输入和输出gydF4y2Ba年代gydF4y2Ba*gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2Ba年代gydF4y2Ba*gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2Ba CgydF4y2Ba 年代gydF4y2Ba 2gydF4y2Ba 输出。gydF4y2Ba

RawtoRGBpixelshuffle.pnggydF4y2Ba

像素洗牌函数通过将信息从给定空间位置的信道维度映射到扩展输出的空间维度gydF4y2Ba年代gydF4y2Ba——gydF4y2Ba- sgydF4y2Ba输出中的空间块,其中每个通道在上采样过程中相对于相邻通道具有一致的空间位置。gydF4y2Ba

缩放和双曲切线激活gydF4y2Ba

双曲切线激活层应用于gydF4y2Ba双曲正切gydF4y2Ba函数的层输入。的缩放和移位版本gydF4y2Ba双曲正切gydF4y2Ba函数,它鼓励但不严格强制RGB网络输出在[0,1]的范围内。gydF4y2Ba

fgydF4y2Ba (gydF4y2Ba xgydF4y2Ba )gydF4y2Ba =gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 58gydF4y2Ba *gydF4y2Ba 双曲正切gydF4y2Ba (gydF4y2Ba xgydF4y2Ba )gydF4y2Ba +gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 5gydF4y2Ba

RawtoRGBtanh.pnggydF4y2Ba

为输入归一化计算训练集统计数据gydF4y2Ba

使用gydF4y2Ba高gydF4y2Ba通过训练数据集计算每个通道的平均约简。网络的输入层利用均值统计量在训练和测试过程中对输入进行均值定心。gydF4y2Ba

dsIn = (dsTrainRAW)复印件;dsIn.UnderlyingDatastore.ReadSize = 1;t =高(dsIn);perChannelMean = gather(mean(t,[1 2]));gydF4y2Ba

创建U-NetgydF4y2Ba

创建初始子网的层,指定每个通道的平均值。gydF4y2Ba

inputSize = [256 256 4];initialLayer = imageInputLayer (inputSize正常化=gydF4y2Ba“zerocenter”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba意味着= perChannelMean, Name =gydF4y2Ba“ImageInputLayer”gydF4y2Ba);gydF4y2Ba

添加第一个编码子网的层。第一个编码器有32个卷积滤波器。gydF4y2Ba

numEncoderStages = 4;numFiltersFirstEncoder = 32;encoderNamePrefix =gydF4y2Ba“Encoder-Stage——”gydF4y2Ba;encoderLayers = [convolution2dLayer([3 3],numFiltersFirstEncoder,Padding= .gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= encoderNamePrefix +gydF4y2Ba“1-Conv-1”gydF4y2Ba) leakyReluLayer (= encoderNamePrefix + 0.2,名称gydF4y2Ba“1-ReLU-1”gydF4y2Ba3) convolution2dLayer ([3], numFiltersFirstEncoder,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= encoderNamePrefix +gydF4y2Ba“1-Conv-2”gydF4y2Ba) leakyReluLayer (= encoderNamePrefix + 0.2,名称gydF4y2Ba“1-ReLU-2”gydF4y2Ba. maxPooling2dLayer([2 2],Stride=[2 2],Name=encoderNamePrefix+ .gydF4y2Ba“1-MaxPool”gydF4y2Ba));gydF4y2Ba

添加额外的编码子网络层。这些子网络在每个卷积层之后使用gydF4y2BagroupNormalizationLayergydF4y2Ba.每个编码器子网络的过滤器数量是前一个编码器子网络的两倍。gydF4y2Ba

cnIdx = 1;gydF4y2Ba为gydF4y2BanumEncoderStages = numFilters = numFiltersFirstEncoder*2^(stage-1);layerNamePrefix = encoderNamePrefix + num2str(阶段);encoderLayers = [encoderLayers convolution2dLayer([3 3],numFilters,Padding= .gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn”gydF4y2Ba+ num2str (cnIdx)) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn”gydF4y2Ba+ num2str (cnIdx + 1)) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-2”gydF4y2BamaxPooling2dLayer([2 2],Stride=[2 2],Name=layerNamePrefix+ .日志含义gydF4y2Ba“-MaxPool”gydF4y2Ba));cnIdx = cnIdx + 2;gydF4y2Ba结束gydF4y2Ba

添加层的桥梁。网桥子网的滤波器数量是最终编码器子网和第一解码器子网的两倍。gydF4y2Ba

numFilters = numFiltersFirstEncoder * 2 ^ numEncoderStages;bridgeelayers = [convolution2dLayer([3 3],numFilters,Padding= .gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称=gydF4y2Ba“Bridge-Conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn7”gydF4y2Ba) leakyReluLayer (0.2, Name =gydF4y2Ba“Bridge-ReLU-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称=gydF4y2Ba“Bridge-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn8”gydF4y2Ba) leakyReluLayer (0.2, Name =gydF4y2Ba“Bridge-ReLU-2”gydF4y2Ba));gydF4y2Ba

添加前三个解码器子网络的层。gydF4y2Ba

numDecoderStages = 4;cnIdx = 9;decoderNamePrefix =gydF4y2Ba“Decoder-Stage——”gydF4y2Ba;decoderLayers = [];gydF4y2Ba为gydF4y2BanumFilters = numFiltersFirstEncoder*2^(numDecoderStages-stage);layerNamePrefix = decoderNamePrefix + num2str(阶段);decoderLayers =[decoderLayers转位conv2dlayer ([3 3],numFilters,Stride=[2 2],裁剪=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-UpConv”gydF4y2Ba) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-UpReLU”gydF4y2Ba) depthConcatenationLayer (= layerNamePrefix + 2名gydF4y2Ba“-DepthConcatenation”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn”gydF4y2Ba+ num2str (cnIdx)) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“channel-wise”gydF4y2Ba、名称=gydF4y2Ba“cn”gydF4y2Ba+ num2str (cnIdx + 1)) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-2”gydF4y2Ba));cnIdx = cnIdx + 2;gydF4y2Ba结束gydF4y2Ba

添加最后一个解码器子网的层。这个子网络排除由其他解码器子网络执行的通道类实例归一化。每个解码器子网的过滤器数量是前一个子网的一半。gydF4y2Ba

numFilters = numFiltersFirstEncoder;layerNamePrefix = decoderNamePrefix + num2str(+ 1)阶段;decoderLayers =[decoderLayers转位conv2dlayer ([3 3],numFilters,Stride=[2 2],裁剪=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-UpConv”gydF4y2Ba) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-UpReLU”gydF4y2Ba) depthConcatenationLayer (= layerNamePrefix + 2名gydF4y2Ba“-DepthConcatenation”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-1”gydF4y2Ba) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-2”gydF4y2Ba) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-2”gydF4y2Ba));gydF4y2Ba

添加U-Net的最后一层。像素洗牌层从gydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba/2 × 12通道大小的激活从最终卷积到gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba-by-3通道激活使用像素洗牌上采样。最后一层使用双曲正切函数鼓励输出到所需的范围[0,1]。gydF4y2Ba

finalLayers = [convolution2dLayer([3 3],12,Padding= .gydF4y2Ba“相同”gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba...gydF4y2BaName =gydF4y2Ba“Decoder-Stage-4-Conv-3”gydF4y2Ba) pixelShuffleLayer (gydF4y2Ba“pixelShuffle”gydF4y2Ba(2) tanhScaledAndShiftedLayergydF4y2Ba“tanhActivation”gydF4y2Ba));层= [initialLayer; encoderLayers; bridgeLayers decoderLayers; finalLayers);lgraph = layerGraph(层);gydF4y2Ba

连接编码和解码子网络的层。gydF4y2Ba

lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-1-ReLU-2”gydF4y2Ba,gydF4y2Ba“Decoder-Stage-4-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-2-ReLU-2”gydF4y2Ba,gydF4y2Ba“Decoder-Stage-3-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-3-ReLU-2”gydF4y2Ba,gydF4y2Ba“Decoder-Stage-2-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-4-ReLU-2”gydF4y2Ba,gydF4y2Ba“Decoder-Stage-1-DepthConcatenation / in2”gydF4y2Ba);网= dlnetwork (lgraph);gydF4y2Ba

方法可视化网络体系结构gydF4y2Ba深层网络设计师gydF4y2Ba(深度学习工具箱)gydF4y2Ba应用程序。gydF4y2Ba

deepNetworkDesigner (lgraph)gydF4y2Ba

加载特征提取网络gydF4y2Ba

该函数修改了预先训练的VGG-16深度神经网络,以提取不同层次的图像特征。这些多层特征用于计算内容丢失。gydF4y2Ba

要获得预先训练的VGG-16网络,请安装gydF4y2Bavgg16gydF4y2Ba(深度学习工具箱)gydF4y2Ba.如果您没有安装所需的支持包,那么该软件将提供下载链接。gydF4y2Ba

vggNet = vgg16;gydF4y2Ba

为了使VGG-16网络适合于特征提取,使用以下层gydF4y2Barelu5_3”gydF4y2Ba.gydF4y2Ba

vggNet = vggNet.Layers一句子);vggNet = dlnetwork (layerGraph (vggNet));gydF4y2Ba

定义模型梯度和损失函数gydF4y2Ba

辅助函数gydF4y2BamodelGradientsgydF4y2Ba计算训练数据批次的梯度和总体损失。函数中定义了此函数gydF4y2Ba支持功能gydF4y2Ba部分。gydF4y2Ba

总的损失是两个损失的加权和:绝对误差(MAE)的平均损失和内容损失。对内容损失进行加权,使MAE损失和内容损失对总损失的贡献大致相等:gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba OgydF4y2Ba vgydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba lgydF4y2Ba =gydF4y2Ba lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba EgydF4y2Ba +gydF4y2Ba wgydF4y2Ba egydF4y2Ba 我gydF4y2Ba ggydF4y2Ba hgydF4y2Ba tgydF4y2Ba FgydF4y2Ba 一个gydF4y2Ba cgydF4y2Ba tgydF4y2Ba ogydF4y2Ba rgydF4y2Ba *gydF4y2Ba lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba CgydF4y2Ba ogydF4y2Ba ngydF4y2Ba tgydF4y2Ba egydF4y2Ba ngydF4y2Ba tgydF4y2Ba

MAE的损失对gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 网络预测样本与目标图像样本之间的距离。gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 是比?更好的选择gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 用于图像处理应用,因为它可以帮助减少模糊工件[gydF4y2Ba4gydF4y2Ba].方法实现此丢失gydF4y2BamaeLossgydF4y2Ba中定义的Helper函数gydF4y2Ba支持功能gydF4y2Ba部分。gydF4y2Ba

内容丢失有助于网络学习高级结构内容和低级的边缘和颜色信息。损失函数计算每个激活层的预测和目标之间的均方误差(MSE)的加权和。方法实现此丢失gydF4y2BacontentLossgydF4y2Ba中定义的Helper函数gydF4y2Ba支持功能gydF4y2Ba部分。gydF4y2Ba

计算内容损失权重因子gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2BaHelper函数要求内容损失权重因子作为输入参数。计算训练数据样本批次的权重因子,使MAE损失等于加权内容损失。gydF4y2Ba

预览一批训练数据,其中包括对RAW网络输入和RGB目标输出。gydF4y2Ba

trainingBatch =预览(dsTrainAug);networkInput = dlarray ((trainingBatch {1}),gydF4y2Ba“SSC”gydF4y2Ba);targetOutput = dlarray ((trainingBatch {1,2}),gydF4y2Ba“SSC”gydF4y2Ba);gydF4y2Ba

预测未经过训练的U-Net网络的响应gydF4y2Ba向前gydF4y2Ba(深度学习工具箱)gydF4y2Ba函数。gydF4y2Ba

predictedOutput =前进(净,networkInput);gydF4y2Ba

计算预测和目标RGB图像之间的MAE和内容损失。gydF4y2Ba

sampleMAELoss = maeLoss (predictedOutput targetOutput);sampleContentLoss = contentLoss (vggNet predictedOutput targetOutput);gydF4y2Ba

计算权重因子。gydF4y2Ba

weightContent = sampleMAELoss / sampleContentLoss;gydF4y2Ba

指定培训选项gydF4y2Ba

定义在自定义训练循环中使用的训练选项,以控制Adam优化的各个方面。训练20次。gydF4y2Ba

learnRate = 5 e-5;numEpochs = 20;gydF4y2Ba

培训网络或下载预培训网络gydF4y2Ba

默认情况下,该示例通过使用gydF4y2BadownloadTrainedNetworkgydF4y2Bahelper函数。预先训练的网络使您可以运行整个示例,而无需等待训练完成。gydF4y2Ba

要训练网络,请设置gydF4y2BadoTraininggydF4y2Ba变量的gydF4y2Ba真正的gydF4y2Ba.在自定义训练循环中训练模型。每一次迭代:gydF4y2Ba

  • 方法读取当前小批处理的数据gydF4y2Ba下一个gydF4y2Ba(深度学习工具箱)gydF4y2Ba函数。gydF4y2Ba

  • 评估模型的梯度使用gydF4y2BadlfevalgydF4y2Ba(深度学习工具箱)gydF4y2Ba函数和gydF4y2BamodelGradientsgydF4y2Bahelper函数。gydF4y2Ba

  • 更新网络参数gydF4y2BaadamupdategydF4y2Ba(深度学习工具箱)gydF4y2Ba函数和梯度信息。gydF4y2Ba

  • 更新每次迭代的训练进度图,并显示各种计算损失。gydF4y2Ba

如果有GPU,请使用GPU进行训练。使用GPU需要并行计算工具箱™和CUDA®支持的NVIDIA®GPU。有关更多信息,请参见gydF4y2BaGPU计算的需求gydF4y2Ba(并行计算工具箱)gydF4y2Ba.在NVIDIA™Titan RTX上进行培训大约需要88小时,根据您的GPU硬件的不同,可能需要更长时间。gydF4y2Ba

doTraining = false;gydF4y2Ba如果gydF4y2BadoTraininggydF4y2Ba创建一个目录来存储检查点gydF4y2BacheckpointDir = fullfile (dataDir,gydF4y2Ba“检查点”gydF4y2Ba, filesep);gydF4y2Ba如果gydF4y2Ba~存在(checkpointDirgydF4y2Ba“dir”gydF4y2Bamkdir (checkpointDir);gydF4y2Ba结束gydF4y2Ba%初始化训练图gydF4y2Ba[hFig, batchLine validationLine] = initializeTrainingPlotRAWToRGB;gydF4y2Ba初始化亚当求解器状态gydF4y2Ba[averageGrad, averageSqGrad] =交易([]);迭代= 0;开始=抽搐;gydF4y2Ba为gydF4y2Ba纪元= 1:numEpochs重置(trainingQueue);洗牌(trainingQueue);gydF4y2Ba而gydF4y2Bahasdata(trainingQueue) [inputRAW,targetRGB] = next(trainingQueue);(研究生,亏损)= dlfeval (@modelGradients,净、vggNet inputRAW, targetRGB, weightContent);迭代=迭代+ 1;[净,averageGrad averageSqGrad] = adamupdate(网络,gydF4y2Ba...gydF4y2Ba校友,averageGrad averageSqGrad,迭代,learnRate);updateTrainingPlotRAWToRGB (batchLine validationLine,迭代,损失,开始,时代,gydF4y2Ba...gydF4y2BavalidationQueue、numValImages valBatchSize,净、vggNet weightContent);gydF4y2Ba结束gydF4y2Ba%保存网络状态检查点gydF4y2Ba保存(checkpointDir +gydF4y2Ba“时代”gydF4y2Ba+时代,gydF4y2Ba“净”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba保存最终网络状态gydF4y2BamodelDateTime =字符串(datetime (gydF4y2Ba“现在”gydF4y2Ba格式=gydF4y2Ba“yyyy-MM-dd-HH-mm-ss”gydF4y2Ba));保存(fullfile (dataDirgydF4y2Ba“trainedRAWToRGBNet——”gydF4y2Ba+ modelDateTime +gydF4y2Ba“.mat”gydF4y2Ba),gydF4y2Ba“净”gydF4y2Ba);gydF4y2Ba其他的gydF4y2BatrainedNet_url =gydF4y2Ba“https://ssd.mathworks.com/supportfiles/vision/data/trainedRAWToRGBNet.mat”gydF4y2Ba;downloadTrainedNetwork (trainedNet_url dataDir);负载(fullfile (dataDirgydF4y2Ba“trainedRAWToRGBNet.mat”gydF4y2Ba));gydF4y2Ba结束gydF4y2Ba

计算图像质量指标gydF4y2Ba

基于参考的质量指标,如MSSIM或PSNR,可以对图像质量进行定量度量。您可以计算补丁测试图像的MSSIM和PSNR,因为它们是空间注册和相同的大小。gydF4y2Ba

方法遍历打过补丁的映像的测试集gydF4y2BaminibatchqueuegydF4y2Ba对象。gydF4y2Ba

patchTestSet =结合(dsTestRAW dsTestRGB);testPatchQueue = minibatchqueue (patchTestSet,gydF4y2Ba...gydF4y2BaMiniBatchSize = 16, MiniBatchFormat =gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba

迭代测试集,并计算每个测试图像的MSSIM和PSNRgydF4y2BamultissimgydF4y2Ba而且gydF4y2Bapsnr值gydF4y2Ba功能。通过使用每个颜色通道的度量的平均值作为近似来计算彩色图像的MSSIM,因为对于多通道输入,度量没有很好地定义。gydF4y2Ba

totalMSSIM = 0;totalPSNR = 0;gydF4y2Ba而gydF4y2Bahasdata(testPatchQueue) [inputRAW,targetRGB] = next(testPatchQueue);outputRGB =前进(净,inputRAW);targetRGB = targetRGB ./ 255;mssimOut =总和(意思是(multissim (outputRGB targetRGB)、3)、4);psnrOut =总和(psnr (outputRGB targetRGB), 4);totalMSSIM = totalMSSIM + mssimOut;totalPSNR = totalPSNR + psnrOut;gydF4y2Ba结束gydF4y2Ba

计算测试集的平均MSSIM和平均PSNR。这一结果与[的类似U-Net方法一致。gydF4y2Ba3.gydF4y2Ba]的平均MSSIM,与PyNet方法在[gydF4y2Ba3.gydF4y2Ba平均PSNR。与[相比,损失函数和使用像素洗牌上采样的差异gydF4y2Ba3.gydF4y2Ba可能解释了这些差异。gydF4y2Ba

numObservations = dsTestRGB.numpartitions;meanMSSIM = totalMSSIM / numObservationsgydF4y2Ba
meanMSSIM = 1(S) × 1(S) × 1(C) × 1(B) single gpuArray dlarray 0.8401gydF4y2Ba
meanPSNR = totalPSNR / numObservationsgydF4y2Ba
均值信噪比= 1(S) × 1(S) × 1(C) × 1(B)单gpuArray dlarver 21.0730gydF4y2Ba

在全尺寸图像上评估训练过的图像处理管道gydF4y2Ba

由于用于获取全分辨率测试图像的手机相机和单反相机之间的传感器差异,场景没有注册,大小也不相同。基于参考的比较来自网络和单反ISP的全分辨率图像是困难的。然而,图像的定性比较是有用的,因为图像处理的目标是创建一个美观的图像。gydF4y2Ba

创建一个包含手机相机获取的全尺寸RAW图像的图像数据存储。gydF4y2Ba

testImageDir = fullfile (dataDir,gydF4y2Ba“测试”gydF4y2Ba);testImageDirRAW =gydF4y2Ba“huawei_full_resolution”gydF4y2Ba;dsTestFullRAW = imageDatastore (fullfile (testImageDir testImageDirRAW));gydF4y2Ba

获取完整尺寸RAW测试集中的图像文件的名称。gydF4y2Ba

targetFilesToInclude = extractAfter (string (dsTestFullRAW.Files),gydF4y2Ba...gydF4y2Bafullfile (testImageDirRAW filesep));targetFilesToInclude = extractBefore (targetFilesToInclude,gydF4y2Ba“使用”gydF4y2Ba);gydF4y2Ba

方法将数据转换为网络所期望的形式,从而对原始数据进行预处理gydF4y2Ba变换gydF4y2Ba函数。的gydF4y2Ba变换gydF4y2Ba方法中指定的操作处理数据gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。gydF4y2Ba

dsTestFullRAW =变换(dsTestFullRAW @preprocessRAWDataForRAWToRGB);gydF4y2Ba

创建一个图像数据存储,其中包含从高端单反相机捕获的全尺寸RGB测试图像。苏黎世RAW-to-RGB数据集包含的全尺寸RGB图像多于RAW图像,因此只包含带有相应RAW图像的RGB图像。gydF4y2Ba

dsTestFullRGB = imageDatastore (fullfile (dataDirgydF4y2Ba“full_resolution”gydF4y2Ba,gydF4y2Ba“佳能”gydF4y2Ba));dsTestFullRGB。F我le年代=dsTestFullRGB。文件(gydF4y2Ba...gydF4y2Ba包含(dsTestFullRGB.Files targetFilesToInclude));gydF4y2Ba

读入目标RGB图像,然后显示前几张图像的蒙太奇。gydF4y2Ba

targetRGB = readall (dsTestFullRGB);蒙太奇(targetRGB、大小= 2[5],插值=gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

方法遍历全尺寸图像的测试集gydF4y2BaminibatchqueuegydF4y2Ba对象。如果您的GPU设备具有足够的内存来处理全分辨率图像,那么您可以通过指定输出环境为在GPU上运行预测gydF4y2Ba“图形”gydF4y2Ba.gydF4y2Ba

testQueue = minibatchqueue (dsTestFullRAW MiniBatchSize = 1,gydF4y2Ba...gydF4y2BaMiniBatchFormat =gydF4y2Ba“SSCB”gydF4y2BaOutputEnvironment =gydF4y2Ba“cpu”gydF4y2Ba);gydF4y2Ba

对于每个全尺寸RAW测试图像,通过调用预测输出RGB图像gydF4y2Ba向前gydF4y2Ba(深度学习工具箱)gydF4y2Ba在网络上。gydF4y2Ba

outputSize = 2*size(preview(dsTestFullRAW),[1 2]);outputImages = 0 ([outputSize 3 dsTestFullRAW.numpartitions],gydF4y2Ba“uint8”gydF4y2Ba);idx = 1;gydF4y2Ba而gydF4y2Bahasdata(testQueue) inputRAW = next(testQueue);rgbOut =前进(净,inputRAW);rgbOut =收集(extractdata (rgbOut));outputImages (:,:,:, idx) = im2uint8 (rgbOut);idx = idx + 1;gydF4y2Ba结束gydF4y2Ba

通过观察蒙太奇视图来了解整体输出。网络产生的图像具有相似的特征,具有美感。gydF4y2Ba

蒙太奇(outputImages、大小= 2[5],插值=gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

将一个目标RGB图像与网络预测的相应图像进行比较。该网络产生的颜色比目标单反图像更饱和。虽然简单的U-Net结构的颜色与单反相机的目标不一样,但在很多情况下,图像在质量上仍然令人满意。gydF4y2Ba

imgIdx = 1;imTarget = targetRGB {imgIdx};imPredicted = outputImages (:,:,:, imgIdx);蒙太奇({imTarget, imPredicted},插值=gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

为了提高RAW-to-RGB网络的性能,网络架构将使用多个尺度从描述颜色和对比的全局特征中学习详细的本地化空间特征[gydF4y2Ba3.gydF4y2Ba].gydF4y2Ba

支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2Ba辅助函数计算梯度和总体损失。梯度信息作为一个表返回,其中包括层、参数名称和模型中每个可学习参数的值。gydF4y2Ba

函数gydF4y2Ba[gradient,loss] = modelGradients(dlnet,vggNet,X,T,weightContent) Y = forward(dlnet,X);lossMAE = maeLoss (Y, T);lossContent = contentLoss (vggNet, Y, T);loss = lossMAE + weightContent.*lossContent;梯度= dlgradient(损失、dlnet.Learnables);gydF4y2Ba结束gydF4y2Ba

平均绝对误差损失函数gydF4y2Ba

辅助函数gydF4y2BamaeLossgydF4y2Ba计算网络预测之间的平均绝对误差,gydF4y2BaYgydF4y2Ba,和目标图像,gydF4y2BaTgydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba损失= maeLoss(Y,T)损失= mean(abs(Y-T),gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

内容的损失函数gydF4y2Ba

辅助函数gydF4y2BacontentLossgydF4y2Ba计算网络预测之间的MSE的加权和,gydF4y2BaYgydF4y2Ba,和目标图像,gydF4y2BaTgydF4y2Ba,对应每个激活层。的gydF4y2BacontentLossgydF4y2Ba函数计算每个激活层的MSEgydF4y2BamseLossgydF4y2Bahelper函数。权重的选择使每个激活层的损失对总体内容损失的贡献大致相同。gydF4y2Ba

函数gydF4y2Ba损失(净,Y,T)层= [gydF4y2Ba“relu1_1”gydF4y2Ba,gydF4y2Ba“relu1_2”gydF4y2Ba,gydF4y2Ba“relu2_1”gydF4y2Ba,gydF4y2Ba“relu2_2”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“relu3_1”gydF4y2Ba,gydF4y2Ba“relu3_2”gydF4y2Ba,gydF4y2Ba“relu3_3”gydF4y2Ba,gydF4y2Ba“relu4_1”gydF4y2Ba];(T1、T2、T3、T4, T5, T6, T7, T8] =前进(=净T输出层);[X1, X2, X3, X4, X5, X6, X7,×8]=前进(=净,Y,输出层);l1 = mseLoss (X1, T1);l2 = mseLoss (X2, T2);l3 = mseLoss (X3, T3);l4 = mseLoss (X4, T4);l5 = mseLoss (X5, T5);社会= mseLoss (X6, T6);地级= mseLoss (X7 T7); l8 = mseLoss(X8,T8); layerLosses = [l1 l2 l3 l4 l5 l6 l7 l8]; weights = [1 0.0449 0.0107 0.0023 6.9445e-04 2.0787e-04 2.0118e-04 6.4759e-04]; loss = sum(layerLosses.*weights);结束gydF4y2Ba

均方误差损失函数gydF4y2Ba

辅助函数gydF4y2BamseLossgydF4y2Ba计算网络预测之间的MSE,gydF4y2BaYgydF4y2Ba,和目标图像,gydF4y2BaTgydF4y2Ba.gydF4y2Ba

函数gydF4y2Baloss = mean((Y-T).^2,gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

1)萨姆纳,抢劫。“用MATLAB处理原始图像”。2014年5月19日。https://rcsumner.net/raw_guide/RAWguide.pdf。gydF4y2Ba

2)陈,陈,陈奇峰,徐佳,Vladlen Koltun。《学会在黑暗中看》gydF4y2BaArXiv: 1805.01934 (Cs)gydF4y2Ba2018年5月4日。http://arxiv.org/abs/1805.01934。gydF4y2Ba

3)伊格纳托夫,安德烈,卢克·范古尔和拉杜·提莫夫特。《用单一深度学习模型取代移动摄像头ISP》gydF4y2BaArXiv: 2002.05509 (Cs,套)gydF4y2Ba2020年2月13日。http://arxiv.org/abs/2002.05509。gydF4y2Ba项目网站gydF4y2Ba.gydF4y2Ba

4)赵,杭,Orazio Gallo, Iuri Frosio, Jan Kautz。图像处理神经网络的损失函数gydF4y2BaArXiv: 1511.08861 (Cs)gydF4y2Ba2018年4月20日。http://arxiv.org/abs/1511.08861。gydF4y2Ba

5)约翰逊,贾斯汀,亚历山大·阿拉希,李飞飞。“实时风格转移和超分辨率的感知损失。”gydF4y2BaArXiv: 1603.08155 (Cs)gydF4y2Ba2016年3月26日。http://arxiv.org/abs/1603.08155。gydF4y2Ba

6)石文哲,Jose Caballero, Ferenc Huszár, Johannes Totz, Andrew P. Aitken, Rob Bishop, Daniel Rueckert, Zehan Wang。利用高效亚像素卷积神经网络实现实时单幅图像和视频的超分辨率。gydF4y2BaArXiv: 1609.05158 (Cs,统计)gydF4y2Ba2016年9月23日。http://arxiv.org/abs/1609.05158。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba(深度学习工具箱)gydF4y2Ba|gydF4y2Ba(深度学习工具箱)gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的例子gydF4y2Ba

更多关于gydF4y2Ba

Baidu
map