主要内容gydF4y2Ba

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

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

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

将单通道原始数据转换为三通道RGB图像所需的唯一操作是去马赛克化。然而,在没有额外的图像处理操作的情况下,产生的RGB图像主观上具有较差的视觉质量。gydF4y2Ba

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

深度学习技术使直接RAW到RGB转换成为可能,而不需要开发传统的处理管道。例如,一种技术在将RAW图像转换为RGB时补偿曝光不足[gydF4y2Ba2gydF4y2Ba]。此示例显示如何将低端手机摄像头的原始图像转换为接近高端DSLR摄像头质量的RGB图像。gydF4y2Ba

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

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

创建一个目录来存储数据集。gydF4y2Ba

imageDir = fullfile (tempdir,gydF4y2Ba'zurichrawtorgb'gydF4y2Ba);gydF4y2Ba如果gydF4y2Ba~exist(imageDir,gydF4y2Ba“dir”gydF4y2Ba)mkdir(imageDir);gydF4y2Ba终止gydF4y2Ba

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

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

为RGB图像修补程序培训数据创建数据存储gydF4y2Ba

创建一个gydF4y2Ba图像数据存储gydF4y2Ba读取使用高端CANON DSLR获取的目标RGB培训图像修补程序。gydF4y2Ba

trainImageDir = fullfile (imageDir,gydF4y2Ba'火车'gydF4y2Ba);dsTrainRGB = imageDatastore (fullfile (trainImageDirgydF4y2Ba“佳能”gydF4y2Ba),gydF4y2Ba“ReadSize”gydF4y2Ba16);gydF4y2Ba

预览RGB训练图像补丁。gydF4y2Ba

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

创建RAW图像补丁训练数据的数据存储gydF4y2Ba

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

dsTrainRAW=图像数据存储(完整文件(trainImageDir,gydF4y2Ba“huawei_raw”gydF4y2Ba),gydF4y2Ba“ReadSize”gydF4y2Ba16);gydF4y2Ba

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

InputPatch =预览(Dstrainraw);InputPatchraw = InputPatch / 4;imshow(InputPatchraw)gydF4y2Ba

为了模拟最小的传统处理管道,使用RGGB Bayer模式对RAW数据进行演示gydF4y2Ba反马赛克gydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。显示处理后的图像并使显示器变亮。与目标RGB图像相比,经过最小值处理的RGB图像颜色较暗,颜色不平衡,存在明显的伪影。经过训练的RAW-to-RGB网络执行预处理操作,使输出的RGB图像与目标图像相似。gydF4y2Ba

inputPatchRGB = demosaic (inputPatch,gydF4y2Ba'rggb'gydF4y2Ba);imshow(重新缩放(inputPatchRGB))gydF4y2Ba

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

测试数据包括RAW和RGB图像补丁和全尺寸图像。本例将测试图像补丁划分为验证集和测试集。本例仅使用全尺寸测试图像进行定性测试。看到gydF4y2Ba在全尺寸图像上评估经过培训的图像处理管道gydF4y2Ba.gydF4y2Ba

创建读取原始和RGB测试图像修补程序的图像数据存储。gydF4y2Ba

testImageDir = fullfile (imageDir,gydF4y2Ba“测试”gydF4y2Ba);dsTestRAW=图像数据存储(完整文件(testImageDir,gydF4y2Ba“huawei_raw”gydF4y2Ba),gydF4y2Ba“ReadSize”gydF4y2Ba,16);dsTestRGB=图像数据存储(完整文件(testImageDir,gydF4y2Ba“佳能”gydF4y2Ba),gydF4y2Ba“ReadSize”gydF4y2Ba16);gydF4y2Ba

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

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

预处理和增强数据gydF4y2Ba

传感器以重复的拜耳模式获取颜色数据,拜耳模式包括一个红色、两个绿色和一个蓝色光电传感器。使用gydF4y2Ba转变gydF4y2Ba函数。的gydF4y2Ba转变gydF4y2Ba函数使用指定的操作处理数据gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。金宝appgydF4y2Ba

的gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数转换gydF4y2BaHgydF4y2Ba-借-gydF4y2BaWgydF4y2Ba-by-1 RAW图像到一个gydF4y2BaHgydF4y2Ba/二乘-gydF4y2BaWgydF4y2Ba/由一个红色通道、两个绿色通道和一个蓝色通道组成的2×4多通道图像。gydF4y2Ba

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

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

目标RGB图像以无符号8位数据的形式存储在磁盘上。为方便指标的计算和网络设计,利用该算法对目标RGB训练图像进行预处理gydF4y2Ba转变gydF4y2Ba函数和gydF4y2BapreprocessRGBDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。金宝appgydF4y2Ba

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

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

将输入原始和目标RGB数据组合使用培训,验证和测试图像集gydF4y2Ba结合gydF4y2Ba函数。gydF4y2Ba

dstrain =组合(dstrainraw,dstrainrgb);DSVAL =联合(DSVALRAW,DSVALRGB);dstest =联合(dststraw,dstestrgb);gydF4y2Ba

使用gydF4y2Ba转变gydF4y2Ba函数和gydF4y2BaaugmentDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。金宝appgydF4y2Ba

的gydF4y2BaaugmentDataForRAWToRGBgydF4y2Ba辅助函数随机对输入的RAW和目标RGB训练图像进行90度旋转和水平反射。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的gydF4y2BaminibatchqueuegydF4y2Ba对象还将数据强制转换到gydF4y2BadlarraygydF4y2Ba对象,使深度学习应用程序中的自动区分。gydF4y2Ba

miniBatchSize = 12;valBatchSize = 10;trainingQueue = minibatchqueue (dsTrainAug,gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba'partialminibatch'gydF4y2Ba,gydF4y2Ba“丢弃”gydF4y2Ba,gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba); validationQueue=minibatchqueue(dsVal,gydF4y2Ba“MiniBatchSize”gydF4y2BavalBatchSize,gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba

的gydF4y2Ba下一个gydF4y2Ba功能gydF4y2BaminibatchqueuegydF4y2Ba生成下一个小批量数据。预览对gydF4y2Ba下一个gydF4y2Ba函数。输出具有数据类型gydF4y2BadlarraygydF4y2Ba。数据已强制转换到gydF4y2BagpuArraygydF4y2Ba,在GPU上,并准备好进行培训。gydF4y2Ba

[inputRAW,targetRGB]=下一个(培训队列);谁gydF4y2BainputRAWgydF4y2Ba
名称大小字节类属性inputRAW 224x224x4x12 9633800美元gydF4y2Ba
谁gydF4y2BatargetRGBgydF4y2Ba
名称大小字节类属性targetRGB 448x448x3x12 28901384 dlarraygydF4y2Ba

建立U-Net网络层gydF4y2Ba

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

本例使用了一个简单的U-Net体系结构,做了两处修改。首先,该网络用自定义像素shuffle上采样(也称为深度到空间)操作取代最终的转置卷积操作。第二,网络使用自定义双曲切线激活层作为网络的最后一层。gydF4y2Ba

像素无序上采样gydF4y2Ba

卷积后像素shuffle上采样可以定义超分辨率应用的亚像素卷积。亚像素卷积可防止由转置卷积产生的棋盘伪影[gydF4y2Ba6gydF4y2Ba].因为模型需要映射gydF4y2BaHgydF4y2Ba/二乘-gydF4y2BaWgydF4y2Ba/2×4原始输入到gydF4y2BaWgydF4y2Ba-借-gydF4y2BaHgydF4y2Ba-通过-3个RGB输出,可以认为模型的最终上采样阶段类似于超分辨率,其中空间样本的数量从输入增加到输出。gydF4y2Ba

该图显示了像素无序上采样在2×2×4输入中的工作原理。前两个维度是空间维度,第三个维度是通道维度。通常,像素无序上采样的系数为gydF4y2Ba年代gydF4y2Ba需要一个gydF4y2BaHgydF4y2Ba-借-gydF4y2BaWgydF4y2Ba-借-gydF4y2BaCgydF4y2Ba输入并生成一个gydF4y2Ba年代gydF4y2Ba*gydF4y2BaHgydF4y2Ba-借-gydF4y2Ba年代gydF4y2Ba*gydF4y2BaWgydF4y2Ba-借-gydF4y2Ba CgydF4y2Ba 年代gydF4y2Ba 2gydF4y2Ba 输出。gydF4y2Ba

像素shuffle函数通过将给定空间位置的通道维数映射到输出的空间维数来增长输出的空间维数gydF4y2Ba年代gydF4y2Ba-经过gydF4y2Ba-gydF4y2Ba输出中的空间块,其中每个通道在上采样期间相对于其相邻通道贡献一个一致的空间位置。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

计算输入归一化的训练集统计gydF4y2Ba

用gydF4y2Ba高的gydF4y2Ba计算整个训练数据集的每通道平均减少量。网络的输入层在训练和测试期间使用平均统计数据对输入进行平均居中。gydF4y2Ba

dsin = copy(dstrainraw);dsin.underwingdatastore.readsize = 1;t =高(dsin);perchannelmean =聚集(平均值(t,[1 2]));gydF4y2Ba
使用并行池“LocalProfile12”评估tall表达式:-通过1次/1次:0%完成评估0%完成-通过1次/1次/1次:在1分钟内完成1秒评估在1分钟2秒内完成gydF4y2Ba

创建U-NetgydF4y2Ba

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

inputSize = [256 256 4];initialLayer = imageInputLayer (inputSize,gydF4y2Ba“正常化”gydF4y2Ba,gydF4y2Ba“Zerocenter”gydF4y2Ba,gydF4y2Ba“平均值”gydF4y2BaperChannelMean,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“imageinputlayer”gydF4y2Ba);gydF4y2Ba

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

numEncoderStages = 4;numFiltersFirstEncoder = 32;encoderNamePrefix =gydF4y2Ba“Encoder-Stage——”gydF4y2Ba;encoderLayers =[卷积2dlayer ([3 3],numFiltersFirstEncoder,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Bastrcat (encoderNamePrefixgydF4y2Ba“1-Conv-1”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Bastrcat (encoderNamePrefixgydF4y2Ba“1-Relu-1”gydF4y2Ba3) convolution2dLayer ([3], numFiltersFirstEncoder,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Bastrcat (encoderNamePrefixgydF4y2Ba“1-Conv-2”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Bastrcat (encoderNamePrefixgydF4y2Ba“1-ReLU-2”gydF4y2Ba))maxpooling2dlayer([2 2],gydF4y2Ba“步”gydF4y2Ba(2 - 2),gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Bastrcat (encoderNamePrefixgydF4y2Ba“1-MaxPool”gydF4y2Ba));];gydF4y2Ba

添加其他编码子网的层。这些子网在每个卷积层使用a后添加频道 - WISE实例标准化gydF4y2Ba组规范化层gydF4y2Ba.每个编码器子网络的过滤器数量是前一个编码器子网络的两倍。gydF4y2Ba

cnIdx = 1;gydF4y2Ba对于gydF4y2BaStage = 2:numencoderstages numfilters = numfiltersfirstencoder * 2 ^(阶段-1);layernameprefix = strcat(EncoderNamePrefix,Num2str(阶段));EncoderLayers = [EncoderLayers卷积2Dlayer([3 3],NumFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,Strcat(gydF4y2Ba“cn”gydF4y2Banum2str (cnIdx))) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“ -  relu-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,Strcat(gydF4y2Ba“cn”gydF4y2Ba,num2str(cnIdx+1)))漏层(0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-reelu-2”gydF4y2Ba))maxpooling2dlayer([2 2],gydF4y2Ba“步”gydF4y2Ba(2 - 2),gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-MaxPool”gydF4y2Ba)) ]; cnIdx=cnIdx+2;gydF4y2Ba终止gydF4y2Ba

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

numfilters = numfiltersfirstencoder * 2 ^ numencoderstages;bridgelayers = [卷积2dlayer([3 3],numfilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“Bridge-conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“CN7”gydF4y2Ba)泄漏层(0.2,gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“Bridge-ReLU-1”gydF4y2Ba)卷积2dlayer([3 3],numfilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“Bridge-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“CN8”gydF4y2Ba)泄漏层(0.2,gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“Bridge-ReLU-2”gydF4y2Ba));gydF4y2Ba

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

numDecoderStages = 4;cnIdx = 9;decoderNamePrefix =gydF4y2Ba“解码器阶段—gydF4y2Ba;解码器= [];gydF4y2Ba对于gydF4y2Bastage = 1:numDecoderStages-1 numFilters = numFiltersFirstEncoder*2^(numDecoderStages-stage);layerNamePrefix = strcat (decoderNamePrefix num2str(阶段));decoderLayers = [decoderLayers转置conv2dlayer ([3 3],numFilters,gydF4y2Ba“步”gydF4y2Ba(2 - 2),gydF4y2Ba“裁剪”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-upconv”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-UpReLU”gydF4y2Ba))深度连接胶层(2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-DepthConcatenation”gydF4y2Ba3) convolution2dLayer ([3], numFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-1”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,Strcat(gydF4y2Ba“cn”gydF4y2Banum2str (cnIdx))) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“ -  relu-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-2”gydF4y2Ba) groupNormalizationLayer (gydF4y2Ba“渠道明智”gydF4y2Ba,gydF4y2Ba“姓名”gydF4y2Ba,Strcat(gydF4y2Ba“cn”gydF4y2Ba,num2str(cnIdx+1)))漏层(0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-reelu-2”gydF4y2Ba)) ]; cnIdx=cnIdx+2;gydF4y2Ba终止gydF4y2Ba

添加最后一个解码器子网络的层。此子网不包括由其他解码器子网执行的信道方式实例规范化。每个解码器子网络的滤波器数量是前一个子网络的一半。gydF4y2Ba

numFilters=numFiltersFirstEncoder;layerNamePrefix=strcat(decoderNamePrefix,num2str(stage+1));decoderLayers=[decoderLayers transposedConv2dLayer([3],numFilters,gydF4y2Ba“步”gydF4y2Ba(2 - 2),gydF4y2Ba“裁剪”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-upconv”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-UpReLU”gydF4y2Ba))深度连接胶层(2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-DepthConcatenation”gydF4y2Ba3) convolution2dLayer ([3], numFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-1”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“ -  relu-1”gydF4y2Ba3) convolution2dLayer ([3], numFilters,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-Conv-2”gydF4y2Ba) leakyReluLayer (0.2,gydF4y2Ba“姓名”gydF4y2Ba,strcat(LayerNamePrefix,gydF4y2Ba“-reelu-2”gydF4y2Ba))];gydF4y2Ba

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

finalLayers =[卷积2dlayer ([3 3],12,gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“增重剂”gydF4y2Ba,gydF4y2Ba“窄正常”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“姓名”gydF4y2Ba,gydF4y2Ba“解码器-Stage-4-Conv-3”gydF4y2Ba) pixelShuffleLayer (gydF4y2Ba“pixelShuffle”gydF4y2Ba,2)tanhScaledAndShiftedLayer(gydF4y2Ba“tanhActivation”gydF4y2Ba));层= [initialLayer; encoderLayers; bridgeLayers decoderLayers; finalLayers);lgraph = layerGraph(层);gydF4y2Ba

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

lgraph = connectLayers (lgraph,gydF4y2Ba“Encoder-Stage-1-ReLU-2”gydF4y2Ba,gydF4y2Ba“解码器 - 阶段-4-DepareConcatation / In2”gydF4y2Ba);lgraph = connectLayers (lgraph,gydF4y2Ba“编码器-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“解码器级1深度级联/in2”gydF4y2Ba);网= dlnetwork (lgraph);gydF4y2Ba

使用gydF4y2Ba深度网络设计器gydF4y2Ba应用程序。gydF4y2Ba

%DeepNetWorkDesigner(LGROPH)gydF4y2Ba

加载特征提取网络gydF4y2Ba

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

安装一个预先训练过的VGG-16网络gydF4y2Bavgg16gydF4y2Ba.如果您没有安装所需的支持包,那么该软件将提供下载链接。金宝appgydF4y2Ba

vggNet =负载(gydF4y2Ba“vgg16”gydF4y2Ba);vggNet = vggNet.net;gydF4y2Ba% vggNet = vgg16;gydF4y2Ba

要使VGG-16网络适合于特征提取,请使用以下图层:gydF4y2Ba“relu5_3”gydF4y2Ba.gydF4y2Ba

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

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

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

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

lgydF4y2Ba ogydF4y2Ba sgydF4y2Ba sgydF4y2Ba OgydF4y2Ba vgydF4y2Ba egydF4y2Ba RgydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba lgydF4y2Ba =gydF4y2Ba lgydF4y2Ba ogydF4y2Ba sgydF4y2Ba sgydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba EgydF4y2Ba +gydF4y2Ba WgydF4y2Ba egydF4y2Ba 我gydF4y2Ba ggydF4y2Ba hgydF4y2Ba TgydF4y2Ba FgydF4y2Ba 一个gydF4y2Ba cgydF4y2Ba TgydF4y2Ba ogydF4y2Ba RgydF4y2Ba *gydF4y2Ba lgydF4y2Ba ogydF4y2Ba sgydF4y2Ba sgydF4y2Ba CgydF4y2Ba ogydF4y2Ba ngydF4y2Ba TgydF4y2Ba egydF4y2Ba ngydF4y2Ba TgydF4y2Ba

MAE损失惩罚gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 网络预测样本与目标图像样本之间的距离。gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 通常是一个更好的选择gydF4y2Ba lgydF4y2Ba 2gydF4y2Ba 用于图像处理应用,因为它可以帮助减少模糊的伪影[gydF4y2Ba4gydF4y2Ba].这种损失是使用gydF4y2BaMaeloss.gydF4y2Ba中定义的辅助函数gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子的一部分。gydF4y2Ba

内容丢失有助于网络学习高层次的结构内容和低层次的边缘和颜色信息。损失函数计算每个激活层的预测和目标之间的均方误差(MSE)的加权和。这种损失是使用gydF4y2BacontentLossgydF4y2Ba中定义的辅助函数gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子的一部分。gydF4y2Ba

计算含量损失重量因子gydF4y2Ba

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

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

Trysternbatch =预览(Dstrainaug);NetworkInput = Dlarray((TriceionBatch {1,1}),gydF4y2Ba“SSC”gydF4y2Ba);targetOutput = dlarray ((trainingBatch {1,2}),gydF4y2Ba“SSC”gydF4y2Ba);gydF4y2Ba

预测未经训练的U-Net网络的反应使用gydF4y2Ba向前gydF4y2Ba函数。gydF4y2Ba

predictedOutput=forward(净、网络输入);gydF4y2Ba

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

sampleMAELoss=maeLoss(预测输出、目标输出);sampleContentLoss=contentLoss(vggNet、predictedOutput、targetOutput);gydF4y2Ba

计算权重因子。gydF4y2Ba

weightContent = sampleMAELoss / sampleContentLoss;gydF4y2Ba

指定培训选项gydF4y2Ba

定义自定义训练循环中用于控制Adam优化方面的训练选项。训练20个阶段。gydF4y2Ba

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

列车网络的gydF4y2Ba

默认情况下,示例使用辅助功能下载raw-rgb网络的预磨损版本gydF4y2BadownloadTrainedRAWToRGBNetgydF4y2Ba。助手功能作为支持文件附加到示例。预训练网络使您无需等待培训完成即可运行整个示例。金宝appgydF4y2Ba

要训练网络,请设置gydF4y2Ba溺爱gydF4y2Ba以下代码中的变量gydF4y2Ba真的gydF4y2Ba.在自定义训练循环中训练模型。对于每个迭代:gydF4y2Ba

  • 使用读取当前小批量的数据gydF4y2Ba下一个gydF4y2Ba函数。gydF4y2Ba

  • 方法评估模型梯度gydF4y2BadlfevalgydF4y2Ba函数和gydF4y2BamodelGradientsgydF4y2Bahelper函数。gydF4y2Ba

  • 使用以下命令更新网络参数:gydF4y2BaadamupdategydF4y2Ba函数和梯度信息。gydF4y2Ba

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

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

dotraining = false;gydF4y2Ba如果gydF4y2Ba溺爱gydF4y2Ba%创建存储检查点的目录gydF4y2Bacheckpointdir = fullfile(imagedir,gydF4y2Ba“检查站”gydF4y2Ba, filesep);gydF4y2Ba如果gydF4y2Ba~exist(检查点目录,gydF4y2Ba“dir”gydF4y2Bamkdir (checkpointDir);gydF4y2Ba终止gydF4y2Ba初始化训练图gydF4y2Ba[hFig、batchLine、validationLine]=初始化TrainingPlotrawPipeline;gydF4y2Ba%初始化Adam解算器状态gydF4y2Ba[平均值,AverageSqgrad] =交易([]);迭代= 0;start = tic;gydF4y2Ba对于gydF4y2Baepoch = 1:numEpochs reset(trainingQueue);洗牌(trainingQueue);gydF4y2Ba尽管gydF4y2Bahasdata(trainingQueue) [inputRAW,targetRGB] = next(trainingQueue);(研究生,亏损)= dlfeval (@modelGradients,净、vggNet inputRAW, targetRGB, weightContent);迭代=迭代+ 1;[净,averageGrad averageSqGrad] = adamupdate(网络,gydF4y2Ba...gydF4y2Bagrad、averageGrad、averageSqGrad、迭代、learnRate);updateTrainingPlotRAWPipeline(批处理线、验证线、迭代、损失、开始、历元、,gydF4y2Ba...gydF4y2BavalidationQueue、numValImages、valBatchSize、net、vggNet、WeighContent);gydF4y2Ba终止gydF4y2Ba%保存网络状态的检查点gydF4y2Ba保存(checkpointDir +gydF4y2Ba“时代”gydF4y2Ba+时代,gydF4y2Ba“净”gydF4y2Ba);gydF4y2Ba终止gydF4y2Ba%保存最终网络状态gydF4y2Ba保存(checkpointDir +gydF4y2Ba“trainedRAWToRGBNet.mat”gydF4y2Ba,gydF4y2Ba“净”gydF4y2Ba);gydF4y2Ba其他的gydF4y2BatrainedRAWToRGBNet\u url=gydF4y2Ba“https://ssd.mathworks.com/金宝appsupportfiles/vision/data/trainedRAWToRGBNet.mat”gydF4y2Ba;downloadTrainedRAWToRGBNet (trainedRAWToRGBNet_url imageDir);负载(fullfile (imageDirgydF4y2Ba“trainedRAWToRGBNet.mat”gydF4y2Ba));gydF4y2Ba终止gydF4y2Ba
预训练的原始到RGB网络已存在。gydF4y2Ba

计算图像质量指标gydF4y2Ba

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

使用。迭代修补过的图像测试集gydF4y2BaminibatchqueuegydF4y2Ba目的。gydF4y2Ba

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

迭代测试集,并使用gydF4y2BamultissimgydF4y2Ba(图像处理工具箱)gydF4y2Ba和gydF4y2Bapsnr值gydF4y2Ba(图像处理工具箱)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。该结果与[gydF4y2Ba3.gydF4y2Ba]的平均MSSIM,并与[中的PyNet方法竞争gydF4y2Ba3.gydF4y2Ba]在平均峰值信噪比中,损失函数和使用像素混洗上采样与[gydF4y2Ba3.gydF4y2Ba很可能解释了这些差异。gydF4y2Ba

numobservations = dststrgb.numumartitions;vilicmssim = totalmssim / numobservationsgydF4y2Ba
meanMSSIM = 1(S) × 1(S) × 1(C) × 1(B)单元0.8425gydF4y2Ba
MASHPSNR = TOMITPSNR / NUMOBSERATIONSgydF4y2Ba
meanPSNR = 1(S) × 1(S) × 1(C) × 1(B)单元21.1213gydF4y2Ba

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

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

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

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

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

targetFilesToInclude = extractAfter (string (dsTestFullRAW.Files) fullfile (testImageDirRAW filesep));targetFilesToInclude = extractBefore (targetFilesToInclude,gydF4y2Ba“.png”gydF4y2Ba);gydF4y2Ba

通过使用gydF4y2Ba转变gydF4y2Ba函数。的gydF4y2Ba转变gydF4y2Ba函数使用指定的操作处理数据gydF4y2BapreprocessRAWDataForRAWToRGBgydF4y2Bahelper函数。helper函数作为支持文件附加到示例中。金宝appgydF4y2Ba

dsTestFullRAW =变换(dsTestFullRAW @preprocessRAWDataForRAWToRGB);gydF4y2Ba

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

dsTestFullRGB=图像数据存储(完整文件(imageDir,gydF4y2Ba“full_resolution”gydF4y2Ba,gydF4y2Ba“佳能”gydF4y2Ba));dsTestFullRGB.Files=dsTestFullRGB.Files(包含(dsTestFullRGB.Files,targetFilesToInclude));gydF4y2Ba

读取目标RGB图像。通过查看蒙太奇视图来获得总体输出的感觉。gydF4y2Ba

targetrgb = Readall(DSTESTFULLRGB);蒙太奇(TargetRGB,gydF4y2Ba“大小”gydF4y2Ba,[5 2],gydF4y2Ba“插值”gydF4y2Ba,gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

迭代完整大小的图像测试集gydF4y2BaminibatchqueuegydF4y2Ba如果您的GPU设备具有足够的内存来处理全分辨率图像,那么您可以通过将输出环境指定为gydF4y2Ba“图形”gydF4y2Ba.gydF4y2Ba

testqueue = minibatchqueue(dstestfullraw,gydF4y2Ba“迷你atchsize”gydF4y2Ba1.gydF4y2Ba...gydF4y2Ba“迷你批处理格式”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba,gydF4y2Ba“OutputEnvironment”gydF4y2Ba,gydF4y2Ba“cpu”gydF4y2Ba);gydF4y2Ba

对于每个全尺寸RAW测试图像,通过调用来预测输出的RGB图像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

蒙太奇(输出图像,gydF4y2Ba“大小”gydF4y2Ba,[5 2],gydF4y2Ba“插值”gydF4y2Ba,gydF4y2Ba“双线性”gydF4y2Ba)gydF4y2Ba

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

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

为了提高原始到RGB网络的性能,网络体系结构将使用描述颜色和对比度的全局特征的多个尺度来学习详细的局部空间特征[gydF4y2Ba3.gydF4y2Ba].gydF4y2Ba

金宝app支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

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

功能gydF4y2Ba[gradient,loss] = modelGradients(dlnet,vggNet,Xpatch,Target,weightContent) Y = forward(dlnet,Xpatch);lossMAE = maeLoss (Y,目标);lossContent = contentLoss (vggNet Y目标);loss = lossMAE + weightContent.*lossContent;梯度= dlgradient(损失、dlnet.Learnables);gydF4y2Ba终止gydF4y2Ba

平均绝对误差损失函数gydF4y2Ba

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

功能gydF4y2Ba损失= maeloss(y,t)损失=平均值(abs(y-t),gydF4y2Ba“全部”gydF4y2Ba);gydF4y2Ba终止gydF4y2Ba

内容的损失函数gydF4y2Ba

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

功能gydF4y2Baloss = contentLoss(net,Y,T) layers = [gydF4y2Ba“relu1_1”gydF4y2Ba,gydF4y2Ba“relu1_2”gydF4y2Ba,gydF4y2Ba“relu2_1”gydF4y2Ba,gydF4y2Ba“relu2_2”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] =前进(净TgydF4y2Ba“输出”gydF4y2Ba层);[x1,x2,x3,x4,x5,x6,x7,x8] =向前(net,y,gydF4y2Ba“输出”gydF4y2Ba层);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);18 = mseLoss(×8、T8);layerLosses = [l1 l2 l3 l4 l5 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中处理RAW图像”。2014年5月19日。https://rcsumner.net/raw_guide/RAWguide.pdf。gydF4y2Ba

2)陈,陈,奇峰陈,贾旭和弗拉德林九屯。“学会在黑暗中看到。”gydF4y2Baarxiv:1805.01934 [CS]gydF4y2Ba,2018年5月4日。http://arxiv.org/abs/1805.01934.gydF4y2Ba

3)伊格纳托夫、安德烈、卢克·凡古尔和拉杜·蒂莫夫特。“用单一的深度学习模型取代移动相机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]gydF4y2Ba,2018年4月20日。http://arxiv.org/abs/1511.08861。gydF4y2Ba

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

6)Shi,Wenzhe,Jose Caballero,FerencHuszár,Johannes Totz,Andrew P. Aitken,Rob Bishop,Daniel Rueckert和Zehan Wang。“使用有效的子像素卷积神经网络的实时单图像和视频超分辨率。”gydF4y2BaArXiv:1609.05158[Cs,Stat]gydF4y2Ba,2016年9月23日。http://arxiv.org/abs/1609.05158.gydF4y2Ba

另见gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的例子gydF4y2Ba

更多关于gydF4y2Ba