Spaces:
Runtime error
Runtime error
Upload 6 files
Browse files- .dockerignore +2 -0
- .gitignore +2 -0
- app.py +19 -0
- model.py +55 -0
- requirements.txt +1 -0
- weights/face_generator_v2.pth +3 -0
.dockerignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
_pycache__pycache_
|
2 |
+
*.pyc
|
.gitignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
_pycache_
|
2 |
+
*.pyc
|
app.py
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request, send_file
|
2 |
+
from model import load_model, generate
|
3 |
+
from io import BytesIO
|
4 |
+
|
5 |
+
app = Flask(__name__)
|
6 |
+
model = load_model()
|
7 |
+
|
8 |
+
def serve_img(pilImage):
|
9 |
+
imageIO = BytesIO()
|
10 |
+
pilImage.save(imageIO, 'JPEG', quality=70)
|
11 |
+
imageIO.seek(0)
|
12 |
+
return imageIO
|
13 |
+
|
14 |
+
|
15 |
+
@app.route("/",methods=['GET'])
|
16 |
+
def index():
|
17 |
+
image = generate(model)
|
18 |
+
g = serve_img(image)
|
19 |
+
return send_file(g, mimetype="image/jpeg")
|
model.py
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import torch.nn as nn
|
3 |
+
import numpy as np
|
4 |
+
|
5 |
+
from PIL import Image
|
6 |
+
|
7 |
+
device = "cpu"
|
8 |
+
weights_path = "./weights/face_generator_v2.pth"
|
9 |
+
IN_CHANNELS = 100
|
10 |
+
|
11 |
+
class FaceGenerator(nn.Module):
|
12 |
+
def __init__(self, in_channels):
|
13 |
+
super(FaceGenerator, self).__init__()
|
14 |
+
self.main = nn.Sequential(
|
15 |
+
nn.ConvTranspose2d(in_channels, 1024, 4, 2,0, bias=False),
|
16 |
+
nn.BatchNorm2d(1024),
|
17 |
+
nn.ReLU(True), # [batch_size, 1024, 2, 2]
|
18 |
+
|
19 |
+
nn.ConvTranspose2d(1024, 512, 4, 2,1, bias=False),
|
20 |
+
nn.BatchNorm2d(512),
|
21 |
+
nn.ReLU(True), # [batch_size, 512, 7, 7]
|
22 |
+
|
23 |
+
nn.ConvTranspose2d(512, 256, 4, 2,1, bias=False),
|
24 |
+
nn.BatchNorm2d(256),
|
25 |
+
nn.ReLU(True), # [batch_size, 256, 14, 14]
|
26 |
+
|
27 |
+
nn.ConvTranspose2d(256, 128, 4, 2,1, bias=False),
|
28 |
+
nn.BatchNorm2d(128),
|
29 |
+
nn.ReLU(True), # [batch_size, 256, 28, 28]
|
30 |
+
|
31 |
+
nn.ConvTranspose2d(128,3, 4, 2,1, bias=False),
|
32 |
+
nn.Sigmoid(), # [batch_size, 1, 32, 32]
|
33 |
+
)
|
34 |
+
def forward(self, x):
|
35 |
+
return self.main(x)
|
36 |
+
|
37 |
+
|
38 |
+
def load_model():
|
39 |
+
model = FaceGenerator(IN_CHANNELS).to(device=device)
|
40 |
+
model.load_state_dict(torch.load(weights_path, map_location=torch.device(device)), strict=True)
|
41 |
+
model = model.eval()
|
42 |
+
|
43 |
+
print("[!] Model Loaded..")
|
44 |
+
return model
|
45 |
+
|
46 |
+
def generate(model):
|
47 |
+
noise = torch.randn((1,IN_CHANNELS, 1, 1)).to(device)
|
48 |
+
image_op = model(noise).squeeze()
|
49 |
+
image_op = image_op.permute(1,2,0).detach().cpu().numpy()
|
50 |
+
image_op = image_op * 255.0
|
51 |
+
image_op = image_op.astype(np.uint8)
|
52 |
+
image_op = Image.fromarray(image_op)
|
53 |
+
image_op = image_op.resize((256, 256),resample=Image.ADAPTIVE)
|
54 |
+
return image_op
|
55 |
+
|
requirements.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
Flask==3.0.2
|
weights/face_generator_v2.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3c29df350fd708de2b613136c28ca047821d53f631897cc2bd4521c97ed9c2ff
|
3 |
+
size 50657645
|