主要内容gydF4y2Ba

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

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

数码单反相机和许多现代手机相机提供的能力将直接从相机传感器收集的数据保存为一个原始文件。每个像素的原始数据直接对应相应的相机捕捉到的光线光电传感器。数据取决于固定摄像机的硬件特点,每个感光器的灵敏度等特定电磁波谱的波长范围。数据还取决于相机采集设置,如曝光时间,和场景的因素如光源。gydF4y2Ba

Demosaicing是唯一要求操作单通道的原始数据转换为一个三通道RGB图像。然而,没有额外的图像处理操作,由此产生的RGB图像主观视觉质量差。gydF4y2Ba

传统的图像处理管道执行额外的操作包括去噪、线性化,白色平衡,色彩校正,调整亮度,对比度调整(gydF4y2Ba1gydF4y2Ba]。管道设计的挑战在于精炼算法优化最后的RGB图像的主观外表不管变化的场景和收购设置。gydF4y2Ba

RAWtoRGBintro.pnggydF4y2Ba

深度学习技术使直接原始RGB转换没有传统处理管道发展的必要性。例如,一项技术补偿曝光不足时,将原始图像转换为RGB (gydF4y2Ba2gydF4y2Ba]。这个例子展示了如何将原始图像从低端手机相机RGB图像近似高端单反相机的质量。gydF4y2Ba

下载苏黎世原始RGB数据集gydF4y2Ba

下面的例子使用了苏黎世原始RGB数据集(gydF4y2Ba3gydF4y2Ba]。数据集的大小是22 GB。数据集包含48043个注册对原始和RGB空间训练图像补丁的大小448 - - 448。数据集包含两个单独的测试集。一个测试集由1204空间注册对原始和RGB图像补丁的大小448 - - 448。未登记的全分辨率的其他测试集由原始和RGB图像。gydF4y2Ba

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

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

下载的数据集,请求访问使用gydF4y2Ba苏黎世原始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

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

创建一个gydF4y2BaimageDatastoregydF4y2Ba读取输入原始训练使用华为手机相机图像补丁了。捕获原始图像与10位精度和被表示为8位和16位PNG文件。补丁的8位文件提供一个紧凑的表示的数据范围[0,255]。没有做任何的扩展原始数据。gydF4y2Ba

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

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

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

传统模拟最小处理管道,demosaic RGGB拜耳原始数据使用的模式gydF4y2BademosaicgydF4y2Ba函数。显示图像和照亮显示处理。目标RGB图像相比,很少加工的RGB图像是黑暗和不平衡的颜色和明显的工件。训练RAW-to-RGB网络执行预处理操作,因此RGB图像与目标图像的相似的输出。gydF4y2Ba

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

测试图像分割成验证集和测试集gydF4y2Ba

测试数据包含原始和RGB图像补丁和全尺寸的图片。这个例子分区测试图像补丁验证集和测试集。例子使用了全尺寸测试图片仅供定性测试。看到gydF4y2Ba评估训练图像处理管道全尺寸图像gydF4y2Ba。gydF4y2Ba

创建图像数据存储,读取原始和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函数。辅助函数附加到例子作为支持文件。金宝appgydF4y2Ba

的gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Ba辅助函数将一个gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba1的原始图像gydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba/ 2×4多通道图像组成的一个红色,两个绿色和一个蓝色通道。gydF4y2Ba

RAWto4Channel.pnggydF4y2Ba

这个函数也将数据转换为数据类型gydF4y2Ba单gydF4y2Ba扩展到区间[0,1]。gydF4y2Ba

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

目标RGB图像作为unsigned 8位数据存储在磁盘上。指标的计算和网络设计更方便,预处理目标RGB图像使用培训gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BapreprocessRGBDataForRAWToRGBgydF4y2Bahelper函数。辅助函数附加到例子作为支持文件。金宝appgydF4y2Ba

的gydF4y2BapreprocessRGBDataForRAWToRGBgydF4y2Bahelper函数将图像数据类型gydF4y2Ba单gydF4y2Ba扩展到区间[0,1]。gydF4y2Ba

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

结合的输入原始和目标RGB数据训练,通过使用验证和测试图像集gydF4y2Ba结合gydF4y2Ba函数。gydF4y2Ba

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

随机增加训练数据使用gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BaaugmentDataForRAWToRGBgydF4y2Bahelper函数。辅助函数附加到例子作为支持文件。金宝appgydF4y2Ba

的gydF4y2BaaugmentDataForRAWToRGBgydF4y2Bahelper函数随机应用90度旋转和水平反射来对输入的原始和目标图像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]。输入原始和目标RGB图像相同的增加。gydF4y2Ba

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

批训练在训练和验证数据gydF4y2Ba

这个例子使用一个自定义训练循环。的gydF4y2BaminibatchqueuegydF4y2Ba(深度学习工具箱)gydF4y2Ba观察的对象是用于管理mini-batching定制培训循环。的gydF4y2BaminibatchqueuegydF4y2Ba对象也投下数据gydF4y2BadlarraygydF4y2Ba(深度学习工具箱)gydF4y2Ba在深度学习应用程序对象,使汽车分化。gydF4y2Ba

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

的gydF4y2Ba下一个gydF4y2Ba(深度学习工具箱)gydF4y2Ba的函数gydF4y2BaminibatchqueuegydF4y2Ba收益率的下mini-batch数据。预览输出从一个调用到gydF4y2Ba下一个gydF4y2Ba函数。输出数据类型gydF4y2BadlarraygydF4y2Ba。已经投下的数据gydF4y2BagpuArraygydF4y2BaGPU,和准备培训。gydF4y2Ba

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

建立U-Net网络层gydF4y2Ba

这个示例使用U-Net网络的一种变体。U-Net,最初的一系列卷积层点缀着麦克斯池层,先后降低输入图像的分辨率。这些层是紧随其后的是一系列的卷积层点缀着upsampling运营商,先后增加输入图像的分辨率。U-Net名称来自这样一个事实:网络可以用一个对称的形状像字母U。gydF4y2Ba

这个示例使用一个简单的U-Net架构有两个修改。首先,网络取代最后转置卷积操作自定义像素洗牌upsampling(也称为depth-to-space)操作。第二,网络使用一个定制的双曲正切活化层的最后一层网络。gydF4y2Ba

像素洗牌UpsamplinggydF4y2Ba

紧随其后的是像素卷积洗牌upsampling超分辨率应用程序可以定义亚像素卷积。亚像素卷积可以防止可能出现的挡板构件转置卷积(gydF4y2Ba6gydF4y2Ba]。因为这个模型需要地图gydF4y2BaHgydF4y2Ba/ 2 -gydF4y2BaWgydF4y2Ba/ 2×4原始输入gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2BaHgydF4y2Ba3 RGB输出,最后upsampling阶段的模型可以被认为类似于超级分辨率空间样本数量的增加从输入到输出。gydF4y2Ba

图中显示像素如何洗牌upsampling 2-by-2-by-4输入工作。前两个维度空间维度和第三维度是一个频道维度。一般来说,像素洗牌upsampling倍gydF4y2Ba年代gydF4y2Ba以一个gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2BaCgydF4y2Ba输入,并产生一个gydF4y2Ba年代gydF4y2Ba*gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2Ba年代gydF4y2Ba*gydF4y2BaWgydF4y2Ba——- - - - - -gydF4y2Ba CgydF4y2Ba 年代gydF4y2Ba 2gydF4y2Ba 输出。gydF4y2Ba

RawtoRGBpixelshuffle.pnggydF4y2Ba

像素洗牌功能增加输出的空间维度的映射信息频道维度在给定的空间位置gydF4y2Ba年代gydF4y2Ba——gydF4y2Ba- sgydF4y2Ba空间模块的输出每个通道有助于一个一致的空间位置相对于邻国upsampling期间。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 =收集(平均(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、填充=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],跨步= 2 [2],Name = encoderNamePrefix +gydF4y2Ba“1-MaxPool”gydF4y2Ba));gydF4y2Ba

添加层额外的编码子网。这些子网添加channel-wise实例规范化卷积后层使用gydF4y2BagroupNormalizationLayergydF4y2Ba。每个编码器子网过滤器与前面的编码器子网数量的两倍。gydF4y2Ba

cnIdx = 1;gydF4y2Ba为gydF4y2Ba= 2阶段:numEncoderStages numFilters = numFiltersFirstEncoder * 2 ^(阶段1);layerNamePrefix = encoderNamePrefix + num2str(阶段);encoderLayers = [encoderLayers convolution2dLayer (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”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)maxPooling2dLayer(2[2],跨步= 2 [2],Name = layerNamePrefix +gydF4y2Ba“-MaxPool”gydF4y2Ba));cnIdx = cnIdx + 2;gydF4y2Ba结束gydF4y2Ba

添加层的桥梁。这座桥子网两次过滤器作为最终的数量编码器子网和第一解码器子网。gydF4y2Ba

numFilters = numFiltersFirstEncoder * 2 ^ numEncoderStages;bridgeLayers = [convolution2dLayer (3 [3]、numFilters、填充=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为gydF4y2Ba= 1阶段:numDecoderStages-1 numFilters = numFiltersFirstEncoder * 2 ^ (numDecoderStages-stage);layerNamePrefix = decoderNamePrefix + num2str(阶段);decoderLayers = [decoderLayers transposedConv2dLayer (3 [3], numFilters大步= 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

添加层最后一个解码器子网。这个子网排除了channel-wise实例标准化执行的其它解码器子网。每个解码器子网有一半数量的过滤器前面的子网。gydF4y2Ba

numFilters = numFiltersFirstEncoder;layerNamePrefix = decoderNamePrefix + num2str(+ 1)阶段;decoderLayers = [decoderLayers transposedConv2dLayer (3 [3], numFilters大步= 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-by-12通道的大小从最后卷积激活gydF4y2BaHgydF4y2Ba——- - - - - -gydF4y2BaWgydF4y2Ba使用像素洗牌upsampling 3通道激活。最后一层鼓励输出所需的范围[0,1]使用双曲正切函数。gydF4y2Ba

finalLayers = [convolution2dLayer([3 3] 12填充=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…gydF4y2Ba“Decoder-Stage-4-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-2-ReLU-2”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“Decoder-Stage-3-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-3-ReLU-2”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“Decoder-Stage-2-DepthConcatenation / in2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-4-ReLU-2”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“Decoder-Stage-1-DepthConcatenation / in2”gydF4y2Ba);网= dlnetwork (lgraph);gydF4y2Ba

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

deepNetworkDesigner (lgraph)gydF4y2Ba

在特征提取网络负载gydF4y2Ba

这个函数修改pretrained VGG-16深层神经网络提取图像特征在不同的层。这些多层功能用于计算内容的损失。gydF4y2Ba

得到一个pretrained VGG-16网络,安装gydF4y2Bavgg16gydF4y2Ba(深度学习工具箱)gydF4y2Ba。如果你没有安装所需的支持包,然后软件提供一个下载链接。金宝appgydF4y2Ba

vggNet = vgg16;gydF4y2Ba

VGG-16网络适用于特征提取,使用层了”gydF4y2Barelu5_3”gydF4y2Ba。gydF4y2Ba

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

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

辅助函数gydF4y2BamodelGradientsgydF4y2Ba计算梯度和训练数据的总体损失批次。这个函数是定义在gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子。gydF4y2Ba

的总体损失是一个加权和两个损失:平均绝对误差(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

美损失对gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 网络预测样本和样品之间的距离的目标图像。gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 通常是一个更好的选择比吗gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 对于图像处理应用程序,因为它可以帮助减少模糊构件(gydF4y2Ba4gydF4y2Ba]。这个损失是使用的实现gydF4y2BamaeLossgydF4y2Ba助手函数中定义gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子。gydF4y2Ba

损失的内容可以帮助网络学习高级结构内容和低级边缘和颜色信息。损失函数计算的加权和预测之间的均方误差(MSE)和目标为每个激活层。这个损失是使用的实现gydF4y2BacontentLossgydF4y2Ba助手函数中定义gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子。gydF4y2Ba

计算内容减肥的因素gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2Bahelper函数需要减肥的因素作为输入参数的内容。计算加权因子等一批样本训练数据,美损失等于加权内容丢失。gydF4y2Ba

预览一批训练数据,包括对原始网络输入和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图像。gydF4y2Ba

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

计算加权因子。gydF4y2Ba

weightContent = sampleMAELoss / sampleContentLoss;gydF4y2Ba

指定培训选项gydF4y2Ba

定义培训选项中使用自定义训练亚当优化的循环控制方面。火车20时代。gydF4y2Ba

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

列车网络或下载Pretrained网络gydF4y2Ba

默认情况下,示例下载的pretrained版本RAW-to-RGB网络使用gydF4y2BadownloadTrainedNetworkgydF4y2Bahelper函数。pretrained网络使您能够运行整个示例没有等待培训完成。gydF4y2Ba

训练网络,设置gydF4y2BadoTraininggydF4y2Ba变量在下面的代码gydF4y2Ba真正的gydF4y2Ba。火车模型在一个定制的训练循环。每一次迭代:gydF4y2Ba

  • 对当前mini-batch使用读取数据gydF4y2Ba下一个gydF4y2Ba(深度学习工具箱)gydF4y2Ba函数。gydF4y2Ba

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

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

  • 更新培训进展情节每次迭代和显示各种计算损失。gydF4y2Ba

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见gydF4y2BaGPU计算的需求gydF4y2Ba(并行计算工具箱)gydF4y2Ba。培训大约需要88个小时的NVIDIA™泰坦RTX甚至可以再根据您的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] = (trainingQueue);(研究生,亏损)= dlfeval (@modelGradients,gydF4y2Ba…gydF4y2Ba净,vggNet inputRAW、targetRGB weightContent);迭代=迭代+ 1;[净,averageGrad averageSqGrad] = adamupdate(网络,gydF4y2Ba…gydF4y2Ba校友,averageGrad averageSqGrad,迭代,learnRate);updateTrainingPlotRAWToRGB (batchLine validationLine,迭代,gydF4y2Ba…gydF4y2Ba损失,启动、时代validationQueue、numValImages valBatchSize,gydF4y2Ba…gydF4y2Ba净,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/金宝appsupportfiles”gydF4y2Ba+gydF4y2Ba…gydF4y2Ba“/视觉/数据/ trainedRAWToRGBNet.mat”gydF4y2Ba;downloadTrainedNetwork (trainedNet_url dataDir);负载(fullfile (dataDirgydF4y2Ba“trainedRAWToRGBNet.mat”gydF4y2Ba));gydF4y2Ba结束gydF4y2Ba

计算图像质量指标gydF4y2Ba

Reference-based质量指标如MSSIM和PSNR使定量衡量图像质量。你可以计算MSSIM和打补丁的测试图像的PSNR值,因为他们是空间注册和相同的大小。gydF4y2Ba

遍历测试组修补图像的使用gydF4y2BaminibatchqueuegydF4y2Ba对象。gydF4y2Ba

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

遍历测试集和计算MSSIM和PSNR值为每个测试图像使用gydF4y2BamultissimgydF4y2Ba和gydF4y2Bapsnr值gydF4y2Ba功能。计算彩色图像通过使用MSSIM意味着每个颜色通道的指标作为近似,因为指标不定义良好的多通道输入。gydF4y2Ba

totalMSSIM = 0;totalPSNR = 0;gydF4y2Ba而gydF4y2Bahasdata (testPatchQueue) [inputRAW targetRGB] = (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方法(gydF4y2Ba3gydF4y2Ba]意味着MSSIM和竞争PyNet方法(gydF4y2Ba3gydF4y2Ba在平均PSNR。不同的损失函数和使用像素洗牌upsampling相比(gydF4y2Ba3gydF4y2Ba可能解释这些差异。gydF4y2Ba

numObservations = dsTestRGB.numpartitions;meanMSSIM = totalMSSIM / numObservationsgydF4y2Ba
meanMSSIM = 1 (S)×1 (S)×1 (C)×1 (B)单gpuArray dlarray 0.8401gydF4y2Ba
meanPSNR = totalPSNR / numObservationsgydF4y2Ba
meanPSNR = 1 (S)×1 (S)×1 (C)×1 (B)单gpuArray dlarray 21.0730gydF4y2Ba

评估训练图像处理管道全尺寸图像gydF4y2Ba

由于手机相机和单反传感器差异用来获得完全解决测试图像,幕后不注册,不一样大小。Reference-based比较全分辨率图像从网络和数码单反相机的ISP是很困难的。然而,图像的定性比较有用,因为是一个图像处理的目标是创建一个美观的形象。gydF4y2Ba

创建一个图像数据存储包含全尺寸的原始图像通过手机摄像头。gydF4y2Ba

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

得到的图像文件的名称在全尺寸的原始测试集。gydF4y2Ba

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

预处理的原始数据,将数据转换为所期望的形式网络使用gydF4y2Ba变换gydF4y2Ba函数。的gydF4y2Ba变换gydF4y2Ba函数过程中指定的数据使用操作gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数。辅助函数附加到例子作为支持文件。金宝appgydF4y2Ba

dsTestFullRAW =变换(dsTestFullRAW @preprocessRAWDataForRAWToRGB);gydF4y2Ba

创建一个包含完整的RGB图像数据存储测试图像捕获的高端数码单反相机。苏黎世RAW-to-RGB数据集包含更多的全尺寸的RGB图像比原始图像,所以只包括与相应的原始图像的RGB图像。gydF4y2Ba

dsTestFullRGB = imageDatastore (fullfile (dataDirgydF4y2Ba“full_resolution”gydF4y2Ba,gydF4y2Ba“佳能”gydF4y2Ba));dsTestFullRGB。F我le年代=dsTestFullRGB。F我le年代(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

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

outputSize = 2 *大小(预览(dsTestFullRAW) [1 - 2]);outputImages = 0 ([outputSize 3 dsTestFullRAW.numpartitions],gydF4y2Ba“uint8”gydF4y2Ba);idx = 1;gydF4y2Ba而gydF4y2Bahasdata (testQueue) inputRAW =下一个(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网络的性能,网络体系结构将学习详细的局部空间特征利用全球的多尺度特征描述颜色和对比(gydF4y2Ba3gydF4y2Ba]。gydF4y2Ba

金宝app支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2Bahelper函数计算梯度和整体损失。返回的梯度信息表包括层,参数名称和值中的每个可学的参数模型。gydF4y2Ba

函数gydF4y2Ba(渐变,亏损)= modelGradients (dlnet vggNet X T weightContent) Y =前进(dlnet X);lossMAE = maeLoss (Y, T);lossContent = contentLoss (vggNet, Y, T);损失= lossMAE + weightContent。* lossContent;梯度= dlgradient(损失、dlnet.Learnables);gydF4y2Ba结束gydF4y2Ba

平均绝对误差损失函数gydF4y2Ba

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

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

内容的损失函数gydF4y2Ba

辅助函数gydF4y2BacontentLossgydF4y2Ba计算之间的均方误差的加权网络的预测,gydF4y2BaYgydF4y2Ba和目标图像,gydF4y2BaTgydF4y2Ba,对于每个激活层。的gydF4y2BacontentLossgydF4y2Bahelper函数计算每个激活的MSE层使用gydF4y2BamseLossgydF4y2Bahelper函数。权重选择的损失从每个激活层大约同样有助于整体内容的损失。gydF4y2Ba

函数gydF4y2Ba损失= contentLoss =[(净,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计算网络之间的均方误差预测,gydF4y2BaYgydF4y2Ba和目标图像,gydF4y2BaTgydF4y2Ba。gydF4y2Ba

函数gydF4y2Ba损失= mseLoss (Y, T)损失=意味着((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)gydF4y2Ba,2018年5月4日。http://arxiv.org/abs/1805.01934。gydF4y2Ba

安德烈,3)Ignatov吕克·范·干傻事,拉杜Timofte。“替换移动相机ISP与单个深度学习模式。”gydF4y2BaArXiv: 2002.05509 (Cs,套)gydF4y2Ba,2020年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)约翰逊,贾斯汀,亚历山大Alahi,李菲菲。“知觉损失实时传输和超分辨率风格。”gydF4y2BaArXiv: 1603.08155 (Cs)gydF4y2Ba,2016年3月26日。http://arxiv.org/abs/1603.08155。gydF4y2Ba

6)史、Wenzhe Jose Caballero费伦茨Huszar, Johannes Totz,安德鲁·p·艾特肯王丹尼尔Rueckert, Zehan Rob主教。“实时图像和视频超分辨率使用高效的亚像素卷积神经网络。”gydF4y2BaArXiv: 1609.05158 (Cs,统计)gydF4y2Ba2016年9月23日。http://arxiv.org/abs/1609.05158。gydF4y2Ba

另请参阅gydF4y2Ba

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

相关的例子gydF4y2Ba

更多关于gydF4y2Ba