用OpenCV4实现图像的超分别率
用OpenCV4實(shí)現(xiàn)圖像的超分別率
本實(shí)驗(yàn)原文鏈接:
https://arxiv.org/pdf/1807.06779.pdf
原文摘要
單圖像超分辨率(SISR)的主要挑戰(zhàn)是如何恢復(fù)微小紋理等高頻細(xì)節(jié)。然而,大多數(shù)最先進(jìn)的方法缺乏識別高頻區(qū)域的特定模塊,導(dǎo)致輸出圖像模糊。本文提出了一種基于注意的方法來區(qū)分紋理區(qū)域和平滑區(qū)域。高頻細(xì)節(jié)定位后,進(jìn)行高頻補(bǔ)償。這種方法可以與先前提出的SISR網(wǎng)絡(luò)相結(jié)合。通過提供高頻增強(qiáng),可以獲得更好的性能和視覺效果。本文還提出了自己的由DenseRes塊組成的SISR網(wǎng)絡(luò)。該模塊提供了一種將低層特征和高層特征相結(jié)合的有效方法。大量的基準(zhǔn)測試表明,本文提出的方法比SISR的最新作品有了顯著的改進(jìn)。
單圖像超分辨率(SISR)的任務(wù)是從單低分辨率(LR)輸入圖像中推斷出高分辨率(HR)圖像。
這是一個高度不適定的問題,因?yàn)樵诘屯V波和下采樣過程中,諸如微小紋理等高頻信息會丟失。因此,SISR是一對多的映射,本文的任務(wù)是找到最合理的圖像,盡可能地恢復(fù)微小的紋理。為了從LR圖像中恢復(fù)HR圖像,需要大的接收場從LR圖像中獲取更多的上下文信息。使用更深層的網(wǎng)絡(luò)是增加接受視野的更好方法。深度網(wǎng)絡(luò)的一個缺點(diǎn)是梯度問題的消失,使得網(wǎng)絡(luò)難以訓(xùn)練。Heetal.[1]利用這些學(xué)習(xí)框架來進(jìn)行網(wǎng)絡(luò)訓(xùn)練。跳過連接是另一種通過網(wǎng)絡(luò)增加梯度和信息流動的解決方案。低層特征包含了有效的信息,可以用來重建HR圖像。SISR將從不同層次的集體信息中獲益。SISR的難點(diǎn)在于恢復(fù)高頻細(xì)節(jié),如微小紋理。
輸出圖像與原始圖像之間的均方誤差(MSE)常作為損失函數(shù)來訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)。然而,在追求高峰值信噪比(PSNR)的過程中,MSE會返回許多可能解的均值,從而使輸出圖像變得模糊和不可信。為了恢復(fù)高頻細(xì)節(jié),人們提出了知覺損失[2],它鼓勵生成特征表示相似的圖像的網(wǎng)絡(luò),從而產(chǎn)生更清晰的圖像。萊迪格在阿爾。[3] ,[4]結(jié)合對抗性網(wǎng)絡(luò)、感知損失和紋理損失,鼓勵輸出圖像恢復(fù)微小紋理等高頻細(xì)節(jié)。但是所有這些網(wǎng)絡(luò)并不清楚高頻細(xì)節(jié)的位置,它們只是試圖盲目地恢復(fù)
紋理。因此,這些網(wǎng)絡(luò)的性能并不令人滿意。為了解決這些問題,首先,在denseNet[5]的基礎(chǔ)上,本文提出了一種新的由剩余積木塊(Resblock)[1]組成的DenseRes塊。每個Resblock的輸出都連接到其他Resblock,增強(qiáng)了信息的流動性,避免了冗余特征的重新學(xué)習(xí)。利用DenseRes塊,減少了梯度消失問題,網(wǎng)絡(luò)易于訓(xùn)練。第二,本文提供一個注意機(jī)制來處理高頻細(xì)節(jié)的恢復(fù)。受用于語義像素級分割的U-net[6]的啟發(fā),本文提出了一種新的混合密集連接U-net,以幫助網(wǎng)絡(luò)區(qū)分是否存在需要修復(fù)或類似于插值圖像的細(xì)小紋理區(qū)域。它作為一個特征選擇器,有選擇地增強(qiáng)高頻特征。因此,可以盡可能接近地恢復(fù)紋理。這是第一次將注意機(jī)制引入SISR。方法簡單有效。通過選擇性地提供高頻增強(qiáng),它緩解了輸出圖像容易模糊的問題。注意機(jī)制可以與先前提出的SISR網(wǎng)絡(luò)相結(jié)合。獲得了較高的信噪比和信噪比。另一個貢獻(xiàn)是本文提出了DenseRes塊,它提供了一種有效的方法來結(jié)合低層特征和高層特征。這有利于恢復(fù)高頻細(xì)節(jié)。本文在四個公開的基準(zhǔn)數(shù)據(jù)集上評估本文的模型。它在PSNR和結(jié)構(gòu)相似性(SSIM)指數(shù)方面優(yōu)于當(dāng)前最新的方法。PSNR比VDSR[7]和DRCN[8]分別提高了0.54db和0.52dB。
圖像超像素
傳統(tǒng)方式的圖像超像素常見的方式就是基于立方插值跟金字塔重建。OpenCV中對這兩種方式均有實(shí)現(xiàn),低像素圖像在紋理細(xì)節(jié)方面很難恢復(fù),從低像素圖像到高像素圖像是典型的一對多映射,如果找到一種好的映射關(guān)系可以盡可能多的恢復(fù)或者保留圖像紋理細(xì)節(jié)是圖像超像素重建的難點(diǎn)之一,傳統(tǒng)方式多數(shù)都是基于可推導(dǎo)的模型實(shí)現(xiàn)。而基于深度學(xué)習(xí)的超像素重新方式過程未知但是結(jié)果優(yōu)于傳統(tǒng)方式。在深度學(xué)習(xí)方式的超像素重建中,對低像素圖像采樣大感受野來獲取更多的紋理特征信息。OpenVINO中提供的單張圖像超像素網(wǎng)絡(luò)參考了下面這篇文章
該網(wǎng)絡(luò)模型主要分為兩個部分
·
特征重建網(wǎng)絡(luò),實(shí)現(xiàn)從低分辨率到高分辨率的像素重建
·
注意力生成網(wǎng)絡(luò),主要實(shí)現(xiàn)圖像中高頻信息的修復(fù)
通過兩個網(wǎng)絡(luò)的的輸出相乘,還可以得到高分辨率圖像的殘差。特征重建網(wǎng)絡(luò)主要包括三個部分。卷積層實(shí)現(xiàn)特征提取,卷積層采樣大感受野來得到更多紋理細(xì)節(jié);多個DenseRes 疊加模塊,級聯(lián)DenseRes可以讓網(wǎng)絡(luò)更深,效果更好;一個亞像素卷積層作為上采樣模塊。注意力生成網(wǎng)絡(luò)部分,用來恢復(fù)小的紋理細(xì)節(jié),如圖像的邊緣與形狀,網(wǎng)絡(luò)可以準(zhǔn)確定位到細(xì)節(jié)特征,然后進(jìn)行相對提升,注意力特征網(wǎng)絡(luò)設(shè)計(jì)受到UNet網(wǎng)絡(luò)架構(gòu)的啟發(fā)。完整的模型結(jié)構(gòu)如下:
一個更簡介的網(wǎng)絡(luò)結(jié)構(gòu)如下:
其中LR表示低分辨率圖像、HR表示高分辨率圖像,Bicubic表示雙立方插值上采樣。
模型文件
OpenVINO提供的模型是在這個模型基礎(chǔ)上進(jìn)行簡化,計(jì)算量更低,速度更快。從上面的模型結(jié)構(gòu)知道,模型有兩個輸入部分,分別是輸入的低分辨率圖像與雙立方上采樣的圖像
·
LR的輸入:[1x3x270x480]雙立方采樣:[1x3x1080x1920]三通道順序是:BGR
模型的輸出
·
輸出層是一個blob對象,格式為[1x3x1080x1920]
程序演示
首先需要加載網(wǎng)絡(luò)模型,獲取可執(zhí)行網(wǎng)絡(luò),然后設(shè)置輸入與輸出的數(shù)據(jù)格式與數(shù)據(jù)精度,這部分的代碼如下:
// 加載檢測模型
CNNNetReader network_reader;
network_reader.ReadNetwork(model_xml);
network_reader.ReadWeights(model_bin);
// 請求網(wǎng)絡(luò)輸入與輸出信息
auto network = network_reader.getNetwork();
InferenceEngine::InputsDataMap input_info(network.getInputsInfo());
InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());
// 設(shè)置輸入格式
for (auto &item : input_info) {
auto input_data = item.second;input_data->setPrecision(Precision::U8);input_data->setLayout(Layout::NCHW);input_data->getPreProcess().setResizeAlgorithm(RESIZE_BILINEAR);input_data->getPreProcess().setColorFormat(ColorFormat::BGR);
}
printf(“get it \n”);
// 設(shè)置輸出格式
for (auto &item : output_info) {
auto output_data = item.second;output_data->setPrecision(Precision::FP32);
}
// 創(chuàng)建可執(zhí)行網(wǎng)絡(luò)對象
auto executable_network = ie.LoadNetwork(network, “CPU”);
// 請求推斷圖
auto infer_request = executable_network.CreateInferRequest();
代碼演示步驟中有兩個輸入,對輸入的設(shè)置可以使用下面的代碼
/** Iterating over all input blobs **/
for (auto & item : input_info) {
auto input_name = item.first;printf("input_name : %s \n", input_name.c_str());/** Getting input blob **/auto input = infer_request.GetBlob(input_name);size_t num_channels = input->getTensorDesc().getDims()[1];size_t h = input->getTensorDesc().getDims()[2];size_t w = input->getTensorDesc().getDims()[3];size_t image_size = h*w;Mat blob_image;resize(src, blob_image, Size(w, h));printf("input channel : %d, height : %d, width : %d \n", num_channels, h, w);// NCHWunsigned char* data = static_cast<unsigned char*>(input->buffer());for (size_t row = 0; row < h; row++) {for (size_t col = 0; col < w; col++) {for (size_t ch = 0; ch < num_channels; ch++) {data[image_size*ch + row*w + col] = blob_image.at<Vec3b>(row, col)[ch];}}}
}
最后執(zhí)行推理,完成對輸出的解析,在解析輸出的時候其實(shí)輸?shù)氖荹NCHW] = [1x3x1080x1920]的浮點(diǎn)數(shù)矩陣,需要轉(zhuǎn)換為Mat類型為[HWC] =[1080x1920x3],采用的是循環(huán)方式,是不是有更好的數(shù)據(jù)處理方法可以轉(zhuǎn)換這個,值得研究。解析部分的代碼如下
// 執(zhí)行預(yù)測
infer_request.Infer();
// 處理輸出結(jié)果
for (auto &item : output_info) {
auto output_name = item.first;// 獲取輸出數(shù)據(jù)auto output = infer_request.GetBlob(output_name);float* buff = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(output->buffer());const int c = output->getTensorDesc().getDims()[1];const int h = output->getTensorDesc().getDims()[2];const int w = output->getTensorDesc().getDims()[3];// 獲得輸出的超像素圖像Mat result = Mat::zeros(Size(w, h), CV_32FC3);for (int ch = 0; ch < c; ch++) {for (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {result.at<Vec3f>(row, col)[ch] = buff[ch*w*h+ row*w + col];}}}printf("channel : %d, height : %d, width : %d \n", c, h, w);normalize(result, result, 0, 255.0, NORM_MINMAX);result.convertTo(result, CV_8U);imshow("High-Resolution Demo", result);imwrite("D:/result.png", result);
}
測試結(jié)果分別如下:(原圖)
超分辨輸出:(1920x1080)
總結(jié)
也許模型被簡化的太厲害了,速度是很快了,單身效果感覺比雙立方好那么一點(diǎn)點(diǎn)而已!
本文提出了一種基于注意的方法來區(qū)分紋理區(qū)域和平滑區(qū)域。當(dāng)高頻細(xì)節(jié)的位置被定位時,注意機(jī)制起到了增強(qiáng)高頻特征和抑制平滑區(qū)域噪聲的特征選擇器的作用。因此,本文的方法避免了盲目地恢復(fù)高頻細(xì)節(jié)。本文將該機(jī)制集成到包括SRResNet、VDSR和DRCN的SISR網(wǎng)絡(luò)中,提高了這些SISR網(wǎng)絡(luò)的性能。因此,本文驗(yàn)證了注意機(jī)制的有效性。對于特征重構(gòu)網(wǎng)絡(luò),本文提出了DenseRes塊,它提供了一種將低層特征和高層特征相結(jié)合的有效方法。通過多個致密塊的級聯(lián),本文的網(wǎng)絡(luò)有一個大的接收場。因此,從LR圖像中獲取有用的大區(qū)域上下文信息,以恢復(fù)HR圖像中的高頻細(xì)節(jié)。與目前最先進(jìn)的方法相比,本文的方法具有最好的性能。今后,本文將探索注意機(jī)制在視頻超分辨率中的應(yīng)用,以產(chǎn)生直觀、定量的高質(zhì)量結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的用OpenCV4实现图像的超分别率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存储计算硬件
- 下一篇: 自动泊车技术短暂困境,前景可期