<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于DnCNN的圖像和視頻去噪

          共 6431字,需瀏覽 13分鐘

           ·

          2022-04-12 22:19

          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達


          簡介


          隨著數(shù)字圖像數(shù)量的增加,對高質(zhì)量的圖像需求也在增加。然而,現(xiàn)代相機拍攝的圖像會因噪聲而退化。圖像中的噪聲是圖像中顏色信息的失真,噪聲是指數(shù)字失真。當(dāng)在夜間拍攝時,圖像變得更嘈雜。該案例研究試圖建立一個預(yù)測模型,該模型將帶噪圖像作為輸入并輸出去噪后的圖像。


          深度學(xué)習(xí)的使用


          這個問題是基于計算機視覺的,CNN等深度學(xué)習(xí)技術(shù)的進步已經(jīng)能夠在圖像去噪方面提供最先進的性能,用于執(zhí)行圖像去噪的模型是DnCNN(去噪卷積神經(jīng)網(wǎng)絡(luò))。


          數(shù)據(jù)集


          BSD300和BSD500數(shù)據(jù)集均用作訓(xùn)練數(shù)據(jù),BSD68用于驗證數(shù)據(jù)。由于數(shù)據(jù)有限,每個圖像使用了4次,即縮放到[1.0,0.7,0.8,0.7]。


          每個縮放圖像被分割成50x50的塊,步幅為20。每個貼片都添加了一個標(biāo)準(zhǔn)偏差在[1,55]之間的高斯噪聲。數(shù)據(jù)生成代碼如下所示:

          #Fix Noisestddevs = np.random.uniform(1, 55.0, 125000)[:, np.newaxis, np.newaxis, np.newaxis]noise = np.random.normal(loc = 0, scale=stddevs, size=(125000, 50, 50, 3)).astype(np.float16)
          def get_dataset(img_path):def image_generator(): patch_size = 50 stride = 20 index = 0for scale in [1, 0.9, 0.8, 0.7]:for path in img_path: true_img = cv2.imread(path)for i in range(0, true_img.shape[0] - patch_size + 1, stride):for j in range(0, true_img.shape[1] - patch_size + 1, stride): Y = true_img[i:i+patch_size, j:j+patch_size] gauss_noise = noise[index].astype(np.float32) X = np.clip(Y + gauss_noise, 0, 255.0) index = (index + 1)%125000yield (X/255.0,),Y/255.0return tf.data.Dataset.from_generator(image_generator, output_signature=((tf.TensorSpec(shape=(None, None, 3)),), (tf.TensorSpec(shape=(None, None, 3)))))

          DnCNN體系結(jié)構(gòu)


          DnCNN中有三種類型的層:

          1. Conv+ReLU:過濾器大小為3,過濾器數(shù)量為64,跨步為1,使用零填充保持卷積后的輸出形狀,使用ReLU作為激活函數(shù)。輸出為形狀(批量大小,50、50、64)

          2. Conv+批量歸一化+ReLU:過濾器大小為3,過濾器數(shù)量為64,步長為1,使用零填充保持卷積后的輸出形狀,使用批量歸一化層更好地收斂,ReLU作為激活函數(shù)。輸出為形狀(批次大小,50、50、64)。

          3. Conv:濾鏡大小為3,跨步為1,濾鏡數(shù)量為c(彩色圖像為3個,灰度圖像為1個),使用零填充在卷積后保持輸出形狀。輸出形狀為(批次大小,50,50,c)。

          DnCNN模型的輸出為殘差圖像。因此,原始圖像=噪聲圖像-殘差圖像。


          在DnCNN中,在每層卷積之前填充零,以確保中間層的每個特征貼圖與輸入圖像具有相同的大小。根據(jù)本文,簡單的零填充策略不會導(dǎo)致任何邊界偽影。

          本文建議深度為17,但本案例研究適用于深度為12和深度為8。


          評價指標(biāo)


          評估指標(biāo)是PSNR(峰值信噪比)分數(shù)。它只是一個數(shù)值,表示構(gòu)造的去噪圖像與原始圖像相比有多好。


          模型訓(xùn)練

          def get_model(depth, channels):noise_inp = tf.keras.layers.Input(shape = (50, 50, channels), dtype=tf.float32)init = 'Orthogonal'
          y = tf.keras.layers.Conv2D(filters = 64, kernel_size = 3, padding = 'same', kernel_initializer=init, use_bias=True)(noise_inp)y = tf.keras.layers.ReLU()(y)for i in range(1, depth-1):y = tf.keras.layers.Conv2D(filters = 64, kernel_size = 3, padding = 'same', kernel_initializer=init, use_bias=True)(y)bn = tf.keras.layers.BatchNormalization(axis=-1, epsilon=1e-5, momentum=0.9)y = bn(y)y = tf.keras.layers.ReLU()(y)residual = tf.keras.layers.Conv2D(filters = channels, kernel_size = 3, padding = 'same', kernel_initializer=init, use_bias=True)(y)
          true_img = tf.keras.layers.Subtract()([noise_inp, residual])model = tf.keras.Model(inputs = [noise_inp], outputs=[true_img])model.compile(optimizer=tf.keras.optimizers.Adam(), loss='mse')
          return model
          def lr_decay(epoch):lr = 1e-3if epoch+1 > 20:lr/=30elif epoch+1 > 10:lr /= 10return lrmodel = get_model(8, 3)lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_decay)dataset = get_dataset(bsd500).shuffle(1000).batch(128).prefetch(tf.data.experimental.AUTOTUNE).repeat(None)model.compile(optimizer=tf.keras.optimizers.Adam(), loss='mse')history = model.fit(x = dataset, steps_per_epoch=2000, epochs=30, shuffle=True,verbose=1,callbacks=[lr_callback])

          批量大小=128,每個歷元的步數(shù)=2000,歷元數(shù)=30。


          結(jié)果





          BSD68數(shù)據(jù)集上的峰值信噪比對于標(biāo)準(zhǔn)差25為~28,對于標(biāo)準(zhǔn)差50為~25。

          如果深度=12,則BSD68數(shù)據(jù)集上的峰值信噪比對于標(biāo)準(zhǔn)差25為28.30,對于標(biāo)準(zhǔn)差50為26.13。


          應(yīng)用:視頻去噪


          我們可以將這個想法擴展到視頻幀,每個幀作為輸入傳遞給DnCNN模型,生成的幀傳遞給視頻編寫器。

          import sysimport tensorflow as tfimport numpy as npimport cv2import timeimport matplotlib.pyplot as pltimport osimport globimport seaborn as snbimport refrom skvideo.io import FFmpegWriter

          class Denoiser:def __init__(self, merge_outputs): self.model = tf.keras.models.load_model('./model') self.merge_outputs = merge_outputs
          def get_patches(self, frame): patches = np.zeros(shape=(self.batch_size, 50, 50, 3)) counter = 0for i in range(0, self.SCALE_H, 50):for j in range(0, self.SCALE_W, 50): patches[counter] = frame[i:i+50, j:j+50] counter+=1return patches.astype(np.float32)
          def reconstruct_from_patches(self, patches, h, w, true_h, true_w, patch_size): img = np.zeros((h,w, patches[0].shape[-1])) counter = 0for i in range(0,h-patch_size+1,patch_size):for j in range(0,w-patch_size+1,patch_size): img[i:i+patch_size, j:j+patch_size, :] = patches[counter] counter+=1return cv2.resize(img, (true_w, true_h), cv2.INTER_CUBIC)
          def denoise_video(self, PATH): self.cap = cv2.VideoCapture(PATH) self.H, self.W = int(self.cap.get(4)), int(self.cap.get(3)) self.SCALE_H, self.SCALE_W = (self.H//50 * 50), (self.W//50 * 50) self.batch_size = ((self.SCALE_H * self.SCALE_W) // (50**2))
          outputFile = './denoise.mp4' writer = FFmpegWriter( outputFile, outputdict={'-vcodec':'libx264','-crf':'0','-preset':'veryslow' } )
          while True: success, img = self.cap.read()if not success:break resize_img = cv2.resize(img, (self.SCALE_W, self.SCALE_H), cv2.INTER_CUBIC).astype(np.float32)
          noise_img = resize_img/255.0 patches = self.get_patches(noise_img).astype(np.float32) predictions = np.clip(self.model(patches), 0, 1) pred_img = (self.reconstruct_from_patches(predictions, self.SCALE_H, self.SCALE_W, self.H, self.W, 50)*255.0)if self.merge_outputs: merge = np.vstack([img[:self.H//2,:,:], pred_img[:self.H//2,:,:]]) writer.writeFrame(merge[:,:,::-1])else: writer.writeFrame(pred_img[:,:,::-1]) writer.close()
          PATH = sys.argv[1]print(f"Path is : {PATH}")denoise = Denoiser(merge_outputs = True)x = denoise.denoise_video(PATH)

          參考

          1. https://arxiv.org/pdf/1608.03981.pdf

          2. https://www.appliedaicourse.com/


          GITHUB代碼鏈接:https://github.com/saproovarun/DnCNN-Keras


          小白團隊出品:零基礎(chǔ)精通語義分割↓

          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲无码中文字幕在线观看 | 超碰碰人人 | 欧美亚洲成人网站 | 国产美女丝袜足交视频 | 中文无码在线观看中文字幕av中文 |