主要内容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。该数据集包含448,043对空间注册的RAW和RGB训练图像补丁,大小为448 × 448。数据集包含两个独立的测试集。一个测试集包含1204对空间注册的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);dstraainrgb = imageDatastore(fullfile(trainImageDir,gydF4y2Ba“佳能”gydF4y2Ba), ReadSize = 16);gydF4y2Ba

预览RGB训练图像补丁。gydF4y2Ba

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

为原始图像补丁训练数据创建数据存储gydF4y2Ba

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

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

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

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

为了模拟最小的传统处理管道,演示了原始数据的RGGB拜耳模式使用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(testImageDir,gydF4y2Ba“huawei_raw”gydF4y2Ba), ReadSize = 16);dsTestRGB = imageDatastore(fullfile(testImageDir,gydF4y2Ba“佳能”gydF4y2Ba), ReadSize = 16);gydF4y2Ba

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

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

预处理和增加数据gydF4y2Ba

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

的gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2BaHelper函数转换gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba-by-1 RAW图像gydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba2乘4的多通道图像由一个红色,两个绿色和一个蓝色通道组成。gydF4y2Ba

RAWto4Channel.pnggydF4y2Ba

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

dsTrainRAW = transform(dsTrainRAW,@preprocessRAWDataForRAWToRGB);dsValRAW = transform(dsValRAW,@preprocessRAWDataForRAWToRGB);dsTestRAW = transform(dsTestRAW,@preprocessRAWDataForRAWToRGB);gydF4y2Ba

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

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

dsTrainRGB = transform(dsTrainRGB,@preprocessRGBDataForRAWToRGB);dsValRGB = transform(dsValRGB,@preprocessRGBDataForRAWToRGB);gydF4y2Ba

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

dsTrain = combine(dsTrainRAW,dsTrainRGB);dsVal = combine(dsValRAW,dsValRGB);dsteest = combine(dsTestRAW,dsTestRGB);gydF4y2Ba

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

的gydF4y2BaaugmentDataForRAWToRGBgydF4y2Bahelper函数随机对输入的RAW和目标RGB训练图像对进行90度旋转和水平反射。gydF4y2Ba

dstraainaug = transform(dsTrain,@augmentDataForRAWToRGB);gydF4y2Ba

预览增强训练数据。gydF4y2Ba

exampleAug = preview(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,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在GPU上,并准备训练。gydF4y2Ba

[inputRAW,targetRGB] = next(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

像素Shuffle上采样gydF4y2Ba

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

图中显示了像素shuffle上采样对于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 = copy(dsTrainRAW);dsin .底层数据存储. 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”gydF4y2Ba) convolution2dLayer([3 3],numFiltersFirstEncoder,Padding= .;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为gydF4y2Ba*2^(stage-1);layerNamePrefix = encoderNamePrefix+num2str(stage);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”gydF4y2Ba)卷积2dlayer ([3 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) maxPooling2dLayer([2 2],Stride=[2 2],Name=layerNamePrefix+gydF4y2Ba“-MaxPool”gydF4y2Ba));cnIdx = cnIdx + 2;gydF4y2Ba结束gydF4y2Ba

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

numFilters = numFiltersFirstEncoder*2^numEncoderStages;bridgeLayers = [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”gydF4y2Ba)卷积2dlayer ([3 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为gydF4y2Ba1:numDecoderStages-1 numFilters = numFiltersFirstEncoder*2^(numDecoderStages-stage);layerNamePrefix = decoderNamePrefix+num2str(stage);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”gydF4y2Ba)卷积2dlayer ([3 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”gydF4y2Ba)卷积2dlayer ([3 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(stage+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”gydF4y2Ba)卷积2dlayer ([3 3],numFilters,填充=gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba...gydF4y2BaWeightsInitializer =gydF4y2Ba“narrow-normal”gydF4y2Ba、名称= layerNamePrefix +gydF4y2Ba“-Conv-1”gydF4y2Ba) leakyReluLayer (= layerNamePrefix + 0.2,名称gydF4y2Ba“-ReLU-1”gydF4y2Ba)卷积2dlayer ([3 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));layers = [initialLayer;encoderLayers;bridgeLayers;decoderLayers; finallayer];lgraph = layerGraph(图层);gydF4y2Ba

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

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

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

deepNetworkDesigner (lgraph)gydF4y2Ba

加载特征提取网络gydF4y2Ba

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

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

vggNet = vgg16;gydF4y2Ba

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

vggNet = vggNet. layers (1:31);vggNet = dlnetwork(layerGraph(vggNet));gydF4y2Ba

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

辅助函数gydF4y2BamodelGradientsgydF4y2Ba计算各批训练数据的梯度和总体损失。函数中定义了此函数gydF4y2Ba万博1manbetx支持功能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万博1manbetx支持功能gydF4y2Ba部分的示例。gydF4y2Ba

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

计算内容损失权重因子gydF4y2Ba

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

预览一批训练数据,由对RAW网络输入和RGB目标输出组成。gydF4y2Ba

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

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

predictedOutput = forward(net,networkInput);gydF4y2Ba

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

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

计算权重因子。gydF4y2Ba

weightContent = sampleMAELoss/sampleContentLoss;gydF4y2Ba

指定培训项目gydF4y2Ba

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

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

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

默认情况下,示例通过使用rawto - rgb网络下载预训练的版本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] = deal([]);迭代= 0;开始= tic;gydF4y2Ba为gydF4y2Baepoch = 1:numEpochs reset(trainingQueue);洗牌(trainingQueue);gydF4y2Ba而gydF4y2Bahasdata(trainingQueue) [inputRAW,targetRGB] = next(trainingQueue);[grad,loss] = dlfeval(@modelGradients,net,vggNet,inputRAW,targetRGB,weightContent);迭代=迭代+ 1;[net,averageGrad,averageSqGrad] = adamupdate(net,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 = string(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/万博1manbetxsupportfiles/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 = combine(dsTestRAW,dsTestRGB);testPatchQueue = minibatchqueuegydF4y2Ba...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 = forward(net,inputRAW);targetRGB = targetRGB ./ 255;mssimOut = sum(mean(multissim(outputRGB,targetRGB),3),4);psnrOut = sum(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
meanPSNR = 1(S) × 1(S) × 1(C) × 1(B) single gpuArray dlarray 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

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

dsTestFullRAW = transform(dsTestFullRAW,@preprocessRAWDataForRAWToRGB);gydF4y2Ba

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

dsTestFullRGB = imageDatastore(fullfile(dataDir,gydF4y2Ba“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(预览(dsTestFullRAW),[1 2]);outputImages = 0 ([outputSize,3,dsTestFullRAW.numpartitions],gydF4y2Ba“uint8”gydF4y2Ba);Idx = 1;gydF4y2Ba而gydF4y2Bahasdata(testQueue) inputRAW = next(testQueue);rgbOut = forward(net,inputRAW);rgbOut = gather(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};impredict = outputImages(:,:,:,imgIdx);蒙太奇({imTarget, imPredicted},插值=gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

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

万博1manbetx支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

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

函数gydF4y2Ba[gradients,loss] = modelGradients(dlnet,vggNet,X,T,weightContent) Y = forward(dlnet,X);lossMAE = maeLoss(Y,T);lossContent = contentLoss(vggNet,Y,T);loss = lossMAE + weightContent.*lossContent;gradients = dlgradient(loss,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] = forward(net,T,Outputs=layers);[X1,X2,X3,X4,X5,X6,X7,X8] = forward(net,Y,Outputs=layers);l1 = mseLoss(X1,T1);l2 = mseLoss(X2,T2);l3 = mseLoss(X3,T3);l4 = mseLoss(X4,T4);l5 = mseLoss(X5,T5);l6 = mseLoss(X6,T6);l7 = 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

函数gydF4y2Ba(Y,T) loss = 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)Ignatov吕克·范·干傻事,拉杜Timofte。“用单一深度学习模型取代移动相机ISP。”gydF4y2BaArXiv:2002.05509 [Cs, Eess]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) Shi,文哲,Jose Caballero, Ferenc Huszár, Johannes Totz, Andrew P. Aitken, Rob Bishop, Daniel Rueckert,和Zehan Wang。“使用高效亚像素卷积神经网络的实时单图像和视频超分辨率。”gydF4y2BaArXiv:1609.05158 [Cs, Stat]gydF4y2Ba2016年9月23日。http://arxiv.org/abs/1609.05158。gydF4y2Ba

另请参阅gydF4y2Ba

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

相关的例子gydF4y2Ba

更多关于gydF4y2Ba