...

How to Improve Image and Video Quality | Super Resolution

Upscale your Images and videos using SUPER RESOLUTION

Welcome to our tutorial on super-resolution CodeFormer for images and videos, In this step-by-step guide,

You’ll learn how to improve and enhance images and videos using super resolution models. We will also add a bonus feature of coloring a B&W images 

What You’ll Learn:

The tutorial is divided into four parts:

Part 1: Setting up the Environment.

Part 2: Image Super-Resolution

Part 3: Video Super-Resolution

Part 4: Bonus – Colorizing Old and Gray Images

Check out our tutorial here  : https://www.youtube.com/watch?v=sjhZjsvfN_o

You can find more tutorials, and join my newsletter here : https://eranfeit.net/blog

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 1 : Super Resolution Installation

# Create a Conda enviroment   conda create --name Codeformer3 python=3.11 conda activate Codeformer3    # Clone the CodeFormer   git clone https://github.com/sczhou/CodeFormer.git cd CodeFormer  # install Pytorch 2.5.0 #  # Find your cuda version : ( I am using Cuda 12.4) nvcc --version  # Look for the command of Pytorch for your Cuda version . # for Cuda 12.4 : conda install pytorch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 pytorch-cuda=12.4 -c pytorch -c nvidia 

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 2 : More Python libraries Installations

pip install addict==2.4.0 pip install future==1.0.0 pip install lmdb==1.6.2 pip install opencv-python==4.11.0.86 pip install requests==2.32.3 pip install scikit-image==0.25.2 pip install tb-nightly==2.20.0a20250602 pip install tqdm==4.67.1 pip install yapf==0.43.0 pip install lpips==0.1.4

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 3: Install CodeFormer

python basicsr/setup.py develop

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 4 : Install dlib

conda install -c conda-forge dlib

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 5 : Download pre-trained models

python scripts/download_pretrained_models.py facelib python scripts/download_pretrained_models.py dlib  python scripts/download_pretrained_models.py CodeFormer

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


part 6: Update the Python script

copy the file “crop_align_face2.py” to scripts folder

""" brief: face alignment with FFHQ method (https://github.com/NVlabs/ffhq-dataset) author: lzhbrian (https://lzhbrian.me) link: https://gist.github.com/lzhbrian/bde87ab23b499dd02ba4f588258f57d5 date: 2020.1.5 note: code is heavily borrowed from     https://github.com/NVlabs/ffhq-dataset     http://dlib.net/face_landmark_detection.py.html requirements:     conda install Pillow numpy scipy     conda install -c conda-forge dlib     # download face landmark model from:     # http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 """  import os import glob import numpy as np import PIL import PIL.Image import scipy import scipy.ndimage import argparse from basicsr.utils.download_util import load_file_from_url  try:     import dlib except ImportError:     print('Please install dlib by running:' 'conda install -c conda-forge dlib')  # download model from: http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 shape_predictor_url = 'https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/shape_predictor_68_face_landmarks-fbdc2cb8.dat' ckpt_path = load_file_from_url(url=shape_predictor_url,                                      model_dir='weights/dlib', progress=True, file_name=None) predictor = dlib.shape_predictor('weights/dlib/shape_predictor_68_face_landmarks-fbdc2cb8.dat')   def get_landmark(filepath, only_keep_largest=True):     """get landmark with dlib     :return: np.array shape=(68, 2)     """     detector = dlib.get_frontal_face_detector()      img = dlib.load_rgb_image(filepath)     dets = detector(img, 1)      # Shangchen modified     print("\tNumber of faces detected: {}".format(len(dets)))     if only_keep_largest:         print('\tOnly keep the largest.')         face_areas = []         for k, d in enumerate(dets):             face_area = (d.right() - d.left()) * (d.bottom() - d.top())             face_areas.append(face_area)          largest_idx = face_areas.index(max(face_areas))         d = dets[largest_idx]         shape = predictor(img, d)         # print("Part 0: {}, Part 1: {} ...".format(         #     shape.part(0), shape.part(1)))     else:         for k, d in enumerate(dets):             # print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(             #     k, d.left(), d.top(), d.right(), d.bottom()))             # Get the landmarks/parts for the face in box d.             shape = predictor(img, d)             # print("Part 0: {}, Part 1: {} ...".format(             #     shape.part(0), shape.part(1)))      t = list(shape.parts())     a = []     for tt in t:         a.append([tt.x, tt.y])     lm = np.array(a)     # lm is a shape=(68,2) np.array     return lm  def align_face(filepath, out_path):     """     :param filepath: str     :return: PIL Image     """     try:         lm = get_landmark(filepath)     except:         print('No landmark ...')         return      lm_chin = lm[0:17]  # left-right     lm_eyebrow_left = lm[17:22]  # left-right     lm_eyebrow_right = lm[22:27]  # left-right     lm_nose = lm[27:31]  # top-down     lm_nostrils = lm[31:36]  # top-down     lm_eye_left = lm[36:42]  # left-clockwise     lm_eye_right = lm[42:48]  # left-clockwise     lm_mouth_outer = lm[48:60]  # left-clockwise     lm_mouth_inner = lm[60:68]  # left-clockwise      # Calculate auxiliary vectors.     eye_left = np.mean(lm_eye_left, axis=0)     eye_right = np.mean(lm_eye_right, axis=0)     eye_avg = (eye_left + eye_right) * 0.5     eye_to_eye = eye_right - eye_left     mouth_left = lm_mouth_outer[0]     mouth_right = lm_mouth_outer[6]     mouth_avg = (mouth_left + mouth_right) * 0.5     eye_to_mouth = mouth_avg - eye_avg      # Choose oriented crop rectangle.     x = eye_to_eye - np.flipud(eye_to_mouth) * [-1, 1]     x /= np.hypot(*x)     x *= max(np.hypot(*eye_to_eye) * 2.0, np.hypot(*eye_to_mouth) * 1.8)     y = np.flipud(x) * [-1, 1]     c = eye_avg + eye_to_mouth * 0.1     quad = np.stack([c - x - y, c - x + y, c + x + y, c + x - y])     qsize = np.hypot(*x) * 2      # read image     img = PIL.Image.open(filepath)      output_size = 512     transform_size = 4096     enable_padding = False      # Shrink.     shrink = int(np.floor(qsize / output_size * 0.5))     if shrink > 1:         rsize = (int(np.rint(float(img.size[0]) / shrink)),                  int(np.rint(float(img.size[1]) / shrink)))         img = img.resize(rsize, PIL.Image.ANTIALIAS)         quad /= shrink         qsize /= shrink       # Crop.     border = max(int(np.rint(qsize * 0.1)), 3)     crop = (int(np.floor(min(quad[:, 0]))), int(np.floor(min(quad[:, 1]))),             int(np.ceil(max(quad[:, 0]))), int(np.ceil(max(quad[:, 1]))))     crop = (max(crop[0] - border, 0), max(crop[1] - border, 0),             min(crop[2] + border,                 img.size[0]), min(crop[3] + border, img.size[1]))     if crop[2] - crop[0] < img.size[0] or crop[3] - crop[1] < img.size[1]:         img = img.crop(crop)         quad -= crop[0:2]      # Pad.     pad = (int(np.floor(min(quad[:, 0]))), int(np.floor(min(quad[:, 1]))),            int(np.ceil(max(quad[:, 0]))), int(np.ceil(max(quad[:, 1]))))     pad = (max(-pad[0] + border,                0), max(-pad[1] + border,                        0), max(pad[2] - img.size[0] + border,                                0), max(pad[3] - img.size[1] + border, 0))     if enable_padding and max(pad) > border - 4:         pad = np.maximum(pad, int(np.rint(qsize * 0.3)))         img = np.pad(             np.float32(img), ((pad[1], pad[3]), (pad[0], pad[2]), (0, 0)),             'reflect')         h, w, _ = img.shape         y, x, _ = np.ogrid[:h, :w, :1]         mask = np.maximum(             1.0 -             np.minimum(np.float32(x) / pad[0],                        np.float32(w - 1 - x) / pad[2]), 1.0 -             np.minimum(np.float32(y) / pad[1],                        np.float32(h - 1 - y) / pad[3]))         blur = qsize * 0.02         img += (scipy.ndimage.gaussian_filter(img, [blur, blur, 0]) -                 img) * np.clip(mask * 3.0 + 1.0, 0.0, 1.0)         img += (np.median(img, axis=(0, 1)) - img) * np.clip(mask, 0.0, 1.0)         img = PIL.Image.fromarray(             np.uint8(np.clip(np.rint(img), 0, 255)), 'RGB')         quad += pad[:2]      img = img.transform((transform_size, transform_size), PIL.Image.QUAD,                         (quad + 0.5).flatten(), PIL.Image.BILINEAR)      if output_size < transform_size:         img = img.resize((output_size, output_size), PIL.Image.ANTIALIAS)      # Save aligned image.     # print('saveing: ', out_path)     img.save(out_path)      return img, np.max(quad[:, 0]) - np.min(quad[:, 0])   if __name__ == '__main__':     parser = argparse.ArgumentParser()     parser.add_argument('-i', '--in_dir', type=str, default='./inputs/whole_imgs')     parser.add_argument('-o', '--out_dir', type=str, default='./inputs/cropped_faces')     args = parser.parse_args()      if args.out_dir.endswith('/'):  # solve when path ends with /         args.out_dir = args.out_dir[:-1]     dir_name = os.path.abspath(args.out_dir)     os.makedirs(dir_name, exist_ok=True)      img_list = sorted(glob.glob(os.path.join(args.in_dir, '*.[jpJP][pnPN]*[gG]')))     test_img_num = len(img_list)      for i, in_path in enumerate(img_list):         img_name = os.path.basename(in_path)         print(f'[{i+1}/{test_img_num}] Processing: {img_name}')         out_path = os.path.join(args.out_dir, img_name)                 out_path = out_path.replace('.jpg', '.png')         size_ = align_face(in_path, out_path)

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 7 : Your test images

These are my test images

1*rb0oAJ0XWKW340Z5j prHg
1*qXOun14Hr18Z PZGVCgJvQ

You can download the images here : https://ko-fi.com/s/0cbc853606


Part 8 : Crop the face images

Use this command :

python scripts/crop_align_face2.py -i [input folder] -o [output folder]

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606

Here is a sample command :

python scripts/crop_align_face2.py -i inputs/whole_imgs -o inputs/cropped_faces

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606

Result :

[1/9] Processing: 00.jpg         Number of faces detected: 4         Only keep the largest. [2/9] Processing: 01.jpg         Number of faces detected: 4         Only keep the largest. [3/9] Processing: 02.png         Number of faces detected: 4         Only keep the largest. [4/9] Processing: 03.jpg         Number of faces detected: 1         Only keep the largest. [5/9] Processing: 04.jpg         Number of faces detected: 1         Only keep the largest. [6/9] Processing: 05.jpg         Number of faces detected: 1         Only keep the largest. [7/9] Processing: 06.png         Number of faces detected: 2         Only keep the largest. [8/9] Processing: 2017-11-03 12.39.38.jpg         Number of faces detected: 2         Only keep the largest. [9/9] Processing: low_res_image.jpg         Number of faces detected: 1         Only keep the largest.

Part 9: 🧑🏻 Face Restoration (cropped and aligned face)

# For cropped and aligned faces (512x512) python inference_codeformer.py -w 0.5 --has_aligned --input_path [image folder]|[image path]  🖼️ Whole Image Enhancement # For whole image # Add '--bg_upsampler realesrgan' to enhance the background regions with Real-ESRGAN # Add '--face_upsample' to further upsample restorated face with Real-ESRGAN # Add -w --fidelity_weight  # sample :  python inference_codeformer.py -w 0.7 --input_path inputs/whole_imgs  # run this command for upscale images :  ##################################### python inference_codeformer.py --input_path inputs/whole_imgs --output_path results -w 0.7 --bg_upsampler realesrgan --face_upsample

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606

Here is the amazing result :

1*nwDtqgLT2rNh6fE3GefWdQ

Part 10 : 🎬 Video Enhancement

1*19F3dwLNJYeghNm494h2jg

You can download the retro video from here : https://ko-fi.com/s/0cbc853606

# please install ffmpeg first :  conda install -c conda-forge ffmpeg pip install ffmpeg  # Copy the Startrek.avi to a new subfolder named "video" into the "codeformer" main folder  # Video file should end with '.mp4'|'.mov'|'.avi'  python inference_codeformer.py --bg_upsampler realesrgan --face_upsample -w 1.0 --input_path [video path]  # sample command python inference_codeformer.py --bg_upsampler realesrgan --face_upsample -w 1.0 --input_path video/Startrek.avi

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606


Part 11: 🌈 Face Colorization (cropped and aligned face)

3 steps :   #step 1 :crop your gray image  copy your image to whole_imgs folder  # run the crop command : !!!! python scripts/crop_align_face.py -i [input folder] -o [output folder]  python scripts/crop_align_face.py -i inputs/whole_imgs   # it will generate a faces images in the "inputs/cropped"    Option 2 : If you run with no paramters the whole_imgs folder will be the input and the cropped folder will be the output python scripts/crop_align_face.py  # step 2 : copy the face gray image to "inputs\gray_faces" folder    # Step 3 : run the color process For cropped and aligned faces (512x512) # Colorize black and white or faded photo  python inference_colorization.py --input_path [image folder]|[image path]  # if it is in the defalut gray folder , You can run : python inference_colorization.py  Now , go to "results\gray_faces" folder and you can find your color image

You can download the Instructions steps for this video here : https://ko-fi.com/s/0cbc853606

1*u8 ftlDdcqoH7XMPXlV ZQ
1*HY53Z8sZeAm1Z7bu574kRw
1*9sg9LRvaN9m8MAqOfv8e3Q

Connect :

☕ Buy me a coffee — https://ko-fi.com/eranfeit

🖥️ Email : feitgemel@gmail.com

🌐 https://eranfeit.net

🤝 Fiverr : https://www.fiverr.com/s/mB3Pbb

Enjoy,

Eran

error: Content is protected !!
Eran Feit