DEV Community

Supatham-1064
Supatham-1064

Posted on

การใช้ Super resolution upscale image โดยใช้ Bulk

ในปัจจุบัน Super resolution เป็นเทคโนโลยีที่ใช้ในการปรับปรุงความละเอียดและคุณภาพได้ทั้งรูปภาพ หรือคลิปวิดีโอ ไม่ว่าจะเป็นการการปรับปรุงความละเอียดของภาพที่ถ่ายมาจากกล้องที่มีความละเอียดต่ำหรือภาพที่ถูกย่อขนาดลง การปรับปรุงภาพที่เสียหายระหว่างการถ่ายส่งรูป (image transmission)ไม่ว่าจะส่งภาพ Line หรือ Facebook หรือการเก็บรักษาภาพ (image storage) รูปจะไม่ถูกบีบ และคุณภาพของภาพเท่าเดิม

และในวันนี้ จะแนะนำคือ Bulk เป็นเครื่องมือที่ใช้สำหรับการขยายขนาดภาพเป็นจำนวนมากอย่างพร้อมกันหรือทีละหลายภาพพร้อมกัน ใช้เทคโนโลยีการประมวลผลภาพเชิงลึก (deep learning) เพื่อปรับปรุงคุณภาพของภาพให้ดีขึ้นโดยการเพิ่มขนาดของภาพโดยไม่สูญเสียคุณภาพ

เราจะใช้ใน Google Colab : สามารถดู Code ได้ใน
https://github.com/neuralfalcon/Bulk-Image-Upscale

Image description

ก่อนเข้าColab สร้าง folder ใน google drive ชื่อว่า upload เพื่อใส่รูปที่ต้องการ (จะใช้กี่รูปก็ได้ เเต่เวลาอาจนานขึ้นตามจำนวนรูป)
Image description

Mount google colab ไปยัง google drive ของตัวเอง

from google.colab import drive
import os
drive.mount("/content/gdrive", force_remount=True)
drive_input_folder = "/content/gdrive/MyDrive/upload"
if os.path.exists(drive_input_folder):
    print("The folder exists.")
else:
    os.mkdir(drive_input_folder)
    print(f"Creating {drive_input_folder} folder")
Enter fullscreen mode Exit fullscreen mode

ติดตั้ง CodeFormer เเละ โหลด Model จาก Github

from IPython.display import clear_output
%cd /content
!rm -rf /content/CodeFormer
!git clone https://github.com/sczhou/CodeFormer.git
%cd /content/CodeFormer
!pip install -r /content/CodeFormer/requirements.txt

# Install basicsr
!python /content/CodeFormer/basicsr/setup.py develop

# Download the pre-trained model
!python /content/CodeFormer/scripts/download_pretrained_models.py facelib
!python /content/CodeFormer/scripts/download_pretrained_models.py CodeFormer
clear_output()
Enter fullscreen mode Exit fullscreen mode

เตรียมการจัดการโฟลเดอร์ เเละ เเปลงรูป

# Visualization function
import cv2
import matplotlib.pyplot as plt
import os
import shutil
def display(img1, img2):
  fig = plt.figure(figsize=(25, 10))
  ax1 = fig.add_subplot(1, 2, 1)
  plt.title('Input', fontsize=16)
  ax1.axis('off')
  ax2 = fig.add_subplot(1, 2, 2)
  plt.title('CodeFormer', fontsize=16)
  ax2.axis('off')
  ax1.imshow(img1)
  ax2.imshow(img2)
def imread(img_path):
  img = cv2.imread(img_path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  return img

upload_folder = '/content/CodeFormer/inputs/user_upload'
if os.path.isdir(upload_folder):
    shutil.rmtree(upload_folder)
os.mkdir(upload_folder)
if os.path.exists("/content/CodeFormer/results/user_upload_0.7"):
  shutil.rmtree("/content/CodeFormer/results/user_upload_0.7")
clear_output()
Enter fullscreen mode Exit fullscreen mode

อัพโหลด รูป

from PIL import Image
import os
import shutil
from google.colab import drive
import os
from google.colab import files
keep_images = False #@param {type:"boolean"}
upload_folder = '/content/CodeFormer/inputs/user_upload'
%cd /content/CodeFormer

if keep_images:
  pass
else:
  if os.path.isdir(upload_folder):
    shutil.rmtree(upload_folder)
  os.mkdir(upload_folder)


def image_from_drive():
  drive.mount('/content/gdrive',force_remount=True)
  drive_input_folder = "/content/gdrive/MyDrive/upload"
  if os.path.exists(drive_input_folder):
      print("The folder exists.")
  else:
      os.mkdir(drive_input_folder)
  image_extensions = ['.jpg', '.jpeg', '.png']  # Add more extensions if needed
  for filename in os.listdir(drive_input_folder):
    _, extension = os.path.splitext(filename)
    if extension.lower() in image_extensions:
      drive_image_path=os.path.join(drive_input_folder,filename)
      shutil.copy(drive_image_path,upload_folder)
def image_from_device():
  uploaded = files.upload()
  for filename in uploaded.keys():
    dst_path = os.path.join(upload_folder, filename)
    print(f'move {filename} to {dst_path}')
    shutil.move(filename, dst_path)

upload_from = "google drive" #@param ["google drive", "local device"] {allow-input: true}
if upload_from == "google drive":
  image_from_drive()
if upload_from == "local device":
  image_from_device()
clear_output()
file_count = len(os.listdir(upload_folder))
if file_count >= 1:
    print("Run next cell")
else:
    print("Please upload an image.")
Enter fullscreen mode Exit fullscreen mode

สามารถเลือกที่อยู่ของรูปได้

Image description

ขั้นตอนประมวลผล Processing

# Inference the uploaded images

#@markdown `CODEFORMER_FIDELITY`: Balance the quality (lower number) and fidelity (higher number)<br>
# you can add '--bg_upsampler realesrgan' to enhance the background
%cd /content/CodeFormer

CODEFORMER_FIDELITY = 0.7 #@param {type:"slider", min:0, max:1, step:0.01}
#@markdown `BACKGROUND_ENHANCE`: Enhance background image with Real-ESRGAN<br>
BACKGROUND_ENHANCE = True #@param {type:"boolean"}
#@markdown `FACE_UPSAMPLE`: Upsample restored faces for high-resolution AI-created images<br>
FACE_UPSAMPLE = True #@param {type:"boolean"}
if BACKGROUND_ENHANCE:
  if FACE_UPSAMPLE:
    !python inference_codeformer.py -w $CODEFORMER_FIDELITY --input_path inputs/user_upload --bg_upsampler realesrgan --face_upsample
  else:
    !python inference_codeformer.py -w $CODEFORMER_FIDELITY --input_path inputs/user_upload --bg_upsampler realesrgan
else:
  !python inference_codeformer.py -w $CODEFORMER_FIDELITY --input_path inputs/user_upload
clear_output()
print(f"All results are saved in /content/CodeFormer/results/user_upload_{CODEFORMER_FIDELITY}")
Enter fullscreen mode Exit fullscreen mode

สามารถปรับการตั้งค่าได้ ดังนี้

Image description
โหลดรูปที่เสร็จเเล้ว

save_a_copy_in_google_drive = True #@param {type:"boolean"}
if save_a_copy_in_google_drive:
  drive.mount('/content/gdrive',force_remount=True)
  drive_save_path = '/content/gdrive/MyDrive/CodeFormer_Bulk_Upscale'
  if os.path.exists(drive_save_path):
    pass
  else:
    os.mkdir(drive_save_path)
  clear_output()
  print(f"All images/zip file save at : {drive_save_path}")

import os
import uuid
from google.colab import files
import shutil
def download_single_images():
  global CODEFORMER_FIDELITY
  download_folder = '/content/download'
  if os.path.exists(download_folder):
      os.system(f'rm -rf {download_folder}')
  os.makedirs(download_folder)
  folder_path = f"/content/CodeFormer/results/user_upload_
  {CODEFORMER_FIDELITY}/final_results"
  for filename in os.listdir(folder_path):
      original_path = os.path.join(folder_path, filename)
      name, extension = os.path.splitext(filename)
      random_string = str(uuid.uuid4())[:8]
      new_filename = f"{name}_{random_string}{extension}"
      download_path = f"/content/download/{new_filename}"
      if save_a_copy_in_google_drive:
        drive_path=f"{drive_save_path}/{new_filename}"
        shutil.copy(original_path, drive_path)
      shutil.copy(original_path, download_path)

      files.download(download_path)
def download_zip():
  global CODEFORMER_FIDELITY
  random_string = str(uuid.uuid4())[:5]
  zip_file_name=f"results_{random_string}.zip"
  var1=os.system(f'zip -r {zip_file_name} results/user_upload_{CODEFORMER_FIDELITY}/final_results')
  if save_a_copy_in_google_drive:
    sour=f"/content/CodeFormer/{zip_file_name}"
    dest=f"{drive_save_path}/{zip_file_name}"
    shutil.copy(sour, dest)

  files.download(zip_file_name)



folder_path = f"/content/CodeFormer/results/user_upload_{CODEFORMER_FIDELITY}/final_results"
image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp']  # Add more extensions if needed
contains_image = False
for filename in os.listdir(folder_path):
    _, extension = os.path.splitext(filename)
    if extension.lower() in image_extensions:
        contains_image = True
        break
download_format = "single file" #@param ["single file", "zip"] {allow-input: true}
if contains_image:
  if download_format == "single file":
    download_single_images()
  if download_format == "zip":
    download_zip()
else:
  print(f"The folder '{folder_path}' does not contain any image files.")
Enter fullscreen mode Exit fullscreen mode

สามารถปรับเปลี่ยนไฟล์ที่จะโหลดได้

Image description

ผลลัพท์เปรียบเทียบกัน

import os
import glob

input_folder = 'inputs/user_upload'
result_folder = f'results/user_upload_{CODEFORMER_FIDELITY}/final_results'
input_list = sorted(glob.glob(os.path.join(input_folder, '*')))
for input_path in input_list:
  img_input = imread(input_path)
  basename = os.path.splitext(os.path.basename(input_path))[0]
  output_path = os.path.join(result_folder, basename+'.png')
  img_output = imread(output_path)
  display(img_input, img_output)
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Image description

Image description

สรุปผล
จากผลลัพธ์ที่ได้ Bulk Upscale Images ช่วยในการเพิ่มรายละเอียดได้เป็นอย่างดี และยังมีจุดเด่นที่สามารถนำรูปมาใส่ได้หลายๆภาพ แต่ บางรูปที่ภาพอาจจะแตกเกินไป ก็ยังปรับปรุงให้กลับมาได้เฉพาะส่วน ส่วนอื่นๆไม่สามารถนำกลับมาได้ ดังนั้นถ้าจะใช้งานก็ควรจะเป็น ไม่แตกจนเกินไป เเละจะใช้ได้ดีกับรูปหน้าคน

References

  1. https://github.com/neuralfalcon/Bulk-Image-Upscale/tree/main :Bulk-Image-Upscale
  2. https://www.youtube.com/watch?v=r8o2XmOzoOs :Free BULK Ai Image Upscaler

Top comments (0)