Spaces:
				
			
			
	
			
			
		Runtime error
		
	
	
	
			
			
	
	
	
	
		
		
		Runtime error
		
	Update app.py
Browse files
    	
        app.py
    CHANGED
    
    | @@ -1,150 +1,79 @@ | |
| 1 | 
             
            import os
         | 
| 2 | 
            -
             | 
| 3 | 
             
            import cv2
         | 
| 4 | 
            -
            import gradio as gr
         | 
| 5 | 
             
            import torch
         | 
|  | |
| 6 | 
             
            from basicsr.archs.srvgg_arch import SRVGGNetCompact
         | 
| 7 | 
             
            from gfpgan.utils import GFPGANer
         | 
| 8 | 
             
            from realesrgan.utils import RealESRGANer
         | 
| 9 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
            if not os.path.exists('realesr-general-x4v3.pth'):
         | 
| 13 | 
            -
                os.system("wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P .")
         | 
| 14 | 
            -
            if not os.path.exists('GFPGANv1.2.pth'):
         | 
| 15 | 
            -
                os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.2.pth -P .")
         | 
| 16 | 
            -
            if not os.path.exists('GFPGANv1.3.pth'):
         | 
| 17 | 
            -
                os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P .")
         | 
| 18 | 
            -
            if not os.path.exists('GFPGANv1.4.pth'):
         | 
| 19 | 
            -
                os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P .")
         | 
| 20 | 
            -
            if not os.path.exists('RestoreFormer.pth'):
         | 
| 21 | 
            -
                os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth -P .")
         | 
| 22 | 
            -
            if not os.path.exists('CodeFormer.pth'):
         | 
| 23 | 
            -
                os.system("wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/CodeFormer.pth -P .")
         | 
| 24 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                'lincoln.jpg')
         | 
| 28 | 
            -
            torch.hub.download_url_to_file(
         | 
| 29 | 
            -
                'https://user-images.githubusercontent.com/17445847/187400315-87a90ac9-d231-45d6-b377-38702bd1838f.jpg',
         | 
| 30 | 
            -
                'AI-generate.jpg')
         | 
| 31 | 
            -
            torch.hub.download_url_to_file(
         | 
| 32 | 
            -
                'https://user-images.githubusercontent.com/17445847/187400981-8a58f7a4-ef61-42d9-af80-bc6234cef860.jpg',
         | 
| 33 | 
            -
                'Blake_Lively.jpg')
         | 
| 34 | 
            -
            torch.hub.download_url_to_file(
         | 
| 35 | 
            -
                'https://user-images.githubusercontent.com/17445847/187401133-8a3bf269-5b4d-4432-b2f0-6d26ee1d3307.png',
         | 
| 36 | 
            -
                '10045.png')
         | 
| 37 |  | 
| 38 | 
            -
            #  | 
| 39 | 
             
            model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
         | 
| 40 | 
             
            model_path = 'realesr-general-x4v3.pth'
         | 
| 41 | 
            -
            half =  | 
| 42 | 
             
            upsampler = RealESRGANer(scale=4, model_path=model_path, model=model, tile=0, tile_pad=10, pre_pad=0, half=half)
         | 
| 43 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
                 | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
                 | 
| 54 | 
            -
                     | 
| 55 | 
            -
             | 
| 56 | 
            -
                     | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
                     | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
                     | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
                     | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
                     | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
                    else:
         | 
| 104 | 
            -
                        extension = 'jpg'
         | 
| 105 | 
            -
                    save_path = f'output/out.{extension}'
         | 
| 106 | 
            -
                    cv2.imwrite(save_path, output)
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                    output = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
         | 
| 109 | 
            -
                    return output, save_path
         | 
| 110 | 
            -
                except Exception as error:
         | 
| 111 | 
            -
                    print('global exception', error)
         | 
| 112 | 
            -
                    return None, None
         | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
            title = "GFPGAN: Practical Face Restoration Algorithm"
         | 
| 116 | 
            -
            description = r"""Gradio demo for <a href='https://github.com/TencentARC/GFPGAN' target='_blank'><b>GFPGAN: Towards Real-World Blind Face Restoration with Generative Facial Prior</b></a>.<br>
         | 
| 117 | 
            -
            It can be used to restore your **old photos** or improve **AI-generated faces**.<br>
         | 
| 118 | 
            -
            To use it, simply upload your image.<br>
         | 
| 119 | 
            -
            If GFPGAN is helpful, please help to ⭐ the <a href='https://github.com/TencentARC/GFPGAN' target='_blank'>Github Repo</a> and recommend it to your friends 😊
         | 
| 120 | 
            -
            """
         | 
| 121 | 
            -
            article = r"""
         | 
| 122 | 
            -
             | 
| 123 | 
            -
            [](https://github.com/TencentARC/GFPGAN/releases)
         | 
| 124 | 
            -
            [](https://github.com/TencentARC/GFPGAN)
         | 
| 125 | 
            -
            [](https://arxiv.org/abs/2101.04061)
         | 
| 126 | 
            -
             | 
| 127 | 
            -
            If you have any question, please email 📧 `xintao.wang@outlook.com` or `xintaowang@tencent.com`.
         | 
| 128 | 
            -
             | 
| 129 | 
            -
            <center><img src='https://visitor-badge.glitch.me/badge?page_id=akhaliq_GFPGAN' alt='visitor badge'></center>
         | 
| 130 | 
            -
            <center><img src='https://visitor-badge.glitch.me/badge?page_id=Gradio_Xintao_GFPGAN' alt='visitor badge'></center>
         | 
| 131 | 
            -
            """
         | 
| 132 | 
            -
            demo = gr.Interface(
         | 
| 133 | 
            -
                inference, [
         | 
| 134 | 
            -
                    gr.Image(type="filepath", label="Input"),
         | 
| 135 | 
            -
                    # gr.Radio(['v1.2', 'v1.3', 'v1.4', 'RestoreFormer', 'CodeFormer'], type="value", value='v1.4', label='version'),
         | 
| 136 | 
            -
                    gr.Radio(['v1.2', 'v1.3', 'v1.4', 'RestoreFormer'], type="value", value='v1.4', label='version'),
         | 
| 137 | 
            -
                    gr.Number(label="Rescaling factor", value=2),
         | 
| 138 | 
            -
                    # gr.Slider(0, 100, label='Weight, only for CodeFormer. 0 for better quality, 100 for better identity', value=50)
         | 
| 139 | 
            -
                ], [
         | 
| 140 | 
            -
                    gr.Image(type="numpy", label="Output (The whole image)"),
         | 
| 141 | 
            -
                    gr.File(label="Download the output image")
         | 
| 142 | 
            -
                ],
         | 
| 143 | 
            -
                title=title,
         | 
| 144 | 
            -
                description=description,
         | 
| 145 | 
            -
                article=article,
         | 
| 146 | 
            -
                # examples=[['AI-generate.jpg', 'v1.4', 2, 50], ['lincoln.jpg', 'v1.4', 2, 50], ['Blake_Lively.jpg', 'v1.4', 2, 50],
         | 
| 147 | 
            -
                #           ['10045.png', 'v1.4', 2, 50]]).launch()
         | 
| 148 | 
            -
                examples=[['AI-generate.jpg', 'v1.4', 2], ['lincoln.jpg', 'v1.4', 2], ['Blake_Lively.jpg', 'v1.4', 2],
         | 
| 149 | 
            -
                          ['10045.png', 'v1.4', 2]])
         | 
| 150 | 
            -
            demo.queue().launch()
         | 
|  | |
| 1 | 
             
            import os
         | 
|  | |
| 2 | 
             
            import cv2
         | 
|  | |
| 3 | 
             
            import torch
         | 
| 4 | 
            +
            from flask import Flask, render_template, request, send_file
         | 
| 5 | 
             
            from basicsr.archs.srvgg_arch import SRVGGNetCompact
         | 
| 6 | 
             
            from gfpgan.utils import GFPGANer
         | 
| 7 | 
             
            from realesrgan.utils import RealESRGANer
         | 
| 8 |  | 
| 9 | 
            +
            # Fix OpenMP threads issue
         | 
| 10 | 
            +
            os.environ["OMP_NUM_THREADS"] = "1"
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 11 |  | 
| 12 | 
            +
            app = Flask(__name__)
         | 
| 13 | 
            +
            os.makedirs("output", exist_ok=True)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 14 |  | 
| 15 | 
            +
            # Setup RealESRGAN upsampler
         | 
| 16 | 
             
            model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
         | 
| 17 | 
             
            model_path = 'realesr-general-x4v3.pth'
         | 
| 18 | 
            +
            half = torch.cuda.is_available()
         | 
| 19 | 
             
            upsampler = RealESRGANer(scale=4, model_path=model_path, model=model, tile=0, tile_pad=10, pre_pad=0, half=half)
         | 
| 20 |  | 
| 21 | 
            +
            # GFPGAN inference function
         | 
| 22 | 
            +
            def enhance_face(img_path, version="v1.4", scale=2):
         | 
| 23 | 
            +
                img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
         | 
| 24 | 
            +
                img_mode = None
         | 
| 25 | 
            +
                if len(img.shape) == 3 and img.shape[2] == 4:
         | 
| 26 | 
            +
                    img_mode = 'RGBA'
         | 
| 27 | 
            +
                elif len(img.shape) == 2:
         | 
| 28 | 
            +
                    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                if version == 'RestoreFormer':
         | 
| 31 | 
            +
                    face_enhancer = GFPGANer(model_path='RestoreFormer.pth', upscale=2, arch='RestoreFormer', channel_multiplier=2, bg_upsampler=upsampler)
         | 
| 32 | 
            +
                else:
         | 
| 33 | 
            +
                    face_enhancer = GFPGANer(model_path=f"{version}.pth", upscale=2, arch='clean', channel_multiplier=2, bg_upsampler=upsampler)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                _, _, output = face_enhancer.enhance(img, has_aligned=False, only_center_face=False, paste_back=True)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Optional rescale
         | 
| 38 | 
            +
                if scale != 2:
         | 
| 39 | 
            +
                    interpolation = cv2.INTER_AREA if scale < 2 else cv2.INTER_LANCZOS4
         | 
| 40 | 
            +
                    h, w = output.shape[0:2]
         | 
| 41 | 
            +
                    output = cv2.resize(output, (int(w * scale / 2), int(h * scale / 2)), interpolation=interpolation)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                # Save output
         | 
| 44 | 
            +
                extension = 'png' if img_mode == 'RGBA' else 'jpg'
         | 
| 45 | 
            +
                save_path = f"output/out.{extension}"
         | 
| 46 | 
            +
                cv2.imwrite(save_path, output)
         | 
| 47 | 
            +
                return save_path
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            # Flask routes
         | 
| 50 | 
            +
            @app.route("/", methods=["GET", "POST"])
         | 
| 51 | 
            +
            def index():
         | 
| 52 | 
            +
                if request.method == "POST":
         | 
| 53 | 
            +
                    file = request.files["image"]
         | 
| 54 | 
            +
                    version = request.form.get("version", "v1.4")
         | 
| 55 | 
            +
                    scale = float(request.form.get("scale", 2))
         | 
| 56 | 
            +
                    filepath = os.path.join("output", file.filename)
         | 
| 57 | 
            +
                    file.save(filepath)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    output_path = enhance_face(filepath, version, scale)
         | 
| 60 | 
            +
                    return send_file(output_path, as_attachment=True)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                return """
         | 
| 63 | 
            +
                <h1>GFPGAN Face Restoration</h1>
         | 
| 64 | 
            +
                <form method="post" enctype="multipart/form-data">
         | 
| 65 | 
            +
                  Upload Image: <input type="file" name="image"><br><br>
         | 
| 66 | 
            +
                  Version:
         | 
| 67 | 
            +
                  <select name="version">
         | 
| 68 | 
            +
                    <option value="v1.2">v1.2</option>
         | 
| 69 | 
            +
                    <option value="v1.3">v1.3</option>
         | 
| 70 | 
            +
                    <option value="v1.4" selected>v1.4</option>
         | 
| 71 | 
            +
                    <option value="RestoreFormer">RestoreFormer</option>
         | 
| 72 | 
            +
                  </select><br><br>
         | 
| 73 | 
            +
                  Rescale factor: <input type="number" step="0.1" name="scale" value="2"><br><br>
         | 
| 74 | 
            +
                  <input type="submit" value="Enhance">
         | 
| 75 | 
            +
                </form>
         | 
| 76 | 
            +
                """
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            if __name__ == "__main__":
         | 
| 79 | 
            +
                app.run(host="0.0.0.0", port=7860, debug=True)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 

