การทำ Deblur รูปภาพโดยใช้ Super resolution Model NAFNET
Published: 2024-04-15 20:05:55

ในยุคที่เราต้องรวดเร็วและใช้เวลาให้คุ้มค่าการจะต้องมาถ่ายรูปใหม่ทุกครั้งที่ถ่ายพลาด ถ่ายเบลอ ซึ่งสิ่งเหล่านี้นั้นจะทำให้เสียเวลาไปเยอะมากและไม่ใช่ทุกครั้งที่ถ่ายใหม่จะดีไปกว่าเก่าจากเหตุผลต่างๆเช่น การถูกรบกวนโดยคนรอบข้าง เวลาที่น้อยลงและความกดดันของคนที่ขอให้ถ่ายใหม่และปัจจุบันก็มีวิธีการแก้ได้หลากหลายวิธีซึ่งวิธีที่จะนำเสนอในวันนี้ก็คือการทำ Deblur รูปภาพซึ่งเป็นหนึ่งในเทคนิคของ Super resolution โดยใช้ Model NAFNET

ซึ่ง Model NAFNET นั้นทำได้มากกว่า Deblur การทำ Denoise ก็สามารถทำได้ซึ่งวันนี้เราจะมาลองทำ Deblur กันก่อนโดยจะใช้ Google Colab ในการรันโคด

**ขั้นตอนที่ 1 Import เข้าไปใน Google Drive**

```
from google.colab import drive
drive.mount('/gdrive')
```
ซึ่งก่อนที่จะทำขั้นตอนต่อไปเราต้องเช็คให้ดีว่าเรา mount drive แล้วหรือยัง

ในส่วนของภาพนี้จะเห็นได้ว่ายังไม่ได้ทำการ mount drive ดังนั้นเราจึงต้องกดไปที่ icon ตามรูปก่อน

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g9n5t27zs0evrrjjvvby.png)

ซึ่งหลังจากกดหรือ mount drive แล้วจะเป็นตามรูปด้านล่าง

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q8y1o5ikc7wduzn2hi9a.png)

**ขั้นตอนที่ 2 ทำการเข้าไปใน Folder ของเราใน Google Drive**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ziqbamjhenzduhejb55g.png)
```
%cd drive/MyDrive/AIBlog/
```

**ขั้นตอนที่ 3 ทำการ Clone ข้อมูลของ Model NAFNET จาก github**

```
!git clone https://github.com/megvii-research/NAFNet.git
%cd NAFNet/
```
หลังจากรันโคดแล้วจะขึ้นตามรูปด้านล่าง
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0k3zdlpstqowvpauunt.png)
และมี Folder ของ NAFNET เพิ่มขึ้นมาตามนี้

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dovf6f22e0flnztvljju.png)

**ขั้นตอนที่ 4 ติดตั้ง libraly ตามที่อยู่ในไฟล์ requirements.txt**
ซึ่งในไฟล์ requirements.txt จะประกอบไปด้วย 
addict
future
lmdb
numpy
opencv-python
Pillow
pyyaml
requests
scikit-image
scipy
tb-nightly
tqdm
yapf

```
!pip install -r requirements.txt
```
หลังจากรันแล้วจะเริ่มติดตั้ง library ตามรูปด้านล่าง

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ps1u7k2760qjiyhxdstv.png)
**ขั้นตอนที่ 5 รันไฟล์ python ที่ชื่อ setup.py โดยไม่ใช้ cuda**

```
!python setup.py develop --no_cuda_ext
```

**ขั้นตอนที่ 6 โหลดข้อมูลที่ทำการเทรนมาแล้ว**
ซึ่งส่วนนี้เป็นส่วนที่สำคัญเพราะว่าถ้าเราไม่มีข้อมูลที่ทำการเทนรมาก่อนรูปภาพที่เราจะได้แทบจะไม่ความแตกต่างจากเดิมเลยหรือถ้าต้องการเทรนข้อมูลรูปภาพเองก็อาจจะใช้เวลาที่นานมาก

ดังนั้นในส่วนนี้เราจะโหลดข้อมูล Pre-trained Models มาจากเจ้าของ NAFNET ที่เทรนให้แล้วมาก่อนโดยใช้ gdown หรือโหลดจาก Google Drive นั่นเอง
```
import gdown
gdown.download('https://drive.google.com/uc?id=14D4V4raNYIOhETfcuuLI3bGLB-OYIv6X', "./experiments/pretrained_models/", quiet=False)
```
หลังจากรันโคดแล้วจะทำการโหลดตามรูปด้านล่าง

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b08sgxevdv18jsuebvhx.png)
และมี File ชื่อ NAFNet-REDS-width64.pth อยู่ใน Folder NAFNET/experiments/pretrained_models/ ตามรูป

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzeh4ordbmovyz70fz1l.png)


**ขั้นตอนที่ 7 นำรูปที่เราต้องการจะทำ Deblur มาลดเบลอ**
โดยรูปที่เราต้องการจะนำมาใส่จะอยู่ใน path ของ input_path
--input_path ./demo/test1.jpg 

และรูปที่ลบเบลอแล้วจะมาอยู่ใน path ของ output_path 
--output_path ./demo/deblur_test1.png

```
!python basicsr/demo.py -opt options/test/REDS/NAFNet-width64.yml --input_path ./demo/test1.jpg --output_path ./demo/deblur_test1.png
```
หลังจากรันแล้วรูปที่ได้จะอยู่ใน Folder demo ตามรูป

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vyjk2mfqopd8om2h3kl.png)

**ขั้นตอนที่ 8 แสดงผลลัพธ์ของรูปออกมาเปรียบเทียบกัน**

```
import cv2
import matplotlib.pyplot as plt
blurImg = cv2.imread('./demo/test1.jpg')
deblurImg = cv2.imread('./demo/deblur_test1.png')

blurImg = cv2.cvtColor(blurImg, cv2.COLOR_BGR2RGB)
deblurImg = cv2.cvtColor(deblurImg, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(blurImg)
plt.title('Blur Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(deblurImg)
plt.title('Deblur Image')
plt.axis('off')
```
ผลลัพธ์ของโคดที่นำรูปมาเปรียบเทียบกัน

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5bfuigf2i65lycin5pi.png)

**สรุป**
การจะทำการลบเบลอได้นั้นไม่ใช่แค่ว่าเรามีโคดอย่างเดียวแล้วจะทำได้เลยเราต้องมีข้อมูลที่ทำการเทรนมาแล้วด้วยซึ่งใน Model NAFNET เองก็มีชุดข้อมูลที่ต่างกันมากมายซึ่งเหมาะกับสถานการณ์ที่แตกต่างกันเพื่อให้รูปที่ออกมามีผลลัพธ์ที่ดีมากขึ้นและยิ่งเราเทรนข้อมูลมากเท่าไหร่ภาพที่ได้ก็จะชัดมากขึ้นเท่านั้นและเมื่อนำประยุกต์ใช้กับกล้องในปัจจุบันเราก็จะไม่ต้องมาคอยถ่ายรูปใหม่ให้เสียเวลาอีกต่อไป

**Reference**
https://github.com/megvii-research/NAFNet