Update app
Browse files- .gitignore +129 -0
- __init_paths.py +21 -0
- align_faces.py +266 -0
- app.py +143 -0
- color.png +0 -0
- enhance.png +0 -0
- face_colorization.py +23 -0
- face_enhancement.py +111 -0
- face_inpainting.py +18 -0
- face_model/face_gan.py +62 -0
- face_model/model.py +818 -0
- face_model/op/__init__.py +2 -0
- face_model/op/fused_act.py +96 -0
- face_model/op/fused_bias_act.cpp +21 -0
- face_model/op/fused_bias_act_kernel.cu +99 -0
- face_model/op/upfirdn2d.cpp +23 -0
- face_model/op/upfirdn2d.py +193 -0
- face_model/op/upfirdn2d_kernel.cu +272 -0
- inpainting.png +3 -0
- requirements.txt +9 -0
- retinaface/.DS_Store +0 -0
- retinaface/data/FDDB/img_list.txt +2845 -0
- retinaface/data/__init__.py +3 -0
- retinaface/data/config.py +42 -0
- retinaface/data/data_augment.py +237 -0
- retinaface/data/wider_face.py +101 -0
- retinaface/facemodels/__init__.py +0 -0
- retinaface/facemodels/net.py +137 -0
- retinaface/facemodels/retinaface.py +127 -0
- retinaface/layers/__init__.py +2 -0
- retinaface/layers/functions/prior_box.py +34 -0
- retinaface/layers/modules/__init__.py +3 -0
- retinaface/layers/modules/multibox_loss.py +125 -0
- retinaface/retinaface_detection.py +192 -0
- retinaface/utils/__init__.py +0 -0
- retinaface/utils/box_utils.py +330 -0
- retinaface/utils/nms/__init__.py +0 -0
- retinaface/utils/nms/py_cpu_nms.py +38 -0
- retinaface/utils/timer.py +40 -0
- selfie.png +0 -0
- sr_model/arch_util.py +125 -0
- sr_model/real_esrnet.py +133 -0
- sr_model/rrdbnet_arch.py +116 -0
- weights/README.md +9 -0
.gitignore
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
pip-wheel-metadata/
|
24 |
+
share/python-wheels/
|
25 |
+
*.egg-info/
|
26 |
+
.installed.cfg
|
27 |
+
*.egg
|
28 |
+
MANIFEST
|
29 |
+
|
30 |
+
# PyInstaller
|
31 |
+
# Usually these files are written by a python script from a template
|
32 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
33 |
+
*.manifest
|
34 |
+
*.spec
|
35 |
+
|
36 |
+
# Installer logs
|
37 |
+
pip-log.txt
|
38 |
+
pip-delete-this-directory.txt
|
39 |
+
|
40 |
+
# Unit test / coverage reports
|
41 |
+
htmlcov/
|
42 |
+
.tox/
|
43 |
+
.nox/
|
44 |
+
.coverage
|
45 |
+
.coverage.*
|
46 |
+
.cache
|
47 |
+
nosetests.xml
|
48 |
+
coverage.xml
|
49 |
+
*.cover
|
50 |
+
*.py,cover
|
51 |
+
.hypothesis/
|
52 |
+
.pytest_cache/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
target/
|
76 |
+
|
77 |
+
# Jupyter Notebook
|
78 |
+
.ipynb_checkpoints
|
79 |
+
|
80 |
+
# IPython
|
81 |
+
profile_default/
|
82 |
+
ipython_config.py
|
83 |
+
|
84 |
+
# pyenv
|
85 |
+
.python-version
|
86 |
+
|
87 |
+
# pipenv
|
88 |
+
# According to pypa/pipenv#598, it==recommended to include Pipfile.lock in version control.
|
89 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
90 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
91 |
+
# install all needed dependencies.
|
92 |
+
#Pipfile.lock
|
93 |
+
|
94 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
95 |
+
__pypackages__/
|
96 |
+
|
97 |
+
# Celery stuff
|
98 |
+
celerybeat-schedule
|
99 |
+
celerybeat.pid
|
100 |
+
|
101 |
+
# SageMath parsed files
|
102 |
+
*.sage.py
|
103 |
+
|
104 |
+
# Environments
|
105 |
+
.env
|
106 |
+
.venv
|
107 |
+
env/
|
108 |
+
venv/
|
109 |
+
ENV/
|
110 |
+
env.bak/
|
111 |
+
venv.bak/
|
112 |
+
|
113 |
+
# Spyder project settings
|
114 |
+
.spyderproject
|
115 |
+
.spyproject
|
116 |
+
|
117 |
+
# Rope project settings
|
118 |
+
.ropeproject
|
119 |
+
|
120 |
+
# mkdocs documentation
|
121 |
+
/site
|
122 |
+
|
123 |
+
# mypy
|
124 |
+
.mypy_cache/
|
125 |
+
.dmypy.json
|
126 |
+
dmypy.json
|
127 |
+
|
128 |
+
# Pyre type checker
|
129 |
+
.pyre/
|
__init_paths.py
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import os.path as osp
|
6 |
+
import sys
|
7 |
+
|
8 |
+
def add_path(path):
|
9 |
+
if path not in sys.path:
|
10 |
+
sys.path.insert(0, path)
|
11 |
+
|
12 |
+
this_dir = osp.dirname(__file__)
|
13 |
+
|
14 |
+
path = osp.join(this_dir, 'retinaface')
|
15 |
+
add_path(path)
|
16 |
+
|
17 |
+
path = osp.join(this_dir, 'sr_model')
|
18 |
+
add_path(path)
|
19 |
+
|
20 |
+
path = osp.join(this_dir, 'face_model')
|
21 |
+
add_path(path)
|
align_faces.py
ADDED
@@ -0,0 +1,266 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# -*- coding: utf-8 -*-
|
2 |
+
"""
|
3 |
+
Created on Mon Apr 24 15:43:29 2017
|
4 |
+
@author: zhaoy
|
5 |
+
"""
|
6 |
+
"""
|
7 |
+
@Modified by yangxy ([email protected])
|
8 |
+
"""
|
9 |
+
import cv2
|
10 |
+
import numpy as np
|
11 |
+
from skimage import transform as trans
|
12 |
+
|
13 |
+
# reference facial points, a list of coordinates (x,y)
|
14 |
+
REFERENCE_FACIAL_POINTS = [
|
15 |
+
[30.29459953, 51.69630051],
|
16 |
+
[65.53179932, 51.50139999],
|
17 |
+
[48.02519989, 71.73660278],
|
18 |
+
[33.54930115, 92.3655014],
|
19 |
+
[62.72990036, 92.20410156]
|
20 |
+
]
|
21 |
+
|
22 |
+
DEFAULT_CROP_SIZE = (96, 112)
|
23 |
+
|
24 |
+
|
25 |
+
def _umeyama(src, dst, estimate_scale=True, scale=1.0):
|
26 |
+
"""Estimate N-D similarity transformation with or without scaling.
|
27 |
+
Parameters
|
28 |
+
----------
|
29 |
+
src : (M, N) array
|
30 |
+
Source coordinates.
|
31 |
+
dst : (M, N) array
|
32 |
+
Destination coordinates.
|
33 |
+
estimate_scale : bool
|
34 |
+
Whether to estimate scaling factor.
|
35 |
+
Returns
|
36 |
+
-------
|
37 |
+
T : (N + 1, N + 1)
|
38 |
+
The homogeneous similarity transformation matrix. The matrix contains
|
39 |
+
NaN values only if the problem is not well-conditioned.
|
40 |
+
References
|
41 |
+
----------
|
42 |
+
.. [1] "Least-squares estimation of transformation parameters between two
|
43 |
+
point patterns", Shinji Umeyama, PAMI 1991, :DOI:`10.1109/34.88573`
|
44 |
+
"""
|
45 |
+
|
46 |
+
num = src.shape[0]
|
47 |
+
dim = src.shape[1]
|
48 |
+
|
49 |
+
# Compute mean of src and dst.
|
50 |
+
src_mean = src.mean(axis=0)
|
51 |
+
dst_mean = dst.mean(axis=0)
|
52 |
+
|
53 |
+
# Subtract mean from src and dst.
|
54 |
+
src_demean = src - src_mean
|
55 |
+
dst_demean = dst - dst_mean
|
56 |
+
|
57 |
+
# Eq. (38).
|
58 |
+
A = dst_demean.T @ src_demean / num
|
59 |
+
|
60 |
+
# Eq. (39).
|
61 |
+
d = np.ones((dim,), dtype=np.double)
|
62 |
+
if np.linalg.det(A) < 0:
|
63 |
+
d[dim - 1] = -1
|
64 |
+
|
65 |
+
T = np.eye(dim + 1, dtype=np.double)
|
66 |
+
|
67 |
+
U, S, V = np.linalg.svd(A)
|
68 |
+
|
69 |
+
# Eq. (40) and (43).
|
70 |
+
rank = np.linalg.matrix_rank(A)
|
71 |
+
if rank == 0:
|
72 |
+
return np.nan * T
|
73 |
+
elif rank == dim - 1:
|
74 |
+
if np.linalg.det(U) * np.linalg.det(V) > 0:
|
75 |
+
T[:dim, :dim] = U @ V
|
76 |
+
else:
|
77 |
+
s = d[dim - 1]
|
78 |
+
d[dim - 1] = -1
|
79 |
+
T[:dim, :dim] = U @ np.diag(d) @ V
|
80 |
+
d[dim - 1] = s
|
81 |
+
else:
|
82 |
+
T[:dim, :dim] = U @ np.diag(d) @ V
|
83 |
+
|
84 |
+
if estimate_scale:
|
85 |
+
# Eq. (41) and (42).
|
86 |
+
scale = 1.0 / src_demean.var(axis=0).sum() * (S @ d)
|
87 |
+
else:
|
88 |
+
scale = scale
|
89 |
+
|
90 |
+
T[:dim, dim] = dst_mean - scale * (T[:dim, :dim] @ src_mean.T)
|
91 |
+
T[:dim, :dim] *= scale
|
92 |
+
|
93 |
+
return T, scale
|
94 |
+
|
95 |
+
|
96 |
+
class FaceWarpException(Exception):
|
97 |
+
def __str__(self):
|
98 |
+
return 'In File {}:{}'.format(
|
99 |
+
__file__, super.__str__(self))
|
100 |
+
|
101 |
+
|
102 |
+
def get_reference_facial_points(output_size=None,
|
103 |
+
inner_padding_factor=0.0,
|
104 |
+
outer_padding=(0, 0),
|
105 |
+
default_square=False):
|
106 |
+
tmp_5pts = np.array(REFERENCE_FACIAL_POINTS)
|
107 |
+
tmp_crop_size = np.array(DEFAULT_CROP_SIZE)
|
108 |
+
|
109 |
+
# 0) make the inner region a square
|
110 |
+
if default_square:
|
111 |
+
size_diff = max(tmp_crop_size) - tmp_crop_size
|
112 |
+
tmp_5pts += size_diff / 2
|
113 |
+
tmp_crop_size += size_diff
|
114 |
+
|
115 |
+
if (output_size and
|
116 |
+
output_size[0] == tmp_crop_size[0] and
|
117 |
+
output_size[1] == tmp_crop_size[1]):
|
118 |
+
print('output_size == DEFAULT_CROP_SIZE {}: return default reference points'.format(tmp_crop_size))
|
119 |
+
return tmp_5pts
|
120 |
+
|
121 |
+
if (inner_padding_factor == 0 and
|
122 |
+
outer_padding == (0, 0)):
|
123 |
+
if output_size==None:
|
124 |
+
print('No paddings to do: return default reference points')
|
125 |
+
return tmp_5pts
|
126 |
+
else:
|
127 |
+
raise FaceWarpException(
|
128 |
+
'No paddings to do, output_size must be None or {}'.format(tmp_crop_size))
|
129 |
+
|
130 |
+
# check output size
|
131 |
+
if not (0 <= inner_padding_factor <= 1.0):
|
132 |
+
raise FaceWarpException('Not (0 <= inner_padding_factor <= 1.0)')
|
133 |
+
|
134 |
+
if ((inner_padding_factor > 0 or outer_padding[0] > 0 or outer_padding[1] > 0)
|
135 |
+
and output_size==None):
|
136 |
+
output_size = tmp_crop_size * \
|
137 |
+
(1 + inner_padding_factor * 2).astype(np.int32)
|
138 |
+
output_size += np.array(outer_padding)
|
139 |
+
print(' deduced from paddings, output_size = ', output_size)
|
140 |
+
|
141 |
+
if not (outer_padding[0] < output_size[0]
|
142 |
+
and outer_padding[1] < output_size[1]):
|
143 |
+
raise FaceWarpException('Not (outer_padding[0] < output_size[0]'
|
144 |
+
'and outer_padding[1] < output_size[1])')
|
145 |
+
|
146 |
+
# 1) pad the inner region according inner_padding_factor
|
147 |
+
# print('---> STEP1: pad the inner region according inner_padding_factor')
|
148 |
+
if inner_padding_factor > 0:
|
149 |
+
size_diff = tmp_crop_size * inner_padding_factor * 2
|
150 |
+
tmp_5pts += size_diff / 2
|
151 |
+
tmp_crop_size += np.round(size_diff).astype(np.int32)
|
152 |
+
|
153 |
+
# print(' crop_size = ', tmp_crop_size)
|
154 |
+
# print(' reference_5pts = ', tmp_5pts)
|
155 |
+
|
156 |
+
# 2) resize the padded inner region
|
157 |
+
# print('---> STEP2: resize the padded inner region')
|
158 |
+
size_bf_outer_pad = np.array(output_size) - np.array(outer_padding) * 2
|
159 |
+
# print(' crop_size = ', tmp_crop_size)
|
160 |
+
# print(' size_bf_outer_pad = ', size_bf_outer_pad)
|
161 |
+
|
162 |
+
if size_bf_outer_pad[0] * tmp_crop_size[1] != size_bf_outer_pad[1] * tmp_crop_size[0]:
|
163 |
+
raise FaceWarpException('Must have (output_size - outer_padding)'
|
164 |
+
'= some_scale * (crop_size * (1.0 + inner_padding_factor)')
|
165 |
+
|
166 |
+
scale_factor = size_bf_outer_pad[0].astype(np.float32) / tmp_crop_size[0]
|
167 |
+
# print(' resize scale_factor = ', scale_factor)
|
168 |
+
tmp_5pts = tmp_5pts * scale_factor
|
169 |
+
# size_diff = tmp_crop_size * (scale_factor - min(scale_factor))
|
170 |
+
# tmp_5pts = tmp_5pts + size_diff / 2
|
171 |
+
tmp_crop_size = size_bf_outer_pad
|
172 |
+
# print(' crop_size = ', tmp_crop_size)
|
173 |
+
# print(' reference_5pts = ', tmp_5pts)
|
174 |
+
|
175 |
+
# 3) add outer_padding to make output_size
|
176 |
+
reference_5point = tmp_5pts + np.array(outer_padding)
|
177 |
+
tmp_crop_size = output_size
|
178 |
+
# print('---> STEP3: add outer_padding to make output_size')
|
179 |
+
# print(' crop_size = ', tmp_crop_size)
|
180 |
+
# print(' reference_5pts = ', tmp_5pts)
|
181 |
+
#
|
182 |
+
# print('===> end get_reference_facial_points\n')
|
183 |
+
|
184 |
+
return reference_5point
|
185 |
+
|
186 |
+
|
187 |
+
def get_affine_transform_matrix(src_pts, dst_pts):
|
188 |
+
tfm = np.float32([[1, 0, 0], [0, 1, 0]])
|
189 |
+
n_pts = src_pts.shape[0]
|
190 |
+
ones = np.ones((n_pts, 1), src_pts.dtype)
|
191 |
+
src_pts_ = np.hstack([src_pts, ones])
|
192 |
+
dst_pts_ = np.hstack([dst_pts, ones])
|
193 |
+
|
194 |
+
A, res, rank, s = np.linalg.lstsq(src_pts_, dst_pts_)
|
195 |
+
|
196 |
+
if rank == 3:
|
197 |
+
tfm = np.float32([
|
198 |
+
[A[0, 0], A[1, 0], A[2, 0]],
|
199 |
+
[A[0, 1], A[1, 1], A[2, 1]]
|
200 |
+
])
|
201 |
+
elif rank == 2:
|
202 |
+
tfm = np.float32([
|
203 |
+
[A[0, 0], A[1, 0], 0],
|
204 |
+
[A[0, 1], A[1, 1], 0]
|
205 |
+
])
|
206 |
+
|
207 |
+
return tfm
|
208 |
+
|
209 |
+
|
210 |
+
def warp_and_crop_face(src_img,
|
211 |
+
facial_pts,
|
212 |
+
reference_pts=None,
|
213 |
+
crop_size=(96, 112),
|
214 |
+
align_type='smilarity'): #smilarity cv2_affine affine
|
215 |
+
if reference_pts is None:
|
216 |
+
if crop_size[0] == 96 and crop_size[1] == 112:
|
217 |
+
reference_pts = REFERENCE_FACIAL_POINTS
|
218 |
+
else:
|
219 |
+
default_square = False
|
220 |
+
inner_padding_factor = 0
|
221 |
+
outer_padding = (0, 0)
|
222 |
+
output_size = crop_size
|
223 |
+
|
224 |
+
reference_pts = get_reference_facial_points(output_size,
|
225 |
+
inner_padding_factor,
|
226 |
+
outer_padding,
|
227 |
+
default_square)
|
228 |
+
|
229 |
+
ref_pts = np.float32(reference_pts)
|
230 |
+
ref_pts_shp = ref_pts.shape
|
231 |
+
if max(ref_pts_shp) < 3 or min(ref_pts_shp) != 2:
|
232 |
+
raise FaceWarpException(
|
233 |
+
'reference_pts.shape must be (K,2) or (2,K) and K>2')
|
234 |
+
|
235 |
+
if ref_pts_shp[0] == 2:
|
236 |
+
ref_pts = ref_pts.T
|
237 |
+
|
238 |
+
src_pts = np.float32(facial_pts)
|
239 |
+
src_pts_shp = src_pts.shape
|
240 |
+
if max(src_pts_shp) < 3 or min(src_pts_shp) != 2:
|
241 |
+
raise FaceWarpException(
|
242 |
+
'facial_pts.shape must be (K,2) or (2,K) and K>2')
|
243 |
+
|
244 |
+
if src_pts_shp[0] == 2:
|
245 |
+
src_pts = src_pts.T
|
246 |
+
|
247 |
+
if src_pts.shape != ref_pts.shape:
|
248 |
+
raise FaceWarpException(
|
249 |
+
'facial_pts and reference_pts must have the same shape')
|
250 |
+
|
251 |
+
if align_type=='cv2_affine':
|
252 |
+
tfm = cv2.getAffineTransform(src_pts[0:3], ref_pts[0:3])
|
253 |
+
tfm_inv = cv2.getAffineTransform(ref_pts[0:3], src_pts[0:3])
|
254 |
+
elif align_type=='affine':
|
255 |
+
tfm = get_affine_transform_matrix(src_pts, ref_pts)
|
256 |
+
tfm_inv = get_affine_transform_matrix(ref_pts, src_pts)
|
257 |
+
else:
|
258 |
+
params, scale = _umeyama(src_pts, ref_pts)
|
259 |
+
tfm = params[:2, :]
|
260 |
+
|
261 |
+
params, _ = _umeyama(ref_pts, src_pts, False, scale=1.0/scale)
|
262 |
+
tfm_inv = params[:2, :]
|
263 |
+
|
264 |
+
face_img = cv2.warpAffine(src_img, tfm, (crop_size[0], crop_size[1]), flags=3)
|
265 |
+
|
266 |
+
return face_img, tfm_inv
|
app.py
ADDED
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
os.system('wget "https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/RetinaFace-R50.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116085&Signature=GlUNW6%2B8FxvxWmE9jKIZYOOciKQ%3D" -O weights/RetinaFace-R50.pth')
|
4 |
+
os.system('wget "https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/GPEN-BFR-512.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116208&Signature=hBgvVvKVSNGeXqT8glG%2Bd2t2OKc%3D" -O weights/GPEN-512.pth')
|
5 |
+
os.system('wget "https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/GPEN-Colorization-1024.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116315&Signature=9tPavW2h%2F1LhIKiXj73sTQoWqcc%3D" -O weights/GPEN-1024-Color.pth ')
|
6 |
+
os.system('wget "https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/realesrnet_x2.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1962694780&Signature=lI%2FolhA%2FyigiTRvoDIVbtMIyhjI%3D" -O weights/realesrnet_x2.pth ')
|
7 |
+
os.system('wget "https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/GPEN-Inpainting-1024.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116338&Signature=tvYhdLaLgW7UdcUrApXp2jsek8w%3D" -O weights/GPEN-Inpainting-1024.pth ')
|
8 |
+
jksp = os.environ['GPEN-BFR-2048']
|
9 |
+
os.system(f'wget "{jksp}" -O weights/GPEN-BFR-2048.pth > jksp.log')
|
10 |
+
|
11 |
+
import gradio as gr
|
12 |
+
|
13 |
+
'''
|
14 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
15 |
+
@author: yangxy ([email protected])
|
16 |
+
'''
|
17 |
+
import os
|
18 |
+
import cv2
|
19 |
+
import glob
|
20 |
+
import time
|
21 |
+
import math
|
22 |
+
import argparse
|
23 |
+
import numpy as np
|
24 |
+
from PIL import Image, ImageDraw
|
25 |
+
import __init_paths
|
26 |
+
from face_enhancement import FaceEnhancement
|
27 |
+
from face_colorization import FaceColorization
|
28 |
+
from face_inpainting import FaceInpainting
|
29 |
+
|
30 |
+
def brush_stroke_mask(img, color=(255,255,255)):
|
31 |
+
min_num_vertex = 8
|
32 |
+
max_num_vertex = 28
|
33 |
+
mean_angle = 2*math.pi / 5
|
34 |
+
angle_range = 2*math.pi / 15
|
35 |
+
min_width = 12
|
36 |
+
max_width = 80
|
37 |
+
def generate_mask(H, W, img=None):
|
38 |
+
average_radius = math.sqrt(H*H+W*W) / 8
|
39 |
+
mask = Image.new('RGB', (W, H), 0)
|
40 |
+
if img is not None: mask = img #Image.fromarray(img)
|
41 |
+
|
42 |
+
for _ in range(np.random.randint(1, 4)):
|
43 |
+
num_vertex = np.random.randint(min_num_vertex, max_num_vertex)
|
44 |
+
angle_min = mean_angle - np.random.uniform(0, angle_range)
|
45 |
+
angle_max = mean_angle + np.random.uniform(0, angle_range)
|
46 |
+
angles = []
|
47 |
+
vertex = []
|
48 |
+
for i in range(num_vertex):
|
49 |
+
if i % 2 == 0:
|
50 |
+
angles.append(2*math.pi - np.random.uniform(angle_min, angle_max))
|
51 |
+
else:
|
52 |
+
angles.append(np.random.uniform(angle_min, angle_max))
|
53 |
+
|
54 |
+
h, w = mask.size
|
55 |
+
vertex.append((int(np.random.randint(0, w)), int(np.random.randint(0, h))))
|
56 |
+
for i in range(num_vertex):
|
57 |
+
r = np.clip(
|
58 |
+
np.random.normal(loc=average_radius, scale=average_radius//2),
|
59 |
+
0, 2*average_radius)
|
60 |
+
new_x = np.clip(vertex[-1][0] + r * math.cos(angles[i]), 0, w)
|
61 |
+
new_y = np.clip(vertex[-1][1] + r * math.sin(angles[i]), 0, h)
|
62 |
+
vertex.append((int(new_x), int(new_y)))
|
63 |
+
|
64 |
+
draw = ImageDraw.Draw(mask)
|
65 |
+
width = int(np.random.uniform(min_width, max_width))
|
66 |
+
draw.line(vertex, fill=color, width=width)
|
67 |
+
for v in vertex:
|
68 |
+
draw.ellipse((v[0] - width//2,
|
69 |
+
v[1] - width//2,
|
70 |
+
v[0] + width//2,
|
71 |
+
v[1] + width//2),
|
72 |
+
fill=color)
|
73 |
+
|
74 |
+
return mask
|
75 |
+
|
76 |
+
width, height = img.size
|
77 |
+
mask = generate_mask(height, width, img)
|
78 |
+
return mask
|
79 |
+
|
80 |
+
def inference(file, mode):
|
81 |
+
|
82 |
+
im = cv2.imread(file, cv2.IMREAD_COLOR)
|
83 |
+
im = cv2.resize(im, (0,0), fx=2, fy=2)
|
84 |
+
faceenhancer = FaceEnhancement(size=512, model='GPEN-512', channel_multiplier=2, device='cpu', u=False)
|
85 |
+
img, orig_faces, enhanced_faces = faceenhancer.process(im)
|
86 |
+
cv2.imwrite(os.path.join("e.png"), img)
|
87 |
+
|
88 |
+
|
89 |
+
if mode == "enhance":
|
90 |
+
return os.path.join("e.png")
|
91 |
+
elif mode == "colorize":
|
92 |
+
model = {'name':'GPEN-1024-Color', 'size':1024}
|
93 |
+
grayf = cv2.imread("e.png", cv2.IMREAD_GRAYSCALE)
|
94 |
+
grayf = cv2.cvtColor(grayf, cv2.COLOR_GRAY2BGR) # channel: 1->3
|
95 |
+
facecolorizer = FaceColorization(size=model['size'], model=model['name'], channel_multiplier=2, device='cpu')
|
96 |
+
colorf = facecolorizer.process(grayf)
|
97 |
+
|
98 |
+
colorf = cv2.resize(colorf, (grayf.shape[1], grayf.shape[0]))
|
99 |
+
cv2.imwrite(os.path.join("output.png"), colorf)
|
100 |
+
return os.path.join("output.png")
|
101 |
+
elif mode == "inpainting":
|
102 |
+
model = {'name':'GPEN-Inpainting-1024', 'size':1024}
|
103 |
+
faceinpainter = FaceInpainting(size=model['size'], model=model['name'], channel_multiplier=2, device='cpu')
|
104 |
+
im = np.asarray(brush_stroke_mask(Image.fromarray(im)))
|
105 |
+
inpaint = faceinpainter.process(im)
|
106 |
+
|
107 |
+
cv2.imwrite(os.path.join("output.png"), inpaint)
|
108 |
+
return os.path.join("output.png")
|
109 |
+
elif mode == "selfie":
|
110 |
+
model = {'name':'GPEN-BFR-2048', 'size':2048}
|
111 |
+
im = cv2.resize(im, (0,0), fx=4, fy=4)
|
112 |
+
faceenhancer = FaceEnhancement(size=model['size'], model=model['name'], channel_multiplier=2, device='cpu')
|
113 |
+
img, orig_faces, enhanced_faces = faceenhancer.process(im)
|
114 |
+
cv2.imwrite(os.path.join("output.png"), img)
|
115 |
+
return os.path.join("output.png")
|
116 |
+
else:
|
117 |
+
faceenhancer = FaceEnhancement(size=512, model='GPEN-512', channel_multiplier=2, device='cpu', u=True)
|
118 |
+
img, orig_faces, enhanced_faces = faceenhancer.process(im)
|
119 |
+
cv2.imwrite(os.path.join("output.png"), img)
|
120 |
+
return os.path.join("output.png")
|
121 |
+
|
122 |
+
|
123 |
+
title = "GPEN"
|
124 |
+
description = "Gradio demo for GAN Prior Embedded Network for Blind Face Restoration in the Wild. This version of gradio demo includes face colorization from GPEN. To use it, simply upload your image, or click one of the examples to load them. Read more at the links below."
|
125 |
+
|
126 |
+
article = "<p style='text-align: center;'><a href='https://arxiv.org/abs/2105.06070' target='_blank'>GAN Prior Embedded Network for Blind Face Restoration in the Wild</a> | <a href='https://github.com/yangxy/GPEN' target='_blank'>Github Repo</a></p><p style='text-align: center;'><img src='https://img.shields.io/badge/Hugging%20Face-Original%20demo-blue' alt='https://huggingface.co/spaces/akhaliq/GPEN' width='172' height='20' /></p>"
|
127 |
+
|
128 |
+
|
129 |
+
gr.Interface(
|
130 |
+
inference,
|
131 |
+
[gr.inputs.Image(type="filepath", label="Input"),gr.inputs.Radio(["enhance", "colorize", "inpainting", "selfie", "enhanced+background"], type="value", default="enhance", label="Type")],
|
132 |
+
gr.outputs.Image(type="file", label="Output"),
|
133 |
+
title=title,
|
134 |
+
description=description,
|
135 |
+
article=article,
|
136 |
+
examples=[
|
137 |
+
['enhance.png', 'enhance'],
|
138 |
+
['color.png', 'colorize'],
|
139 |
+
['inpainting.png', 'inpainting'],
|
140 |
+
['selfie.png', 'selfie']
|
141 |
+
],
|
142 |
+
enable_queue=True
|
143 |
+
).launch()
|
color.png
ADDED
enhance.png
ADDED
face_colorization.py
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import os
|
6 |
+
import cv2
|
7 |
+
import glob
|
8 |
+
import time
|
9 |
+
import numpy as np
|
10 |
+
from PIL import Image
|
11 |
+
import __init_paths
|
12 |
+
from face_model.face_gan import FaceGAN
|
13 |
+
|
14 |
+
class FaceColorization(object):
|
15 |
+
def __init__(self, base_dir='./', size=1024, out_size=None, model=None, channel_multiplier=2, narrow=1, key=None, device='cuda'):
|
16 |
+
self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
|
17 |
+
|
18 |
+
# make sure the face image==well aligned. Please refer to face_enhancement.py
|
19 |
+
def process(self, gray):
|
20 |
+
# colorize the face
|
21 |
+
out = self.facegan.process(gray)
|
22 |
+
|
23 |
+
return out
|
face_enhancement.py
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import os
|
6 |
+
import cv2
|
7 |
+
import glob
|
8 |
+
import time
|
9 |
+
import numpy as np
|
10 |
+
from PIL import Image
|
11 |
+
import __init_paths
|
12 |
+
from retinaface.retinaface_detection import RetinaFaceDetection
|
13 |
+
from face_model.face_gan import FaceGAN
|
14 |
+
from sr_model.real_esrnet import RealESRNet
|
15 |
+
from align_faces import warp_and_crop_face, get_reference_facial_points
|
16 |
+
|
17 |
+
class FaceEnhancement(object):
|
18 |
+
def __init__(self, base_dir='./', size=512, out_size=None, model=None, channel_multiplier=2, narrow=1, key=None, device='cpu', u=False):
|
19 |
+
self.facedetector = RetinaFaceDetection(base_dir, device)
|
20 |
+
self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
|
21 |
+
self.srmodel = RealESRNet(base_dir, 'realesrnet', 2, 0, device=device)
|
22 |
+
self.use_sr = u
|
23 |
+
self.size = size
|
24 |
+
self.out_size = size if out_size==None else out_size
|
25 |
+
self.threshold = 0.9
|
26 |
+
|
27 |
+
# the mask for pasting restored faces back
|
28 |
+
self.mask = np.zeros((512, 512), np.float32)
|
29 |
+
cv2.rectangle(self.mask, (26, 26), (486, 486), (1, 1, 1), -1, cv2.LINE_AA)
|
30 |
+
self.mask = cv2.GaussianBlur(self.mask, (101, 101), 11)
|
31 |
+
self.mask = cv2.GaussianBlur(self.mask, (101, 101), 11)
|
32 |
+
|
33 |
+
self.kernel = np.array((
|
34 |
+
[0.0625, 0.125, 0.0625],
|
35 |
+
[0.125, 0.25, 0.125],
|
36 |
+
[0.0625, 0.125, 0.0625]), dtype="float32")
|
37 |
+
|
38 |
+
# get the reference 5 landmarks position in the crop settings
|
39 |
+
default_square = True
|
40 |
+
inner_padding_factor = 0.25
|
41 |
+
outer_padding = (0, 0)
|
42 |
+
self.reference_5pts = get_reference_facial_points(
|
43 |
+
(self.size, self.size), inner_padding_factor, outer_padding, default_square)
|
44 |
+
|
45 |
+
def mask_postprocess(self, mask, thres=20):
|
46 |
+
mask[:thres, :] = 0; mask[-thres:, :] = 0
|
47 |
+
mask[:, :thres] = 0; mask[:, -thres:] = 0
|
48 |
+
mask = cv2.GaussianBlur(mask, (101, 101), 11)
|
49 |
+
mask = cv2.GaussianBlur(mask, (101, 101), 11)
|
50 |
+
return mask.astype(np.float32)
|
51 |
+
|
52 |
+
def process(self, img, aligned=False):
|
53 |
+
orig_faces, enhanced_faces = [], []
|
54 |
+
if aligned:
|
55 |
+
ef = self.facegan.process(img)
|
56 |
+
orig_faces.append(img)
|
57 |
+
enhanced_faces.append(ef)
|
58 |
+
|
59 |
+
if self.use_sr:
|
60 |
+
ef = self.srmodel.process(ef)
|
61 |
+
|
62 |
+
return ef, orig_faces, enhanced_faces
|
63 |
+
|
64 |
+
if self.use_sr:
|
65 |
+
img_sr = self.srmodel.process(img)
|
66 |
+
if img_sr is not None:
|
67 |
+
img = cv2.resize(img, img_sr.shape[:2][::-1])
|
68 |
+
|
69 |
+
facebs, landms = self.facedetector.detect(img)
|
70 |
+
|
71 |
+
height, width = img.shape[:2]
|
72 |
+
full_mask = np.zeros((height, width), dtype=np.float32)
|
73 |
+
full_img = np.zeros(img.shape, dtype=np.uint8)
|
74 |
+
|
75 |
+
for i, (faceb, facial5points) in enumerate(zip(facebs, landms)):
|
76 |
+
if faceb[4]<self.threshold: continue
|
77 |
+
fh, fw = (faceb[3]-faceb[1]), (faceb[2]-faceb[0])
|
78 |
+
|
79 |
+
facial5points = np.reshape(facial5points, (2, 5))
|
80 |
+
|
81 |
+
of, tfm_inv = warp_and_crop_face(img, facial5points, reference_pts=self.reference_5pts, crop_size=(self.size, self.size))
|
82 |
+
|
83 |
+
# enhance the face
|
84 |
+
ef = self.facegan.process(of)
|
85 |
+
|
86 |
+
orig_faces.append(of)
|
87 |
+
enhanced_faces.append(ef)
|
88 |
+
|
89 |
+
tmp_mask = self.mask
|
90 |
+
tmp_mask = cv2.resize(tmp_mask, (self.size, self.size))
|
91 |
+
tmp_mask = cv2.warpAffine(tmp_mask, tfm_inv, (width, height), flags=3)
|
92 |
+
|
93 |
+
if min(fh, fw)<100: # gaussian filter for small faces
|
94 |
+
ef = cv2.filter2D(ef, -1, self.kernel)
|
95 |
+
|
96 |
+
if self.size!=self.out_size:
|
97 |
+
ef = cv2.resize(ef, (self.size, self.size))
|
98 |
+
tmp_img = cv2.warpAffine(ef, tfm_inv, (width, height), flags=3)
|
99 |
+
|
100 |
+
mask = tmp_mask - full_mask
|
101 |
+
full_mask[np.where(mask>0)] = tmp_mask[np.where(mask>0)]
|
102 |
+
full_img[np.where(mask>0)] = tmp_img[np.where(mask>0)]
|
103 |
+
|
104 |
+
full_mask = full_mask[:, :, np.newaxis]
|
105 |
+
if self.use_sr and img_sr is not None:
|
106 |
+
img = cv2.convertScaleAbs(img_sr*(1-full_mask) + full_img*full_mask)
|
107 |
+
else:
|
108 |
+
img = cv2.convertScaleAbs(img*(1-full_mask) + full_img*full_mask)
|
109 |
+
|
110 |
+
return img, orig_faces, enhanced_faces
|
111 |
+
|
face_inpainting.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
from face_model.face_gan import FaceGAN
|
6 |
+
|
7 |
+
class FaceInpainting(object):
|
8 |
+
def __init__(self, base_dir='./', size=1024, out_size=1024, model=None, channel_multiplier=2, narrow=1, key=None, device='cuda'):
|
9 |
+
self.facegan = FaceGAN(base_dir, size, out_size, model, channel_multiplier, narrow, key, device=device)
|
10 |
+
|
11 |
+
# make sure the face image is well aligned. Please refer to face_enhancement.py
|
12 |
+
def process(self, brokenf, aligned=True):
|
13 |
+
# complete the face
|
14 |
+
out = self.facegan.process(brokenf)
|
15 |
+
|
16 |
+
return out
|
17 |
+
|
18 |
+
|
face_model/face_gan.py
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import torch
|
6 |
+
import os
|
7 |
+
import cv2
|
8 |
+
import glob
|
9 |
+
import numpy as np
|
10 |
+
from torch import nn
|
11 |
+
import torch.nn.functional as F
|
12 |
+
from torchvision import transforms, utils
|
13 |
+
from model import FullGenerator, FullGenerator_SR
|
14 |
+
|
15 |
+
class FaceGAN(object):
|
16 |
+
def __init__(self, base_dir='./', size=512, out_size=None, model=None, channel_multiplier=2, narrow=1, key=None, is_norm=True, device='cuda'):
|
17 |
+
self.mfile = os.path.join(base_dir, 'weights', model+'.pth')
|
18 |
+
self.n_mlp = 8
|
19 |
+
self.device = device
|
20 |
+
self.is_norm = is_norm
|
21 |
+
self.in_resolution = size
|
22 |
+
self.out_resolution = size if out_size == None else out_size
|
23 |
+
self.key = key
|
24 |
+
self.load_model(channel_multiplier, narrow)
|
25 |
+
|
26 |
+
def load_model(self, channel_multiplier=2, narrow=1):
|
27 |
+
if self.in_resolution == self.out_resolution:
|
28 |
+
self.model = FullGenerator(self.in_resolution, 512, self.n_mlp, channel_multiplier, narrow=narrow, device=self.device)
|
29 |
+
else:
|
30 |
+
self.model = FullGenerator_SR(self.in_resolution, self.out_resolution, 512, self.n_mlp, channel_multiplier, narrow=narrow, device=self.device)
|
31 |
+
pretrained_dict = torch.load(self.mfile, map_location=torch.device('cpu'))
|
32 |
+
if self.key is not None: pretrained_dict = pretrained_dict[self.key]
|
33 |
+
self.model.load_state_dict(pretrained_dict)
|
34 |
+
self.model.to(self.device)
|
35 |
+
self.model.eval()
|
36 |
+
|
37 |
+
def process(self, img):
|
38 |
+
img = cv2.resize(img, (self.in_resolution, self.in_resolution))
|
39 |
+
img_t = self.img2tensor(img)
|
40 |
+
|
41 |
+
with torch.no_grad():
|
42 |
+
out, __ = self.model(img_t)
|
43 |
+
del img_t
|
44 |
+
|
45 |
+
out = self.tensor2img(out)
|
46 |
+
|
47 |
+
return out
|
48 |
+
|
49 |
+
def img2tensor(self, img):
|
50 |
+
img_t = torch.from_numpy(img).to(self.device)/255.
|
51 |
+
if self.is_norm:
|
52 |
+
img_t = (img_t - 0.5) / 0.5
|
53 |
+
img_t = img_t.permute(2, 0, 1).unsqueeze(0).flip(1) # BGR->RGB
|
54 |
+
return img_t
|
55 |
+
|
56 |
+
def tensor2img(self, img_t, pmax=255.0, imtype=np.uint8):
|
57 |
+
if self.is_norm:
|
58 |
+
img_t = img_t * 0.5 + 0.5
|
59 |
+
img_t = img_t.squeeze(0).permute(1, 2, 0).flip(2) # RGB->BGR
|
60 |
+
img_np = np.clip(img_t.float().cpu().numpy(), 0, 1) * pmax
|
61 |
+
|
62 |
+
return img_np.astype(imtype)
|
face_model/model.py
ADDED
@@ -0,0 +1,818 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import math
|
6 |
+
import random
|
7 |
+
import functools
|
8 |
+
import operator
|
9 |
+
import itertools
|
10 |
+
|
11 |
+
import torch
|
12 |
+
from torch import nn
|
13 |
+
from torch.nn import functional as F
|
14 |
+
from torch.autograd import Function
|
15 |
+
|
16 |
+
from op import FusedLeakyReLU, fused_leaky_relu, upfirdn2d
|
17 |
+
|
18 |
+
class PixelNorm(nn.Module):
|
19 |
+
def __init__(self):
|
20 |
+
super().__init__()
|
21 |
+
|
22 |
+
def forward(self, input):
|
23 |
+
return input * torch.rsqrt(torch.mean(input ** 2, dim=1, keepdim=True) + 1e-8)
|
24 |
+
|
25 |
+
|
26 |
+
def make_kernel(k):
|
27 |
+
k = torch.tensor(k, dtype=torch.float32)
|
28 |
+
|
29 |
+
if k.ndim == 1:
|
30 |
+
k = k[None, :] * k[:, None]
|
31 |
+
|
32 |
+
k /= k.sum()
|
33 |
+
|
34 |
+
return k
|
35 |
+
|
36 |
+
|
37 |
+
class Upsample(nn.Module):
|
38 |
+
def __init__(self, kernel, factor=2, device='cpu'):
|
39 |
+
super().__init__()
|
40 |
+
|
41 |
+
self.factor = factor
|
42 |
+
kernel = make_kernel(kernel) * (factor ** 2)
|
43 |
+
self.register_buffer('kernel', kernel)
|
44 |
+
|
45 |
+
p = kernel.shape[0] - factor
|
46 |
+
|
47 |
+
pad0 = (p + 1) // 2 + factor - 1
|
48 |
+
pad1 = p // 2
|
49 |
+
|
50 |
+
self.pad = (pad0, pad1)
|
51 |
+
self.device = device
|
52 |
+
|
53 |
+
def forward(self, input):
|
54 |
+
out = upfirdn2d(input, self.kernel, up=self.factor, down=1, pad=self.pad, device=self.device)
|
55 |
+
|
56 |
+
return out
|
57 |
+
|
58 |
+
|
59 |
+
class Downsample(nn.Module):
|
60 |
+
def __init__(self, kernel, factor=2, device='cpu'):
|
61 |
+
super().__init__()
|
62 |
+
|
63 |
+
self.factor = factor
|
64 |
+
kernel = make_kernel(kernel)
|
65 |
+
self.register_buffer('kernel', kernel)
|
66 |
+
|
67 |
+
p = kernel.shape[0] - factor
|
68 |
+
|
69 |
+
pad0 = (p + 1) // 2
|
70 |
+
pad1 = p // 2
|
71 |
+
|
72 |
+
self.pad = (pad0, pad1)
|
73 |
+
self.device = device
|
74 |
+
|
75 |
+
def forward(self, input):
|
76 |
+
out = upfirdn2d(input, self.kernel, up=1, down=self.factor, pad=self.pad, device=self.device)
|
77 |
+
|
78 |
+
return out
|
79 |
+
|
80 |
+
|
81 |
+
class Blur(nn.Module):
|
82 |
+
def __init__(self, kernel, pad, upsample_factor=1, device='cpu'):
|
83 |
+
super().__init__()
|
84 |
+
|
85 |
+
kernel = make_kernel(kernel)
|
86 |
+
|
87 |
+
if upsample_factor > 1:
|
88 |
+
kernel = kernel * (upsample_factor ** 2)
|
89 |
+
|
90 |
+
self.register_buffer('kernel', kernel)
|
91 |
+
|
92 |
+
self.pad = pad
|
93 |
+
self.device = device
|
94 |
+
|
95 |
+
def forward(self, input):
|
96 |
+
out = upfirdn2d(input, self.kernel, pad=self.pad, device=self.device)
|
97 |
+
|
98 |
+
return out
|
99 |
+
|
100 |
+
|
101 |
+
class EqualConv2d(nn.Module):
|
102 |
+
def __init__(
|
103 |
+
self, in_channel, out_channel, kernel_size, stride=1, padding=0, bias=True
|
104 |
+
):
|
105 |
+
super().__init__()
|
106 |
+
|
107 |
+
self.weight = nn.Parameter(
|
108 |
+
torch.randn(out_channel, in_channel, kernel_size, kernel_size)
|
109 |
+
)
|
110 |
+
self.scale = 1 / math.sqrt(in_channel * kernel_size ** 2)
|
111 |
+
|
112 |
+
self.stride = stride
|
113 |
+
self.padding = padding
|
114 |
+
|
115 |
+
if bias:
|
116 |
+
self.bias = nn.Parameter(torch.zeros(out_channel))
|
117 |
+
|
118 |
+
else:
|
119 |
+
self.bias = None
|
120 |
+
|
121 |
+
def forward(self, input):
|
122 |
+
out = F.conv2d(
|
123 |
+
input,
|
124 |
+
self.weight * self.scale,
|
125 |
+
bias=self.bias,
|
126 |
+
stride=self.stride,
|
127 |
+
padding=self.padding,
|
128 |
+
)
|
129 |
+
|
130 |
+
return out
|
131 |
+
|
132 |
+
def __repr__(self):
|
133 |
+
return (
|
134 |
+
f'{self.__class__.__name__}({self.weight.shape[1]}, {self.weight.shape[0]},'
|
135 |
+
f' {self.weight.shape[2]}, stride={self.stride}, padding={self.padding})'
|
136 |
+
)
|
137 |
+
|
138 |
+
|
139 |
+
class EqualLinear(nn.Module):
|
140 |
+
def __init__(
|
141 |
+
self, in_dim, out_dim, bias=True, bias_init=0, lr_mul=1, activation=None, device='cpu'
|
142 |
+
):
|
143 |
+
super().__init__()
|
144 |
+
|
145 |
+
self.weight = nn.Parameter(torch.randn(out_dim, in_dim).div_(lr_mul))
|
146 |
+
|
147 |
+
if bias:
|
148 |
+
self.bias = nn.Parameter(torch.zeros(out_dim).fill_(bias_init))
|
149 |
+
|
150 |
+
else:
|
151 |
+
self.bias = None
|
152 |
+
|
153 |
+
self.activation = activation
|
154 |
+
self.device = device
|
155 |
+
|
156 |
+
self.scale = (1 / math.sqrt(in_dim)) * lr_mul
|
157 |
+
self.lr_mul = lr_mul
|
158 |
+
|
159 |
+
def forward(self, input):
|
160 |
+
if self.activation:
|
161 |
+
out = F.linear(input, self.weight * self.scale)
|
162 |
+
out = fused_leaky_relu(out, self.bias * self.lr_mul, device=self.device)
|
163 |
+
|
164 |
+
else:
|
165 |
+
out = F.linear(input, self.weight * self.scale, bias=self.bias * self.lr_mul)
|
166 |
+
|
167 |
+
return out
|
168 |
+
|
169 |
+
def __repr__(self):
|
170 |
+
return (
|
171 |
+
f'{self.__class__.__name__}({self.weight.shape[1]}, {self.weight.shape[0]})'
|
172 |
+
)
|
173 |
+
|
174 |
+
|
175 |
+
class ScaledLeakyReLU(nn.Module):
|
176 |
+
def __init__(self, negative_slope=0.2):
|
177 |
+
super().__init__()
|
178 |
+
|
179 |
+
self.negative_slope = negative_slope
|
180 |
+
|
181 |
+
def forward(self, input):
|
182 |
+
out = F.leaky_relu(input, negative_slope=self.negative_slope)
|
183 |
+
|
184 |
+
return out * math.sqrt(2)
|
185 |
+
|
186 |
+
|
187 |
+
class ModulatedConv2d(nn.Module):
|
188 |
+
def __init__(
|
189 |
+
self,
|
190 |
+
in_channel,
|
191 |
+
out_channel,
|
192 |
+
kernel_size,
|
193 |
+
style_dim,
|
194 |
+
demodulate=True,
|
195 |
+
upsample=False,
|
196 |
+
downsample=False,
|
197 |
+
blur_kernel=[1, 3, 3, 1],
|
198 |
+
device='cpu'
|
199 |
+
):
|
200 |
+
super().__init__()
|
201 |
+
|
202 |
+
self.eps = 1e-8
|
203 |
+
self.kernel_size = kernel_size
|
204 |
+
self.in_channel = in_channel
|
205 |
+
self.out_channel = out_channel
|
206 |
+
self.upsample = upsample
|
207 |
+
self.downsample = downsample
|
208 |
+
|
209 |
+
if upsample:
|
210 |
+
factor = 2
|
211 |
+
p = (len(blur_kernel) - factor) - (kernel_size - 1)
|
212 |
+
pad0 = (p + 1) // 2 + factor - 1
|
213 |
+
pad1 = p // 2 + 1
|
214 |
+
|
215 |
+
self.blur = Blur(blur_kernel, pad=(pad0, pad1), upsample_factor=factor, device=device)
|
216 |
+
|
217 |
+
if downsample:
|
218 |
+
factor = 2
|
219 |
+
p = (len(blur_kernel) - factor) + (kernel_size - 1)
|
220 |
+
pad0 = (p + 1) // 2
|
221 |
+
pad1 = p // 2
|
222 |
+
|
223 |
+
self.blur = Blur(blur_kernel, pad=(pad0, pad1), device=device)
|
224 |
+
|
225 |
+
fan_in = in_channel * kernel_size ** 2
|
226 |
+
self.scale = 1 / math.sqrt(fan_in)
|
227 |
+
self.padding = kernel_size // 2
|
228 |
+
|
229 |
+
self.weight = nn.Parameter(
|
230 |
+
torch.randn(1, out_channel, in_channel, kernel_size, kernel_size)
|
231 |
+
)
|
232 |
+
|
233 |
+
self.modulation = EqualLinear(style_dim, in_channel, bias_init=1)
|
234 |
+
|
235 |
+
self.demodulate = demodulate
|
236 |
+
|
237 |
+
def __repr__(self):
|
238 |
+
return (
|
239 |
+
f'{self.__class__.__name__}({self.in_channel}, {self.out_channel}, {self.kernel_size}, '
|
240 |
+
f'upsample={self.upsample}, downsample={self.downsample})'
|
241 |
+
)
|
242 |
+
|
243 |
+
def forward(self, input, style):
|
244 |
+
batch, in_channel, height, width = input.shape
|
245 |
+
|
246 |
+
style = self.modulation(style).view(batch, 1, in_channel, 1, 1)
|
247 |
+
weight = self.scale * self.weight * style
|
248 |
+
|
249 |
+
if self.demodulate:
|
250 |
+
demod = torch.rsqrt(weight.pow(2).sum([2, 3, 4]) + 1e-8)
|
251 |
+
weight = weight * demod.view(batch, self.out_channel, 1, 1, 1)
|
252 |
+
|
253 |
+
weight = weight.view(
|
254 |
+
batch * self.out_channel, in_channel, self.kernel_size, self.kernel_size
|
255 |
+
)
|
256 |
+
|
257 |
+
if self.upsample:
|
258 |
+
input = input.view(1, batch * in_channel, height, width)
|
259 |
+
weight = weight.view(
|
260 |
+
batch, self.out_channel, in_channel, self.kernel_size, self.kernel_size
|
261 |
+
)
|
262 |
+
weight = weight.transpose(1, 2).reshape(
|
263 |
+
batch * in_channel, self.out_channel, self.kernel_size, self.kernel_size
|
264 |
+
)
|
265 |
+
out = F.conv_transpose2d(input, weight, padding=0, stride=2, groups=batch)
|
266 |
+
_, _, height, width = out.shape
|
267 |
+
out = out.view(batch, self.out_channel, height, width)
|
268 |
+
out = self.blur(out)
|
269 |
+
|
270 |
+
elif self.downsample:
|
271 |
+
input = self.blur(input)
|
272 |
+
_, _, height, width = input.shape
|
273 |
+
input = input.view(1, batch * in_channel, height, width)
|
274 |
+
out = F.conv2d(input, weight, padding=0, stride=2, groups=batch)
|
275 |
+
_, _, height, width = out.shape
|
276 |
+
out = out.view(batch, self.out_channel, height, width)
|
277 |
+
|
278 |
+
else:
|
279 |
+
input = input.view(1, batch * in_channel, height, width)
|
280 |
+
out = F.conv2d(input, weight, padding=self.padding, groups=batch)
|
281 |
+
_, _, height, width = out.shape
|
282 |
+
out = out.view(batch, self.out_channel, height, width)
|
283 |
+
|
284 |
+
return out
|
285 |
+
|
286 |
+
|
287 |
+
class NoiseInjection(nn.Module):
|
288 |
+
def __init__(self, isconcat=True):
|
289 |
+
super().__init__()
|
290 |
+
|
291 |
+
self.isconcat = isconcat
|
292 |
+
self.weight = nn.Parameter(torch.zeros(1))
|
293 |
+
|
294 |
+
def forward(self, image, noise=None):
|
295 |
+
if noise==None:
|
296 |
+
batch, channel, height, width = image.shape
|
297 |
+
noise = image.new_empty(batch, channel, height, width).normal_()
|
298 |
+
|
299 |
+
if self.isconcat:
|
300 |
+
return torch.cat((image, self.weight * noise), dim=1)
|
301 |
+
else:
|
302 |
+
return image + self.weight * noise
|
303 |
+
|
304 |
+
|
305 |
+
class ConstantInput(nn.Module):
|
306 |
+
def __init__(self, channel, size=4):
|
307 |
+
super().__init__()
|
308 |
+
|
309 |
+
self.input = nn.Parameter(torch.randn(1, channel, size, size))
|
310 |
+
|
311 |
+
def forward(self, input):
|
312 |
+
batch = input.shape[0]
|
313 |
+
out = self.input.repeat(batch, 1, 1, 1)
|
314 |
+
|
315 |
+
return out
|
316 |
+
|
317 |
+
|
318 |
+
class StyledConv(nn.Module):
|
319 |
+
def __init__(
|
320 |
+
self,
|
321 |
+
in_channel,
|
322 |
+
out_channel,
|
323 |
+
kernel_size,
|
324 |
+
style_dim,
|
325 |
+
upsample=False,
|
326 |
+
blur_kernel=[1, 3, 3, 1],
|
327 |
+
demodulate=True,
|
328 |
+
isconcat=True,
|
329 |
+
device='cpu'
|
330 |
+
):
|
331 |
+
super().__init__()
|
332 |
+
|
333 |
+
self.conv = ModulatedConv2d(
|
334 |
+
in_channel,
|
335 |
+
out_channel,
|
336 |
+
kernel_size,
|
337 |
+
style_dim,
|
338 |
+
upsample=upsample,
|
339 |
+
blur_kernel=blur_kernel,
|
340 |
+
demodulate=demodulate,
|
341 |
+
device=device
|
342 |
+
)
|
343 |
+
|
344 |
+
self.noise = NoiseInjection(isconcat)
|
345 |
+
#self.bias = nn.Parameter(torch.zeros(1, out_channel, 1, 1))
|
346 |
+
#self.activate = ScaledLeakyReLU(0.2)
|
347 |
+
feat_multiplier = 2 if isconcat else 1
|
348 |
+
self.activate = FusedLeakyReLU(out_channel*feat_multiplier, device=device)
|
349 |
+
|
350 |
+
def forward(self, input, style, noise=None):
|
351 |
+
out = self.conv(input, style)
|
352 |
+
out = self.noise(out, noise=noise)
|
353 |
+
# out = out + self.bias
|
354 |
+
out = self.activate(out)
|
355 |
+
|
356 |
+
return out
|
357 |
+
|
358 |
+
|
359 |
+
class ToRGB(nn.Module):
|
360 |
+
def __init__(self, in_channel, style_dim, upsample=True, blur_kernel=[1, 3, 3, 1], device='cpu'):
|
361 |
+
super().__init__()
|
362 |
+
|
363 |
+
if upsample:
|
364 |
+
self.upsample = Upsample(blur_kernel, device=device)
|
365 |
+
|
366 |
+
self.conv = ModulatedConv2d(in_channel, 3, 1, style_dim, demodulate=False, device=device)
|
367 |
+
self.bias = nn.Parameter(torch.zeros(1, 3, 1, 1))
|
368 |
+
|
369 |
+
def forward(self, input, style, skip=None):
|
370 |
+
out = self.conv(input, style)
|
371 |
+
out = out + self.bias
|
372 |
+
|
373 |
+
if skip is not None:
|
374 |
+
skip = self.upsample(skip)
|
375 |
+
|
376 |
+
out = out + skip
|
377 |
+
|
378 |
+
return out
|
379 |
+
|
380 |
+
class Generator(nn.Module):
|
381 |
+
def __init__(
|
382 |
+
self,
|
383 |
+
size,
|
384 |
+
style_dim,
|
385 |
+
n_mlp,
|
386 |
+
channel_multiplier=2,
|
387 |
+
blur_kernel=[1, 3, 3, 1],
|
388 |
+
lr_mlp=0.01,
|
389 |
+
isconcat=True,
|
390 |
+
narrow=1,
|
391 |
+
device='cpu'
|
392 |
+
):
|
393 |
+
super().__init__()
|
394 |
+
|
395 |
+
self.size = size
|
396 |
+
self.n_mlp = n_mlp
|
397 |
+
self.style_dim = style_dim
|
398 |
+
self.feat_multiplier = 2 if isconcat else 1
|
399 |
+
|
400 |
+
layers = [PixelNorm()]
|
401 |
+
|
402 |
+
for i in range(n_mlp):
|
403 |
+
layers.append(
|
404 |
+
EqualLinear(
|
405 |
+
style_dim, style_dim, lr_mul=lr_mlp, activation='fused_lrelu', device=device
|
406 |
+
)
|
407 |
+
)
|
408 |
+
|
409 |
+
self.style = nn.Sequential(*layers)
|
410 |
+
|
411 |
+
self.channels = {
|
412 |
+
4: int(512 * narrow),
|
413 |
+
8: int(512 * narrow),
|
414 |
+
16: int(512 * narrow),
|
415 |
+
32: int(512 * narrow),
|
416 |
+
64: int(256 * channel_multiplier * narrow),
|
417 |
+
128: int(128 * channel_multiplier * narrow),
|
418 |
+
256: int(64 * channel_multiplier * narrow),
|
419 |
+
512: int(32 * channel_multiplier * narrow),
|
420 |
+
1024: int(16 * channel_multiplier * narrow),
|
421 |
+
2048: int(8 * channel_multiplier * narrow)
|
422 |
+
}
|
423 |
+
|
424 |
+
self.input = ConstantInput(self.channels[4])
|
425 |
+
self.conv1 = StyledConv(
|
426 |
+
self.channels[4], self.channels[4], 3, style_dim, blur_kernel=blur_kernel, isconcat=isconcat, device=device
|
427 |
+
)
|
428 |
+
self.to_rgb1 = ToRGB(self.channels[4]*self.feat_multiplier, style_dim, upsample=False, device=device)
|
429 |
+
|
430 |
+
self.log_size = int(math.log(size, 2))
|
431 |
+
|
432 |
+
self.convs = nn.ModuleList()
|
433 |
+
self.upsamples = nn.ModuleList()
|
434 |
+
self.to_rgbs = nn.ModuleList()
|
435 |
+
|
436 |
+
in_channel = self.channels[4]
|
437 |
+
|
438 |
+
for i in range(3, self.log_size + 1):
|
439 |
+
out_channel = self.channels[2 ** i]
|
440 |
+
|
441 |
+
self.convs.append(
|
442 |
+
StyledConv(
|
443 |
+
in_channel*self.feat_multiplier,
|
444 |
+
out_channel,
|
445 |
+
3,
|
446 |
+
style_dim,
|
447 |
+
upsample=True,
|
448 |
+
blur_kernel=blur_kernel,
|
449 |
+
isconcat=isconcat,
|
450 |
+
device=device
|
451 |
+
)
|
452 |
+
)
|
453 |
+
|
454 |
+
self.convs.append(
|
455 |
+
StyledConv(
|
456 |
+
out_channel*self.feat_multiplier, out_channel, 3, style_dim, blur_kernel=blur_kernel, isconcat=isconcat, device=device
|
457 |
+
)
|
458 |
+
)
|
459 |
+
|
460 |
+
self.to_rgbs.append(ToRGB(out_channel*self.feat_multiplier, style_dim, device=device))
|
461 |
+
|
462 |
+
in_channel = out_channel
|
463 |
+
|
464 |
+
self.n_latent = self.log_size * 2 - 2
|
465 |
+
|
466 |
+
def make_noise(self):
|
467 |
+
device = self.input.input.device
|
468 |
+
|
469 |
+
noises = [torch.randn(1, 1, 2 ** 2, 2 ** 2, device=device)]
|
470 |
+
|
471 |
+
for i in range(3, self.log_size + 1):
|
472 |
+
for _ in range(2):
|
473 |
+
noises.append(torch.randn(1, 1, 2 ** i, 2 ** i, device=device))
|
474 |
+
|
475 |
+
return noises
|
476 |
+
|
477 |
+
def mean_latent(self, n_latent):
|
478 |
+
latent_in = torch.randn(
|
479 |
+
n_latent, self.style_dim, device=self.input.input.device
|
480 |
+
)
|
481 |
+
latent = self.style(latent_in).mean(0, keepdim=True)
|
482 |
+
|
483 |
+
return latent
|
484 |
+
|
485 |
+
def get_latent(self, input):
|
486 |
+
return self.style(input)
|
487 |
+
|
488 |
+
def forward(
|
489 |
+
self,
|
490 |
+
styles,
|
491 |
+
return_latents=False,
|
492 |
+
inject_index=None,
|
493 |
+
truncation=1,
|
494 |
+
truncation_latent=None,
|
495 |
+
input_is_latent=False,
|
496 |
+
noise=None,
|
497 |
+
):
|
498 |
+
if not input_is_latent:
|
499 |
+
styles = [self.style(s) for s in styles]
|
500 |
+
|
501 |
+
if noise==None:
|
502 |
+
'''
|
503 |
+
noise = [None] * (2 * (self.log_size - 2) + 1)
|
504 |
+
'''
|
505 |
+
noise = []
|
506 |
+
batch = styles[0].shape[0]
|
507 |
+
for i in range(self.n_mlp + 1):
|
508 |
+
size = 2 ** (i+2)
|
509 |
+
noise.append(torch.randn(batch, self.channels[size], size, size, device=styles[0].device))
|
510 |
+
|
511 |
+
if truncation < 1:
|
512 |
+
style_t = []
|
513 |
+
|
514 |
+
for style in styles:
|
515 |
+
style_t.append(
|
516 |
+
truncation_latent + truncation * (style - truncation_latent)
|
517 |
+
)
|
518 |
+
|
519 |
+
styles = style_t
|
520 |
+
|
521 |
+
if len(styles) < 2:
|
522 |
+
inject_index = self.n_latent
|
523 |
+
|
524 |
+
latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
|
525 |
+
|
526 |
+
else:
|
527 |
+
if inject_index==None:
|
528 |
+
inject_index = random.randint(1, self.n_latent - 1)
|
529 |
+
|
530 |
+
latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
|
531 |
+
latent2 = styles[1].unsqueeze(1).repeat(1, self.n_latent - inject_index, 1)
|
532 |
+
|
533 |
+
latent = torch.cat([latent, latent2], 1)
|
534 |
+
|
535 |
+
out = self.input(latent)
|
536 |
+
out = self.conv1(out, latent[:, 0], noise=noise[0])
|
537 |
+
|
538 |
+
skip = self.to_rgb1(out, latent[:, 1])
|
539 |
+
|
540 |
+
i = 1
|
541 |
+
for conv1, conv2, noise1, noise2, to_rgb in zip(
|
542 |
+
self.convs[::2], self.convs[1::2], noise[1::2], noise[2::2], self.to_rgbs
|
543 |
+
):
|
544 |
+
out = conv1(out, latent[:, i], noise=noise1)
|
545 |
+
out = conv2(out, latent[:, i + 1], noise=noise2)
|
546 |
+
skip = to_rgb(out, latent[:, i + 2], skip)
|
547 |
+
|
548 |
+
i += 2
|
549 |
+
|
550 |
+
image = skip
|
551 |
+
|
552 |
+
if return_latents:
|
553 |
+
return image, latent
|
554 |
+
|
555 |
+
else:
|
556 |
+
return image, None
|
557 |
+
|
558 |
+
class ConvLayer(nn.Sequential):
|
559 |
+
def __init__(
|
560 |
+
self,
|
561 |
+
in_channel,
|
562 |
+
out_channel,
|
563 |
+
kernel_size,
|
564 |
+
downsample=False,
|
565 |
+
blur_kernel=[1, 3, 3, 1],
|
566 |
+
bias=True,
|
567 |
+
activate=True,
|
568 |
+
device='cpu'
|
569 |
+
):
|
570 |
+
layers = []
|
571 |
+
|
572 |
+
if downsample:
|
573 |
+
factor = 2
|
574 |
+
p = (len(blur_kernel) - factor) + (kernel_size - 1)
|
575 |
+
pad0 = (p + 1) // 2
|
576 |
+
pad1 = p // 2
|
577 |
+
|
578 |
+
layers.append(Blur(blur_kernel, pad=(pad0, pad1), device=device))
|
579 |
+
|
580 |
+
stride = 2
|
581 |
+
self.padding = 0
|
582 |
+
|
583 |
+
else:
|
584 |
+
stride = 1
|
585 |
+
self.padding = kernel_size // 2
|
586 |
+
|
587 |
+
layers.append(
|
588 |
+
EqualConv2d(
|
589 |
+
in_channel,
|
590 |
+
out_channel,
|
591 |
+
kernel_size,
|
592 |
+
padding=self.padding,
|
593 |
+
stride=stride,
|
594 |
+
bias=bias and not activate,
|
595 |
+
)
|
596 |
+
)
|
597 |
+
|
598 |
+
if activate:
|
599 |
+
if bias:
|
600 |
+
layers.append(FusedLeakyReLU(out_channel, device=device))
|
601 |
+
|
602 |
+
else:
|
603 |
+
layers.append(ScaledLeakyReLU(0.2))
|
604 |
+
|
605 |
+
super().__init__(*layers)
|
606 |
+
|
607 |
+
|
608 |
+
class ResBlock(nn.Module):
|
609 |
+
def __init__(self, in_channel, out_channel, blur_kernel=[1, 3, 3, 1], device='cpu'):
|
610 |
+
super().__init__()
|
611 |
+
|
612 |
+
self.conv1 = ConvLayer(in_channel, in_channel, 3, device=device)
|
613 |
+
self.conv2 = ConvLayer(in_channel, out_channel, 3, downsample=True, device=device)
|
614 |
+
|
615 |
+
self.skip = ConvLayer(
|
616 |
+
in_channel, out_channel, 1, downsample=True, activate=False, bias=False
|
617 |
+
)
|
618 |
+
|
619 |
+
def forward(self, input):
|
620 |
+
out = self.conv1(input)
|
621 |
+
out = self.conv2(out)
|
622 |
+
|
623 |
+
skip = self.skip(input)
|
624 |
+
out = (out + skip) / math.sqrt(2)
|
625 |
+
|
626 |
+
return out
|
627 |
+
|
628 |
+
class FullGenerator(nn.Module):
|
629 |
+
def __init__(
|
630 |
+
self,
|
631 |
+
size,
|
632 |
+
style_dim,
|
633 |
+
n_mlp,
|
634 |
+
channel_multiplier=2,
|
635 |
+
blur_kernel=[1, 3, 3, 1],
|
636 |
+
lr_mlp=0.01,
|
637 |
+
isconcat=True,
|
638 |
+
narrow=1,
|
639 |
+
device='cpu'
|
640 |
+
):
|
641 |
+
super().__init__()
|
642 |
+
channels = {
|
643 |
+
4: int(512 * narrow),
|
644 |
+
8: int(512 * narrow),
|
645 |
+
16: int(512 * narrow),
|
646 |
+
32: int(512 * narrow),
|
647 |
+
64: int(256 * channel_multiplier * narrow),
|
648 |
+
128: int(128 * channel_multiplier * narrow),
|
649 |
+
256: int(64 * channel_multiplier * narrow),
|
650 |
+
512: int(32 * channel_multiplier * narrow),
|
651 |
+
1024: int(16 * channel_multiplier * narrow),
|
652 |
+
2048: int(8 * channel_multiplier * narrow)
|
653 |
+
}
|
654 |
+
|
655 |
+
self.log_size = int(math.log(size, 2))
|
656 |
+
self.generator = Generator(size, style_dim, n_mlp, channel_multiplier=channel_multiplier, blur_kernel=blur_kernel, lr_mlp=lr_mlp, isconcat=isconcat, narrow=narrow, device=device)
|
657 |
+
|
658 |
+
conv = [ConvLayer(3, channels[size], 1, device=device)]
|
659 |
+
self.ecd0 = nn.Sequential(*conv)
|
660 |
+
in_channel = channels[size]
|
661 |
+
|
662 |
+
self.names = ['ecd%d'%i for i in range(self.log_size-1)]
|
663 |
+
for i in range(self.log_size, 2, -1):
|
664 |
+
out_channel = channels[2 ** (i - 1)]
|
665 |
+
#conv = [ResBlock(in_channel, out_channel, blur_kernel)]
|
666 |
+
conv = [ConvLayer(in_channel, out_channel, 3, downsample=True, device=device)]
|
667 |
+
setattr(self, self.names[self.log_size-i+1], nn.Sequential(*conv))
|
668 |
+
in_channel = out_channel
|
669 |
+
self.final_linear = nn.Sequential(EqualLinear(channels[4] * 4 * 4, style_dim, activation='fused_lrelu', device=device))
|
670 |
+
|
671 |
+
def forward(self,
|
672 |
+
inputs,
|
673 |
+
return_latents=False,
|
674 |
+
inject_index=None,
|
675 |
+
truncation=1,
|
676 |
+
truncation_latent=None,
|
677 |
+
input_is_latent=False,
|
678 |
+
):
|
679 |
+
noise = []
|
680 |
+
for i in range(self.log_size-1):
|
681 |
+
ecd = getattr(self, self.names[i])
|
682 |
+
inputs = ecd(inputs)
|
683 |
+
noise.append(inputs)
|
684 |
+
#print(inputs.shape)
|
685 |
+
inputs = inputs.view(inputs.shape[0], -1)
|
686 |
+
outs = self.final_linear(inputs)
|
687 |
+
#print(outs.shape)
|
688 |
+
noise = list(itertools.chain.from_iterable(itertools.repeat(x, 2) for x in noise))[::-1]
|
689 |
+
outs = self.generator([outs], return_latents, inject_index, truncation, truncation_latent, input_is_latent, noise=noise[1:])
|
690 |
+
return outs
|
691 |
+
|
692 |
+
class Discriminator(nn.Module):
|
693 |
+
def __init__(self, size, channel_multiplier=2, blur_kernel=[1, 3, 3, 1], narrow=1, device='cpu'):
|
694 |
+
super().__init__()
|
695 |
+
|
696 |
+
channels = {
|
697 |
+
4: int(512 * narrow),
|
698 |
+
8: int(512 * narrow),
|
699 |
+
16: int(512 * narrow),
|
700 |
+
32: int(512 * narrow),
|
701 |
+
64: int(256 * channel_multiplier * narrow),
|
702 |
+
128: int(128 * channel_multiplier * narrow),
|
703 |
+
256: int(64 * channel_multiplier * narrow),
|
704 |
+
512: int(32 * channel_multiplier * narrow),
|
705 |
+
1024: int(16 * channel_multiplier * narrow),
|
706 |
+
2048: int(8 * channel_multiplier * narrow)
|
707 |
+
}
|
708 |
+
|
709 |
+
convs = [ConvLayer(3, channels[size], 1, device=device)]
|
710 |
+
|
711 |
+
log_size = int(math.log(size, 2))
|
712 |
+
|
713 |
+
in_channel = channels[size]
|
714 |
+
|
715 |
+
for i in range(log_size, 2, -1):
|
716 |
+
out_channel = channels[2 ** (i - 1)]
|
717 |
+
|
718 |
+
convs.append(ResBlock(in_channel, out_channel, blur_kernel, device=device))
|
719 |
+
|
720 |
+
in_channel = out_channel
|
721 |
+
|
722 |
+
self.convs = nn.Sequential(*convs)
|
723 |
+
|
724 |
+
self.stddev_group = 4
|
725 |
+
self.stddev_feat = 1
|
726 |
+
|
727 |
+
self.final_conv = ConvLayer(in_channel + 1, channels[4], 3, device=device)
|
728 |
+
self.final_linear = nn.Sequential(
|
729 |
+
EqualLinear(channels[4] * 4 * 4, channels[4], activation='fused_lrelu', device=device),
|
730 |
+
EqualLinear(channels[4], 1),
|
731 |
+
)
|
732 |
+
|
733 |
+
def forward(self, input):
|
734 |
+
out = self.convs(input)
|
735 |
+
|
736 |
+
batch, channel, height, width = out.shape
|
737 |
+
group = min(batch, self.stddev_group)
|
738 |
+
stddev = out.view(
|
739 |
+
group, -1, self.stddev_feat, channel // self.stddev_feat, height, width
|
740 |
+
)
|
741 |
+
stddev = torch.sqrt(stddev.var(0, unbiased=False) + 1e-8)
|
742 |
+
stddev = stddev.mean([2, 3, 4], keepdims=True).squeeze(2)
|
743 |
+
stddev = stddev.repeat(group, 1, height, width)
|
744 |
+
out = torch.cat([out, stddev], 1)
|
745 |
+
|
746 |
+
out = self.final_conv(out)
|
747 |
+
|
748 |
+
out = out.view(batch, -1)
|
749 |
+
out = self.final_linear(out)
|
750 |
+
return out
|
751 |
+
|
752 |
+
class FullGenerator_SR(nn.Module):
|
753 |
+
def __init__(
|
754 |
+
self,
|
755 |
+
size,
|
756 |
+
out_size,
|
757 |
+
style_dim,
|
758 |
+
n_mlp,
|
759 |
+
channel_multiplier=2,
|
760 |
+
blur_kernel=[1, 3, 3, 1],
|
761 |
+
lr_mlp=0.01,
|
762 |
+
isconcat=True,
|
763 |
+
narrow=1,
|
764 |
+
device='cpu'
|
765 |
+
):
|
766 |
+
super().__init__()
|
767 |
+
channels = {
|
768 |
+
4: int(512 * narrow),
|
769 |
+
8: int(512 * narrow),
|
770 |
+
16: int(512 * narrow),
|
771 |
+
32: int(512 * narrow),
|
772 |
+
64: int(256 * channel_multiplier * narrow),
|
773 |
+
128: int(128 * channel_multiplier * narrow),
|
774 |
+
256: int(64 * channel_multiplier * narrow),
|
775 |
+
512: int(32 * channel_multiplier * narrow),
|
776 |
+
1024: int(16 * channel_multiplier * narrow),
|
777 |
+
2048: int(8 * channel_multiplier * narrow),
|
778 |
+
}
|
779 |
+
|
780 |
+
self.log_insize = int(math.log(size, 2))
|
781 |
+
self.log_outsize = int(math.log(out_size, 2))
|
782 |
+
self.generator = Generator(out_size, style_dim, n_mlp, channel_multiplier=channel_multiplier, blur_kernel=blur_kernel, lr_mlp=lr_mlp, isconcat=isconcat, narrow=narrow, device=device)
|
783 |
+
|
784 |
+
conv = [ConvLayer(3, channels[size], 1, device=device)]
|
785 |
+
self.ecd0 = nn.Sequential(*conv)
|
786 |
+
in_channel = channels[size]
|
787 |
+
|
788 |
+
self.names = ['ecd%d'%i for i in range(self.log_insize-1)]
|
789 |
+
for i in range(self.log_insize, 2, -1):
|
790 |
+
out_channel = channels[2 ** (i - 1)]
|
791 |
+
#conv = [ResBlock(in_channel, out_channel, blur_kernel)]
|
792 |
+
conv = [ConvLayer(in_channel, out_channel, 3, downsample=True, device=device)]
|
793 |
+
setattr(self, self.names[self.log_insize-i+1], nn.Sequential(*conv))
|
794 |
+
in_channel = out_channel
|
795 |
+
self.final_linear = nn.Sequential(EqualLinear(channels[4] * 4 * 4, style_dim, activation='fused_lrelu', device=device))
|
796 |
+
|
797 |
+
def forward(self,
|
798 |
+
inputs,
|
799 |
+
return_latents=False,
|
800 |
+
inject_index=None,
|
801 |
+
truncation=1,
|
802 |
+
truncation_latent=None,
|
803 |
+
input_is_latent=False,
|
804 |
+
):
|
805 |
+
noise = []
|
806 |
+
for i in range(self.log_outsize-self.log_insize):
|
807 |
+
noise.append(None)
|
808 |
+
for i in range(self.log_insize-1):
|
809 |
+
ecd = getattr(self, self.names[i])
|
810 |
+
inputs = ecd(inputs)
|
811 |
+
noise.append(inputs)
|
812 |
+
#print(inputs.shape)
|
813 |
+
inputs = inputs.view(inputs.shape[0], -1)
|
814 |
+
outs = self.final_linear(inputs)
|
815 |
+
#print(outs.shape)
|
816 |
+
noise = list(itertools.chain.from_iterable(itertools.repeat(x, 2) for x in noise))[::-1]
|
817 |
+
image, latent = self.generator([outs], return_latents, inject_index, truncation, truncation_latent, input_is_latent, noise=noise[1:])
|
818 |
+
return image, latent
|
face_model/op/__init__.py
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
from .fused_act import FusedLeakyReLU, fused_leaky_relu
|
2 |
+
from .upfirdn2d import upfirdn2d
|
face_model/op/fused_act.py
ADDED
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import platform
|
3 |
+
|
4 |
+
import torch
|
5 |
+
from torch import nn
|
6 |
+
import torch.nn.functional as F
|
7 |
+
from torch.autograd import Function
|
8 |
+
from torch.utils.cpp_extension import load, _import_module_from_library
|
9 |
+
|
10 |
+
# if running GPEN without cuda, please comment line 11-19
|
11 |
+
if platform.system() == 'Linux' and torch.cuda.is_available():
|
12 |
+
module_path = os.path.dirname(__file__)
|
13 |
+
fused = load(
|
14 |
+
'fused',
|
15 |
+
sources=[
|
16 |
+
os.path.join(module_path, 'fused_bias_act.cpp'),
|
17 |
+
os.path.join(module_path, 'fused_bias_act_kernel.cu'),
|
18 |
+
],
|
19 |
+
)
|
20 |
+
|
21 |
+
|
22 |
+
#fused = _import_module_from_library('fused', '/tmp/torch_extensions/fused', True)
|
23 |
+
|
24 |
+
|
25 |
+
class FusedLeakyReLUFunctionBackward(Function):
|
26 |
+
@staticmethod
|
27 |
+
def forward(ctx, grad_output, out, negative_slope, scale):
|
28 |
+
ctx.save_for_backward(out)
|
29 |
+
ctx.negative_slope = negative_slope
|
30 |
+
ctx.scale = scale
|
31 |
+
|
32 |
+
empty = grad_output.new_empty(0)
|
33 |
+
|
34 |
+
grad_input = fused.fused_bias_act(
|
35 |
+
grad_output, empty, out, 3, 1, negative_slope, scale
|
36 |
+
)
|
37 |
+
|
38 |
+
dim = [0]
|
39 |
+
|
40 |
+
if grad_input.ndim > 2:
|
41 |
+
dim += list(range(2, grad_input.ndim))
|
42 |
+
|
43 |
+
grad_bias = grad_input.sum(dim).detach()
|
44 |
+
|
45 |
+
return grad_input, grad_bias
|
46 |
+
|
47 |
+
@staticmethod
|
48 |
+
def backward(ctx, gradgrad_input, gradgrad_bias):
|
49 |
+
out, = ctx.saved_tensors
|
50 |
+
gradgrad_out = fused.fused_bias_act(
|
51 |
+
gradgrad_input, gradgrad_bias, out, 3, 1, ctx.negative_slope, ctx.scale
|
52 |
+
)
|
53 |
+
|
54 |
+
return gradgrad_out, None, None, None
|
55 |
+
|
56 |
+
|
57 |
+
class FusedLeakyReLUFunction(Function):
|
58 |
+
@staticmethod
|
59 |
+
def forward(ctx, input, bias, negative_slope, scale):
|
60 |
+
empty = input.new_empty(0)
|
61 |
+
out = fused.fused_bias_act(input, bias, empty, 3, 0, negative_slope, scale)
|
62 |
+
ctx.save_for_backward(out)
|
63 |
+
ctx.negative_slope = negative_slope
|
64 |
+
ctx.scale = scale
|
65 |
+
|
66 |
+
return out
|
67 |
+
|
68 |
+
@staticmethod
|
69 |
+
def backward(ctx, grad_output):
|
70 |
+
out, = ctx.saved_tensors
|
71 |
+
|
72 |
+
grad_input, grad_bias = FusedLeakyReLUFunctionBackward.apply(
|
73 |
+
grad_output, out, ctx.negative_slope, ctx.scale
|
74 |
+
)
|
75 |
+
|
76 |
+
return grad_input, grad_bias, None, None
|
77 |
+
|
78 |
+
|
79 |
+
class FusedLeakyReLU(nn.Module):
|
80 |
+
def __init__(self, channel, negative_slope=0.2, scale=2 ** 0.5, device='cpu'):
|
81 |
+
super().__init__()
|
82 |
+
|
83 |
+
self.bias = nn.Parameter(torch.zeros(channel))
|
84 |
+
self.negative_slope = negative_slope
|
85 |
+
self.scale = scale
|
86 |
+
self.device = device
|
87 |
+
|
88 |
+
def forward(self, input):
|
89 |
+
return fused_leaky_relu(input, self.bias, self.negative_slope, self.scale, self.device)
|
90 |
+
|
91 |
+
|
92 |
+
def fused_leaky_relu(input, bias, negative_slope=0.2, scale=2 ** 0.5, device='cpu'):
|
93 |
+
if platform.system() == 'Linux' and torch.cuda.is_available() and device != 'cpu':
|
94 |
+
return FusedLeakyReLUFunction.apply(input, bias, negative_slope, scale)
|
95 |
+
else:
|
96 |
+
return scale * F.leaky_relu(input + bias.view((1, -1)+(1,)*(len(input.shape)-2)), negative_slope=negative_slope)
|
face_model/op/fused_bias_act.cpp
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#include <torch/extension.h>
|
2 |
+
|
3 |
+
|
4 |
+
torch::Tensor fused_bias_act_op(const torch::Tensor& input, const torch::Tensor& bias, const torch::Tensor& refer,
|
5 |
+
int act, int grad, float alpha, float scale);
|
6 |
+
|
7 |
+
#define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor")
|
8 |
+
#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous")
|
9 |
+
#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)
|
10 |
+
|
11 |
+
torch::Tensor fused_bias_act(const torch::Tensor& input, const torch::Tensor& bias, const torch::Tensor& refer,
|
12 |
+
int act, int grad, float alpha, float scale) {
|
13 |
+
CHECK_CUDA(input);
|
14 |
+
CHECK_CUDA(bias);
|
15 |
+
|
16 |
+
return fused_bias_act_op(input, bias, refer, act, grad, alpha, scale);
|
17 |
+
}
|
18 |
+
|
19 |
+
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
|
20 |
+
m.def("fused_bias_act", &fused_bias_act, "fused bias act (CUDA)");
|
21 |
+
}
|
face_model/op/fused_bias_act_kernel.cu
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
|
2 |
+
//
|
3 |
+
// This work==made available under the Nvidia Source Code License-NC.
|
4 |
+
// To view a copy of this license, visit
|
5 |
+
// https://nvlabs.github.io/stylegan2/license.html
|
6 |
+
|
7 |
+
#include <torch/types.h>
|
8 |
+
|
9 |
+
#include <ATen/ATen.h>
|
10 |
+
#include <ATen/AccumulateType.h>
|
11 |
+
#include <ATen/cuda/CUDAContext.h>
|
12 |
+
#include <ATen/cuda/CUDAApplyUtils.cuh>
|
13 |
+
|
14 |
+
#include <cuda.h>
|
15 |
+
#include <cuda_runtime.h>
|
16 |
+
|
17 |
+
|
18 |
+
template <typename scalar_t>
|
19 |
+
static __global__ void fused_bias_act_kernel(scalar_t* out, const scalar_t* p_x, const scalar_t* p_b, const scalar_t* p_ref,
|
20 |
+
int act, int grad, scalar_t alpha, scalar_t scale, int loop_x, int size_x, int step_b, int size_b, int use_bias, int use_ref) {
|
21 |
+
int xi = blockIdx.x * loop_x * blockDim.x + threadIdx.x;
|
22 |
+
|
23 |
+
scalar_t zero = 0.0;
|
24 |
+
|
25 |
+
for (int loop_idx = 0; loop_idx < loop_x && xi < size_x; loop_idx++, xi += blockDim.x) {
|
26 |
+
scalar_t x = p_x[xi];
|
27 |
+
|
28 |
+
if (use_bias) {
|
29 |
+
x += p_b[(xi / step_b) % size_b];
|
30 |
+
}
|
31 |
+
|
32 |
+
scalar_t ref = use_ref ? p_ref[xi] : zero;
|
33 |
+
|
34 |
+
scalar_t y;
|
35 |
+
|
36 |
+
switch (act * 10 + grad) {
|
37 |
+
default:
|
38 |
+
case 10: y = x; break;
|
39 |
+
case 11: y = x; break;
|
40 |
+
case 12: y = 0.0; break;
|
41 |
+
|
42 |
+
case 30: y = (x > 0.0) ? x : x * alpha; break;
|
43 |
+
case 31: y = (ref > 0.0) ? x : x * alpha; break;
|
44 |
+
case 32: y = 0.0; break;
|
45 |
+
}
|
46 |
+
|
47 |
+
out[xi] = y * scale;
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
|
52 |
+
torch::Tensor fused_bias_act_op(const torch::Tensor& input, const torch::Tensor& bias, const torch::Tensor& refer,
|
53 |
+
int act, int grad, float alpha, float scale) {
|
54 |
+
int curDevice = -1;
|
55 |
+
cudaGetDevice(&curDevice);
|
56 |
+
cudaStream_t stream = at::cuda::getCurrentCUDAStream(curDevice);
|
57 |
+
|
58 |
+
auto x = input.contiguous();
|
59 |
+
auto b = bias.contiguous();
|
60 |
+
auto ref = refer.contiguous();
|
61 |
+
|
62 |
+
int use_bias = b.numel() ? 1 : 0;
|
63 |
+
int use_ref = ref.numel() ? 1 : 0;
|
64 |
+
|
65 |
+
int size_x = x.numel();
|
66 |
+
int size_b = b.numel();
|
67 |
+
int step_b = 1;
|
68 |
+
|
69 |
+
for (int i = 1 + 1; i < x.dim(); i++) {
|
70 |
+
step_b *= x.size(i);
|
71 |
+
}
|
72 |
+
|
73 |
+
int loop_x = 4;
|
74 |
+
int block_size = 4 * 32;
|
75 |
+
int grid_size = (size_x - 1) / (loop_x * block_size) + 1;
|
76 |
+
|
77 |
+
auto y = torch::empty_like(x);
|
78 |
+
|
79 |
+
AT_DISPATCH_FLOATING_TYPES_AND_HALF(x.scalar_type(), "fused_bias_act_kernel", [&] {
|
80 |
+
fused_bias_act_kernel<scalar_t><<<grid_size, block_size, 0, stream>>>(
|
81 |
+
y.data_ptr<scalar_t>(),
|
82 |
+
x.data_ptr<scalar_t>(),
|
83 |
+
b.data_ptr<scalar_t>(),
|
84 |
+
ref.data_ptr<scalar_t>(),
|
85 |
+
act,
|
86 |
+
grad,
|
87 |
+
alpha,
|
88 |
+
scale,
|
89 |
+
loop_x,
|
90 |
+
size_x,
|
91 |
+
step_b,
|
92 |
+
size_b,
|
93 |
+
use_bias,
|
94 |
+
use_ref
|
95 |
+
);
|
96 |
+
});
|
97 |
+
|
98 |
+
return y;
|
99 |
+
}
|
face_model/op/upfirdn2d.cpp
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#include <torch/extension.h>
|
2 |
+
|
3 |
+
|
4 |
+
torch::Tensor upfirdn2d_op(const torch::Tensor& input, const torch::Tensor& kernel,
|
5 |
+
int up_x, int up_y, int down_x, int down_y,
|
6 |
+
int pad_x0, int pad_x1, int pad_y0, int pad_y1);
|
7 |
+
|
8 |
+
#define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor")
|
9 |
+
#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous")
|
10 |
+
#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)
|
11 |
+
|
12 |
+
torch::Tensor upfirdn2d(const torch::Tensor& input, const torch::Tensor& kernel,
|
13 |
+
int up_x, int up_y, int down_x, int down_y,
|
14 |
+
int pad_x0, int pad_x1, int pad_y0, int pad_y1) {
|
15 |
+
CHECK_CUDA(input);
|
16 |
+
CHECK_CUDA(kernel);
|
17 |
+
|
18 |
+
return upfirdn2d_op(input, kernel, up_x, up_y, down_x, down_y, pad_x0, pad_x1, pad_y0, pad_y1);
|
19 |
+
}
|
20 |
+
|
21 |
+
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
|
22 |
+
m.def("upfirdn2d", &upfirdn2d, "upfirdn2d (CUDA)");
|
23 |
+
}
|
face_model/op/upfirdn2d.py
ADDED
@@ -0,0 +1,193 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import platform
|
3 |
+
|
4 |
+
import torch
|
5 |
+
import torch.nn.functional as F
|
6 |
+
from torch.autograd import Function
|
7 |
+
from torch.utils.cpp_extension import load, _import_module_from_library
|
8 |
+
|
9 |
+
# if running GPEN without cuda, please comment line 10-18
|
10 |
+
if platform.system() == 'Linux' and torch.cuda.is_available():
|
11 |
+
module_path = os.path.dirname(__file__)
|
12 |
+
upfirdn2d_op = load(
|
13 |
+
'upfirdn2d',
|
14 |
+
sources=[
|
15 |
+
os.path.join(module_path, 'upfirdn2d.cpp'),
|
16 |
+
os.path.join(module_path, 'upfirdn2d_kernel.cu'),
|
17 |
+
],
|
18 |
+
)
|
19 |
+
|
20 |
+
|
21 |
+
#upfirdn2d_op = _import_module_from_library('upfirdn2d', '/tmp/torch_extensions/upfirdn2d', True)
|
22 |
+
|
23 |
+
class UpFirDn2dBackward(Function):
|
24 |
+
@staticmethod
|
25 |
+
def forward(
|
26 |
+
ctx, grad_output, kernel, grad_kernel, up, down, pad, g_pad, size, out_size
|
27 |
+
):
|
28 |
+
|
29 |
+
up_x, up_y = up
|
30 |
+
down_x, down_y = down
|
31 |
+
g_pad_x0, g_pad_x1, g_pad_y0, g_pad_y1 = g_pad
|
32 |
+
|
33 |
+
grad_output = grad_output.reshape(-1, out_size[0], out_size[1], 1)
|
34 |
+
|
35 |
+
grad_input = upfirdn2d_op.upfirdn2d(
|
36 |
+
grad_output,
|
37 |
+
grad_kernel,
|
38 |
+
down_x,
|
39 |
+
down_y,
|
40 |
+
up_x,
|
41 |
+
up_y,
|
42 |
+
g_pad_x0,
|
43 |
+
g_pad_x1,
|
44 |
+
g_pad_y0,
|
45 |
+
g_pad_y1,
|
46 |
+
)
|
47 |
+
grad_input = grad_input.view(size[0], size[1], size[2], size[3])
|
48 |
+
|
49 |
+
ctx.save_for_backward(kernel)
|
50 |
+
|
51 |
+
pad_x0, pad_x1, pad_y0, pad_y1 = pad
|
52 |
+
|
53 |
+
ctx.up_x = up_x
|
54 |
+
ctx.up_y = up_y
|
55 |
+
ctx.down_x = down_x
|
56 |
+
ctx.down_y = down_y
|
57 |
+
ctx.pad_x0 = pad_x0
|
58 |
+
ctx.pad_x1 = pad_x1
|
59 |
+
ctx.pad_y0 = pad_y0
|
60 |
+
ctx.pad_y1 = pad_y1
|
61 |
+
ctx.size = size
|
62 |
+
ctx.out_size = out_size
|
63 |
+
|
64 |
+
return grad_input
|
65 |
+
|
66 |
+
@staticmethod
|
67 |
+
def backward(ctx, gradgrad_input):
|
68 |
+
kernel, = ctx.saved_tensors
|
69 |
+
|
70 |
+
gradgrad_input = gradgrad_input.reshape(-1, ctx.size[2], ctx.size[3], 1)
|
71 |
+
|
72 |
+
gradgrad_out = upfirdn2d_op.upfirdn2d(
|
73 |
+
gradgrad_input,
|
74 |
+
kernel,
|
75 |
+
ctx.up_x,
|
76 |
+
ctx.up_y,
|
77 |
+
ctx.down_x,
|
78 |
+
ctx.down_y,
|
79 |
+
ctx.pad_x0,
|
80 |
+
ctx.pad_x1,
|
81 |
+
ctx.pad_y0,
|
82 |
+
ctx.pad_y1,
|
83 |
+
)
|
84 |
+
# gradgrad_out = gradgrad_out.view(ctx.size[0], ctx.out_size[0], ctx.out_size[1], ctx.size[3])
|
85 |
+
gradgrad_out = gradgrad_out.view(
|
86 |
+
ctx.size[0], ctx.size[1], ctx.out_size[0], ctx.out_size[1]
|
87 |
+
)
|
88 |
+
|
89 |
+
return gradgrad_out, None, None, None, None, None, None, None, None
|
90 |
+
|
91 |
+
|
92 |
+
class UpFirDn2d(Function):
|
93 |
+
@staticmethod
|
94 |
+
def forward(ctx, input, kernel, up, down, pad):
|
95 |
+
up_x, up_y = up
|
96 |
+
down_x, down_y = down
|
97 |
+
pad_x0, pad_x1, pad_y0, pad_y1 = pad
|
98 |
+
|
99 |
+
kernel_h, kernel_w = kernel.shape
|
100 |
+
batch, channel, in_h, in_w = input.shape
|
101 |
+
ctx.size = input.shape
|
102 |
+
|
103 |
+
input = input.reshape(-1, in_h, in_w, 1)
|
104 |
+
|
105 |
+
ctx.save_for_backward(kernel, torch.flip(kernel, [0, 1]))
|
106 |
+
|
107 |
+
out_h = (in_h * up_y + pad_y0 + pad_y1 - kernel_h) // down_y + 1
|
108 |
+
out_w = (in_w * up_x + pad_x0 + pad_x1 - kernel_w) // down_x + 1
|
109 |
+
ctx.out_size = (out_h, out_w)
|
110 |
+
|
111 |
+
ctx.up = (up_x, up_y)
|
112 |
+
ctx.down = (down_x, down_y)
|
113 |
+
ctx.pad = (pad_x0, pad_x1, pad_y0, pad_y1)
|
114 |
+
|
115 |
+
g_pad_x0 = kernel_w - pad_x0 - 1
|
116 |
+
g_pad_y0 = kernel_h - pad_y0 - 1
|
117 |
+
g_pad_x1 = in_w * up_x - out_w * down_x + pad_x0 - up_x + 1
|
118 |
+
g_pad_y1 = in_h * up_y - out_h * down_y + pad_y0 - up_y + 1
|
119 |
+
|
120 |
+
ctx.g_pad = (g_pad_x0, g_pad_x1, g_pad_y0, g_pad_y1)
|
121 |
+
|
122 |
+
out = upfirdn2d_op.upfirdn2d(
|
123 |
+
input, kernel, up_x, up_y, down_x, down_y, pad_x0, pad_x1, pad_y0, pad_y1
|
124 |
+
)
|
125 |
+
# out = out.view(major, out_h, out_w, minor)
|
126 |
+
out = out.view(-1, channel, out_h, out_w)
|
127 |
+
|
128 |
+
return out
|
129 |
+
|
130 |
+
@staticmethod
|
131 |
+
def backward(ctx, grad_output):
|
132 |
+
kernel, grad_kernel = ctx.saved_tensors
|
133 |
+
|
134 |
+
grad_input = UpFirDn2dBackward.apply(
|
135 |
+
grad_output,
|
136 |
+
kernel,
|
137 |
+
grad_kernel,
|
138 |
+
ctx.up,
|
139 |
+
ctx.down,
|
140 |
+
ctx.pad,
|
141 |
+
ctx.g_pad,
|
142 |
+
ctx.size,
|
143 |
+
ctx.out_size,
|
144 |
+
)
|
145 |
+
|
146 |
+
return grad_input, None, None, None, None
|
147 |
+
|
148 |
+
|
149 |
+
def upfirdn2d(input, kernel, up=1, down=1, pad=(0, 0), device='cpu'):
|
150 |
+
if platform.system() == 'Linux' and torch.cuda.is_available() and device != 'cpu':
|
151 |
+
out = UpFirDn2d.apply(
|
152 |
+
input, kernel, (up, up), (down, down), (pad[0], pad[1], pad[0], pad[1])
|
153 |
+
)
|
154 |
+
else:
|
155 |
+
out = upfirdn2d_native(input, kernel, up, up, down, down, pad[0], pad[1], pad[0], pad[1])
|
156 |
+
|
157 |
+
return out
|
158 |
+
|
159 |
+
|
160 |
+
def upfirdn2d_native(
|
161 |
+
input, kernel, up_x, up_y, down_x, down_y, pad_x0, pad_x1, pad_y0, pad_y1
|
162 |
+
):
|
163 |
+
input = input.permute(0, 2, 3, 1)
|
164 |
+
_, in_h, in_w, minor = input.shape
|
165 |
+
kernel_h, kernel_w = kernel.shape
|
166 |
+
out = input.view(-1, in_h, 1, in_w, 1, minor)
|
167 |
+
out = F.pad(out, [0, 0, 0, up_x - 1, 0, 0, 0, up_y - 1])
|
168 |
+
out = out.view(-1, in_h * up_y, in_w * up_x, minor)
|
169 |
+
|
170 |
+
out = F.pad(
|
171 |
+
out, [0, 0, max(pad_x0, 0), max(pad_x1, 0), max(pad_y0, 0), max(pad_y1, 0)]
|
172 |
+
)
|
173 |
+
out = out[
|
174 |
+
:,
|
175 |
+
max(-pad_y0, 0) : out.shape[1] - max(-pad_y1, 0),
|
176 |
+
max(-pad_x0, 0) : out.shape[2] - max(-pad_x1, 0),
|
177 |
+
:,
|
178 |
+
]
|
179 |
+
|
180 |
+
out = out.permute(0, 3, 1, 2)
|
181 |
+
out = out.reshape(
|
182 |
+
[-1, 1, in_h * up_y + pad_y0 + pad_y1, in_w * up_x + pad_x0 + pad_x1]
|
183 |
+
)
|
184 |
+
w = torch.flip(kernel, [0, 1]).view(1, 1, kernel_h, kernel_w)
|
185 |
+
out = F.conv2d(out, w)
|
186 |
+
out = out.reshape(
|
187 |
+
-1,
|
188 |
+
minor,
|
189 |
+
in_h * up_y + pad_y0 + pad_y1 - kernel_h + 1,
|
190 |
+
in_w * up_x + pad_x0 + pad_x1 - kernel_w + 1,
|
191 |
+
)
|
192 |
+
# out = out.permute(0, 2, 3, 1)
|
193 |
+
return out[:, :, ::down_y, ::down_x]
|
face_model/op/upfirdn2d_kernel.cu
ADDED
@@ -0,0 +1,272 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
|
2 |
+
//
|
3 |
+
// This work==made available under the Nvidia Source Code License-NC.
|
4 |
+
// To view a copy of this license, visit
|
5 |
+
// https://nvlabs.github.io/stylegan2/license.html
|
6 |
+
|
7 |
+
#include <torch/types.h>
|
8 |
+
|
9 |
+
#include <ATen/ATen.h>
|
10 |
+
#include <ATen/AccumulateType.h>
|
11 |
+
#include <ATen/cuda/CUDAContext.h>
|
12 |
+
#include <ATen/cuda/CUDAApplyUtils.cuh>
|
13 |
+
|
14 |
+
#include <cuda.h>
|
15 |
+
#include <cuda_runtime.h>
|
16 |
+
|
17 |
+
|
18 |
+
static __host__ __device__ __forceinline__ int floor_div(int a, int b) {
|
19 |
+
int c = a / b;
|
20 |
+
|
21 |
+
if (c * b > a) {
|
22 |
+
c--;
|
23 |
+
}
|
24 |
+
|
25 |
+
return c;
|
26 |
+
}
|
27 |
+
|
28 |
+
|
29 |
+
struct UpFirDn2DKernelParams {
|
30 |
+
int up_x;
|
31 |
+
int up_y;
|
32 |
+
int down_x;
|
33 |
+
int down_y;
|
34 |
+
int pad_x0;
|
35 |
+
int pad_x1;
|
36 |
+
int pad_y0;
|
37 |
+
int pad_y1;
|
38 |
+
|
39 |
+
int major_dim;
|
40 |
+
int in_h;
|
41 |
+
int in_w;
|
42 |
+
int minor_dim;
|
43 |
+
int kernel_h;
|
44 |
+
int kernel_w;
|
45 |
+
int out_h;
|
46 |
+
int out_w;
|
47 |
+
int loop_major;
|
48 |
+
int loop_x;
|
49 |
+
};
|
50 |
+
|
51 |
+
|
52 |
+
template <typename scalar_t, int up_x, int up_y, int down_x, int down_y, int kernel_h, int kernel_w, int tile_out_h, int tile_out_w>
|
53 |
+
__global__ void upfirdn2d_kernel(scalar_t* out, const scalar_t* input, const scalar_t* kernel, const UpFirDn2DKernelParams p) {
|
54 |
+
const int tile_in_h = ((tile_out_h - 1) * down_y + kernel_h - 1) / up_y + 1;
|
55 |
+
const int tile_in_w = ((tile_out_w - 1) * down_x + kernel_w - 1) / up_x + 1;
|
56 |
+
|
57 |
+
__shared__ volatile float sk[kernel_h][kernel_w];
|
58 |
+
__shared__ volatile float sx[tile_in_h][tile_in_w];
|
59 |
+
|
60 |
+
int minor_idx = blockIdx.x;
|
61 |
+
int tile_out_y = minor_idx / p.minor_dim;
|
62 |
+
minor_idx -= tile_out_y * p.minor_dim;
|
63 |
+
tile_out_y *= tile_out_h;
|
64 |
+
int tile_out_x_base = blockIdx.y * p.loop_x * tile_out_w;
|
65 |
+
int major_idx_base = blockIdx.z * p.loop_major;
|
66 |
+
|
67 |
+
if (tile_out_x_base >= p.out_w | tile_out_y >= p.out_h | major_idx_base >= p.major_dim) {
|
68 |
+
return;
|
69 |
+
}
|
70 |
+
|
71 |
+
for (int tap_idx = threadIdx.x; tap_idx < kernel_h * kernel_w; tap_idx += blockDim.x) {
|
72 |
+
int ky = tap_idx / kernel_w;
|
73 |
+
int kx = tap_idx - ky * kernel_w;
|
74 |
+
scalar_t v = 0.0;
|
75 |
+
|
76 |
+
if (kx < p.kernel_w & ky < p.kernel_h) {
|
77 |
+
v = kernel[(p.kernel_h - 1 - ky) * p.kernel_w + (p.kernel_w - 1 - kx)];
|
78 |
+
}
|
79 |
+
|
80 |
+
sk[ky][kx] = v;
|
81 |
+
}
|
82 |
+
|
83 |
+
for (int loop_major = 0, major_idx = major_idx_base; loop_major < p.loop_major & major_idx < p.major_dim; loop_major++, major_idx++) {
|
84 |
+
for (int loop_x = 0, tile_out_x = tile_out_x_base; loop_x < p.loop_x & tile_out_x < p.out_w; loop_x++, tile_out_x += tile_out_w) {
|
85 |
+
int tile_mid_x = tile_out_x * down_x + up_x - 1 - p.pad_x0;
|
86 |
+
int tile_mid_y = tile_out_y * down_y + up_y - 1 - p.pad_y0;
|
87 |
+
int tile_in_x = floor_div(tile_mid_x, up_x);
|
88 |
+
int tile_in_y = floor_div(tile_mid_y, up_y);
|
89 |
+
|
90 |
+
__syncthreads();
|
91 |
+
|
92 |
+
for (int in_idx = threadIdx.x; in_idx < tile_in_h * tile_in_w; in_idx += blockDim.x) {
|
93 |
+
int rel_in_y = in_idx / tile_in_w;
|
94 |
+
int rel_in_x = in_idx - rel_in_y * tile_in_w;
|
95 |
+
int in_x = rel_in_x + tile_in_x;
|
96 |
+
int in_y = rel_in_y + tile_in_y;
|
97 |
+
|
98 |
+
scalar_t v = 0.0;
|
99 |
+
|
100 |
+
if (in_x >= 0 & in_y >= 0 & in_x < p.in_w & in_y < p.in_h) {
|
101 |
+
v = input[((major_idx * p.in_h + in_y) * p.in_w + in_x) * p.minor_dim + minor_idx];
|
102 |
+
}
|
103 |
+
|
104 |
+
sx[rel_in_y][rel_in_x] = v;
|
105 |
+
}
|
106 |
+
|
107 |
+
__syncthreads();
|
108 |
+
for (int out_idx = threadIdx.x; out_idx < tile_out_h * tile_out_w; out_idx += blockDim.x) {
|
109 |
+
int rel_out_y = out_idx / tile_out_w;
|
110 |
+
int rel_out_x = out_idx - rel_out_y * tile_out_w;
|
111 |
+
int out_x = rel_out_x + tile_out_x;
|
112 |
+
int out_y = rel_out_y + tile_out_y;
|
113 |
+
|
114 |
+
int mid_x = tile_mid_x + rel_out_x * down_x;
|
115 |
+
int mid_y = tile_mid_y + rel_out_y * down_y;
|
116 |
+
int in_x = floor_div(mid_x, up_x);
|
117 |
+
int in_y = floor_div(mid_y, up_y);
|
118 |
+
int rel_in_x = in_x - tile_in_x;
|
119 |
+
int rel_in_y = in_y - tile_in_y;
|
120 |
+
int kernel_x = (in_x + 1) * up_x - mid_x - 1;
|
121 |
+
int kernel_y = (in_y + 1) * up_y - mid_y - 1;
|
122 |
+
|
123 |
+
scalar_t v = 0.0;
|
124 |
+
|
125 |
+
#pragma unroll
|
126 |
+
for (int y = 0; y < kernel_h / up_y; y++)
|
127 |
+
#pragma unroll
|
128 |
+
for (int x = 0; x < kernel_w / up_x; x++)
|
129 |
+
v += sx[rel_in_y + y][rel_in_x + x] * sk[kernel_y + y * up_y][kernel_x + x * up_x];
|
130 |
+
|
131 |
+
if (out_x < p.out_w & out_y < p.out_h) {
|
132 |
+
out[((major_idx * p.out_h + out_y) * p.out_w + out_x) * p.minor_dim + minor_idx] = v;
|
133 |
+
}
|
134 |
+
}
|
135 |
+
}
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
|
140 |
+
torch::Tensor upfirdn2d_op(const torch::Tensor& input, const torch::Tensor& kernel,
|
141 |
+
int up_x, int up_y, int down_x, int down_y,
|
142 |
+
int pad_x0, int pad_x1, int pad_y0, int pad_y1) {
|
143 |
+
int curDevice = -1;
|
144 |
+
cudaGetDevice(&curDevice);
|
145 |
+
cudaStream_t stream = at::cuda::getCurrentCUDAStream(curDevice);
|
146 |
+
|
147 |
+
UpFirDn2DKernelParams p;
|
148 |
+
|
149 |
+
auto x = input.contiguous();
|
150 |
+
auto k = kernel.contiguous();
|
151 |
+
|
152 |
+
p.major_dim = x.size(0);
|
153 |
+
p.in_h = x.size(1);
|
154 |
+
p.in_w = x.size(2);
|
155 |
+
p.minor_dim = x.size(3);
|
156 |
+
p.kernel_h = k.size(0);
|
157 |
+
p.kernel_w = k.size(1);
|
158 |
+
p.up_x = up_x;
|
159 |
+
p.up_y = up_y;
|
160 |
+
p.down_x = down_x;
|
161 |
+
p.down_y = down_y;
|
162 |
+
p.pad_x0 = pad_x0;
|
163 |
+
p.pad_x1 = pad_x1;
|
164 |
+
p.pad_y0 = pad_y0;
|
165 |
+
p.pad_y1 = pad_y1;
|
166 |
+
|
167 |
+
p.out_h = (p.in_h * p.up_y + p.pad_y0 + p.pad_y1 - p.kernel_h + p.down_y) / p.down_y;
|
168 |
+
p.out_w = (p.in_w * p.up_x + p.pad_x0 + p.pad_x1 - p.kernel_w + p.down_x) / p.down_x;
|
169 |
+
|
170 |
+
auto out = at::empty({p.major_dim, p.out_h, p.out_w, p.minor_dim}, x.options());
|
171 |
+
|
172 |
+
int mode = -1;
|
173 |
+
|
174 |
+
int tile_out_h;
|
175 |
+
int tile_out_w;
|
176 |
+
|
177 |
+
if (p.up_x == 1 && p.up_y == 1 && p.down_x == 1 && p.down_y == 1 && p.kernel_h <= 4 && p.kernel_w <= 4) {
|
178 |
+
mode = 1;
|
179 |
+
tile_out_h = 16;
|
180 |
+
tile_out_w = 64;
|
181 |
+
}
|
182 |
+
|
183 |
+
if (p.up_x == 1 && p.up_y == 1 && p.down_x == 1 && p.down_y == 1 && p.kernel_h <= 3 && p.kernel_w <= 3) {
|
184 |
+
mode = 2;
|
185 |
+
tile_out_h = 16;
|
186 |
+
tile_out_w = 64;
|
187 |
+
}
|
188 |
+
|
189 |
+
if (p.up_x == 2 && p.up_y == 2 && p.down_x == 1 && p.down_y == 1 && p.kernel_h <= 4 && p.kernel_w <= 4) {
|
190 |
+
mode = 3;
|
191 |
+
tile_out_h = 16;
|
192 |
+
tile_out_w = 64;
|
193 |
+
}
|
194 |
+
|
195 |
+
if (p.up_x == 2 && p.up_y == 2 && p.down_x == 1 && p.down_y == 1 && p.kernel_h <= 2 && p.kernel_w <= 2) {
|
196 |
+
mode = 4;
|
197 |
+
tile_out_h = 16;
|
198 |
+
tile_out_w = 64;
|
199 |
+
}
|
200 |
+
|
201 |
+
if (p.up_x == 1 && p.up_y == 1 && p.down_x == 2 && p.down_y == 2 && p.kernel_h <= 4 && p.kernel_w <= 4) {
|
202 |
+
mode = 5;
|
203 |
+
tile_out_h = 8;
|
204 |
+
tile_out_w = 32;
|
205 |
+
}
|
206 |
+
|
207 |
+
if (p.up_x == 1 && p.up_y == 1 && p.down_x == 2 && p.down_y == 2 && p.kernel_h <= 2 && p.kernel_w <= 2) {
|
208 |
+
mode = 6;
|
209 |
+
tile_out_h = 8;
|
210 |
+
tile_out_w = 32;
|
211 |
+
}
|
212 |
+
|
213 |
+
dim3 block_size;
|
214 |
+
dim3 grid_size;
|
215 |
+
|
216 |
+
if (tile_out_h > 0 && tile_out_w) {
|
217 |
+
p.loop_major = (p.major_dim - 1) / 16384 + 1;
|
218 |
+
p.loop_x = 1;
|
219 |
+
block_size = dim3(32 * 8, 1, 1);
|
220 |
+
grid_size = dim3(((p.out_h - 1) / tile_out_h + 1) * p.minor_dim,
|
221 |
+
(p.out_w - 1) / (p.loop_x * tile_out_w) + 1,
|
222 |
+
(p.major_dim - 1) / p.loop_major + 1);
|
223 |
+
}
|
224 |
+
|
225 |
+
AT_DISPATCH_FLOATING_TYPES_AND_HALF(x.scalar_type(), "upfirdn2d_cuda", [&] {
|
226 |
+
switch (mode) {
|
227 |
+
case 1:
|
228 |
+
upfirdn2d_kernel<scalar_t, 1, 1, 1, 1, 4, 4, 16, 64><<<grid_size, block_size, 0, stream>>>(
|
229 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
230 |
+
);
|
231 |
+
|
232 |
+
break;
|
233 |
+
|
234 |
+
case 2:
|
235 |
+
upfirdn2d_kernel<scalar_t, 1, 1, 1, 1, 3, 3, 16, 64><<<grid_size, block_size, 0, stream>>>(
|
236 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
237 |
+
);
|
238 |
+
|
239 |
+
break;
|
240 |
+
|
241 |
+
case 3:
|
242 |
+
upfirdn2d_kernel<scalar_t, 2, 2, 1, 1, 4, 4, 16, 64><<<grid_size, block_size, 0, stream>>>(
|
243 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
244 |
+
);
|
245 |
+
|
246 |
+
break;
|
247 |
+
|
248 |
+
case 4:
|
249 |
+
upfirdn2d_kernel<scalar_t, 2, 2, 1, 1, 2, 2, 16, 64><<<grid_size, block_size, 0, stream>>>(
|
250 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
251 |
+
);
|
252 |
+
|
253 |
+
break;
|
254 |
+
|
255 |
+
case 5:
|
256 |
+
upfirdn2d_kernel<scalar_t, 1, 1, 2, 2, 4, 4, 8, 32><<<grid_size, block_size, 0, stream>>>(
|
257 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
258 |
+
);
|
259 |
+
|
260 |
+
break;
|
261 |
+
|
262 |
+
case 6:
|
263 |
+
upfirdn2d_kernel<scalar_t, 1, 1, 2, 2, 4, 4, 8, 32><<<grid_size, block_size, 0, stream>>>(
|
264 |
+
out.data_ptr<scalar_t>(), x.data_ptr<scalar_t>(), k.data_ptr<scalar_t>(), p
|
265 |
+
);
|
266 |
+
|
267 |
+
break;
|
268 |
+
}
|
269 |
+
});
|
270 |
+
|
271 |
+
return out;
|
272 |
+
}
|
inpainting.png
ADDED
Git LFS Details
|
requirements.txt
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
ninja
|
2 |
+
torch
|
3 |
+
torchvision==0.12.0
|
4 |
+
opencv-python
|
5 |
+
numpy
|
6 |
+
scikit-image
|
7 |
+
pillow
|
8 |
+
scikit-learn
|
9 |
+
joblib
|
retinaface/.DS_Store
ADDED
Binary file (12.3 kB). View file
|
|
retinaface/data/FDDB/img_list.txt
ADDED
@@ -0,0 +1,2845 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
2002/08/11/big/img_591
|
2 |
+
2002/08/26/big/img_265
|
3 |
+
2002/07/19/big/img_423
|
4 |
+
2002/08/24/big/img_490
|
5 |
+
2002/08/31/big/img_17676
|
6 |
+
2002/07/31/big/img_228
|
7 |
+
2002/07/24/big/img_402
|
8 |
+
2002/08/04/big/img_769
|
9 |
+
2002/07/19/big/img_581
|
10 |
+
2002/08/13/big/img_723
|
11 |
+
2002/08/12/big/img_821
|
12 |
+
2003/01/17/big/img_610
|
13 |
+
2002/08/13/big/img_1116
|
14 |
+
2002/08/28/big/img_19238
|
15 |
+
2002/08/21/big/img_660
|
16 |
+
2002/08/14/big/img_607
|
17 |
+
2002/08/05/big/img_3708
|
18 |
+
2002/08/19/big/img_511
|
19 |
+
2002/08/07/big/img_1316
|
20 |
+
2002/07/25/big/img_1047
|
21 |
+
2002/07/23/big/img_474
|
22 |
+
2002/07/27/big/img_970
|
23 |
+
2002/09/02/big/img_15752
|
24 |
+
2002/09/01/big/img_16378
|
25 |
+
2002/09/01/big/img_16189
|
26 |
+
2002/08/26/big/img_276
|
27 |
+
2002/07/24/big/img_518
|
28 |
+
2002/08/14/big/img_1027
|
29 |
+
2002/08/24/big/img_733
|
30 |
+
2002/08/15/big/img_249
|
31 |
+
2003/01/15/big/img_1371
|
32 |
+
2002/08/07/big/img_1348
|
33 |
+
2003/01/01/big/img_331
|
34 |
+
2002/08/23/big/img_536
|
35 |
+
2002/07/30/big/img_224
|
36 |
+
2002/08/10/big/img_763
|
37 |
+
2002/08/21/big/img_293
|
38 |
+
2002/08/15/big/img_1211
|
39 |
+
2002/08/15/big/img_1194
|
40 |
+
2003/01/15/big/img_390
|
41 |
+
2002/08/06/big/img_2893
|
42 |
+
2002/08/17/big/img_691
|
43 |
+
2002/08/07/big/img_1695
|
44 |
+
2002/08/16/big/img_829
|
45 |
+
2002/07/25/big/img_201
|
46 |
+
2002/08/23/big/img_36
|
47 |
+
2003/01/15/big/img_763
|
48 |
+
2003/01/15/big/img_637
|
49 |
+
2002/08/22/big/img_592
|
50 |
+
2002/07/25/big/img_817
|
51 |
+
2003/01/15/big/img_1219
|
52 |
+
2002/08/05/big/img_3508
|
53 |
+
2002/08/15/big/img_1108
|
54 |
+
2002/07/19/big/img_488
|
55 |
+
2003/01/16/big/img_704
|
56 |
+
2003/01/13/big/img_1087
|
57 |
+
2002/08/10/big/img_670
|
58 |
+
2002/07/24/big/img_104
|
59 |
+
2002/08/27/big/img_19823
|
60 |
+
2002/09/01/big/img_16229
|
61 |
+
2003/01/13/big/img_846
|
62 |
+
2002/08/04/big/img_412
|
63 |
+
2002/07/22/big/img_554
|
64 |
+
2002/08/12/big/img_331
|
65 |
+
2002/08/02/big/img_533
|
66 |
+
2002/08/12/big/img_259
|
67 |
+
2002/08/18/big/img_328
|
68 |
+
2003/01/14/big/img_630
|
69 |
+
2002/08/05/big/img_3541
|
70 |
+
2002/08/06/big/img_2390
|
71 |
+
2002/08/20/big/img_150
|
72 |
+
2002/08/02/big/img_1231
|
73 |
+
2002/08/16/big/img_710
|
74 |
+
2002/08/19/big/img_591
|
75 |
+
2002/07/22/big/img_725
|
76 |
+
2002/07/24/big/img_820
|
77 |
+
2003/01/13/big/img_568
|
78 |
+
2002/08/22/big/img_853
|
79 |
+
2002/08/09/big/img_648
|
80 |
+
2002/08/23/big/img_528
|
81 |
+
2003/01/14/big/img_888
|
82 |
+
2002/08/30/big/img_18201
|
83 |
+
2002/08/13/big/img_965
|
84 |
+
2003/01/14/big/img_660
|
85 |
+
2002/07/19/big/img_517
|
86 |
+
2003/01/14/big/img_406
|
87 |
+
2002/08/30/big/img_18433
|
88 |
+
2002/08/07/big/img_1630
|
89 |
+
2002/08/06/big/img_2717
|
90 |
+
2002/08/21/big/img_470
|
91 |
+
2002/07/23/big/img_633
|
92 |
+
2002/08/20/big/img_915
|
93 |
+
2002/08/16/big/img_893
|
94 |
+
2002/07/29/big/img_644
|
95 |
+
2002/08/15/big/img_529
|
96 |
+
2002/08/16/big/img_668
|
97 |
+
2002/08/07/big/img_1871
|
98 |
+
2002/07/25/big/img_192
|
99 |
+
2002/07/31/big/img_961
|
100 |
+
2002/08/19/big/img_738
|
101 |
+
2002/07/31/big/img_382
|
102 |
+
2002/08/19/big/img_298
|
103 |
+
2003/01/17/big/img_608
|
104 |
+
2002/08/21/big/img_514
|
105 |
+
2002/07/23/big/img_183
|
106 |
+
2003/01/17/big/img_536
|
107 |
+
2002/07/24/big/img_478
|
108 |
+
2002/08/06/big/img_2997
|
109 |
+
2002/09/02/big/img_15380
|
110 |
+
2002/08/07/big/img_1153
|
111 |
+
2002/07/31/big/img_967
|
112 |
+
2002/07/31/big/img_711
|
113 |
+
2002/08/26/big/img_664
|
114 |
+
2003/01/01/big/img_326
|
115 |
+
2002/08/24/big/img_775
|
116 |
+
2002/08/08/big/img_961
|
117 |
+
2002/08/16/big/img_77
|
118 |
+
2002/08/12/big/img_296
|
119 |
+
2002/07/22/big/img_905
|
120 |
+
2003/01/13/big/img_284
|
121 |
+
2002/08/13/big/img_887
|
122 |
+
2002/08/24/big/img_849
|
123 |
+
2002/07/30/big/img_345
|
124 |
+
2002/08/18/big/img_419
|
125 |
+
2002/08/01/big/img_1347
|
126 |
+
2002/08/05/big/img_3670
|
127 |
+
2002/07/21/big/img_479
|
128 |
+
2002/08/08/big/img_913
|
129 |
+
2002/09/02/big/img_15828
|
130 |
+
2002/08/30/big/img_18194
|
131 |
+
2002/08/08/big/img_471
|
132 |
+
2002/08/22/big/img_734
|
133 |
+
2002/08/09/big/img_586
|
134 |
+
2002/08/09/big/img_454
|
135 |
+
2002/07/29/big/img_47
|
136 |
+
2002/07/19/big/img_381
|
137 |
+
2002/07/29/big/img_733
|
138 |
+
2002/08/20/big/img_327
|
139 |
+
2002/07/21/big/img_96
|
140 |
+
2002/08/06/big/img_2680
|
141 |
+
2002/07/25/big/img_919
|
142 |
+
2002/07/21/big/img_158
|
143 |
+
2002/07/22/big/img_801
|
144 |
+
2002/07/22/big/img_567
|
145 |
+
2002/07/24/big/img_804
|
146 |
+
2002/07/24/big/img_690
|
147 |
+
2003/01/15/big/img_576
|
148 |
+
2002/08/14/big/img_335
|
149 |
+
2003/01/13/big/img_390
|
150 |
+
2002/08/11/big/img_258
|
151 |
+
2002/07/23/big/img_917
|
152 |
+
2002/08/15/big/img_525
|
153 |
+
2003/01/15/big/img_505
|
154 |
+
2002/07/30/big/img_886
|
155 |
+
2003/01/16/big/img_640
|
156 |
+
2003/01/14/big/img_642
|
157 |
+
2003/01/17/big/img_844
|
158 |
+
2002/08/04/big/img_571
|
159 |
+
2002/08/29/big/img_18702
|
160 |
+
2003/01/15/big/img_240
|
161 |
+
2002/07/29/big/img_553
|
162 |
+
2002/08/10/big/img_354
|
163 |
+
2002/08/18/big/img_17
|
164 |
+
2003/01/15/big/img_782
|
165 |
+
2002/07/27/big/img_382
|
166 |
+
2002/08/14/big/img_970
|
167 |
+
2003/01/16/big/img_70
|
168 |
+
2003/01/16/big/img_625
|
169 |
+
2002/08/18/big/img_341
|
170 |
+
2002/08/26/big/img_188
|
171 |
+
2002/08/09/big/img_405
|
172 |
+
2002/08/02/big/img_37
|
173 |
+
2002/08/13/big/img_748
|
174 |
+
2002/07/22/big/img_399
|
175 |
+
2002/07/25/big/img_844
|
176 |
+
2002/08/12/big/img_340
|
177 |
+
2003/01/13/big/img_815
|
178 |
+
2002/08/26/big/img_5
|
179 |
+
2002/08/10/big/img_158
|
180 |
+
2002/08/18/big/img_95
|
181 |
+
2002/07/29/big/img_1297
|
182 |
+
2003/01/13/big/img_508
|
183 |
+
2002/09/01/big/img_16680
|
184 |
+
2003/01/16/big/img_338
|
185 |
+
2002/08/13/big/img_517
|
186 |
+
2002/07/22/big/img_626
|
187 |
+
2002/08/06/big/img_3024
|
188 |
+
2002/07/26/big/img_499
|
189 |
+
2003/01/13/big/img_387
|
190 |
+
2002/08/31/big/img_18025
|
191 |
+
2002/08/13/big/img_520
|
192 |
+
2003/01/16/big/img_576
|
193 |
+
2002/07/26/big/img_121
|
194 |
+
2002/08/25/big/img_703
|
195 |
+
2002/08/26/big/img_615
|
196 |
+
2002/08/17/big/img_434
|
197 |
+
2002/08/02/big/img_677
|
198 |
+
2002/08/18/big/img_276
|
199 |
+
2002/08/05/big/img_3672
|
200 |
+
2002/07/26/big/img_700
|
201 |
+
2002/07/31/big/img_277
|
202 |
+
2003/01/14/big/img_220
|
203 |
+
2002/08/23/big/img_232
|
204 |
+
2002/08/31/big/img_17422
|
205 |
+
2002/07/22/big/img_508
|
206 |
+
2002/08/13/big/img_681
|
207 |
+
2003/01/15/big/img_638
|
208 |
+
2002/08/30/big/img_18408
|
209 |
+
2003/01/14/big/img_533
|
210 |
+
2003/01/17/big/img_12
|
211 |
+
2002/08/28/big/img_19388
|
212 |
+
2002/08/08/big/img_133
|
213 |
+
2002/07/26/big/img_885
|
214 |
+
2002/08/19/big/img_387
|
215 |
+
2002/08/27/big/img_19976
|
216 |
+
2002/08/26/big/img_118
|
217 |
+
2002/08/28/big/img_19146
|
218 |
+
2002/08/05/big/img_3259
|
219 |
+
2002/08/15/big/img_536
|
220 |
+
2002/07/22/big/img_279
|
221 |
+
2002/07/22/big/img_9
|
222 |
+
2002/08/13/big/img_301
|
223 |
+
2002/08/15/big/img_974
|
224 |
+
2002/08/06/big/img_2355
|
225 |
+
2002/08/01/big/img_1526
|
226 |
+
2002/08/03/big/img_417
|
227 |
+
2002/08/04/big/img_407
|
228 |
+
2002/08/15/big/img_1029
|
229 |
+
2002/07/29/big/img_700
|
230 |
+
2002/08/01/big/img_1463
|
231 |
+
2002/08/31/big/img_17365
|
232 |
+
2002/07/28/big/img_223
|
233 |
+
2002/07/19/big/img_827
|
234 |
+
2002/07/27/big/img_531
|
235 |
+
2002/07/19/big/img_845
|
236 |
+
2002/08/20/big/img_382
|
237 |
+
2002/07/31/big/img_268
|
238 |
+
2002/08/27/big/img_19705
|
239 |
+
2002/08/02/big/img_830
|
240 |
+
2002/08/23/big/img_250
|
241 |
+
2002/07/20/big/img_777
|
242 |
+
2002/08/21/big/img_879
|
243 |
+
2002/08/26/big/img_20146
|
244 |
+
2002/08/23/big/img_789
|
245 |
+
2002/08/06/big/img_2683
|
246 |
+
2002/08/25/big/img_576
|
247 |
+
2002/08/09/big/img_498
|
248 |
+
2002/08/08/big/img_384
|
249 |
+
2002/08/26/big/img_592
|
250 |
+
2002/07/29/big/img_1470
|
251 |
+
2002/08/21/big/img_452
|
252 |
+
2002/08/30/big/img_18395
|
253 |
+
2002/08/15/big/img_215
|
254 |
+
2002/07/21/big/img_643
|
255 |
+
2002/07/22/big/img_209
|
256 |
+
2003/01/17/big/img_346
|
257 |
+
2002/08/25/big/img_658
|
258 |
+
2002/08/21/big/img_221
|
259 |
+
2002/08/14/big/img_60
|
260 |
+
2003/01/17/big/img_885
|
261 |
+
2003/01/16/big/img_482
|
262 |
+
2002/08/19/big/img_593
|
263 |
+
2002/08/08/big/img_233
|
264 |
+
2002/07/30/big/img_458
|
265 |
+
2002/07/23/big/img_384
|
266 |
+
2003/01/15/big/img_670
|
267 |
+
2003/01/15/big/img_267
|
268 |
+
2002/08/26/big/img_540
|
269 |
+
2002/07/29/big/img_552
|
270 |
+
2002/07/30/big/img_997
|
271 |
+
2003/01/17/big/img_377
|
272 |
+
2002/08/21/big/img_265
|
273 |
+
2002/08/09/big/img_561
|
274 |
+
2002/07/31/big/img_945
|
275 |
+
2002/09/02/big/img_15252
|
276 |
+
2002/08/11/big/img_276
|
277 |
+
2002/07/22/big/img_491
|
278 |
+
2002/07/26/big/img_517
|
279 |
+
2002/08/14/big/img_726
|
280 |
+
2002/08/08/big/img_46
|
281 |
+
2002/08/28/big/img_19458
|
282 |
+
2002/08/06/big/img_2935
|
283 |
+
2002/07/29/big/img_1392
|
284 |
+
2002/08/13/big/img_776
|
285 |
+
2002/08/24/big/img_616
|
286 |
+
2002/08/14/big/img_1065
|
287 |
+
2002/07/29/big/img_889
|
288 |
+
2002/08/18/big/img_188
|
289 |
+
2002/08/07/big/img_1453
|
290 |
+
2002/08/02/big/img_760
|
291 |
+
2002/07/28/big/img_416
|
292 |
+
2002/08/07/big/img_1393
|
293 |
+
2002/08/26/big/img_292
|
294 |
+
2002/08/26/big/img_301
|
295 |
+
2003/01/13/big/img_195
|
296 |
+
2002/07/26/big/img_532
|
297 |
+
2002/08/20/big/img_550
|
298 |
+
2002/08/05/big/img_3658
|
299 |
+
2002/08/26/big/img_738
|
300 |
+
2002/09/02/big/img_15750
|
301 |
+
2003/01/17/big/img_451
|
302 |
+
2002/07/23/big/img_339
|
303 |
+
2002/08/16/big/img_637
|
304 |
+
2002/08/14/big/img_748
|
305 |
+
2002/08/06/big/img_2739
|
306 |
+
2002/07/25/big/img_482
|
307 |
+
2002/08/19/big/img_191
|
308 |
+
2002/08/26/big/img_537
|
309 |
+
2003/01/15/big/img_716
|
310 |
+
2003/01/15/big/img_767
|
311 |
+
2002/08/02/big/img_452
|
312 |
+
2002/08/08/big/img_1011
|
313 |
+
2002/08/10/big/img_144
|
314 |
+
2003/01/14/big/img_122
|
315 |
+
2002/07/24/big/img_586
|
316 |
+
2002/07/24/big/img_762
|
317 |
+
2002/08/20/big/img_369
|
318 |
+
2002/07/30/big/img_146
|
319 |
+
2002/08/23/big/img_396
|
320 |
+
2003/01/15/big/img_200
|
321 |
+
2002/08/15/big/img_1183
|
322 |
+
2003/01/14/big/img_698
|
323 |
+
2002/08/09/big/img_792
|
324 |
+
2002/08/06/big/img_2347
|
325 |
+
2002/07/31/big/img_911
|
326 |
+
2002/08/26/big/img_722
|
327 |
+
2002/08/23/big/img_621
|
328 |
+
2002/08/05/big/img_3790
|
329 |
+
2003/01/13/big/img_633
|
330 |
+
2002/08/09/big/img_224
|
331 |
+
2002/07/24/big/img_454
|
332 |
+
2002/07/21/big/img_202
|
333 |
+
2002/08/02/big/img_630
|
334 |
+
2002/08/30/big/img_18315
|
335 |
+
2002/07/19/big/img_491
|
336 |
+
2002/09/01/big/img_16456
|
337 |
+
2002/08/09/big/img_242
|
338 |
+
2002/07/25/big/img_595
|
339 |
+
2002/07/22/big/img_522
|
340 |
+
2002/08/01/big/img_1593
|
341 |
+
2002/07/29/big/img_336
|
342 |
+
2002/08/15/big/img_448
|
343 |
+
2002/08/28/big/img_19281
|
344 |
+
2002/07/29/big/img_342
|
345 |
+
2002/08/12/big/img_78
|
346 |
+
2003/01/14/big/img_525
|
347 |
+
2002/07/28/big/img_147
|
348 |
+
2002/08/11/big/img_353
|
349 |
+
2002/08/22/big/img_513
|
350 |
+
2002/08/04/big/img_721
|
351 |
+
2002/08/17/big/img_247
|
352 |
+
2003/01/14/big/img_891
|
353 |
+
2002/08/20/big/img_853
|
354 |
+
2002/07/19/big/img_414
|
355 |
+
2002/08/01/big/img_1530
|
356 |
+
2003/01/14/big/img_924
|
357 |
+
2002/08/22/big/img_468
|
358 |
+
2002/08/18/big/img_354
|
359 |
+
2002/08/30/big/img_18193
|
360 |
+
2002/08/23/big/img_492
|
361 |
+
2002/08/15/big/img_871
|
362 |
+
2002/08/12/big/img_494
|
363 |
+
2002/08/06/big/img_2470
|
364 |
+
2002/07/23/big/img_923
|
365 |
+
2002/08/26/big/img_155
|
366 |
+
2002/08/08/big/img_669
|
367 |
+
2002/07/23/big/img_404
|
368 |
+
2002/08/28/big/img_19421
|
369 |
+
2002/08/29/big/img_18993
|
370 |
+
2002/08/25/big/img_416
|
371 |
+
2003/01/17/big/img_434
|
372 |
+
2002/07/29/big/img_1370
|
373 |
+
2002/07/28/big/img_483
|
374 |
+
2002/08/11/big/img_50
|
375 |
+
2002/08/10/big/img_404
|
376 |
+
2002/09/02/big/img_15057
|
377 |
+
2003/01/14/big/img_911
|
378 |
+
2002/09/01/big/img_16697
|
379 |
+
2003/01/16/big/img_665
|
380 |
+
2002/09/01/big/img_16708
|
381 |
+
2002/08/22/big/img_612
|
382 |
+
2002/08/28/big/img_19471
|
383 |
+
2002/08/02/big/img_198
|
384 |
+
2003/01/16/big/img_527
|
385 |
+
2002/08/22/big/img_209
|
386 |
+
2002/08/30/big/img_18205
|
387 |
+
2003/01/14/big/img_114
|
388 |
+
2003/01/14/big/img_1028
|
389 |
+
2003/01/16/big/img_894
|
390 |
+
2003/01/14/big/img_837
|
391 |
+
2002/07/30/big/img_9
|
392 |
+
2002/08/06/big/img_2821
|
393 |
+
2002/08/04/big/img_85
|
394 |
+
2003/01/13/big/img_884
|
395 |
+
2002/07/22/big/img_570
|
396 |
+
2002/08/07/big/img_1773
|
397 |
+
2002/07/26/big/img_208
|
398 |
+
2003/01/17/big/img_946
|
399 |
+
2002/07/19/big/img_930
|
400 |
+
2003/01/01/big/img_698
|
401 |
+
2003/01/17/big/img_612
|
402 |
+
2002/07/19/big/img_372
|
403 |
+
2002/07/30/big/img_721
|
404 |
+
2003/01/14/big/img_649
|
405 |
+
2002/08/19/big/img_4
|
406 |
+
2002/07/25/big/img_1024
|
407 |
+
2003/01/15/big/img_601
|
408 |
+
2002/08/30/big/img_18470
|
409 |
+
2002/07/22/big/img_29
|
410 |
+
2002/08/07/big/img_1686
|
411 |
+
2002/07/20/big/img_294
|
412 |
+
2002/08/14/big/img_800
|
413 |
+
2002/08/19/big/img_353
|
414 |
+
2002/08/19/big/img_350
|
415 |
+
2002/08/05/big/img_3392
|
416 |
+
2002/08/09/big/img_622
|
417 |
+
2003/01/15/big/img_236
|
418 |
+
2002/08/11/big/img_643
|
419 |
+
2002/08/05/big/img_3458
|
420 |
+
2002/08/12/big/img_413
|
421 |
+
2002/08/22/big/img_415
|
422 |
+
2002/08/13/big/img_635
|
423 |
+
2002/08/07/big/img_1198
|
424 |
+
2002/08/04/big/img_873
|
425 |
+
2002/08/12/big/img_407
|
426 |
+
2003/01/15/big/img_346
|
427 |
+
2002/08/02/big/img_275
|
428 |
+
2002/08/17/big/img_997
|
429 |
+
2002/08/21/big/img_958
|
430 |
+
2002/08/20/big/img_579
|
431 |
+
2002/07/29/big/img_142
|
432 |
+
2003/01/14/big/img_1115
|
433 |
+
2002/08/16/big/img_365
|
434 |
+
2002/07/29/big/img_1414
|
435 |
+
2002/08/17/big/img_489
|
436 |
+
2002/08/13/big/img_1010
|
437 |
+
2002/07/31/big/img_276
|
438 |
+
2002/07/25/big/img_1000
|
439 |
+
2002/08/23/big/img_524
|
440 |
+
2002/08/28/big/img_19147
|
441 |
+
2003/01/13/big/img_433
|
442 |
+
2002/08/20/big/img_205
|
443 |
+
2003/01/01/big/img_458
|
444 |
+
2002/07/29/big/img_1449
|
445 |
+
2003/01/16/big/img_696
|
446 |
+
2002/08/28/big/img_19296
|
447 |
+
2002/08/29/big/img_18688
|
448 |
+
2002/08/21/big/img_767
|
449 |
+
2002/08/20/big/img_532
|
450 |
+
2002/08/26/big/img_187
|
451 |
+
2002/07/26/big/img_183
|
452 |
+
2002/07/27/big/img_890
|
453 |
+
2003/01/13/big/img_576
|
454 |
+
2002/07/30/big/img_15
|
455 |
+
2002/07/31/big/img_889
|
456 |
+
2002/08/31/big/img_17759
|
457 |
+
2003/01/14/big/img_1114
|
458 |
+
2002/07/19/big/img_445
|
459 |
+
2002/08/03/big/img_593
|
460 |
+
2002/07/24/big/img_750
|
461 |
+
2002/07/30/big/img_133
|
462 |
+
2002/08/25/big/img_671
|
463 |
+
2002/07/20/big/img_351
|
464 |
+
2002/08/31/big/img_17276
|
465 |
+
2002/08/05/big/img_3231
|
466 |
+
2002/09/02/big/img_15882
|
467 |
+
2002/08/14/big/img_115
|
468 |
+
2002/08/02/big/img_1148
|
469 |
+
2002/07/25/big/img_936
|
470 |
+
2002/07/31/big/img_639
|
471 |
+
2002/08/04/big/img_427
|
472 |
+
2002/08/22/big/img_843
|
473 |
+
2003/01/17/big/img_17
|
474 |
+
2003/01/13/big/img_690
|
475 |
+
2002/08/13/big/img_472
|
476 |
+
2002/08/09/big/img_425
|
477 |
+
2002/08/05/big/img_3450
|
478 |
+
2003/01/17/big/img_439
|
479 |
+
2002/08/13/big/img_539
|
480 |
+
2002/07/28/big/img_35
|
481 |
+
2002/08/16/big/img_241
|
482 |
+
2002/08/06/big/img_2898
|
483 |
+
2003/01/16/big/img_429
|
484 |
+
2002/08/05/big/img_3817
|
485 |
+
2002/08/27/big/img_19919
|
486 |
+
2002/07/19/big/img_422
|
487 |
+
2002/08/15/big/img_560
|
488 |
+
2002/07/23/big/img_750
|
489 |
+
2002/07/30/big/img_353
|
490 |
+
2002/08/05/big/img_43
|
491 |
+
2002/08/23/big/img_305
|
492 |
+
2002/08/01/big/img_2137
|
493 |
+
2002/08/30/big/img_18097
|
494 |
+
2002/08/01/big/img_1389
|
495 |
+
2002/08/02/big/img_308
|
496 |
+
2003/01/14/big/img_652
|
497 |
+
2002/08/01/big/img_1798
|
498 |
+
2003/01/14/big/img_732
|
499 |
+
2003/01/16/big/img_294
|
500 |
+
2002/08/26/big/img_213
|
501 |
+
2002/07/24/big/img_842
|
502 |
+
2003/01/13/big/img_630
|
503 |
+
2003/01/13/big/img_634
|
504 |
+
2002/08/06/big/img_2285
|
505 |
+
2002/08/01/big/img_2162
|
506 |
+
2002/08/30/big/img_18134
|
507 |
+
2002/08/02/big/img_1045
|
508 |
+
2002/08/01/big/img_2143
|
509 |
+
2002/07/25/big/img_135
|
510 |
+
2002/07/20/big/img_645
|
511 |
+
2002/08/05/big/img_3666
|
512 |
+
2002/08/14/big/img_523
|
513 |
+
2002/08/04/big/img_425
|
514 |
+
2003/01/14/big/img_137
|
515 |
+
2003/01/01/big/img_176
|
516 |
+
2002/08/15/big/img_505
|
517 |
+
2002/08/24/big/img_386
|
518 |
+
2002/08/05/big/img_3187
|
519 |
+
2002/08/15/big/img_419
|
520 |
+
2003/01/13/big/img_520
|
521 |
+
2002/08/04/big/img_444
|
522 |
+
2002/08/26/big/img_483
|
523 |
+
2002/08/05/big/img_3449
|
524 |
+
2002/08/30/big/img_18409
|
525 |
+
2002/08/28/big/img_19455
|
526 |
+
2002/08/27/big/img_20090
|
527 |
+
2002/07/23/big/img_625
|
528 |
+
2002/08/24/big/img_205
|
529 |
+
2002/08/08/big/img_938
|
530 |
+
2003/01/13/big/img_527
|
531 |
+
2002/08/07/big/img_1712
|
532 |
+
2002/07/24/big/img_801
|
533 |
+
2002/08/09/big/img_579
|
534 |
+
2003/01/14/big/img_41
|
535 |
+
2003/01/15/big/img_1130
|
536 |
+
2002/07/21/big/img_672
|
537 |
+
2002/08/07/big/img_1590
|
538 |
+
2003/01/01/big/img_532
|
539 |
+
2002/08/02/big/img_529
|
540 |
+
2002/08/05/big/img_3591
|
541 |
+
2002/08/23/big/img_5
|
542 |
+
2003/01/14/big/img_882
|
543 |
+
2002/08/28/big/img_19234
|
544 |
+
2002/07/24/big/img_398
|
545 |
+
2003/01/14/big/img_592
|
546 |
+
2002/08/22/big/img_548
|
547 |
+
2002/08/12/big/img_761
|
548 |
+
2003/01/16/big/img_497
|
549 |
+
2002/08/18/big/img_133
|
550 |
+
2002/08/08/big/img_874
|
551 |
+
2002/07/19/big/img_247
|
552 |
+
2002/08/15/big/img_170
|
553 |
+
2002/08/27/big/img_19679
|
554 |
+
2002/08/20/big/img_246
|
555 |
+
2002/08/24/big/img_358
|
556 |
+
2002/07/29/big/img_599
|
557 |
+
2002/08/01/big/img_1555
|
558 |
+
2002/07/30/big/img_491
|
559 |
+
2002/07/30/big/img_371
|
560 |
+
2003/01/16/big/img_682
|
561 |
+
2002/07/25/big/img_619
|
562 |
+
2003/01/15/big/img_587
|
563 |
+
2002/08/02/big/img_1212
|
564 |
+
2002/08/01/big/img_2152
|
565 |
+
2002/07/25/big/img_668
|
566 |
+
2003/01/16/big/img_574
|
567 |
+
2002/08/28/big/img_19464
|
568 |
+
2002/08/11/big/img_536
|
569 |
+
2002/07/24/big/img_201
|
570 |
+
2002/08/05/big/img_3488
|
571 |
+
2002/07/25/big/img_887
|
572 |
+
2002/07/22/big/img_789
|
573 |
+
2002/07/30/big/img_432
|
574 |
+
2002/08/16/big/img_166
|
575 |
+
2002/09/01/big/img_16333
|
576 |
+
2002/07/26/big/img_1010
|
577 |
+
2002/07/21/big/img_793
|
578 |
+
2002/07/22/big/img_720
|
579 |
+
2002/07/31/big/img_337
|
580 |
+
2002/07/27/big/img_185
|
581 |
+
2002/08/23/big/img_440
|
582 |
+
2002/07/31/big/img_801
|
583 |
+
2002/07/25/big/img_478
|
584 |
+
2003/01/14/big/img_171
|
585 |
+
2002/08/07/big/img_1054
|
586 |
+
2002/09/02/big/img_15659
|
587 |
+
2002/07/29/big/img_1348
|
588 |
+
2002/08/09/big/img_337
|
589 |
+
2002/08/26/big/img_684
|
590 |
+
2002/07/31/big/img_537
|
591 |
+
2002/08/15/big/img_808
|
592 |
+
2003/01/13/big/img_740
|
593 |
+
2002/08/07/big/img_1667
|
594 |
+
2002/08/03/big/img_404
|
595 |
+
2002/08/06/big/img_2520
|
596 |
+
2002/07/19/big/img_230
|
597 |
+
2002/07/19/big/img_356
|
598 |
+
2003/01/16/big/img_627
|
599 |
+
2002/08/04/big/img_474
|
600 |
+
2002/07/29/big/img_833
|
601 |
+
2002/07/25/big/img_176
|
602 |
+
2002/08/01/big/img_1684
|
603 |
+
2002/08/21/big/img_643
|
604 |
+
2002/08/27/big/img_19673
|
605 |
+
2002/08/02/big/img_838
|
606 |
+
2002/08/06/big/img_2378
|
607 |
+
2003/01/15/big/img_48
|
608 |
+
2002/07/30/big/img_470
|
609 |
+
2002/08/15/big/img_963
|
610 |
+
2002/08/24/big/img_444
|
611 |
+
2002/08/16/big/img_662
|
612 |
+
2002/08/15/big/img_1209
|
613 |
+
2002/07/24/big/img_25
|
614 |
+
2002/08/06/big/img_2740
|
615 |
+
2002/07/29/big/img_996
|
616 |
+
2002/08/31/big/img_18074
|
617 |
+
2002/08/04/big/img_343
|
618 |
+
2003/01/17/big/img_509
|
619 |
+
2003/01/13/big/img_726
|
620 |
+
2002/08/07/big/img_1466
|
621 |
+
2002/07/26/big/img_307
|
622 |
+
2002/08/10/big/img_598
|
623 |
+
2002/08/13/big/img_890
|
624 |
+
2002/08/14/big/img_997
|
625 |
+
2002/07/19/big/img_392
|
626 |
+
2002/08/02/big/img_475
|
627 |
+
2002/08/29/big/img_19038
|
628 |
+
2002/07/29/big/img_538
|
629 |
+
2002/07/29/big/img_502
|
630 |
+
2002/08/02/big/img_364
|
631 |
+
2002/08/31/big/img_17353
|
632 |
+
2002/08/08/big/img_539
|
633 |
+
2002/08/01/big/img_1449
|
634 |
+
2002/07/22/big/img_363
|
635 |
+
2002/08/02/big/img_90
|
636 |
+
2002/09/01/big/img_16867
|
637 |
+
2002/08/05/big/img_3371
|
638 |
+
2002/07/30/big/img_342
|
639 |
+
2002/08/07/big/img_1363
|
640 |
+
2002/08/22/big/img_790
|
641 |
+
2003/01/15/big/img_404
|
642 |
+
2002/08/05/big/img_3447
|
643 |
+
2002/09/01/big/img_16167
|
644 |
+
2003/01/13/big/img_840
|
645 |
+
2002/08/22/big/img_1001
|
646 |
+
2002/08/09/big/img_431
|
647 |
+
2002/07/27/big/img_618
|
648 |
+
2002/07/31/big/img_741
|
649 |
+
2002/07/30/big/img_964
|
650 |
+
2002/07/25/big/img_86
|
651 |
+
2002/07/29/big/img_275
|
652 |
+
2002/08/21/big/img_921
|
653 |
+
2002/07/26/big/img_892
|
654 |
+
2002/08/21/big/img_663
|
655 |
+
2003/01/13/big/img_567
|
656 |
+
2003/01/14/big/img_719
|
657 |
+
2002/07/28/big/img_251
|
658 |
+
2003/01/15/big/img_1123
|
659 |
+
2002/07/29/big/img_260
|
660 |
+
2002/08/24/big/img_337
|
661 |
+
2002/08/01/big/img_1914
|
662 |
+
2002/08/13/big/img_373
|
663 |
+
2003/01/15/big/img_589
|
664 |
+
2002/08/13/big/img_906
|
665 |
+
2002/07/26/big/img_270
|
666 |
+
2002/08/26/big/img_313
|
667 |
+
2002/08/25/big/img_694
|
668 |
+
2003/01/01/big/img_327
|
669 |
+
2002/07/23/big/img_261
|
670 |
+
2002/08/26/big/img_642
|
671 |
+
2002/07/29/big/img_918
|
672 |
+
2002/07/23/big/img_455
|
673 |
+
2002/07/24/big/img_612
|
674 |
+
2002/07/23/big/img_534
|
675 |
+
2002/07/19/big/img_534
|
676 |
+
2002/07/19/big/img_726
|
677 |
+
2002/08/01/big/img_2146
|
678 |
+
2002/08/02/big/img_543
|
679 |
+
2003/01/16/big/img_777
|
680 |
+
2002/07/30/big/img_484
|
681 |
+
2002/08/13/big/img_1161
|
682 |
+
2002/07/21/big/img_390
|
683 |
+
2002/08/06/big/img_2288
|
684 |
+
2002/08/21/big/img_677
|
685 |
+
2002/08/13/big/img_747
|
686 |
+
2002/08/15/big/img_1248
|
687 |
+
2002/07/31/big/img_416
|
688 |
+
2002/09/02/big/img_15259
|
689 |
+
2002/08/16/big/img_781
|
690 |
+
2002/08/24/big/img_754
|
691 |
+
2002/07/24/big/img_803
|
692 |
+
2002/08/20/big/img_609
|
693 |
+
2002/08/28/big/img_19571
|
694 |
+
2002/09/01/big/img_16140
|
695 |
+
2002/08/26/big/img_769
|
696 |
+
2002/07/20/big/img_588
|
697 |
+
2002/08/02/big/img_898
|
698 |
+
2002/07/21/big/img_466
|
699 |
+
2002/08/14/big/img_1046
|
700 |
+
2002/07/25/big/img_212
|
701 |
+
2002/08/26/big/img_353
|
702 |
+
2002/08/19/big/img_810
|
703 |
+
2002/08/31/big/img_17824
|
704 |
+
2002/08/12/big/img_631
|
705 |
+
2002/07/19/big/img_828
|
706 |
+
2002/07/24/big/img_130
|
707 |
+
2002/08/25/big/img_580
|
708 |
+
2002/07/31/big/img_699
|
709 |
+
2002/07/23/big/img_808
|
710 |
+
2002/07/31/big/img_377
|
711 |
+
2003/01/16/big/img_570
|
712 |
+
2002/09/01/big/img_16254
|
713 |
+
2002/07/21/big/img_471
|
714 |
+
2002/08/01/big/img_1548
|
715 |
+
2002/08/18/big/img_252
|
716 |
+
2002/08/19/big/img_576
|
717 |
+
2002/08/20/big/img_464
|
718 |
+
2002/07/27/big/img_735
|
719 |
+
2002/08/21/big/img_589
|
720 |
+
2003/01/15/big/img_1192
|
721 |
+
2002/08/09/big/img_302
|
722 |
+
2002/07/31/big/img_594
|
723 |
+
2002/08/23/big/img_19
|
724 |
+
2002/08/29/big/img_18819
|
725 |
+
2002/08/19/big/img_293
|
726 |
+
2002/07/30/big/img_331
|
727 |
+
2002/08/23/big/img_607
|
728 |
+
2002/07/30/big/img_363
|
729 |
+
2002/08/16/big/img_766
|
730 |
+
2003/01/13/big/img_481
|
731 |
+
2002/08/06/big/img_2515
|
732 |
+
2002/09/02/big/img_15913
|
733 |
+
2002/09/02/big/img_15827
|
734 |
+
2002/09/02/big/img_15053
|
735 |
+
2002/08/07/big/img_1576
|
736 |
+
2002/07/23/big/img_268
|
737 |
+
2002/08/21/big/img_152
|
738 |
+
2003/01/15/big/img_578
|
739 |
+
2002/07/21/big/img_589
|
740 |
+
2002/07/20/big/img_548
|
741 |
+
2002/08/27/big/img_19693
|
742 |
+
2002/08/31/big/img_17252
|
743 |
+
2002/07/31/big/img_138
|
744 |
+
2002/07/23/big/img_372
|
745 |
+
2002/08/16/big/img_695
|
746 |
+
2002/07/27/big/img_287
|
747 |
+
2002/08/15/big/img_315
|
748 |
+
2002/08/10/big/img_361
|
749 |
+
2002/07/29/big/img_899
|
750 |
+
2002/08/13/big/img_771
|
751 |
+
2002/08/21/big/img_92
|
752 |
+
2003/01/15/big/img_425
|
753 |
+
2003/01/16/big/img_450
|
754 |
+
2002/09/01/big/img_16942
|
755 |
+
2002/08/02/big/img_51
|
756 |
+
2002/09/02/big/img_15379
|
757 |
+
2002/08/24/big/img_147
|
758 |
+
2002/08/30/big/img_18122
|
759 |
+
2002/07/26/big/img_950
|
760 |
+
2002/08/07/big/img_1400
|
761 |
+
2002/08/17/big/img_468
|
762 |
+
2002/08/15/big/img_470
|
763 |
+
2002/07/30/big/img_318
|
764 |
+
2002/07/22/big/img_644
|
765 |
+
2002/08/27/big/img_19732
|
766 |
+
2002/07/23/big/img_601
|
767 |
+
2002/08/26/big/img_398
|
768 |
+
2002/08/21/big/img_428
|
769 |
+
2002/08/06/big/img_2119
|
770 |
+
2002/08/29/big/img_19103
|
771 |
+
2003/01/14/big/img_933
|
772 |
+
2002/08/11/big/img_674
|
773 |
+
2002/08/28/big/img_19420
|
774 |
+
2002/08/03/big/img_418
|
775 |
+
2002/08/17/big/img_312
|
776 |
+
2002/07/25/big/img_1044
|
777 |
+
2003/01/17/big/img_671
|
778 |
+
2002/08/30/big/img_18297
|
779 |
+
2002/07/25/big/img_755
|
780 |
+
2002/07/23/big/img_471
|
781 |
+
2002/08/21/big/img_39
|
782 |
+
2002/07/26/big/img_699
|
783 |
+
2003/01/14/big/img_33
|
784 |
+
2002/07/31/big/img_411
|
785 |
+
2002/08/16/big/img_645
|
786 |
+
2003/01/17/big/img_116
|
787 |
+
2002/09/02/big/img_15903
|
788 |
+
2002/08/20/big/img_120
|
789 |
+
2002/08/22/big/img_176
|
790 |
+
2002/07/29/big/img_1316
|
791 |
+
2002/08/27/big/img_19914
|
792 |
+
2002/07/22/big/img_719
|
793 |
+
2002/08/28/big/img_19239
|
794 |
+
2003/01/13/big/img_385
|
795 |
+
2002/08/08/big/img_525
|
796 |
+
2002/07/19/big/img_782
|
797 |
+
2002/08/13/big/img_843
|
798 |
+
2002/07/30/big/img_107
|
799 |
+
2002/08/11/big/img_752
|
800 |
+
2002/07/29/big/img_383
|
801 |
+
2002/08/26/big/img_249
|
802 |
+
2002/08/29/big/img_18860
|
803 |
+
2002/07/30/big/img_70
|
804 |
+
2002/07/26/big/img_194
|
805 |
+
2002/08/15/big/img_530
|
806 |
+
2002/08/08/big/img_816
|
807 |
+
2002/07/31/big/img_286
|
808 |
+
2003/01/13/big/img_294
|
809 |
+
2002/07/31/big/img_251
|
810 |
+
2002/07/24/big/img_13
|
811 |
+
2002/08/31/big/img_17938
|
812 |
+
2002/07/22/big/img_642
|
813 |
+
2003/01/14/big/img_728
|
814 |
+
2002/08/18/big/img_47
|
815 |
+
2002/08/22/big/img_306
|
816 |
+
2002/08/20/big/img_348
|
817 |
+
2002/08/15/big/img_764
|
818 |
+
2002/08/08/big/img_163
|
819 |
+
2002/07/23/big/img_531
|
820 |
+
2002/07/23/big/img_467
|
821 |
+
2003/01/16/big/img_743
|
822 |
+
2003/01/13/big/img_535
|
823 |
+
2002/08/02/big/img_523
|
824 |
+
2002/08/22/big/img_120
|
825 |
+
2002/08/11/big/img_496
|
826 |
+
2002/08/29/big/img_19075
|
827 |
+
2002/08/08/big/img_465
|
828 |
+
2002/08/09/big/img_790
|
829 |
+
2002/08/19/big/img_588
|
830 |
+
2002/08/23/big/img_407
|
831 |
+
2003/01/17/big/img_435
|
832 |
+
2002/08/24/big/img_398
|
833 |
+
2002/08/27/big/img_19899
|
834 |
+
2003/01/15/big/img_335
|
835 |
+
2002/08/13/big/img_493
|
836 |
+
2002/09/02/big/img_15460
|
837 |
+
2002/07/31/big/img_470
|
838 |
+
2002/08/05/big/img_3550
|
839 |
+
2002/07/28/big/img_123
|
840 |
+
2002/08/01/big/img_1498
|
841 |
+
2002/08/04/big/img_504
|
842 |
+
2003/01/17/big/img_427
|
843 |
+
2002/08/27/big/img_19708
|
844 |
+
2002/07/27/big/img_861
|
845 |
+
2002/07/25/big/img_685
|
846 |
+
2002/07/31/big/img_207
|
847 |
+
2003/01/14/big/img_745
|
848 |
+
2002/08/31/big/img_17756
|
849 |
+
2002/08/24/big/img_288
|
850 |
+
2002/08/18/big/img_181
|
851 |
+
2002/08/10/big/img_520
|
852 |
+
2002/08/25/big/img_705
|
853 |
+
2002/08/23/big/img_226
|
854 |
+
2002/08/04/big/img_727
|
855 |
+
2002/07/24/big/img_625
|
856 |
+
2002/08/28/big/img_19157
|
857 |
+
2002/08/23/big/img_586
|
858 |
+
2002/07/31/big/img_232
|
859 |
+
2003/01/13/big/img_240
|
860 |
+
2003/01/14/big/img_321
|
861 |
+
2003/01/15/big/img_533
|
862 |
+
2002/07/23/big/img_480
|
863 |
+
2002/07/24/big/img_371
|
864 |
+
2002/08/21/big/img_702
|
865 |
+
2002/08/31/big/img_17075
|
866 |
+
2002/09/02/big/img_15278
|
867 |
+
2002/07/29/big/img_246
|
868 |
+
2003/01/15/big/img_829
|
869 |
+
2003/01/15/big/img_1213
|
870 |
+
2003/01/16/big/img_441
|
871 |
+
2002/08/14/big/img_921
|
872 |
+
2002/07/23/big/img_425
|
873 |
+
2002/08/15/big/img_296
|
874 |
+
2002/07/19/big/img_135
|
875 |
+
2002/07/26/big/img_402
|
876 |
+
2003/01/17/big/img_88
|
877 |
+
2002/08/20/big/img_872
|
878 |
+
2002/08/13/big/img_1110
|
879 |
+
2003/01/16/big/img_1040
|
880 |
+
2002/07/23/big/img_9
|
881 |
+
2002/08/13/big/img_700
|
882 |
+
2002/08/16/big/img_371
|
883 |
+
2002/08/27/big/img_19966
|
884 |
+
2003/01/17/big/img_391
|
885 |
+
2002/08/18/big/img_426
|
886 |
+
2002/08/01/big/img_1618
|
887 |
+
2002/07/21/big/img_754
|
888 |
+
2003/01/14/big/img_1101
|
889 |
+
2003/01/16/big/img_1022
|
890 |
+
2002/07/22/big/img_275
|
891 |
+
2002/08/24/big/img_86
|
892 |
+
2002/08/17/big/img_582
|
893 |
+
2003/01/15/big/img_765
|
894 |
+
2003/01/17/big/img_449
|
895 |
+
2002/07/28/big/img_265
|
896 |
+
2003/01/13/big/img_552
|
897 |
+
2002/07/28/big/img_115
|
898 |
+
2003/01/16/big/img_56
|
899 |
+
2002/08/02/big/img_1232
|
900 |
+
2003/01/17/big/img_925
|
901 |
+
2002/07/22/big/img_445
|
902 |
+
2002/07/25/big/img_957
|
903 |
+
2002/07/20/big/img_589
|
904 |
+
2002/08/31/big/img_17107
|
905 |
+
2002/07/29/big/img_483
|
906 |
+
2002/08/14/big/img_1063
|
907 |
+
2002/08/07/big/img_1545
|
908 |
+
2002/08/14/big/img_680
|
909 |
+
2002/09/01/big/img_16694
|
910 |
+
2002/08/14/big/img_257
|
911 |
+
2002/08/11/big/img_726
|
912 |
+
2002/07/26/big/img_681
|
913 |
+
2002/07/25/big/img_481
|
914 |
+
2003/01/14/big/img_737
|
915 |
+
2002/08/28/big/img_19480
|
916 |
+
2003/01/16/big/img_362
|
917 |
+
2002/08/27/big/img_19865
|
918 |
+
2003/01/01/big/img_547
|
919 |
+
2002/09/02/big/img_15074
|
920 |
+
2002/08/01/big/img_1453
|
921 |
+
2002/08/22/big/img_594
|
922 |
+
2002/08/28/big/img_19263
|
923 |
+
2002/08/13/big/img_478
|
924 |
+
2002/07/29/big/img_1358
|
925 |
+
2003/01/14/big/img_1022
|
926 |
+
2002/08/16/big/img_450
|
927 |
+
2002/08/02/big/img_159
|
928 |
+
2002/07/26/big/img_781
|
929 |
+
2003/01/13/big/img_601
|
930 |
+
2002/08/20/big/img_407
|
931 |
+
2002/08/15/big/img_468
|
932 |
+
2002/08/31/big/img_17902
|
933 |
+
2002/08/16/big/img_81
|
934 |
+
2002/07/25/big/img_987
|
935 |
+
2002/07/25/big/img_500
|
936 |
+
2002/08/02/big/img_31
|
937 |
+
2002/08/18/big/img_538
|
938 |
+
2002/08/08/big/img_54
|
939 |
+
2002/07/23/big/img_686
|
940 |
+
2002/07/24/big/img_836
|
941 |
+
2003/01/17/big/img_734
|
942 |
+
2002/08/16/big/img_1055
|
943 |
+
2003/01/16/big/img_521
|
944 |
+
2002/07/25/big/img_612
|
945 |
+
2002/08/22/big/img_778
|
946 |
+
2002/08/03/big/img_251
|
947 |
+
2002/08/12/big/img_436
|
948 |
+
2002/08/23/big/img_705
|
949 |
+
2002/07/28/big/img_243
|
950 |
+
2002/07/25/big/img_1029
|
951 |
+
2002/08/20/big/img_287
|
952 |
+
2002/08/29/big/img_18739
|
953 |
+
2002/08/05/big/img_3272
|
954 |
+
2002/07/27/big/img_214
|
955 |
+
2003/01/14/big/img_5
|
956 |
+
2002/08/01/big/img_1380
|
957 |
+
2002/08/29/big/img_19097
|
958 |
+
2002/07/30/big/img_486
|
959 |
+
2002/08/29/big/img_18707
|
960 |
+
2002/08/10/big/img_559
|
961 |
+
2002/08/15/big/img_365
|
962 |
+
2002/08/09/big/img_525
|
963 |
+
2002/08/10/big/img_689
|
964 |
+
2002/07/25/big/img_502
|
965 |
+
2002/08/03/big/img_667
|
966 |
+
2002/08/10/big/img_855
|
967 |
+
2002/08/10/big/img_706
|
968 |
+
2002/08/18/big/img_603
|
969 |
+
2003/01/16/big/img_1055
|
970 |
+
2002/08/31/big/img_17890
|
971 |
+
2002/08/15/big/img_761
|
972 |
+
2003/01/15/big/img_489
|
973 |
+
2002/08/26/big/img_351
|
974 |
+
2002/08/01/big/img_1772
|
975 |
+
2002/08/31/big/img_17729
|
976 |
+
2002/07/25/big/img_609
|
977 |
+
2003/01/13/big/img_539
|
978 |
+
2002/07/27/big/img_686
|
979 |
+
2002/07/31/big/img_311
|
980 |
+
2002/08/22/big/img_799
|
981 |
+
2003/01/16/big/img_936
|
982 |
+
2002/08/31/big/img_17813
|
983 |
+
2002/08/04/big/img_862
|
984 |
+
2002/08/09/big/img_332
|
985 |
+
2002/07/20/big/img_148
|
986 |
+
2002/08/12/big/img_426
|
987 |
+
2002/07/24/big/img_69
|
988 |
+
2002/07/27/big/img_685
|
989 |
+
2002/08/02/big/img_480
|
990 |
+
2002/08/26/big/img_154
|
991 |
+
2002/07/24/big/img_598
|
992 |
+
2002/08/01/big/img_1881
|
993 |
+
2002/08/20/big/img_667
|
994 |
+
2003/01/14/big/img_495
|
995 |
+
2002/07/21/big/img_744
|
996 |
+
2002/07/30/big/img_150
|
997 |
+
2002/07/23/big/img_924
|
998 |
+
2002/08/08/big/img_272
|
999 |
+
2002/07/23/big/img_310
|
1000 |
+
2002/07/25/big/img_1011
|
1001 |
+
2002/09/02/big/img_15725
|
1002 |
+
2002/07/19/big/img_814
|
1003 |
+
2002/08/20/big/img_936
|
1004 |
+
2002/07/25/big/img_85
|
1005 |
+
2002/08/24/big/img_662
|
1006 |
+
2002/08/09/big/img_495
|
1007 |
+
2003/01/15/big/img_196
|
1008 |
+
2002/08/16/big/img_707
|
1009 |
+
2002/08/28/big/img_19370
|
1010 |
+
2002/08/06/big/img_2366
|
1011 |
+
2002/08/06/big/img_3012
|
1012 |
+
2002/08/01/big/img_1452
|
1013 |
+
2002/07/31/big/img_742
|
1014 |
+
2002/07/27/big/img_914
|
1015 |
+
2003/01/13/big/img_290
|
1016 |
+
2002/07/31/big/img_288
|
1017 |
+
2002/08/02/big/img_171
|
1018 |
+
2002/08/22/big/img_191
|
1019 |
+
2002/07/27/big/img_1066
|
1020 |
+
2002/08/12/big/img_383
|
1021 |
+
2003/01/17/big/img_1018
|
1022 |
+
2002/08/01/big/img_1785
|
1023 |
+
2002/08/11/big/img_390
|
1024 |
+
2002/08/27/big/img_20037
|
1025 |
+
2002/08/12/big/img_38
|
1026 |
+
2003/01/15/big/img_103
|
1027 |
+
2002/08/26/big/img_31
|
1028 |
+
2002/08/18/big/img_660
|
1029 |
+
2002/07/22/big/img_694
|
1030 |
+
2002/08/15/big/img_24
|
1031 |
+
2002/07/27/big/img_1077
|
1032 |
+
2002/08/01/big/img_1943
|
1033 |
+
2002/07/22/big/img_292
|
1034 |
+
2002/09/01/big/img_16857
|
1035 |
+
2002/07/22/big/img_892
|
1036 |
+
2003/01/14/big/img_46
|
1037 |
+
2002/08/09/big/img_469
|
1038 |
+
2002/08/09/big/img_414
|
1039 |
+
2003/01/16/big/img_40
|
1040 |
+
2002/08/28/big/img_19231
|
1041 |
+
2002/07/27/big/img_978
|
1042 |
+
2002/07/23/big/img_475
|
1043 |
+
2002/07/25/big/img_92
|
1044 |
+
2002/08/09/big/img_799
|
1045 |
+
2002/07/25/big/img_491
|
1046 |
+
2002/08/03/big/img_654
|
1047 |
+
2003/01/15/big/img_687
|
1048 |
+
2002/08/11/big/img_478
|
1049 |
+
2002/08/07/big/img_1664
|
1050 |
+
2002/08/20/big/img_362
|
1051 |
+
2002/08/01/big/img_1298
|
1052 |
+
2003/01/13/big/img_500
|
1053 |
+
2002/08/06/big/img_2896
|
1054 |
+
2002/08/30/big/img_18529
|
1055 |
+
2002/08/16/big/img_1020
|
1056 |
+
2002/07/29/big/img_892
|
1057 |
+
2002/08/29/big/img_18726
|
1058 |
+
2002/07/21/big/img_453
|
1059 |
+
2002/08/17/big/img_437
|
1060 |
+
2002/07/19/big/img_665
|
1061 |
+
2002/07/22/big/img_440
|
1062 |
+
2002/07/19/big/img_582
|
1063 |
+
2002/07/21/big/img_233
|
1064 |
+
2003/01/01/big/img_82
|
1065 |
+
2002/07/25/big/img_341
|
1066 |
+
2002/07/29/big/img_864
|
1067 |
+
2002/08/02/big/img_276
|
1068 |
+
2002/08/29/big/img_18654
|
1069 |
+
2002/07/27/big/img_1024
|
1070 |
+
2002/08/19/big/img_373
|
1071 |
+
2003/01/15/big/img_241
|
1072 |
+
2002/07/25/big/img_84
|
1073 |
+
2002/08/13/big/img_834
|
1074 |
+
2002/08/10/big/img_511
|
1075 |
+
2002/08/01/big/img_1627
|
1076 |
+
2002/08/08/big/img_607
|
1077 |
+
2002/08/06/big/img_2083
|
1078 |
+
2002/08/01/big/img_1486
|
1079 |
+
2002/08/08/big/img_700
|
1080 |
+
2002/08/01/big/img_1954
|
1081 |
+
2002/08/21/big/img_54
|
1082 |
+
2002/07/30/big/img_847
|
1083 |
+
2002/08/28/big/img_19169
|
1084 |
+
2002/07/21/big/img_549
|
1085 |
+
2002/08/03/big/img_693
|
1086 |
+
2002/07/31/big/img_1002
|
1087 |
+
2003/01/14/big/img_1035
|
1088 |
+
2003/01/16/big/img_622
|
1089 |
+
2002/07/30/big/img_1201
|
1090 |
+
2002/08/10/big/img_444
|
1091 |
+
2002/07/31/big/img_374
|
1092 |
+
2002/08/21/big/img_301
|
1093 |
+
2002/08/13/big/img_1095
|
1094 |
+
2003/01/13/big/img_288
|
1095 |
+
2002/07/25/big/img_232
|
1096 |
+
2003/01/13/big/img_967
|
1097 |
+
2002/08/26/big/img_360
|
1098 |
+
2002/08/05/big/img_67
|
1099 |
+
2002/08/29/big/img_18969
|
1100 |
+
2002/07/28/big/img_16
|
1101 |
+
2002/08/16/big/img_515
|
1102 |
+
2002/07/20/big/img_708
|
1103 |
+
2002/08/18/big/img_178
|
1104 |
+
2003/01/15/big/img_509
|
1105 |
+
2002/07/25/big/img_430
|
1106 |
+
2002/08/21/big/img_738
|
1107 |
+
2002/08/16/big/img_886
|
1108 |
+
2002/09/02/big/img_15605
|
1109 |
+
2002/09/01/big/img_16242
|
1110 |
+
2002/08/24/big/img_711
|
1111 |
+
2002/07/25/big/img_90
|
1112 |
+
2002/08/09/big/img_491
|
1113 |
+
2002/07/30/big/img_534
|
1114 |
+
2003/01/13/big/img_474
|
1115 |
+
2002/08/25/big/img_510
|
1116 |
+
2002/08/15/big/img_555
|
1117 |
+
2002/08/02/big/img_775
|
1118 |
+
2002/07/23/big/img_975
|
1119 |
+
2002/08/19/big/img_229
|
1120 |
+
2003/01/17/big/img_860
|
1121 |
+
2003/01/02/big/img_10
|
1122 |
+
2002/07/23/big/img_542
|
1123 |
+
2002/08/06/big/img_2535
|
1124 |
+
2002/07/22/big/img_37
|
1125 |
+
2002/08/06/big/img_2342
|
1126 |
+
2002/08/25/big/img_515
|
1127 |
+
2002/08/25/big/img_336
|
1128 |
+
2002/08/18/big/img_837
|
1129 |
+
2002/08/21/big/img_616
|
1130 |
+
2003/01/17/big/img_24
|
1131 |
+
2002/07/26/big/img_936
|
1132 |
+
2002/08/14/big/img_896
|
1133 |
+
2002/07/29/big/img_465
|
1134 |
+
2002/07/31/big/img_543
|
1135 |
+
2002/08/01/big/img_1411
|
1136 |
+
2002/08/02/big/img_423
|
1137 |
+
2002/08/21/big/img_44
|
1138 |
+
2002/07/31/big/img_11
|
1139 |
+
2003/01/15/big/img_628
|
1140 |
+
2003/01/15/big/img_605
|
1141 |
+
2002/07/30/big/img_571
|
1142 |
+
2002/07/23/big/img_428
|
1143 |
+
2002/08/15/big/img_942
|
1144 |
+
2002/07/26/big/img_531
|
1145 |
+
2003/01/16/big/img_59
|
1146 |
+
2002/08/02/big/img_410
|
1147 |
+
2002/07/31/big/img_230
|
1148 |
+
2002/08/19/big/img_806
|
1149 |
+
2003/01/14/big/img_462
|
1150 |
+
2002/08/16/big/img_370
|
1151 |
+
2002/08/13/big/img_380
|
1152 |
+
2002/08/16/big/img_932
|
1153 |
+
2002/07/19/big/img_393
|
1154 |
+
2002/08/20/big/img_764
|
1155 |
+
2002/08/15/big/img_616
|
1156 |
+
2002/07/26/big/img_267
|
1157 |
+
2002/07/27/big/img_1069
|
1158 |
+
2002/08/14/big/img_1041
|
1159 |
+
2003/01/13/big/img_594
|
1160 |
+
2002/09/01/big/img_16845
|
1161 |
+
2002/08/09/big/img_229
|
1162 |
+
2003/01/16/big/img_639
|
1163 |
+
2002/08/19/big/img_398
|
1164 |
+
2002/08/18/big/img_978
|
1165 |
+
2002/08/24/big/img_296
|
1166 |
+
2002/07/29/big/img_415
|
1167 |
+
2002/07/30/big/img_923
|
1168 |
+
2002/08/18/big/img_575
|
1169 |
+
2002/08/22/big/img_182
|
1170 |
+
2002/07/25/big/img_806
|
1171 |
+
2002/07/22/big/img_49
|
1172 |
+
2002/07/29/big/img_989
|
1173 |
+
2003/01/17/big/img_789
|
1174 |
+
2003/01/15/big/img_503
|
1175 |
+
2002/09/01/big/img_16062
|
1176 |
+
2003/01/17/big/img_794
|
1177 |
+
2002/08/15/big/img_564
|
1178 |
+
2003/01/15/big/img_222
|
1179 |
+
2002/08/01/big/img_1656
|
1180 |
+
2003/01/13/big/img_432
|
1181 |
+
2002/07/19/big/img_426
|
1182 |
+
2002/08/17/big/img_244
|
1183 |
+
2002/08/13/big/img_805
|
1184 |
+
2002/09/02/big/img_15067
|
1185 |
+
2002/08/11/big/img_58
|
1186 |
+
2002/08/22/big/img_636
|
1187 |
+
2002/07/22/big/img_416
|
1188 |
+
2002/08/13/big/img_836
|
1189 |
+
2002/08/26/big/img_363
|
1190 |
+
2002/07/30/big/img_917
|
1191 |
+
2003/01/14/big/img_206
|
1192 |
+
2002/08/12/big/img_311
|
1193 |
+
2002/08/31/big/img_17623
|
1194 |
+
2002/07/29/big/img_661
|
1195 |
+
2003/01/13/big/img_417
|
1196 |
+
2002/08/02/big/img_463
|
1197 |
+
2002/08/02/big/img_669
|
1198 |
+
2002/08/26/big/img_670
|
1199 |
+
2002/08/02/big/img_375
|
1200 |
+
2002/07/19/big/img_209
|
1201 |
+
2002/08/08/big/img_115
|
1202 |
+
2002/08/21/big/img_399
|
1203 |
+
2002/08/20/big/img_911
|
1204 |
+
2002/08/07/big/img_1212
|
1205 |
+
2002/08/20/big/img_578
|
1206 |
+
2002/08/22/big/img_554
|
1207 |
+
2002/08/21/big/img_484
|
1208 |
+
2002/07/25/big/img_450
|
1209 |
+
2002/08/03/big/img_542
|
1210 |
+
2002/08/15/big/img_561
|
1211 |
+
2002/07/23/big/img_360
|
1212 |
+
2002/08/30/big/img_18137
|
1213 |
+
2002/07/25/big/img_250
|
1214 |
+
2002/08/03/big/img_647
|
1215 |
+
2002/08/20/big/img_375
|
1216 |
+
2002/08/14/big/img_387
|
1217 |
+
2002/09/01/big/img_16990
|
1218 |
+
2002/08/28/big/img_19341
|
1219 |
+
2003/01/15/big/img_239
|
1220 |
+
2002/08/20/big/img_528
|
1221 |
+
2002/08/12/big/img_130
|
1222 |
+
2002/09/02/big/img_15108
|
1223 |
+
2003/01/15/big/img_372
|
1224 |
+
2002/08/16/big/img_678
|
1225 |
+
2002/08/04/big/img_623
|
1226 |
+
2002/07/23/big/img_477
|
1227 |
+
2002/08/28/big/img_19590
|
1228 |
+
2003/01/17/big/img_978
|
1229 |
+
2002/09/01/big/img_16692
|
1230 |
+
2002/07/20/big/img_109
|
1231 |
+
2002/08/06/big/img_2660
|
1232 |
+
2003/01/14/big/img_464
|
1233 |
+
2002/08/09/big/img_618
|
1234 |
+
2002/07/22/big/img_722
|
1235 |
+
2002/08/25/big/img_419
|
1236 |
+
2002/08/03/big/img_314
|
1237 |
+
2002/08/25/big/img_40
|
1238 |
+
2002/07/27/big/img_430
|
1239 |
+
2002/08/10/big/img_569
|
1240 |
+
2002/08/23/big/img_398
|
1241 |
+
2002/07/23/big/img_893
|
1242 |
+
2002/08/16/big/img_261
|
1243 |
+
2002/08/06/big/img_2668
|
1244 |
+
2002/07/22/big/img_835
|
1245 |
+
2002/09/02/big/img_15093
|
1246 |
+
2003/01/16/big/img_65
|
1247 |
+
2002/08/21/big/img_448
|
1248 |
+
2003/01/14/big/img_351
|
1249 |
+
2003/01/17/big/img_133
|
1250 |
+
2002/07/28/big/img_493
|
1251 |
+
2003/01/15/big/img_640
|
1252 |
+
2002/09/01/big/img_16880
|
1253 |
+
2002/08/15/big/img_350
|
1254 |
+
2002/08/20/big/img_624
|
1255 |
+
2002/08/25/big/img_604
|
1256 |
+
2002/08/06/big/img_2200
|
1257 |
+
2002/08/23/big/img_290
|
1258 |
+
2002/08/13/big/img_1152
|
1259 |
+
2003/01/14/big/img_251
|
1260 |
+
2002/08/02/big/img_538
|
1261 |
+
2002/08/22/big/img_613
|
1262 |
+
2003/01/13/big/img_351
|
1263 |
+
2002/08/18/big/img_368
|
1264 |
+
2002/07/23/big/img_392
|
1265 |
+
2002/07/25/big/img_198
|
1266 |
+
2002/07/25/big/img_418
|
1267 |
+
2002/08/26/big/img_614
|
1268 |
+
2002/07/23/big/img_405
|
1269 |
+
2003/01/14/big/img_445
|
1270 |
+
2002/07/25/big/img_326
|
1271 |
+
2002/08/10/big/img_734
|
1272 |
+
2003/01/14/big/img_530
|
1273 |
+
2002/08/08/big/img_561
|
1274 |
+
2002/08/29/big/img_18990
|
1275 |
+
2002/08/10/big/img_576
|
1276 |
+
2002/07/29/big/img_1494
|
1277 |
+
2002/07/19/big/img_198
|
1278 |
+
2002/08/10/big/img_562
|
1279 |
+
2002/07/22/big/img_901
|
1280 |
+
2003/01/14/big/img_37
|
1281 |
+
2002/09/02/big/img_15629
|
1282 |
+
2003/01/14/big/img_58
|
1283 |
+
2002/08/01/big/img_1364
|
1284 |
+
2002/07/27/big/img_636
|
1285 |
+
2003/01/13/big/img_241
|
1286 |
+
2002/09/01/big/img_16988
|
1287 |
+
2003/01/13/big/img_560
|
1288 |
+
2002/08/09/big/img_533
|
1289 |
+
2002/07/31/big/img_249
|
1290 |
+
2003/01/17/big/img_1007
|
1291 |
+
2002/07/21/big/img_64
|
1292 |
+
2003/01/13/big/img_537
|
1293 |
+
2003/01/15/big/img_606
|
1294 |
+
2002/08/18/big/img_651
|
1295 |
+
2002/08/24/big/img_405
|
1296 |
+
2002/07/26/big/img_837
|
1297 |
+
2002/08/09/big/img_562
|
1298 |
+
2002/08/01/big/img_1983
|
1299 |
+
2002/08/03/big/img_514
|
1300 |
+
2002/07/29/big/img_314
|
1301 |
+
2002/08/12/big/img_493
|
1302 |
+
2003/01/14/big/img_121
|
1303 |
+
2003/01/14/big/img_479
|
1304 |
+
2002/08/04/big/img_410
|
1305 |
+
2002/07/22/big/img_607
|
1306 |
+
2003/01/17/big/img_417
|
1307 |
+
2002/07/20/big/img_547
|
1308 |
+
2002/08/13/big/img_396
|
1309 |
+
2002/08/31/big/img_17538
|
1310 |
+
2002/08/13/big/img_187
|
1311 |
+
2002/08/12/big/img_328
|
1312 |
+
2003/01/14/big/img_569
|
1313 |
+
2002/07/27/big/img_1081
|
1314 |
+
2002/08/14/big/img_504
|
1315 |
+
2002/08/23/big/img_785
|
1316 |
+
2002/07/26/big/img_339
|
1317 |
+
2002/08/07/big/img_1156
|
1318 |
+
2002/08/07/big/img_1456
|
1319 |
+
2002/08/23/big/img_378
|
1320 |
+
2002/08/27/big/img_19719
|
1321 |
+
2002/07/31/big/img_39
|
1322 |
+
2002/07/31/big/img_883
|
1323 |
+
2003/01/14/big/img_676
|
1324 |
+
2002/07/29/big/img_214
|
1325 |
+
2002/07/26/big/img_669
|
1326 |
+
2002/07/25/big/img_202
|
1327 |
+
2002/08/08/big/img_259
|
1328 |
+
2003/01/17/big/img_943
|
1329 |
+
2003/01/15/big/img_512
|
1330 |
+
2002/08/05/big/img_3295
|
1331 |
+
2002/08/27/big/img_19685
|
1332 |
+
2002/08/08/big/img_277
|
1333 |
+
2002/08/30/big/img_18154
|
1334 |
+
2002/07/22/big/img_663
|
1335 |
+
2002/08/29/big/img_18914
|
1336 |
+
2002/07/31/big/img_908
|
1337 |
+
2002/08/27/big/img_19926
|
1338 |
+
2003/01/13/big/img_791
|
1339 |
+
2003/01/15/big/img_827
|
1340 |
+
2002/08/18/big/img_878
|
1341 |
+
2002/08/14/big/img_670
|
1342 |
+
2002/07/20/big/img_182
|
1343 |
+
2002/08/15/big/img_291
|
1344 |
+
2002/08/06/big/img_2600
|
1345 |
+
2002/07/23/big/img_587
|
1346 |
+
2002/08/14/big/img_577
|
1347 |
+
2003/01/15/big/img_585
|
1348 |
+
2002/07/30/big/img_310
|
1349 |
+
2002/08/03/big/img_658
|
1350 |
+
2002/08/10/big/img_157
|
1351 |
+
2002/08/19/big/img_811
|
1352 |
+
2002/07/29/big/img_1318
|
1353 |
+
2002/08/04/big/img_104
|
1354 |
+
2002/07/30/big/img_332
|
1355 |
+
2002/07/24/big/img_789
|
1356 |
+
2002/07/29/big/img_516
|
1357 |
+
2002/07/23/big/img_843
|
1358 |
+
2002/08/01/big/img_1528
|
1359 |
+
2002/08/13/big/img_798
|
1360 |
+
2002/08/07/big/img_1729
|
1361 |
+
2002/08/28/big/img_19448
|
1362 |
+
2003/01/16/big/img_95
|
1363 |
+
2002/08/12/big/img_473
|
1364 |
+
2002/07/27/big/img_269
|
1365 |
+
2003/01/16/big/img_621
|
1366 |
+
2002/07/29/big/img_772
|
1367 |
+
2002/07/24/big/img_171
|
1368 |
+
2002/07/19/big/img_429
|
1369 |
+
2002/08/07/big/img_1933
|
1370 |
+
2002/08/27/big/img_19629
|
1371 |
+
2002/08/05/big/img_3688
|
1372 |
+
2002/08/07/big/img_1691
|
1373 |
+
2002/07/23/big/img_600
|
1374 |
+
2002/07/29/big/img_666
|
1375 |
+
2002/08/25/big/img_566
|
1376 |
+
2002/08/06/big/img_2659
|
1377 |
+
2002/08/29/big/img_18929
|
1378 |
+
2002/08/16/big/img_407
|
1379 |
+
2002/08/18/big/img_774
|
1380 |
+
2002/08/19/big/img_249
|
1381 |
+
2002/08/06/big/img_2427
|
1382 |
+
2002/08/29/big/img_18899
|
1383 |
+
2002/08/01/big/img_1818
|
1384 |
+
2002/07/31/big/img_108
|
1385 |
+
2002/07/29/big/img_500
|
1386 |
+
2002/08/11/big/img_115
|
1387 |
+
2002/07/19/big/img_521
|
1388 |
+
2002/08/02/big/img_1163
|
1389 |
+
2002/07/22/big/img_62
|
1390 |
+
2002/08/13/big/img_466
|
1391 |
+
2002/08/21/big/img_956
|
1392 |
+
2002/08/23/big/img_602
|
1393 |
+
2002/08/20/big/img_858
|
1394 |
+
2002/07/25/big/img_690
|
1395 |
+
2002/07/19/big/img_130
|
1396 |
+
2002/08/04/big/img_874
|
1397 |
+
2002/07/26/big/img_489
|
1398 |
+
2002/07/22/big/img_548
|
1399 |
+
2002/08/10/big/img_191
|
1400 |
+
2002/07/25/big/img_1051
|
1401 |
+
2002/08/18/big/img_473
|
1402 |
+
2002/08/12/big/img_755
|
1403 |
+
2002/08/18/big/img_413
|
1404 |
+
2002/08/08/big/img_1044
|
1405 |
+
2002/08/17/big/img_680
|
1406 |
+
2002/08/26/big/img_235
|
1407 |
+
2002/08/20/big/img_330
|
1408 |
+
2002/08/22/big/img_344
|
1409 |
+
2002/08/09/big/img_593
|
1410 |
+
2002/07/31/big/img_1006
|
1411 |
+
2002/08/14/big/img_337
|
1412 |
+
2002/08/16/big/img_728
|
1413 |
+
2002/07/24/big/img_834
|
1414 |
+
2002/08/04/big/img_552
|
1415 |
+
2002/09/02/big/img_15213
|
1416 |
+
2002/07/25/big/img_725
|
1417 |
+
2002/08/30/big/img_18290
|
1418 |
+
2003/01/01/big/img_475
|
1419 |
+
2002/07/27/big/img_1083
|
1420 |
+
2002/08/29/big/img_18955
|
1421 |
+
2002/08/31/big/img_17232
|
1422 |
+
2002/08/08/big/img_480
|
1423 |
+
2002/08/01/big/img_1311
|
1424 |
+
2002/07/30/big/img_745
|
1425 |
+
2002/08/03/big/img_649
|
1426 |
+
2002/08/12/big/img_193
|
1427 |
+
2002/07/29/big/img_228
|
1428 |
+
2002/07/25/big/img_836
|
1429 |
+
2002/08/20/big/img_400
|
1430 |
+
2002/07/30/big/img_507
|
1431 |
+
2002/09/02/big/img_15072
|
1432 |
+
2002/07/26/big/img_658
|
1433 |
+
2002/07/28/big/img_503
|
1434 |
+
2002/08/05/big/img_3814
|
1435 |
+
2002/08/24/big/img_745
|
1436 |
+
2003/01/13/big/img_817
|
1437 |
+
2002/08/08/big/img_579
|
1438 |
+
2002/07/22/big/img_251
|
1439 |
+
2003/01/13/big/img_689
|
1440 |
+
2002/07/25/big/img_407
|
1441 |
+
2002/08/13/big/img_1050
|
1442 |
+
2002/08/14/big/img_733
|
1443 |
+
2002/07/24/big/img_82
|
1444 |
+
2003/01/17/big/img_288
|
1445 |
+
2003/01/15/big/img_475
|
1446 |
+
2002/08/14/big/img_620
|
1447 |
+
2002/08/21/big/img_167
|
1448 |
+
2002/07/19/big/img_300
|
1449 |
+
2002/07/26/big/img_219
|
1450 |
+
2002/08/01/big/img_1468
|
1451 |
+
2002/07/23/big/img_260
|
1452 |
+
2002/08/09/big/img_555
|
1453 |
+
2002/07/19/big/img_160
|
1454 |
+
2002/08/02/big/img_1060
|
1455 |
+
2003/01/14/big/img_149
|
1456 |
+
2002/08/15/big/img_346
|
1457 |
+
2002/08/24/big/img_597
|
1458 |
+
2002/08/22/big/img_502
|
1459 |
+
2002/08/30/big/img_18228
|
1460 |
+
2002/07/21/big/img_766
|
1461 |
+
2003/01/15/big/img_841
|
1462 |
+
2002/07/24/big/img_516
|
1463 |
+
2002/08/02/big/img_265
|
1464 |
+
2002/08/15/big/img_1243
|
1465 |
+
2003/01/15/big/img_223
|
1466 |
+
2002/08/04/big/img_236
|
1467 |
+
2002/07/22/big/img_309
|
1468 |
+
2002/07/20/big/img_656
|
1469 |
+
2002/07/31/big/img_412
|
1470 |
+
2002/09/01/big/img_16462
|
1471 |
+
2003/01/16/big/img_431
|
1472 |
+
2002/07/22/big/img_793
|
1473 |
+
2002/08/15/big/img_877
|
1474 |
+
2002/07/26/big/img_282
|
1475 |
+
2002/07/25/big/img_529
|
1476 |
+
2002/08/24/big/img_613
|
1477 |
+
2003/01/17/big/img_700
|
1478 |
+
2002/08/06/big/img_2526
|
1479 |
+
2002/08/24/big/img_394
|
1480 |
+
2002/08/21/big/img_521
|
1481 |
+
2002/08/25/big/img_560
|
1482 |
+
2002/07/29/big/img_966
|
1483 |
+
2002/07/25/big/img_448
|
1484 |
+
2003/01/13/big/img_782
|
1485 |
+
2002/08/21/big/img_296
|
1486 |
+
2002/09/01/big/img_16755
|
1487 |
+
2002/08/05/big/img_3552
|
1488 |
+
2002/09/02/big/img_15823
|
1489 |
+
2003/01/14/big/img_193
|
1490 |
+
2002/07/21/big/img_159
|
1491 |
+
2002/08/02/big/img_564
|
1492 |
+
2002/08/16/big/img_300
|
1493 |
+
2002/07/19/big/img_269
|
1494 |
+
2002/08/13/big/img_676
|
1495 |
+
2002/07/28/big/img_57
|
1496 |
+
2002/08/05/big/img_3318
|
1497 |
+
2002/07/31/big/img_218
|
1498 |
+
2002/08/21/big/img_898
|
1499 |
+
2002/07/29/big/img_109
|
1500 |
+
2002/07/19/big/img_854
|
1501 |
+
2002/08/23/big/img_311
|
1502 |
+
2002/08/14/big/img_318
|
1503 |
+
2002/07/25/big/img_523
|
1504 |
+
2002/07/21/big/img_678
|
1505 |
+
2003/01/17/big/img_690
|
1506 |
+
2002/08/28/big/img_19503
|
1507 |
+
2002/08/18/big/img_251
|
1508 |
+
2002/08/22/big/img_672
|
1509 |
+
2002/08/20/big/img_663
|
1510 |
+
2002/08/02/big/img_148
|
1511 |
+
2002/09/02/big/img_15580
|
1512 |
+
2002/07/25/big/img_778
|
1513 |
+
2002/08/14/big/img_565
|
1514 |
+
2002/08/12/big/img_374
|
1515 |
+
2002/08/13/big/img_1018
|
1516 |
+
2002/08/20/big/img_474
|
1517 |
+
2002/08/25/big/img_33
|
1518 |
+
2002/08/02/big/img_1190
|
1519 |
+
2002/08/08/big/img_864
|
1520 |
+
2002/08/14/big/img_1071
|
1521 |
+
2002/08/30/big/img_18103
|
1522 |
+
2002/08/18/big/img_533
|
1523 |
+
2003/01/16/big/img_650
|
1524 |
+
2002/07/25/big/img_108
|
1525 |
+
2002/07/26/big/img_81
|
1526 |
+
2002/07/27/big/img_543
|
1527 |
+
2002/07/29/big/img_521
|
1528 |
+
2003/01/13/big/img_434
|
1529 |
+
2002/08/26/big/img_674
|
1530 |
+
2002/08/06/big/img_2932
|
1531 |
+
2002/08/07/big/img_1262
|
1532 |
+
2003/01/15/big/img_201
|
1533 |
+
2003/01/16/big/img_673
|
1534 |
+
2002/09/02/big/img_15988
|
1535 |
+
2002/07/29/big/img_1306
|
1536 |
+
2003/01/14/big/img_1072
|
1537 |
+
2002/08/30/big/img_18232
|
1538 |
+
2002/08/05/big/img_3711
|
1539 |
+
2002/07/23/big/img_775
|
1540 |
+
2002/08/01/big/img_16
|
1541 |
+
2003/01/16/big/img_630
|
1542 |
+
2002/08/22/big/img_695
|
1543 |
+
2002/08/14/big/img_51
|
1544 |
+
2002/08/14/big/img_782
|
1545 |
+
2002/08/24/big/img_742
|
1546 |
+
2003/01/14/big/img_512
|
1547 |
+
2003/01/15/big/img_1183
|
1548 |
+
2003/01/15/big/img_714
|
1549 |
+
2002/08/01/big/img_2078
|
1550 |
+
2002/07/31/big/img_682
|
1551 |
+
2002/09/02/big/img_15687
|
1552 |
+
2002/07/26/big/img_518
|
1553 |
+
2002/08/27/big/img_19676
|
1554 |
+
2002/09/02/big/img_15969
|
1555 |
+
2002/08/02/big/img_931
|
1556 |
+
2002/08/25/big/img_508
|
1557 |
+
2002/08/29/big/img_18616
|
1558 |
+
2002/07/22/big/img_839
|
1559 |
+
2002/07/28/big/img_313
|
1560 |
+
2003/01/14/big/img_155
|
1561 |
+
2002/08/02/big/img_1105
|
1562 |
+
2002/08/09/big/img_53
|
1563 |
+
2002/08/16/big/img_469
|
1564 |
+
2002/08/15/big/img_502
|
1565 |
+
2002/08/20/big/img_575
|
1566 |
+
2002/07/25/big/img_138
|
1567 |
+
2003/01/16/big/img_579
|
1568 |
+
2002/07/19/big/img_352
|
1569 |
+
2003/01/14/big/img_762
|
1570 |
+
2003/01/01/big/img_588
|
1571 |
+
2002/08/02/big/img_981
|
1572 |
+
2002/08/21/big/img_447
|
1573 |
+
2002/09/01/big/img_16151
|
1574 |
+
2003/01/14/big/img_769
|
1575 |
+
2002/08/23/big/img_461
|
1576 |
+
2002/08/17/big/img_240
|
1577 |
+
2002/09/02/big/img_15220
|
1578 |
+
2002/07/19/big/img_408
|
1579 |
+
2002/09/02/big/img_15496
|
1580 |
+
2002/07/29/big/img_758
|
1581 |
+
2002/08/28/big/img_19392
|
1582 |
+
2002/08/06/big/img_2723
|
1583 |
+
2002/08/31/big/img_17752
|
1584 |
+
2002/08/23/big/img_469
|
1585 |
+
2002/08/13/big/img_515
|
1586 |
+
2002/09/02/big/img_15551
|
1587 |
+
2002/08/03/big/img_462
|
1588 |
+
2002/07/24/big/img_613
|
1589 |
+
2002/07/22/big/img_61
|
1590 |
+
2002/08/08/big/img_171
|
1591 |
+
2002/08/21/big/img_177
|
1592 |
+
2003/01/14/big/img_105
|
1593 |
+
2002/08/02/big/img_1017
|
1594 |
+
2002/08/22/big/img_106
|
1595 |
+
2002/07/27/big/img_542
|
1596 |
+
2002/07/21/big/img_665
|
1597 |
+
2002/07/23/big/img_595
|
1598 |
+
2002/08/04/big/img_657
|
1599 |
+
2002/08/29/big/img_19002
|
1600 |
+
2003/01/15/big/img_550
|
1601 |
+
2002/08/14/big/img_662
|
1602 |
+
2002/07/20/big/img_425
|
1603 |
+
2002/08/30/big/img_18528
|
1604 |
+
2002/07/26/big/img_611
|
1605 |
+
2002/07/22/big/img_849
|
1606 |
+
2002/08/07/big/img_1655
|
1607 |
+
2002/08/21/big/img_638
|
1608 |
+
2003/01/17/big/img_732
|
1609 |
+
2003/01/01/big/img_496
|
1610 |
+
2002/08/18/big/img_713
|
1611 |
+
2002/08/08/big/img_109
|
1612 |
+
2002/07/27/big/img_1008
|
1613 |
+
2002/07/20/big/img_559
|
1614 |
+
2002/08/16/big/img_699
|
1615 |
+
2002/08/31/big/img_17702
|
1616 |
+
2002/07/31/big/img_1013
|
1617 |
+
2002/08/01/big/img_2027
|
1618 |
+
2002/08/02/big/img_1001
|
1619 |
+
2002/08/03/big/img_210
|
1620 |
+
2002/08/01/big/img_2087
|
1621 |
+
2003/01/14/big/img_199
|
1622 |
+
2002/07/29/big/img_48
|
1623 |
+
2002/07/19/big/img_727
|
1624 |
+
2002/08/09/big/img_249
|
1625 |
+
2002/08/04/big/img_632
|
1626 |
+
2002/08/22/big/img_620
|
1627 |
+
2003/01/01/big/img_457
|
1628 |
+
2002/08/05/big/img_3223
|
1629 |
+
2002/07/27/big/img_240
|
1630 |
+
2002/07/25/big/img_797
|
1631 |
+
2002/08/13/big/img_430
|
1632 |
+
2002/07/25/big/img_615
|
1633 |
+
2002/08/12/big/img_28
|
1634 |
+
2002/07/30/big/img_220
|
1635 |
+
2002/07/24/big/img_89
|
1636 |
+
2002/08/21/big/img_357
|
1637 |
+
2002/08/09/big/img_590
|
1638 |
+
2003/01/13/big/img_525
|
1639 |
+
2002/08/17/big/img_818
|
1640 |
+
2003/01/02/big/img_7
|
1641 |
+
2002/07/26/big/img_636
|
1642 |
+
2003/01/13/big/img_1122
|
1643 |
+
2002/07/23/big/img_810
|
1644 |
+
2002/08/20/big/img_888
|
1645 |
+
2002/07/27/big/img_3
|
1646 |
+
2002/08/15/big/img_451
|
1647 |
+
2002/09/02/big/img_15787
|
1648 |
+
2002/07/31/big/img_281
|
1649 |
+
2002/08/05/big/img_3274
|
1650 |
+
2002/08/07/big/img_1254
|
1651 |
+
2002/07/31/big/img_27
|
1652 |
+
2002/08/01/big/img_1366
|
1653 |
+
2002/07/30/big/img_182
|
1654 |
+
2002/08/27/big/img_19690
|
1655 |
+
2002/07/29/big/img_68
|
1656 |
+
2002/08/23/big/img_754
|
1657 |
+
2002/07/30/big/img_540
|
1658 |
+
2002/08/27/big/img_20063
|
1659 |
+
2002/08/14/big/img_471
|
1660 |
+
2002/08/02/big/img_615
|
1661 |
+
2002/07/30/big/img_186
|
1662 |
+
2002/08/25/big/img_150
|
1663 |
+
2002/07/27/big/img_626
|
1664 |
+
2002/07/20/big/img_225
|
1665 |
+
2003/01/15/big/img_1252
|
1666 |
+
2002/07/19/big/img_367
|
1667 |
+
2003/01/15/big/img_582
|
1668 |
+
2002/08/09/big/img_572
|
1669 |
+
2002/08/08/big/img_428
|
1670 |
+
2003/01/15/big/img_639
|
1671 |
+
2002/08/28/big/img_19245
|
1672 |
+
2002/07/24/big/img_321
|
1673 |
+
2002/08/02/big/img_662
|
1674 |
+
2002/08/08/big/img_1033
|
1675 |
+
2003/01/17/big/img_867
|
1676 |
+
2002/07/22/big/img_652
|
1677 |
+
2003/01/14/big/img_224
|
1678 |
+
2002/08/18/big/img_49
|
1679 |
+
2002/07/26/big/img_46
|
1680 |
+
2002/08/31/big/img_18021
|
1681 |
+
2002/07/25/big/img_151
|
1682 |
+
2002/08/23/big/img_540
|
1683 |
+
2002/08/25/big/img_693
|
1684 |
+
2002/07/23/big/img_340
|
1685 |
+
2002/07/28/big/img_117
|
1686 |
+
2002/09/02/big/img_15768
|
1687 |
+
2002/08/26/big/img_562
|
1688 |
+
2002/07/24/big/img_480
|
1689 |
+
2003/01/15/big/img_341
|
1690 |
+
2002/08/10/big/img_783
|
1691 |
+
2002/08/20/big/img_132
|
1692 |
+
2003/01/14/big/img_370
|
1693 |
+
2002/07/20/big/img_720
|
1694 |
+
2002/08/03/big/img_144
|
1695 |
+
2002/08/20/big/img_538
|
1696 |
+
2002/08/01/big/img_1745
|
1697 |
+
2002/08/11/big/img_683
|
1698 |
+
2002/08/03/big/img_328
|
1699 |
+
2002/08/10/big/img_793
|
1700 |
+
2002/08/14/big/img_689
|
1701 |
+
2002/08/02/big/img_162
|
1702 |
+
2003/01/17/big/img_411
|
1703 |
+
2002/07/31/big/img_361
|
1704 |
+
2002/08/15/big/img_289
|
1705 |
+
2002/08/08/big/img_254
|
1706 |
+
2002/08/15/big/img_996
|
1707 |
+
2002/08/20/big/img_785
|
1708 |
+
2002/07/24/big/img_511
|
1709 |
+
2002/08/06/big/img_2614
|
1710 |
+
2002/08/29/big/img_18733
|
1711 |
+
2002/08/17/big/img_78
|
1712 |
+
2002/07/30/big/img_378
|
1713 |
+
2002/08/31/big/img_17947
|
1714 |
+
2002/08/26/big/img_88
|
1715 |
+
2002/07/30/big/img_558
|
1716 |
+
2002/08/02/big/img_67
|
1717 |
+
2003/01/14/big/img_325
|
1718 |
+
2002/07/29/big/img_1357
|
1719 |
+
2002/07/19/big/img_391
|
1720 |
+
2002/07/30/big/img_307
|
1721 |
+
2003/01/13/big/img_219
|
1722 |
+
2002/07/24/big/img_807
|
1723 |
+
2002/08/23/big/img_543
|
1724 |
+
2002/08/29/big/img_18620
|
1725 |
+
2002/07/22/big/img_769
|
1726 |
+
2002/08/26/big/img_503
|
1727 |
+
2002/07/30/big/img_78
|
1728 |
+
2002/08/14/big/img_1036
|
1729 |
+
2002/08/09/big/img_58
|
1730 |
+
2002/07/24/big/img_616
|
1731 |
+
2002/08/02/big/img_464
|
1732 |
+
2002/07/26/big/img_576
|
1733 |
+
2002/07/22/big/img_273
|
1734 |
+
2003/01/16/big/img_470
|
1735 |
+
2002/07/29/big/img_329
|
1736 |
+
2002/07/30/big/img_1086
|
1737 |
+
2002/07/31/big/img_353
|
1738 |
+
2002/09/02/big/img_15275
|
1739 |
+
2003/01/17/big/img_555
|
1740 |
+
2002/08/26/big/img_212
|
1741 |
+
2002/08/01/big/img_1692
|
1742 |
+
2003/01/15/big/img_600
|
1743 |
+
2002/07/29/big/img_825
|
1744 |
+
2002/08/08/big/img_68
|
1745 |
+
2002/08/10/big/img_719
|
1746 |
+
2002/07/31/big/img_636
|
1747 |
+
2002/07/29/big/img_325
|
1748 |
+
2002/07/21/big/img_515
|
1749 |
+
2002/07/22/big/img_705
|
1750 |
+
2003/01/13/big/img_818
|
1751 |
+
2002/08/09/big/img_486
|
1752 |
+
2002/08/22/big/img_141
|
1753 |
+
2002/07/22/big/img_303
|
1754 |
+
2002/08/09/big/img_393
|
1755 |
+
2002/07/29/big/img_963
|
1756 |
+
2002/08/02/big/img_1215
|
1757 |
+
2002/08/19/big/img_674
|
1758 |
+
2002/08/12/big/img_690
|
1759 |
+
2002/08/21/big/img_637
|
1760 |
+
2002/08/21/big/img_841
|
1761 |
+
2002/08/24/big/img_71
|
1762 |
+
2002/07/25/big/img_596
|
1763 |
+
2002/07/24/big/img_864
|
1764 |
+
2002/08/18/big/img_293
|
1765 |
+
2003/01/14/big/img_657
|
1766 |
+
2002/08/15/big/img_411
|
1767 |
+
2002/08/16/big/img_348
|
1768 |
+
2002/08/05/big/img_3157
|
1769 |
+
2002/07/20/big/img_663
|
1770 |
+
2003/01/13/big/img_654
|
1771 |
+
2003/01/16/big/img_433
|
1772 |
+
2002/08/30/big/img_18200
|
1773 |
+
2002/08/12/big/img_226
|
1774 |
+
2003/01/16/big/img_491
|
1775 |
+
2002/08/08/big/img_666
|
1776 |
+
2002/07/19/big/img_576
|
1777 |
+
2003/01/15/big/img_776
|
1778 |
+
2003/01/16/big/img_899
|
1779 |
+
2002/07/19/big/img_397
|
1780 |
+
2002/08/14/big/img_44
|
1781 |
+
2003/01/15/big/img_762
|
1782 |
+
2002/08/02/big/img_982
|
1783 |
+
2002/09/02/big/img_15234
|
1784 |
+
2002/08/17/big/img_556
|
1785 |
+
2002/08/21/big/img_410
|
1786 |
+
2002/08/21/big/img_386
|
1787 |
+
2002/07/19/big/img_690
|
1788 |
+
2002/08/05/big/img_3052
|
1789 |
+
2002/08/14/big/img_219
|
1790 |
+
2002/08/16/big/img_273
|
1791 |
+
2003/01/15/big/img_752
|
1792 |
+
2002/08/08/big/img_184
|
1793 |
+
2002/07/31/big/img_743
|
1794 |
+
2002/08/23/big/img_338
|
1795 |
+
2003/01/14/big/img_1055
|
1796 |
+
2002/08/05/big/img_3405
|
1797 |
+
2003/01/15/big/img_17
|
1798 |
+
2002/08/03/big/img_141
|
1799 |
+
2002/08/14/big/img_549
|
1800 |
+
2002/07/27/big/img_1034
|
1801 |
+
2002/07/31/big/img_932
|
1802 |
+
2002/08/30/big/img_18487
|
1803 |
+
2002/09/02/big/img_15814
|
1804 |
+
2002/08/01/big/img_2086
|
1805 |
+
2002/09/01/big/img_16535
|
1806 |
+
2002/07/22/big/img_500
|
1807 |
+
2003/01/13/big/img_400
|
1808 |
+
2002/08/25/big/img_607
|
1809 |
+
2002/08/30/big/img_18384
|
1810 |
+
2003/01/14/big/img_951
|
1811 |
+
2002/08/13/big/img_1150
|
1812 |
+
2002/08/08/big/img_1022
|
1813 |
+
2002/08/10/big/img_428
|
1814 |
+
2002/08/28/big/img_19242
|
1815 |
+
2002/08/05/big/img_3098
|
1816 |
+
2002/07/23/big/img_400
|
1817 |
+
2002/08/26/big/img_365
|
1818 |
+
2002/07/20/big/img_318
|
1819 |
+
2002/08/13/big/img_740
|
1820 |
+
2003/01/16/big/img_37
|
1821 |
+
2002/08/26/big/img_274
|
1822 |
+
2002/08/02/big/img_205
|
1823 |
+
2002/08/21/big/img_695
|
1824 |
+
2002/08/06/big/img_2289
|
1825 |
+
2002/08/20/big/img_794
|
1826 |
+
2002/08/18/big/img_438
|
1827 |
+
2002/08/07/big/img_1380
|
1828 |
+
2002/08/02/big/img_737
|
1829 |
+
2002/08/07/big/img_1651
|
1830 |
+
2002/08/15/big/img_1238
|
1831 |
+
2002/08/01/big/img_1681
|
1832 |
+
2002/08/06/big/img_3017
|
1833 |
+
2002/07/23/big/img_706
|
1834 |
+
2002/07/31/big/img_392
|
1835 |
+
2002/08/09/big/img_539
|
1836 |
+
2002/07/29/big/img_835
|
1837 |
+
2002/08/26/big/img_723
|
1838 |
+
2002/08/28/big/img_19235
|
1839 |
+
2003/01/16/big/img_353
|
1840 |
+
2002/08/10/big/img_150
|
1841 |
+
2002/08/29/big/img_19025
|
1842 |
+
2002/08/21/big/img_310
|
1843 |
+
2002/08/10/big/img_823
|
1844 |
+
2002/07/26/big/img_981
|
1845 |
+
2002/08/11/big/img_288
|
1846 |
+
2002/08/19/big/img_534
|
1847 |
+
2002/08/21/big/img_300
|
1848 |
+
2002/07/31/big/img_49
|
1849 |
+
2002/07/30/big/img_469
|
1850 |
+
2002/08/28/big/img_19197
|
1851 |
+
2002/08/25/big/img_205
|
1852 |
+
2002/08/10/big/img_390
|
1853 |
+
2002/08/23/big/img_291
|
1854 |
+
2002/08/26/big/img_230
|
1855 |
+
2002/08/18/big/img_76
|
1856 |
+
2002/07/23/big/img_409
|
1857 |
+
2002/08/14/big/img_1053
|
1858 |
+
2003/01/14/big/img_291
|
1859 |
+
2002/08/10/big/img_503
|
1860 |
+
2002/08/27/big/img_19928
|
1861 |
+
2002/08/03/big/img_563
|
1862 |
+
2002/08/17/big/img_250
|
1863 |
+
2002/08/06/big/img_2381
|
1864 |
+
2002/08/17/big/img_948
|
1865 |
+
2002/08/06/big/img_2710
|
1866 |
+
2002/07/22/big/img_696
|
1867 |
+
2002/07/31/big/img_670
|
1868 |
+
2002/08/12/big/img_594
|
1869 |
+
2002/07/29/big/img_624
|
1870 |
+
2003/01/17/big/img_934
|
1871 |
+
2002/08/03/big/img_584
|
1872 |
+
2002/08/22/big/img_1003
|
1873 |
+
2002/08/05/big/img_3396
|
1874 |
+
2003/01/13/big/img_570
|
1875 |
+
2002/08/02/big/img_219
|
1876 |
+
2002/09/02/big/img_15774
|
1877 |
+
2002/08/16/big/img_818
|
1878 |
+
2002/08/23/big/img_402
|
1879 |
+
2003/01/14/big/img_552
|
1880 |
+
2002/07/29/big/img_71
|
1881 |
+
2002/08/05/big/img_3592
|
1882 |
+
2002/08/16/big/img_80
|
1883 |
+
2002/07/27/big/img_672
|
1884 |
+
2003/01/13/big/img_470
|
1885 |
+
2003/01/16/big/img_702
|
1886 |
+
2002/09/01/big/img_16130
|
1887 |
+
2002/08/08/big/img_240
|
1888 |
+
2002/09/01/big/img_16338
|
1889 |
+
2002/07/26/big/img_312
|
1890 |
+
2003/01/14/big/img_538
|
1891 |
+
2002/07/20/big/img_695
|
1892 |
+
2002/08/30/big/img_18098
|
1893 |
+
2002/08/25/big/img_259
|
1894 |
+
2002/08/16/big/img_1042
|
1895 |
+
2002/08/09/big/img_837
|
1896 |
+
2002/08/31/big/img_17760
|
1897 |
+
2002/07/31/big/img_14
|
1898 |
+
2002/08/09/big/img_361
|
1899 |
+
2003/01/16/big/img_107
|
1900 |
+
2002/08/14/big/img_124
|
1901 |
+
2002/07/19/big/img_463
|
1902 |
+
2003/01/15/big/img_275
|
1903 |
+
2002/07/25/big/img_1151
|
1904 |
+
2002/07/29/big/img_1501
|
1905 |
+
2002/08/27/big/img_19889
|
1906 |
+
2002/08/29/big/img_18603
|
1907 |
+
2003/01/17/big/img_601
|
1908 |
+
2002/08/25/big/img_355
|
1909 |
+
2002/08/08/big/img_297
|
1910 |
+
2002/08/20/big/img_290
|
1911 |
+
2002/07/31/big/img_195
|
1912 |
+
2003/01/01/big/img_336
|
1913 |
+
2002/08/18/big/img_369
|
1914 |
+
2002/07/25/big/img_621
|
1915 |
+
2002/08/11/big/img_508
|
1916 |
+
2003/01/14/big/img_458
|
1917 |
+
2003/01/15/big/img_795
|
1918 |
+
2002/08/12/big/img_498
|
1919 |
+
2002/08/01/big/img_1734
|
1920 |
+
2002/08/02/big/img_246
|
1921 |
+
2002/08/16/big/img_565
|
1922 |
+
2002/08/11/big/img_475
|
1923 |
+
2002/08/22/big/img_408
|
1924 |
+
2002/07/28/big/img_78
|
1925 |
+
2002/07/21/big/img_81
|
1926 |
+
2003/01/14/big/img_697
|
1927 |
+
2002/08/14/big/img_661
|
1928 |
+
2002/08/15/big/img_507
|
1929 |
+
2002/08/19/big/img_55
|
1930 |
+
2002/07/22/big/img_152
|
1931 |
+
2003/01/14/big/img_470
|
1932 |
+
2002/08/03/big/img_379
|
1933 |
+
2002/08/22/big/img_506
|
1934 |
+
2003/01/16/big/img_966
|
1935 |
+
2002/08/18/big/img_698
|
1936 |
+
2002/08/24/big/img_528
|
1937 |
+
2002/08/23/big/img_10
|
1938 |
+
2002/08/01/big/img_1655
|
1939 |
+
2002/08/22/big/img_953
|
1940 |
+
2002/07/19/big/img_630
|
1941 |
+
2002/07/22/big/img_889
|
1942 |
+
2002/08/16/big/img_351
|
1943 |
+
2003/01/16/big/img_83
|
1944 |
+
2002/07/19/big/img_805
|
1945 |
+
2002/08/14/big/img_704
|
1946 |
+
2002/07/19/big/img_389
|
1947 |
+
2002/08/31/big/img_17765
|
1948 |
+
2002/07/29/big/img_606
|
1949 |
+
2003/01/17/big/img_939
|
1950 |
+
2002/09/02/big/img_15081
|
1951 |
+
2002/08/21/big/img_181
|
1952 |
+
2002/07/29/big/img_1321
|
1953 |
+
2002/07/21/big/img_497
|
1954 |
+
2002/07/20/big/img_539
|
1955 |
+
2002/08/24/big/img_119
|
1956 |
+
2002/08/01/big/img_1281
|
1957 |
+
2002/07/26/big/img_207
|
1958 |
+
2002/07/26/big/img_432
|
1959 |
+
2002/07/27/big/img_1006
|
1960 |
+
2002/08/05/big/img_3087
|
1961 |
+
2002/08/14/big/img_252
|
1962 |
+
2002/08/14/big/img_798
|
1963 |
+
2002/07/24/big/img_538
|
1964 |
+
2002/09/02/big/img_15507
|
1965 |
+
2002/08/08/big/img_901
|
1966 |
+
2003/01/14/big/img_557
|
1967 |
+
2002/08/07/big/img_1819
|
1968 |
+
2002/08/04/big/img_470
|
1969 |
+
2002/08/01/big/img_1504
|
1970 |
+
2002/08/16/big/img_1070
|
1971 |
+
2002/08/16/big/img_372
|
1972 |
+
2002/08/23/big/img_416
|
1973 |
+
2002/08/30/big/img_18208
|
1974 |
+
2002/08/01/big/img_2043
|
1975 |
+
2002/07/22/big/img_385
|
1976 |
+
2002/08/22/big/img_466
|
1977 |
+
2002/08/21/big/img_869
|
1978 |
+
2002/08/28/big/img_19429
|
1979 |
+
2002/08/02/big/img_770
|
1980 |
+
2002/07/23/big/img_433
|
1981 |
+
2003/01/14/big/img_13
|
1982 |
+
2002/07/27/big/img_953
|
1983 |
+
2002/09/02/big/img_15728
|
1984 |
+
2002/08/01/big/img_1361
|
1985 |
+
2002/08/29/big/img_18897
|
1986 |
+
2002/08/26/big/img_534
|
1987 |
+
2002/08/11/big/img_121
|
1988 |
+
2002/08/26/big/img_20130
|
1989 |
+
2002/07/31/big/img_363
|
1990 |
+
2002/08/13/big/img_978
|
1991 |
+
2002/07/25/big/img_835
|
1992 |
+
2002/08/02/big/img_906
|
1993 |
+
2003/01/14/big/img_548
|
1994 |
+
2002/07/30/big/img_80
|
1995 |
+
2002/07/26/big/img_982
|
1996 |
+
2003/01/16/big/img_99
|
1997 |
+
2002/08/19/big/img_362
|
1998 |
+
2002/08/24/big/img_376
|
1999 |
+
2002/08/07/big/img_1264
|
2000 |
+
2002/07/27/big/img_938
|
2001 |
+
2003/01/17/big/img_535
|
2002 |
+
2002/07/26/big/img_457
|
2003 |
+
2002/08/08/big/img_848
|
2004 |
+
2003/01/15/big/img_859
|
2005 |
+
2003/01/15/big/img_622
|
2006 |
+
2002/07/30/big/img_403
|
2007 |
+
2002/07/29/big/img_217
|
2008 |
+
2002/07/26/big/img_891
|
2009 |
+
2002/07/24/big/img_70
|
2010 |
+
2002/08/25/big/img_619
|
2011 |
+
2002/08/05/big/img_3375
|
2012 |
+
2002/08/01/big/img_2160
|
2013 |
+
2002/08/06/big/img_2227
|
2014 |
+
2003/01/14/big/img_117
|
2015 |
+
2002/08/14/big/img_227
|
2016 |
+
2002/08/13/big/img_565
|
2017 |
+
2002/08/19/big/img_625
|
2018 |
+
2002/08/03/big/img_812
|
2019 |
+
2002/07/24/big/img_41
|
2020 |
+
2002/08/16/big/img_235
|
2021 |
+
2002/07/29/big/img_759
|
2022 |
+
2002/07/21/big/img_433
|
2023 |
+
2002/07/29/big/img_190
|
2024 |
+
2003/01/16/big/img_435
|
2025 |
+
2003/01/13/big/img_708
|
2026 |
+
2002/07/30/big/img_57
|
2027 |
+
2002/08/22/big/img_162
|
2028 |
+
2003/01/01/big/img_558
|
2029 |
+
2003/01/15/big/img_604
|
2030 |
+
2002/08/16/big/img_935
|
2031 |
+
2002/08/20/big/img_394
|
2032 |
+
2002/07/28/big/img_465
|
2033 |
+
2002/09/02/big/img_15534
|
2034 |
+
2002/08/16/big/img_87
|
2035 |
+
2002/07/22/big/img_469
|
2036 |
+
2002/08/12/big/img_245
|
2037 |
+
2003/01/13/big/img_236
|
2038 |
+
2002/08/06/big/img_2736
|
2039 |
+
2002/08/03/big/img_348
|
2040 |
+
2003/01/14/big/img_218
|
2041 |
+
2002/07/26/big/img_232
|
2042 |
+
2003/01/15/big/img_244
|
2043 |
+
2002/07/25/big/img_1121
|
2044 |
+
2002/08/01/big/img_1484
|
2045 |
+
2002/07/26/big/img_541
|
2046 |
+
2002/08/07/big/img_1244
|
2047 |
+
2002/07/31/big/img_3
|
2048 |
+
2002/08/30/big/img_18437
|
2049 |
+
2002/08/29/big/img_19094
|
2050 |
+
2002/08/01/big/img_1355
|
2051 |
+
2002/08/19/big/img_338
|
2052 |
+
2002/07/19/big/img_255
|
2053 |
+
2002/07/21/big/img_76
|
2054 |
+
2002/08/25/big/img_199
|
2055 |
+
2002/08/12/big/img_740
|
2056 |
+
2002/07/30/big/img_852
|
2057 |
+
2002/08/15/big/img_599
|
2058 |
+
2002/08/23/big/img_254
|
2059 |
+
2002/08/19/big/img_125
|
2060 |
+
2002/07/24/big/img_2
|
2061 |
+
2002/08/04/big/img_145
|
2062 |
+
2002/08/05/big/img_3137
|
2063 |
+
2002/07/28/big/img_463
|
2064 |
+
2003/01/14/big/img_801
|
2065 |
+
2002/07/23/big/img_366
|
2066 |
+
2002/08/26/big/img_600
|
2067 |
+
2002/08/26/big/img_649
|
2068 |
+
2002/09/02/big/img_15849
|
2069 |
+
2002/07/26/big/img_248
|
2070 |
+
2003/01/13/big/img_200
|
2071 |
+
2002/08/07/big/img_1794
|
2072 |
+
2002/08/31/big/img_17270
|
2073 |
+
2002/08/23/big/img_608
|
2074 |
+
2003/01/13/big/img_837
|
2075 |
+
2002/08/23/big/img_581
|
2076 |
+
2002/08/20/big/img_754
|
2077 |
+
2002/08/18/big/img_183
|
2078 |
+
2002/08/20/big/img_328
|
2079 |
+
2002/07/22/big/img_494
|
2080 |
+
2002/07/29/big/img_399
|
2081 |
+
2002/08/28/big/img_19284
|
2082 |
+
2002/08/08/big/img_566
|
2083 |
+
2002/07/25/big/img_376
|
2084 |
+
2002/07/23/big/img_138
|
2085 |
+
2002/07/25/big/img_435
|
2086 |
+
2002/08/17/big/img_685
|
2087 |
+
2002/07/19/big/img_90
|
2088 |
+
2002/07/20/big/img_716
|
2089 |
+
2002/08/31/big/img_17458
|
2090 |
+
2002/08/26/big/img_461
|
2091 |
+
2002/07/25/big/img_355
|
2092 |
+
2002/08/06/big/img_2152
|
2093 |
+
2002/07/27/big/img_932
|
2094 |
+
2002/07/23/big/img_232
|
2095 |
+
2002/08/08/big/img_1020
|
2096 |
+
2002/07/31/big/img_366
|
2097 |
+
2002/08/06/big/img_2667
|
2098 |
+
2002/08/21/big/img_465
|
2099 |
+
2002/08/15/big/img_305
|
2100 |
+
2002/08/02/big/img_247
|
2101 |
+
2002/07/28/big/img_46
|
2102 |
+
2002/08/27/big/img_19922
|
2103 |
+
2002/08/23/big/img_643
|
2104 |
+
2003/01/13/big/img_624
|
2105 |
+
2002/08/23/big/img_625
|
2106 |
+
2002/08/05/big/img_3787
|
2107 |
+
2003/01/13/big/img_627
|
2108 |
+
2002/09/01/big/img_16381
|
2109 |
+
2002/08/05/big/img_3668
|
2110 |
+
2002/07/21/big/img_535
|
2111 |
+
2002/08/27/big/img_19680
|
2112 |
+
2002/07/22/big/img_413
|
2113 |
+
2002/07/29/big/img_481
|
2114 |
+
2003/01/15/big/img_496
|
2115 |
+
2002/07/23/big/img_701
|
2116 |
+
2002/08/29/big/img_18670
|
2117 |
+
2002/07/28/big/img_319
|
2118 |
+
2003/01/14/big/img_517
|
2119 |
+
2002/07/26/big/img_256
|
2120 |
+
2003/01/16/big/img_593
|
2121 |
+
2002/07/30/big/img_956
|
2122 |
+
2002/07/30/big/img_667
|
2123 |
+
2002/07/25/big/img_100
|
2124 |
+
2002/08/11/big/img_570
|
2125 |
+
2002/07/26/big/img_745
|
2126 |
+
2002/08/04/big/img_834
|
2127 |
+
2002/08/25/big/img_521
|
2128 |
+
2002/08/01/big/img_2148
|
2129 |
+
2002/09/02/big/img_15183
|
2130 |
+
2002/08/22/big/img_514
|
2131 |
+
2002/08/23/big/img_477
|
2132 |
+
2002/07/23/big/img_336
|
2133 |
+
2002/07/26/big/img_481
|
2134 |
+
2002/08/20/big/img_409
|
2135 |
+
2002/07/23/big/img_918
|
2136 |
+
2002/08/09/big/img_474
|
2137 |
+
2002/08/02/big/img_929
|
2138 |
+
2002/08/31/big/img_17932
|
2139 |
+
2002/08/19/big/img_161
|
2140 |
+
2002/08/09/big/img_667
|
2141 |
+
2002/07/31/big/img_805
|
2142 |
+
2002/09/02/big/img_15678
|
2143 |
+
2002/08/31/big/img_17509
|
2144 |
+
2002/08/29/big/img_18998
|
2145 |
+
2002/07/23/big/img_301
|
2146 |
+
2002/08/07/big/img_1612
|
2147 |
+
2002/08/06/big/img_2472
|
2148 |
+
2002/07/23/big/img_466
|
2149 |
+
2002/08/27/big/img_19634
|
2150 |
+
2003/01/16/big/img_16
|
2151 |
+
2002/08/14/big/img_193
|
2152 |
+
2002/08/21/big/img_340
|
2153 |
+
2002/08/27/big/img_19799
|
2154 |
+
2002/08/01/big/img_1345
|
2155 |
+
2002/08/07/big/img_1448
|
2156 |
+
2002/08/11/big/img_324
|
2157 |
+
2003/01/16/big/img_754
|
2158 |
+
2002/08/13/big/img_418
|
2159 |
+
2003/01/16/big/img_544
|
2160 |
+
2002/08/19/big/img_135
|
2161 |
+
2002/08/10/big/img_455
|
2162 |
+
2002/08/10/big/img_693
|
2163 |
+
2002/08/31/big/img_17967
|
2164 |
+
2002/08/28/big/img_19229
|
2165 |
+
2002/08/04/big/img_811
|
2166 |
+
2002/09/01/big/img_16225
|
2167 |
+
2003/01/16/big/img_428
|
2168 |
+
2002/09/02/big/img_15295
|
2169 |
+
2002/07/26/big/img_108
|
2170 |
+
2002/07/21/big/img_477
|
2171 |
+
2002/08/07/big/img_1354
|
2172 |
+
2002/08/23/big/img_246
|
2173 |
+
2002/08/16/big/img_652
|
2174 |
+
2002/07/27/big/img_553
|
2175 |
+
2002/07/31/big/img_346
|
2176 |
+
2002/08/04/big/img_537
|
2177 |
+
2002/08/08/big/img_498
|
2178 |
+
2002/08/29/big/img_18956
|
2179 |
+
2003/01/13/big/img_922
|
2180 |
+
2002/08/31/big/img_17425
|
2181 |
+
2002/07/26/big/img_438
|
2182 |
+
2002/08/19/big/img_185
|
2183 |
+
2003/01/16/big/img_33
|
2184 |
+
2002/08/10/big/img_252
|
2185 |
+
2002/07/29/big/img_598
|
2186 |
+
2002/08/27/big/img_19820
|
2187 |
+
2002/08/06/big/img_2664
|
2188 |
+
2002/08/20/big/img_705
|
2189 |
+
2003/01/14/big/img_816
|
2190 |
+
2002/08/03/big/img_552
|
2191 |
+
2002/07/25/big/img_561
|
2192 |
+
2002/07/25/big/img_934
|
2193 |
+
2002/08/01/big/img_1893
|
2194 |
+
2003/01/14/big/img_746
|
2195 |
+
2003/01/16/big/img_519
|
2196 |
+
2002/08/03/big/img_681
|
2197 |
+
2002/07/24/big/img_808
|
2198 |
+
2002/08/14/big/img_803
|
2199 |
+
2002/08/25/big/img_155
|
2200 |
+
2002/07/30/big/img_1107
|
2201 |
+
2002/08/29/big/img_18882
|
2202 |
+
2003/01/15/big/img_598
|
2203 |
+
2002/08/19/big/img_122
|
2204 |
+
2002/07/30/big/img_428
|
2205 |
+
2002/07/24/big/img_684
|
2206 |
+
2002/08/22/big/img_192
|
2207 |
+
2002/08/22/big/img_543
|
2208 |
+
2002/08/07/big/img_1318
|
2209 |
+
2002/08/18/big/img_25
|
2210 |
+
2002/07/26/big/img_583
|
2211 |
+
2002/07/20/big/img_464
|
2212 |
+
2002/08/19/big/img_664
|
2213 |
+
2002/08/24/big/img_861
|
2214 |
+
2002/09/01/big/img_16136
|
2215 |
+
2002/08/22/big/img_400
|
2216 |
+
2002/08/12/big/img_445
|
2217 |
+
2003/01/14/big/img_174
|
2218 |
+
2002/08/27/big/img_19677
|
2219 |
+
2002/08/31/big/img_17214
|
2220 |
+
2002/08/30/big/img_18175
|
2221 |
+
2003/01/17/big/img_402
|
2222 |
+
2002/08/06/big/img_2396
|
2223 |
+
2002/08/18/big/img_448
|
2224 |
+
2002/08/21/big/img_165
|
2225 |
+
2002/08/31/big/img_17609
|
2226 |
+
2003/01/01/big/img_151
|
2227 |
+
2002/08/26/big/img_372
|
2228 |
+
2002/09/02/big/img_15994
|
2229 |
+
2002/07/26/big/img_660
|
2230 |
+
2002/09/02/big/img_15197
|
2231 |
+
2002/07/29/big/img_258
|
2232 |
+
2002/08/30/big/img_18525
|
2233 |
+
2003/01/13/big/img_368
|
2234 |
+
2002/07/29/big/img_1538
|
2235 |
+
2002/07/21/big/img_787
|
2236 |
+
2002/08/18/big/img_152
|
2237 |
+
2002/08/06/big/img_2379
|
2238 |
+
2003/01/17/big/img_864
|
2239 |
+
2002/08/27/big/img_19998
|
2240 |
+
2002/08/01/big/img_1634
|
2241 |
+
2002/07/25/big/img_414
|
2242 |
+
2002/08/22/big/img_627
|
2243 |
+
2002/08/07/big/img_1669
|
2244 |
+
2002/08/16/big/img_1052
|
2245 |
+
2002/08/31/big/img_17796
|
2246 |
+
2002/08/18/big/img_199
|
2247 |
+
2002/09/02/big/img_15147
|
2248 |
+
2002/08/09/big/img_460
|
2249 |
+
2002/08/14/big/img_581
|
2250 |
+
2002/08/30/big/img_18286
|
2251 |
+
2002/07/26/big/img_337
|
2252 |
+
2002/08/18/big/img_589
|
2253 |
+
2003/01/14/big/img_866
|
2254 |
+
2002/07/20/big/img_624
|
2255 |
+
2002/08/01/big/img_1801
|
2256 |
+
2002/07/24/big/img_683
|
2257 |
+
2002/08/09/big/img_725
|
2258 |
+
2003/01/14/big/img_34
|
2259 |
+
2002/07/30/big/img_144
|
2260 |
+
2002/07/30/big/img_706
|
2261 |
+
2002/08/08/big/img_394
|
2262 |
+
2002/08/19/big/img_619
|
2263 |
+
2002/08/06/big/img_2703
|
2264 |
+
2002/08/29/big/img_19034
|
2265 |
+
2002/07/24/big/img_67
|
2266 |
+
2002/08/27/big/img_19841
|
2267 |
+
2002/08/19/big/img_427
|
2268 |
+
2003/01/14/big/img_333
|
2269 |
+
2002/09/01/big/img_16406
|
2270 |
+
2002/07/19/big/img_882
|
2271 |
+
2002/08/17/big/img_238
|
2272 |
+
2003/01/14/big/img_739
|
2273 |
+
2002/07/22/big/img_151
|
2274 |
+
2002/08/21/big/img_743
|
2275 |
+
2002/07/25/big/img_1048
|
2276 |
+
2002/07/30/big/img_395
|
2277 |
+
2003/01/13/big/img_584
|
2278 |
+
2002/08/13/big/img_742
|
2279 |
+
2002/08/13/big/img_1168
|
2280 |
+
2003/01/14/big/img_147
|
2281 |
+
2002/07/26/big/img_803
|
2282 |
+
2002/08/05/big/img_3298
|
2283 |
+
2002/08/07/big/img_1451
|
2284 |
+
2002/08/16/big/img_424
|
2285 |
+
2002/07/29/big/img_1069
|
2286 |
+
2002/09/01/big/img_16735
|
2287 |
+
2002/07/21/big/img_637
|
2288 |
+
2003/01/14/big/img_585
|
2289 |
+
2002/08/02/big/img_358
|
2290 |
+
2003/01/13/big/img_358
|
2291 |
+
2002/08/14/big/img_198
|
2292 |
+
2002/08/17/big/img_935
|
2293 |
+
2002/08/04/big/img_42
|
2294 |
+
2002/08/30/big/img_18245
|
2295 |
+
2002/07/25/big/img_158
|
2296 |
+
2002/08/22/big/img_744
|
2297 |
+
2002/08/06/big/img_2291
|
2298 |
+
2002/08/05/big/img_3044
|
2299 |
+
2002/07/30/big/img_272
|
2300 |
+
2002/08/23/big/img_641
|
2301 |
+
2002/07/24/big/img_797
|
2302 |
+
2002/07/30/big/img_392
|
2303 |
+
2003/01/14/big/img_447
|
2304 |
+
2002/07/31/big/img_898
|
2305 |
+
2002/08/06/big/img_2812
|
2306 |
+
2002/08/13/big/img_564
|
2307 |
+
2002/07/22/big/img_43
|
2308 |
+
2002/07/26/big/img_634
|
2309 |
+
2002/07/19/big/img_843
|
2310 |
+
2002/08/26/big/img_58
|
2311 |
+
2002/07/21/big/img_375
|
2312 |
+
2002/08/25/big/img_729
|
2313 |
+
2002/07/19/big/img_561
|
2314 |
+
2003/01/15/big/img_884
|
2315 |
+
2002/07/25/big/img_891
|
2316 |
+
2002/08/09/big/img_558
|
2317 |
+
2002/08/26/big/img_587
|
2318 |
+
2002/08/13/big/img_1146
|
2319 |
+
2002/09/02/big/img_15153
|
2320 |
+
2002/07/26/big/img_316
|
2321 |
+
2002/08/01/big/img_1940
|
2322 |
+
2002/08/26/big/img_90
|
2323 |
+
2003/01/13/big/img_347
|
2324 |
+
2002/07/25/big/img_520
|
2325 |
+
2002/08/29/big/img_18718
|
2326 |
+
2002/08/28/big/img_19219
|
2327 |
+
2002/08/13/big/img_375
|
2328 |
+
2002/07/20/big/img_719
|
2329 |
+
2002/08/31/big/img_17431
|
2330 |
+
2002/07/28/big/img_192
|
2331 |
+
2002/08/26/big/img_259
|
2332 |
+
2002/08/18/big/img_484
|
2333 |
+
2002/07/29/big/img_580
|
2334 |
+
2002/07/26/big/img_84
|
2335 |
+
2002/08/02/big/img_302
|
2336 |
+
2002/08/31/big/img_17007
|
2337 |
+
2003/01/15/big/img_543
|
2338 |
+
2002/09/01/big/img_16488
|
2339 |
+
2002/08/22/big/img_798
|
2340 |
+
2002/07/30/big/img_383
|
2341 |
+
2002/08/04/big/img_668
|
2342 |
+
2002/08/13/big/img_156
|
2343 |
+
2002/08/07/big/img_1353
|
2344 |
+
2002/07/25/big/img_281
|
2345 |
+
2003/01/14/big/img_587
|
2346 |
+
2003/01/15/big/img_524
|
2347 |
+
2002/08/19/big/img_726
|
2348 |
+
2002/08/21/big/img_709
|
2349 |
+
2002/08/26/big/img_465
|
2350 |
+
2002/07/31/big/img_658
|
2351 |
+
2002/08/28/big/img_19148
|
2352 |
+
2002/07/23/big/img_423
|
2353 |
+
2002/08/16/big/img_758
|
2354 |
+
2002/08/22/big/img_523
|
2355 |
+
2002/08/16/big/img_591
|
2356 |
+
2002/08/23/big/img_845
|
2357 |
+
2002/07/26/big/img_678
|
2358 |
+
2002/08/09/big/img_806
|
2359 |
+
2002/08/06/big/img_2369
|
2360 |
+
2002/07/29/big/img_457
|
2361 |
+
2002/07/19/big/img_278
|
2362 |
+
2002/08/30/big/img_18107
|
2363 |
+
2002/07/26/big/img_444
|
2364 |
+
2002/08/20/big/img_278
|
2365 |
+
2002/08/26/big/img_92
|
2366 |
+
2002/08/26/big/img_257
|
2367 |
+
2002/07/25/big/img_266
|
2368 |
+
2002/08/05/big/img_3829
|
2369 |
+
2002/07/26/big/img_757
|
2370 |
+
2002/07/29/big/img_1536
|
2371 |
+
2002/08/09/big/img_472
|
2372 |
+
2003/01/17/big/img_480
|
2373 |
+
2002/08/28/big/img_19355
|
2374 |
+
2002/07/26/big/img_97
|
2375 |
+
2002/08/06/big/img_2503
|
2376 |
+
2002/07/19/big/img_254
|
2377 |
+
2002/08/01/big/img_1470
|
2378 |
+
2002/08/21/big/img_42
|
2379 |
+
2002/08/20/big/img_217
|
2380 |
+
2002/08/06/big/img_2459
|
2381 |
+
2002/07/19/big/img_552
|
2382 |
+
2002/08/13/big/img_717
|
2383 |
+
2002/08/12/big/img_586
|
2384 |
+
2002/08/20/big/img_411
|
2385 |
+
2003/01/13/big/img_768
|
2386 |
+
2002/08/07/big/img_1747
|
2387 |
+
2002/08/15/big/img_385
|
2388 |
+
2002/08/01/big/img_1648
|
2389 |
+
2002/08/15/big/img_311
|
2390 |
+
2002/08/21/big/img_95
|
2391 |
+
2002/08/09/big/img_108
|
2392 |
+
2002/08/21/big/img_398
|
2393 |
+
2002/08/17/big/img_340
|
2394 |
+
2002/08/14/big/img_474
|
2395 |
+
2002/08/13/big/img_294
|
2396 |
+
2002/08/24/big/img_840
|
2397 |
+
2002/08/09/big/img_808
|
2398 |
+
2002/08/23/big/img_491
|
2399 |
+
2002/07/28/big/img_33
|
2400 |
+
2003/01/13/big/img_664
|
2401 |
+
2002/08/02/big/img_261
|
2402 |
+
2002/08/09/big/img_591
|
2403 |
+
2002/07/26/big/img_309
|
2404 |
+
2003/01/14/big/img_372
|
2405 |
+
2002/08/19/big/img_581
|
2406 |
+
2002/08/19/big/img_168
|
2407 |
+
2002/08/26/big/img_422
|
2408 |
+
2002/07/24/big/img_106
|
2409 |
+
2002/08/01/big/img_1936
|
2410 |
+
2002/08/05/big/img_3764
|
2411 |
+
2002/08/21/big/img_266
|
2412 |
+
2002/08/31/big/img_17968
|
2413 |
+
2002/08/01/big/img_1941
|
2414 |
+
2002/08/15/big/img_550
|
2415 |
+
2002/08/14/big/img_13
|
2416 |
+
2002/07/30/big/img_171
|
2417 |
+
2003/01/13/big/img_490
|
2418 |
+
2002/07/25/big/img_427
|
2419 |
+
2002/07/19/big/img_770
|
2420 |
+
2002/08/12/big/img_759
|
2421 |
+
2003/01/15/big/img_1360
|
2422 |
+
2002/08/05/big/img_3692
|
2423 |
+
2003/01/16/big/img_30
|
2424 |
+
2002/07/25/big/img_1026
|
2425 |
+
2002/07/22/big/img_288
|
2426 |
+
2002/08/29/big/img_18801
|
2427 |
+
2002/07/24/big/img_793
|
2428 |
+
2002/08/13/big/img_178
|
2429 |
+
2002/08/06/big/img_2322
|
2430 |
+
2003/01/14/big/img_560
|
2431 |
+
2002/08/18/big/img_408
|
2432 |
+
2003/01/16/big/img_915
|
2433 |
+
2003/01/16/big/img_679
|
2434 |
+
2002/08/07/big/img_1552
|
2435 |
+
2002/08/29/big/img_19050
|
2436 |
+
2002/08/01/big/img_2172
|
2437 |
+
2002/07/31/big/img_30
|
2438 |
+
2002/07/30/big/img_1019
|
2439 |
+
2002/07/30/big/img_587
|
2440 |
+
2003/01/13/big/img_773
|
2441 |
+
2002/07/30/big/img_410
|
2442 |
+
2002/07/28/big/img_65
|
2443 |
+
2002/08/05/big/img_3138
|
2444 |
+
2002/07/23/big/img_541
|
2445 |
+
2002/08/22/big/img_963
|
2446 |
+
2002/07/27/big/img_657
|
2447 |
+
2002/07/30/big/img_1051
|
2448 |
+
2003/01/16/big/img_150
|
2449 |
+
2002/07/31/big/img_519
|
2450 |
+
2002/08/01/big/img_1961
|
2451 |
+
2002/08/05/big/img_3752
|
2452 |
+
2002/07/23/big/img_631
|
2453 |
+
2003/01/14/big/img_237
|
2454 |
+
2002/07/28/big/img_21
|
2455 |
+
2002/07/22/big/img_813
|
2456 |
+
2002/08/05/big/img_3563
|
2457 |
+
2003/01/17/big/img_620
|
2458 |
+
2002/07/19/big/img_523
|
2459 |
+
2002/07/30/big/img_904
|
2460 |
+
2002/08/29/big/img_18642
|
2461 |
+
2002/08/11/big/img_492
|
2462 |
+
2002/08/01/big/img_2130
|
2463 |
+
2002/07/25/big/img_618
|
2464 |
+
2002/08/17/big/img_305
|
2465 |
+
2003/01/16/big/img_520
|
2466 |
+
2002/07/26/big/img_495
|
2467 |
+
2002/08/17/big/img_164
|
2468 |
+
2002/08/03/big/img_440
|
2469 |
+
2002/07/24/big/img_441
|
2470 |
+
2002/08/06/big/img_2146
|
2471 |
+
2002/08/11/big/img_558
|
2472 |
+
2002/08/02/big/img_545
|
2473 |
+
2002/08/31/big/img_18090
|
2474 |
+
2003/01/01/big/img_136
|
2475 |
+
2002/07/25/big/img_1099
|
2476 |
+
2003/01/13/big/img_728
|
2477 |
+
2003/01/16/big/img_197
|
2478 |
+
2002/07/26/big/img_651
|
2479 |
+
2002/08/11/big/img_676
|
2480 |
+
2003/01/15/big/img_10
|
2481 |
+
2002/08/21/big/img_250
|
2482 |
+
2002/08/14/big/img_325
|
2483 |
+
2002/08/04/big/img_390
|
2484 |
+
2002/07/24/big/img_554
|
2485 |
+
2003/01/16/big/img_333
|
2486 |
+
2002/07/31/big/img_922
|
2487 |
+
2002/09/02/big/img_15586
|
2488 |
+
2003/01/16/big/img_184
|
2489 |
+
2002/07/22/big/img_766
|
2490 |
+
2002/07/21/big/img_608
|
2491 |
+
2002/08/07/big/img_1578
|
2492 |
+
2002/08/17/big/img_961
|
2493 |
+
2002/07/27/big/img_324
|
2494 |
+
2002/08/05/big/img_3765
|
2495 |
+
2002/08/23/big/img_462
|
2496 |
+
2003/01/16/big/img_382
|
2497 |
+
2002/08/27/big/img_19838
|
2498 |
+
2002/08/01/big/img_1505
|
2499 |
+
2002/08/21/big/img_662
|
2500 |
+
2002/08/14/big/img_605
|
2501 |
+
2002/08/19/big/img_816
|
2502 |
+
2002/07/29/big/img_136
|
2503 |
+
2002/08/20/big/img_719
|
2504 |
+
2002/08/06/big/img_2826
|
2505 |
+
2002/08/10/big/img_630
|
2506 |
+
2003/01/17/big/img_973
|
2507 |
+
2002/08/14/big/img_116
|
2508 |
+
2002/08/02/big/img_666
|
2509 |
+
2002/08/21/big/img_710
|
2510 |
+
2002/08/05/big/img_55
|
2511 |
+
2002/07/31/big/img_229
|
2512 |
+
2002/08/01/big/img_1549
|
2513 |
+
2002/07/23/big/img_432
|
2514 |
+
2002/07/21/big/img_430
|
2515 |
+
2002/08/21/big/img_549
|
2516 |
+
2002/08/08/big/img_985
|
2517 |
+
2002/07/20/big/img_610
|
2518 |
+
2002/07/23/big/img_978
|
2519 |
+
2002/08/23/big/img_219
|
2520 |
+
2002/07/25/big/img_175
|
2521 |
+
2003/01/15/big/img_230
|
2522 |
+
2002/08/23/big/img_385
|
2523 |
+
2002/07/31/big/img_879
|
2524 |
+
2002/08/12/big/img_495
|
2525 |
+
2002/08/22/big/img_499
|
2526 |
+
2002/08/30/big/img_18322
|
2527 |
+
2002/08/15/big/img_795
|
2528 |
+
2002/08/13/big/img_835
|
2529 |
+
2003/01/17/big/img_930
|
2530 |
+
2002/07/30/big/img_873
|
2531 |
+
2002/08/11/big/img_257
|
2532 |
+
2002/07/31/big/img_593
|
2533 |
+
2002/08/21/big/img_916
|
2534 |
+
2003/01/13/big/img_814
|
2535 |
+
2002/07/25/big/img_722
|
2536 |
+
2002/08/16/big/img_379
|
2537 |
+
2002/07/31/big/img_497
|
2538 |
+
2002/07/22/big/img_602
|
2539 |
+
2002/08/21/big/img_642
|
2540 |
+
2002/08/21/big/img_614
|
2541 |
+
2002/08/23/big/img_482
|
2542 |
+
2002/07/29/big/img_603
|
2543 |
+
2002/08/13/big/img_705
|
2544 |
+
2002/07/23/big/img_833
|
2545 |
+
2003/01/14/big/img_511
|
2546 |
+
2002/07/24/big/img_376
|
2547 |
+
2002/08/17/big/img_1030
|
2548 |
+
2002/08/05/big/img_3576
|
2549 |
+
2002/08/16/big/img_540
|
2550 |
+
2002/07/22/big/img_630
|
2551 |
+
2002/08/10/big/img_180
|
2552 |
+
2002/08/14/big/img_905
|
2553 |
+
2002/08/29/big/img_18777
|
2554 |
+
2002/08/22/big/img_693
|
2555 |
+
2003/01/16/big/img_933
|
2556 |
+
2002/08/20/big/img_555
|
2557 |
+
2002/08/15/big/img_549
|
2558 |
+
2003/01/14/big/img_830
|
2559 |
+
2003/01/16/big/img_64
|
2560 |
+
2002/08/27/big/img_19670
|
2561 |
+
2002/08/22/big/img_729
|
2562 |
+
2002/07/27/big/img_981
|
2563 |
+
2002/08/09/big/img_458
|
2564 |
+
2003/01/17/big/img_884
|
2565 |
+
2002/07/25/big/img_639
|
2566 |
+
2002/08/31/big/img_18008
|
2567 |
+
2002/08/22/big/img_249
|
2568 |
+
2002/08/17/big/img_971
|
2569 |
+
2002/08/04/big/img_308
|
2570 |
+
2002/07/28/big/img_362
|
2571 |
+
2002/08/12/big/img_142
|
2572 |
+
2002/08/26/big/img_61
|
2573 |
+
2002/08/14/big/img_422
|
2574 |
+
2002/07/19/big/img_607
|
2575 |
+
2003/01/15/big/img_717
|
2576 |
+
2002/08/01/big/img_1475
|
2577 |
+
2002/08/29/big/img_19061
|
2578 |
+
2003/01/01/big/img_346
|
2579 |
+
2002/07/20/big/img_315
|
2580 |
+
2003/01/15/big/img_756
|
2581 |
+
2002/08/15/big/img_879
|
2582 |
+
2002/08/08/big/img_615
|
2583 |
+
2003/01/13/big/img_431
|
2584 |
+
2002/08/05/big/img_3233
|
2585 |
+
2002/08/24/big/img_526
|
2586 |
+
2003/01/13/big/img_717
|
2587 |
+
2002/09/01/big/img_16408
|
2588 |
+
2002/07/22/big/img_217
|
2589 |
+
2002/07/31/big/img_960
|
2590 |
+
2002/08/21/big/img_610
|
2591 |
+
2002/08/05/big/img_3753
|
2592 |
+
2002/08/03/big/img_151
|
2593 |
+
2002/08/21/big/img_267
|
2594 |
+
2002/08/01/big/img_2175
|
2595 |
+
2002/08/04/big/img_556
|
2596 |
+
2002/08/21/big/img_527
|
2597 |
+
2002/09/02/big/img_15800
|
2598 |
+
2002/07/27/big/img_156
|
2599 |
+
2002/07/20/big/img_590
|
2600 |
+
2002/08/15/big/img_700
|
2601 |
+
2002/08/08/big/img_444
|
2602 |
+
2002/07/25/big/img_94
|
2603 |
+
2002/07/24/big/img_778
|
2604 |
+
2002/08/14/big/img_694
|
2605 |
+
2002/07/20/big/img_666
|
2606 |
+
2002/08/02/big/img_200
|
2607 |
+
2002/08/02/big/img_578
|
2608 |
+
2003/01/17/big/img_332
|
2609 |
+
2002/09/01/big/img_16352
|
2610 |
+
2002/08/27/big/img_19668
|
2611 |
+
2002/07/23/big/img_823
|
2612 |
+
2002/08/13/big/img_431
|
2613 |
+
2003/01/16/big/img_463
|
2614 |
+
2002/08/27/big/img_19711
|
2615 |
+
2002/08/23/big/img_154
|
2616 |
+
2002/07/31/big/img_360
|
2617 |
+
2002/08/23/big/img_555
|
2618 |
+
2002/08/10/big/img_561
|
2619 |
+
2003/01/14/big/img_550
|
2620 |
+
2002/08/07/big/img_1370
|
2621 |
+
2002/07/30/big/img_1184
|
2622 |
+
2002/08/01/big/img_1445
|
2623 |
+
2002/08/23/big/img_22
|
2624 |
+
2002/07/30/big/img_606
|
2625 |
+
2003/01/17/big/img_271
|
2626 |
+
2002/08/31/big/img_17316
|
2627 |
+
2002/08/16/big/img_973
|
2628 |
+
2002/07/26/big/img_77
|
2629 |
+
2002/07/20/big/img_788
|
2630 |
+
2002/08/06/big/img_2426
|
2631 |
+
2002/08/07/big/img_1498
|
2632 |
+
2002/08/16/big/img_358
|
2633 |
+
2002/08/06/big/img_2851
|
2634 |
+
2002/08/12/big/img_359
|
2635 |
+
2002/08/01/big/img_1521
|
2636 |
+
2002/08/02/big/img_709
|
2637 |
+
2002/08/20/big/img_935
|
2638 |
+
2002/08/12/big/img_188
|
2639 |
+
2002/08/24/big/img_411
|
2640 |
+
2002/08/22/big/img_680
|
2641 |
+
2002/08/06/big/img_2480
|
2642 |
+
2002/07/20/big/img_627
|
2643 |
+
2002/07/30/big/img_214
|
2644 |
+
2002/07/25/big/img_354
|
2645 |
+
2002/08/02/big/img_636
|
2646 |
+
2003/01/15/big/img_661
|
2647 |
+
2002/08/07/big/img_1327
|
2648 |
+
2002/08/01/big/img_2108
|
2649 |
+
2002/08/31/big/img_17919
|
2650 |
+
2002/08/29/big/img_18768
|
2651 |
+
2002/08/05/big/img_3840
|
2652 |
+
2002/07/26/big/img_242
|
2653 |
+
2003/01/14/big/img_451
|
2654 |
+
2002/08/20/big/img_923
|
2655 |
+
2002/08/27/big/img_19908
|
2656 |
+
2002/08/16/big/img_282
|
2657 |
+
2002/08/19/big/img_440
|
2658 |
+
2003/01/01/big/img_230
|
2659 |
+
2002/08/08/big/img_212
|
2660 |
+
2002/07/20/big/img_443
|
2661 |
+
2002/08/25/big/img_635
|
2662 |
+
2003/01/13/big/img_1169
|
2663 |
+
2002/07/26/big/img_998
|
2664 |
+
2002/08/15/big/img_995
|
2665 |
+
2002/08/06/big/img_3002
|
2666 |
+
2002/07/29/big/img_460
|
2667 |
+
2003/01/14/big/img_925
|
2668 |
+
2002/07/23/big/img_539
|
2669 |
+
2002/08/16/big/img_694
|
2670 |
+
2003/01/13/big/img_459
|
2671 |
+
2002/07/23/big/img_249
|
2672 |
+
2002/08/20/big/img_539
|
2673 |
+
2002/08/04/big/img_186
|
2674 |
+
2002/08/26/big/img_264
|
2675 |
+
2002/07/22/big/img_704
|
2676 |
+
2002/08/25/big/img_277
|
2677 |
+
2002/08/22/big/img_988
|
2678 |
+
2002/07/29/big/img_504
|
2679 |
+
2002/08/05/big/img_3600
|
2680 |
+
2002/08/30/big/img_18380
|
2681 |
+
2003/01/14/big/img_937
|
2682 |
+
2002/08/21/big/img_254
|
2683 |
+
2002/08/10/big/img_130
|
2684 |
+
2002/08/20/big/img_339
|
2685 |
+
2003/01/14/big/img_428
|
2686 |
+
2002/08/20/big/img_889
|
2687 |
+
2002/08/31/big/img_17637
|
2688 |
+
2002/07/26/big/img_644
|
2689 |
+
2002/09/01/big/img_16776
|
2690 |
+
2002/08/06/big/img_2239
|
2691 |
+
2002/08/06/big/img_2646
|
2692 |
+
2003/01/13/big/img_491
|
2693 |
+
2002/08/10/big/img_579
|
2694 |
+
2002/08/21/big/img_713
|
2695 |
+
2002/08/22/big/img_482
|
2696 |
+
2002/07/22/big/img_167
|
2697 |
+
2002/07/24/big/img_539
|
2698 |
+
2002/08/14/big/img_721
|
2699 |
+
2002/07/25/big/img_389
|
2700 |
+
2002/09/01/big/img_16591
|
2701 |
+
2002/08/13/big/img_543
|
2702 |
+
2003/01/14/big/img_432
|
2703 |
+
2002/08/09/big/img_287
|
2704 |
+
2002/07/26/big/img_126
|
2705 |
+
2002/08/23/big/img_412
|
2706 |
+
2002/08/15/big/img_1034
|
2707 |
+
2002/08/28/big/img_19485
|
2708 |
+
2002/07/31/big/img_236
|
2709 |
+
2002/07/30/big/img_523
|
2710 |
+
2002/07/19/big/img_141
|
2711 |
+
2003/01/17/big/img_957
|
2712 |
+
2002/08/04/big/img_81
|
2713 |
+
2002/07/25/big/img_206
|
2714 |
+
2002/08/15/big/img_716
|
2715 |
+
2002/08/13/big/img_403
|
2716 |
+
2002/08/15/big/img_685
|
2717 |
+
2002/07/26/big/img_884
|
2718 |
+
2002/07/19/big/img_499
|
2719 |
+
2002/07/23/big/img_772
|
2720 |
+
2002/07/27/big/img_752
|
2721 |
+
2003/01/14/big/img_493
|
2722 |
+
2002/08/25/big/img_664
|
2723 |
+
2002/07/31/big/img_334
|
2724 |
+
2002/08/26/big/img_678
|
2725 |
+
2002/09/01/big/img_16541
|
2726 |
+
2003/01/14/big/img_347
|
2727 |
+
2002/07/23/big/img_187
|
2728 |
+
2002/07/30/big/img_1163
|
2729 |
+
2002/08/05/big/img_35
|
2730 |
+
2002/08/22/big/img_944
|
2731 |
+
2002/08/07/big/img_1239
|
2732 |
+
2002/07/29/big/img_1215
|
2733 |
+
2002/08/03/big/img_312
|
2734 |
+
2002/08/05/big/img_3523
|
2735 |
+
2002/07/29/big/img_218
|
2736 |
+
2002/08/13/big/img_672
|
2737 |
+
2002/08/16/big/img_205
|
2738 |
+
2002/08/17/big/img_594
|
2739 |
+
2002/07/29/big/img_1411
|
2740 |
+
2002/07/30/big/img_942
|
2741 |
+
2003/01/16/big/img_312
|
2742 |
+
2002/08/08/big/img_312
|
2743 |
+
2002/07/25/big/img_15
|
2744 |
+
2002/08/09/big/img_839
|
2745 |
+
2002/08/01/big/img_2069
|
2746 |
+
2002/08/31/big/img_17512
|
2747 |
+
2002/08/01/big/img_3
|
2748 |
+
2002/07/31/big/img_320
|
2749 |
+
2003/01/15/big/img_1265
|
2750 |
+
2002/08/14/big/img_563
|
2751 |
+
2002/07/31/big/img_167
|
2752 |
+
2002/08/20/big/img_374
|
2753 |
+
2002/08/13/big/img_406
|
2754 |
+
2002/08/08/big/img_625
|
2755 |
+
2002/08/02/big/img_314
|
2756 |
+
2002/08/27/big/img_19964
|
2757 |
+
2002/09/01/big/img_16670
|
2758 |
+
2002/07/31/big/img_599
|
2759 |
+
2002/08/29/big/img_18906
|
2760 |
+
2002/07/24/big/img_373
|
2761 |
+
2002/07/26/big/img_513
|
2762 |
+
2002/09/02/big/img_15497
|
2763 |
+
2002/08/19/big/img_117
|
2764 |
+
2003/01/01/big/img_158
|
2765 |
+
2002/08/24/big/img_178
|
2766 |
+
2003/01/13/big/img_935
|
2767 |
+
2002/08/13/big/img_609
|
2768 |
+
2002/08/30/big/img_18341
|
2769 |
+
2002/08/25/big/img_674
|
2770 |
+
2003/01/13/big/img_209
|
2771 |
+
2002/08/13/big/img_258
|
2772 |
+
2002/08/05/big/img_3543
|
2773 |
+
2002/08/07/big/img_1970
|
2774 |
+
2002/08/06/big/img_3004
|
2775 |
+
2003/01/17/big/img_487
|
2776 |
+
2002/08/24/big/img_873
|
2777 |
+
2002/08/29/big/img_18730
|
2778 |
+
2002/08/09/big/img_375
|
2779 |
+
2003/01/16/big/img_751
|
2780 |
+
2002/08/02/big/img_603
|
2781 |
+
2002/08/19/big/img_325
|
2782 |
+
2002/09/01/big/img_16420
|
2783 |
+
2002/08/05/big/img_3633
|
2784 |
+
2002/08/21/big/img_516
|
2785 |
+
2002/07/19/big/img_501
|
2786 |
+
2002/07/26/big/img_688
|
2787 |
+
2002/07/24/big/img_256
|
2788 |
+
2002/07/25/big/img_438
|
2789 |
+
2002/07/31/big/img_1017
|
2790 |
+
2002/08/22/big/img_512
|
2791 |
+
2002/07/21/big/img_543
|
2792 |
+
2002/08/08/big/img_223
|
2793 |
+
2002/08/19/big/img_189
|
2794 |
+
2002/08/12/big/img_630
|
2795 |
+
2002/07/30/big/img_958
|
2796 |
+
2002/07/28/big/img_208
|
2797 |
+
2002/08/31/big/img_17691
|
2798 |
+
2002/07/22/big/img_542
|
2799 |
+
2002/07/19/big/img_741
|
2800 |
+
2002/07/19/big/img_158
|
2801 |
+
2002/08/15/big/img_399
|
2802 |
+
2002/08/01/big/img_2159
|
2803 |
+
2002/08/14/big/img_455
|
2804 |
+
2002/08/17/big/img_1011
|
2805 |
+
2002/08/26/big/img_744
|
2806 |
+
2002/08/12/big/img_624
|
2807 |
+
2003/01/17/big/img_821
|
2808 |
+
2002/08/16/big/img_980
|
2809 |
+
2002/07/28/big/img_281
|
2810 |
+
2002/07/25/big/img_171
|
2811 |
+
2002/08/03/big/img_116
|
2812 |
+
2002/07/22/big/img_467
|
2813 |
+
2002/07/31/big/img_750
|
2814 |
+
2002/07/26/big/img_435
|
2815 |
+
2002/07/19/big/img_822
|
2816 |
+
2002/08/13/big/img_626
|
2817 |
+
2002/08/11/big/img_344
|
2818 |
+
2002/08/02/big/img_473
|
2819 |
+
2002/09/01/big/img_16817
|
2820 |
+
2002/08/01/big/img_1275
|
2821 |
+
2002/08/28/big/img_19270
|
2822 |
+
2002/07/23/big/img_607
|
2823 |
+
2002/08/09/big/img_316
|
2824 |
+
2002/07/29/big/img_626
|
2825 |
+
2002/07/24/big/img_824
|
2826 |
+
2002/07/22/big/img_342
|
2827 |
+
2002/08/08/big/img_794
|
2828 |
+
2002/08/07/big/img_1209
|
2829 |
+
2002/07/19/big/img_18
|
2830 |
+
2002/08/25/big/img_634
|
2831 |
+
2002/07/24/big/img_730
|
2832 |
+
2003/01/17/big/img_356
|
2833 |
+
2002/07/23/big/img_305
|
2834 |
+
2002/07/30/big/img_453
|
2835 |
+
2003/01/13/big/img_972
|
2836 |
+
2002/08/06/big/img_2610
|
2837 |
+
2002/08/29/big/img_18920
|
2838 |
+
2002/07/31/big/img_123
|
2839 |
+
2002/07/26/big/img_979
|
2840 |
+
2002/08/24/big/img_635
|
2841 |
+
2002/08/05/big/img_3704
|
2842 |
+
2002/08/07/big/img_1358
|
2843 |
+
2002/07/22/big/img_306
|
2844 |
+
2002/08/13/big/img_619
|
2845 |
+
2002/08/02/big/img_366
|
retinaface/data/__init__.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from .wider_face import WiderFaceDetection, detection_collate
|
2 |
+
from .data_augment import *
|
3 |
+
from .config import *
|
retinaface/data/config.py
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# config.py
|
2 |
+
|
3 |
+
cfg_mnet = {
|
4 |
+
'name': 'mobilenet0.25',
|
5 |
+
'msizes': [[16, 32], [64, 128], [256, 512]],
|
6 |
+
'steps': [8, 16, 32],
|
7 |
+
'variance': [0.1, 0.2],
|
8 |
+
'clip': False,
|
9 |
+
'loc_weight': 2.0,
|
10 |
+
'gpu_train': True,
|
11 |
+
'batch_size': 32,
|
12 |
+
'ngpu': 1,
|
13 |
+
'epoch': 250,
|
14 |
+
'decay1': 190,
|
15 |
+
'decay2': 220,
|
16 |
+
'image_size': 640,
|
17 |
+
'pretrain': False,
|
18 |
+
'return_layers': {'stage1': 1, 'stage2': 2, 'stage3': 3},
|
19 |
+
'in_channel': 32,
|
20 |
+
'out_channel': 64
|
21 |
+
}
|
22 |
+
|
23 |
+
cfg_re50 = {
|
24 |
+
'name': 'Resnet50',
|
25 |
+
'msizes': [[16, 32], [64, 128], [256, 512]],
|
26 |
+
'steps': [8, 16, 32],
|
27 |
+
'variance': [0.1, 0.2],
|
28 |
+
'clip': False,
|
29 |
+
'loc_weight': 2.0,
|
30 |
+
'gpu_train': True,
|
31 |
+
'batch_size': 24,
|
32 |
+
'ngpu': 4,
|
33 |
+
'epoch': 100,
|
34 |
+
'decay1': 70,
|
35 |
+
'decay2': 90,
|
36 |
+
'image_size': 840,
|
37 |
+
'pretrain': False,
|
38 |
+
'return_layers': {'layer2': 1, 'layer3': 2, 'layer4': 3},
|
39 |
+
'in_channel': 256,
|
40 |
+
'out_channel': 256
|
41 |
+
}
|
42 |
+
|
retinaface/data/data_augment.py
ADDED
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import cv2
|
2 |
+
import numpy as np
|
3 |
+
import random
|
4 |
+
from utils.box_utils import matrix_iof
|
5 |
+
|
6 |
+
|
7 |
+
def _crop(image, boxes, labels, landm, img_dim):
|
8 |
+
height, width, _ = image.shape
|
9 |
+
pad_image_flag = True
|
10 |
+
|
11 |
+
for _ in range(250):
|
12 |
+
"""
|
13 |
+
if random.uniform(0, 1) <= 0.2:
|
14 |
+
scale = 1.0
|
15 |
+
else:
|
16 |
+
scale = random.uniform(0.3, 1.0)
|
17 |
+
"""
|
18 |
+
PRE_SCALES = [0.3, 0.45, 0.6, 0.8, 1.0]
|
19 |
+
scale = random.choice(PRE_SCALES)
|
20 |
+
short_side = min(width, height)
|
21 |
+
w = int(scale * short_side)
|
22 |
+
h = w
|
23 |
+
|
24 |
+
if width == w:
|
25 |
+
l = 0
|
26 |
+
else:
|
27 |
+
l = random.randrange(width - w)
|
28 |
+
if height == h:
|
29 |
+
t = 0
|
30 |
+
else:
|
31 |
+
t = random.randrange(height - h)
|
32 |
+
roi = np.array((l, t, l + w, t + h))
|
33 |
+
|
34 |
+
value = matrix_iof(boxes, roi[np.newaxis])
|
35 |
+
flag = (value >= 1)
|
36 |
+
if not flag.any():
|
37 |
+
continue
|
38 |
+
|
39 |
+
centers = (boxes[:, :2] + boxes[:, 2:]) / 2
|
40 |
+
mask_a = np.logical_and(roi[:2] < centers, centers < roi[2:]).all(axis=1)
|
41 |
+
boxes_t = boxes[mask_a].copy()
|
42 |
+
labels_t = labels[mask_a].copy()
|
43 |
+
landms_t = landm[mask_a].copy()
|
44 |
+
landms_t = landms_t.reshape([-1, 5, 2])
|
45 |
+
|
46 |
+
if boxes_t.shape[0] == 0:
|
47 |
+
continue
|
48 |
+
|
49 |
+
image_t = image[roi[1]:roi[3], roi[0]:roi[2]]
|
50 |
+
|
51 |
+
boxes_t[:, :2] = np.maximum(boxes_t[:, :2], roi[:2])
|
52 |
+
boxes_t[:, :2] -= roi[:2]
|
53 |
+
boxes_t[:, 2:] = np.minimum(boxes_t[:, 2:], roi[2:])
|
54 |
+
boxes_t[:, 2:] -= roi[:2]
|
55 |
+
|
56 |
+
# landm
|
57 |
+
landms_t[:, :, :2] = landms_t[:, :, :2] - roi[:2]
|
58 |
+
landms_t[:, :, :2] = np.maximum(landms_t[:, :, :2], np.array([0, 0]))
|
59 |
+
landms_t[:, :, :2] = np.minimum(landms_t[:, :, :2], roi[2:] - roi[:2])
|
60 |
+
landms_t = landms_t.reshape([-1, 10])
|
61 |
+
|
62 |
+
|
63 |
+
# make sure that the cropped image contains at least one face > 16 pixel at training image scale
|
64 |
+
b_w_t = (boxes_t[:, 2] - boxes_t[:, 0] + 1) / w * img_dim
|
65 |
+
b_h_t = (boxes_t[:, 3] - boxes_t[:, 1] + 1) / h * img_dim
|
66 |
+
mask_b = np.minimum(b_w_t, b_h_t) > 0.0
|
67 |
+
boxes_t = boxes_t[mask_b]
|
68 |
+
labels_t = labels_t[mask_b]
|
69 |
+
landms_t = landms_t[mask_b]
|
70 |
+
|
71 |
+
if boxes_t.shape[0] == 0:
|
72 |
+
continue
|
73 |
+
|
74 |
+
pad_image_flag = False
|
75 |
+
|
76 |
+
return image_t, boxes_t, labels_t, landms_t, pad_image_flag
|
77 |
+
return image, boxes, labels, landm, pad_image_flag
|
78 |
+
|
79 |
+
|
80 |
+
def _distort(image):
|
81 |
+
|
82 |
+
def _convert(image, alpha=1, beta=0):
|
83 |
+
tmp = image.astype(float) * alpha + beta
|
84 |
+
tmp[tmp < 0] = 0
|
85 |
+
tmp[tmp > 255] = 255
|
86 |
+
image[:] = tmp
|
87 |
+
|
88 |
+
image = image.copy()
|
89 |
+
|
90 |
+
if random.randrange(2):
|
91 |
+
|
92 |
+
#brightness distortion
|
93 |
+
if random.randrange(2):
|
94 |
+
_convert(image, beta=random.uniform(-32, 32))
|
95 |
+
|
96 |
+
#contrast distortion
|
97 |
+
if random.randrange(2):
|
98 |
+
_convert(image, alpha=random.uniform(0.5, 1.5))
|
99 |
+
|
100 |
+
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
|
101 |
+
|
102 |
+
#saturation distortion
|
103 |
+
if random.randrange(2):
|
104 |
+
_convert(image[:, :, 1], alpha=random.uniform(0.5, 1.5))
|
105 |
+
|
106 |
+
#hue distortion
|
107 |
+
if random.randrange(2):
|
108 |
+
tmp = image[:, :, 0].astype(int) + random.randint(-18, 18)
|
109 |
+
tmp %= 180
|
110 |
+
image[:, :, 0] = tmp
|
111 |
+
|
112 |
+
image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)
|
113 |
+
|
114 |
+
else:
|
115 |
+
|
116 |
+
#brightness distortion
|
117 |
+
if random.randrange(2):
|
118 |
+
_convert(image, beta=random.uniform(-32, 32))
|
119 |
+
|
120 |
+
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
|
121 |
+
|
122 |
+
#saturation distortion
|
123 |
+
if random.randrange(2):
|
124 |
+
_convert(image[:, :, 1], alpha=random.uniform(0.5, 1.5))
|
125 |
+
|
126 |
+
#hue distortion
|
127 |
+
if random.randrange(2):
|
128 |
+
tmp = image[:, :, 0].astype(int) + random.randint(-18, 18)
|
129 |
+
tmp %= 180
|
130 |
+
image[:, :, 0] = tmp
|
131 |
+
|
132 |
+
image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)
|
133 |
+
|
134 |
+
#contrast distortion
|
135 |
+
if random.randrange(2):
|
136 |
+
_convert(image, alpha=random.uniform(0.5, 1.5))
|
137 |
+
|
138 |
+
return image
|
139 |
+
|
140 |
+
|
141 |
+
def _expand(image, boxes, fill, p):
|
142 |
+
if random.randrange(2):
|
143 |
+
return image, boxes
|
144 |
+
|
145 |
+
height, width, depth = image.shape
|
146 |
+
|
147 |
+
scale = random.uniform(1, p)
|
148 |
+
w = int(scale * width)
|
149 |
+
h = int(scale * height)
|
150 |
+
|
151 |
+
left = random.randint(0, w - width)
|
152 |
+
top = random.randint(0, h - height)
|
153 |
+
|
154 |
+
boxes_t = boxes.copy()
|
155 |
+
boxes_t[:, :2] += (left, top)
|
156 |
+
boxes_t[:, 2:] += (left, top)
|
157 |
+
expand_image = np.empty(
|
158 |
+
(h, w, depth),
|
159 |
+
dtype=image.dtype)
|
160 |
+
expand_image[:, :] = fill
|
161 |
+
expand_image[top:top + height, left:left + width] = image
|
162 |
+
image = expand_image
|
163 |
+
|
164 |
+
return image, boxes_t
|
165 |
+
|
166 |
+
|
167 |
+
def _mirror(image, boxes, landms):
|
168 |
+
_, width, _ = image.shape
|
169 |
+
if random.randrange(2):
|
170 |
+
image = image[:, ::-1]
|
171 |
+
boxes = boxes.copy()
|
172 |
+
boxes[:, 0::2] = width - boxes[:, 2::-2]
|
173 |
+
|
174 |
+
# landm
|
175 |
+
landms = landms.copy()
|
176 |
+
landms = landms.reshape([-1, 5, 2])
|
177 |
+
landms[:, :, 0] = width - landms[:, :, 0]
|
178 |
+
tmp = landms[:, 1, :].copy()
|
179 |
+
landms[:, 1, :] = landms[:, 0, :]
|
180 |
+
landms[:, 0, :] = tmp
|
181 |
+
tmp1 = landms[:, 4, :].copy()
|
182 |
+
landms[:, 4, :] = landms[:, 3, :]
|
183 |
+
landms[:, 3, :] = tmp1
|
184 |
+
landms = landms.reshape([-1, 10])
|
185 |
+
|
186 |
+
return image, boxes, landms
|
187 |
+
|
188 |
+
|
189 |
+
def _pad_to_square(image, rgb_mean, pad_image_flag):
|
190 |
+
if not pad_image_flag:
|
191 |
+
return image
|
192 |
+
height, width, _ = image.shape
|
193 |
+
long_side = max(width, height)
|
194 |
+
image_t = np.empty((long_side, long_side, 3), dtype=image.dtype)
|
195 |
+
image_t[:, :] = rgb_mean
|
196 |
+
image_t[0:0 + height, 0:0 + width] = image
|
197 |
+
return image_t
|
198 |
+
|
199 |
+
|
200 |
+
def _resize_subtract_mean(image, insize, rgb_mean):
|
201 |
+
interp_methods = [cv2.INTER_LINEAR, cv2.INTER_CUBIC, cv2.INTER_AREA, cv2.INTER_NEAREST, cv2.INTER_LANCZOS4]
|
202 |
+
interp_method = interp_methods[random.randrange(5)]
|
203 |
+
image = cv2.resize(image, (insize, insize), interpolation=interp_method)
|
204 |
+
image = image.astype(np.float32)
|
205 |
+
image -= rgb_mean
|
206 |
+
return image.transpose(2, 0, 1)
|
207 |
+
|
208 |
+
|
209 |
+
class preproc(object):
|
210 |
+
|
211 |
+
def __init__(self, img_dim, rgb_means):
|
212 |
+
self.img_dim = img_dim
|
213 |
+
self.rgb_means = rgb_means
|
214 |
+
|
215 |
+
def __call__(self, image, targets):
|
216 |
+
assert targets.shape[0] > 0, "this image does not have gt"
|
217 |
+
|
218 |
+
boxes = targets[:, :4].copy()
|
219 |
+
labels = targets[:, -1].copy()
|
220 |
+
landm = targets[:, 4:-1].copy()
|
221 |
+
|
222 |
+
image_t, boxes_t, labels_t, landm_t, pad_image_flag = _crop(image, boxes, labels, landm, self.img_dim)
|
223 |
+
image_t = _distort(image_t)
|
224 |
+
image_t = _pad_to_square(image_t,self.rgb_means, pad_image_flag)
|
225 |
+
image_t, boxes_t, landm_t = _mirror(image_t, boxes_t, landm_t)
|
226 |
+
height, width, _ = image_t.shape
|
227 |
+
image_t = _resize_subtract_mean(image_t, self.img_dim, self.rgb_means)
|
228 |
+
boxes_t[:, 0::2] /= width
|
229 |
+
boxes_t[:, 1::2] /= height
|
230 |
+
|
231 |
+
landm_t[:, 0::2] /= width
|
232 |
+
landm_t[:, 1::2] /= height
|
233 |
+
|
234 |
+
labels_t = np.expand_dims(labels_t, 1)
|
235 |
+
targets_t = np.hstack((boxes_t, landm_t, labels_t))
|
236 |
+
|
237 |
+
return image_t, targets_t
|
retinaface/data/wider_face.py
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import os.path
|
3 |
+
import sys
|
4 |
+
import torch
|
5 |
+
import torch.utils.data as data
|
6 |
+
import cv2
|
7 |
+
import numpy as np
|
8 |
+
|
9 |
+
class WiderFaceDetection(data.Dataset):
|
10 |
+
def __init__(self, txt_path, preproc=None):
|
11 |
+
self.preproc = preproc
|
12 |
+
self.imgs_path = []
|
13 |
+
self.words = []
|
14 |
+
f = open(txt_path,'r')
|
15 |
+
lines = f.readlines()
|
16 |
+
isFirst = True
|
17 |
+
labels = []
|
18 |
+
for line in lines:
|
19 |
+
line = line.rstrip()
|
20 |
+
if line.startswith('#'):
|
21 |
+
if isFirst==True:
|
22 |
+
isFirst = False
|
23 |
+
else:
|
24 |
+
labels_copy = labels.copy()
|
25 |
+
self.words.append(labels_copy)
|
26 |
+
labels.clear()
|
27 |
+
path = line[2:]
|
28 |
+
path = txt_path.replace('label.txt','images/') + path
|
29 |
+
self.imgs_path.append(path)
|
30 |
+
else:
|
31 |
+
line = line.split(' ')
|
32 |
+
label = [float(x) for x in line]
|
33 |
+
labels.append(label)
|
34 |
+
|
35 |
+
self.words.append(labels)
|
36 |
+
|
37 |
+
def __len__(self):
|
38 |
+
return len(self.imgs_path)
|
39 |
+
|
40 |
+
def __getitem__(self, index):
|
41 |
+
img = cv2.imread(self.imgs_path[index])
|
42 |
+
height, width, _ = img.shape
|
43 |
+
|
44 |
+
labels = self.words[index]
|
45 |
+
annotations = np.zeros((0, 15))
|
46 |
+
if len(labels) == 0:
|
47 |
+
return annotations
|
48 |
+
for idx, label in enumerate(labels):
|
49 |
+
annotation = np.zeros((1, 15))
|
50 |
+
# bbox
|
51 |
+
annotation[0, 0] = label[0] # x1
|
52 |
+
annotation[0, 1] = label[1] # y1
|
53 |
+
annotation[0, 2] = label[0] + label[2] # x2
|
54 |
+
annotation[0, 3] = label[1] + label[3] # y2
|
55 |
+
|
56 |
+
# landmarks
|
57 |
+
annotation[0, 4] = label[4] # l0_x
|
58 |
+
annotation[0, 5] = label[5] # l0_y
|
59 |
+
annotation[0, 6] = label[7] # l1_x
|
60 |
+
annotation[0, 7] = label[8] # l1_y
|
61 |
+
annotation[0, 8] = label[10] # l2_x
|
62 |
+
annotation[0, 9] = label[11] # l2_y
|
63 |
+
annotation[0, 10] = label[13] # l3_x
|
64 |
+
annotation[0, 11] = label[14] # l3_y
|
65 |
+
annotation[0, 12] = label[16] # l4_x
|
66 |
+
annotation[0, 13] = label[17] # l4_y
|
67 |
+
if (annotation[0, 4]<0):
|
68 |
+
annotation[0, 14] = -1
|
69 |
+
else:
|
70 |
+
annotation[0, 14] = 1
|
71 |
+
|
72 |
+
annotations = np.append(annotations, annotation, axis=0)
|
73 |
+
target = np.array(annotations)
|
74 |
+
if self.preproc is not None:
|
75 |
+
img, target = self.preproc(img, target)
|
76 |
+
|
77 |
+
return torch.from_numpy(img), target
|
78 |
+
|
79 |
+
def detection_collate(batch):
|
80 |
+
"""Custom collate fn for dealing with batches of images that have a different
|
81 |
+
number of associated object annotations (bounding boxes).
|
82 |
+
|
83 |
+
Arguments:
|
84 |
+
batch: (tuple) A tuple of tensor images and lists of annotations
|
85 |
+
|
86 |
+
Return:
|
87 |
+
A tuple containing:
|
88 |
+
1) (tensor) batch of images stacked on their 0 dim
|
89 |
+
2) (list of tensors) annotations for a given image are stacked on 0 dim
|
90 |
+
"""
|
91 |
+
targets = []
|
92 |
+
imgs = []
|
93 |
+
for _, sample in enumerate(batch):
|
94 |
+
for _, tup in enumerate(sample):
|
95 |
+
if torch.is_tensor(tup):
|
96 |
+
imgs.append(tup)
|
97 |
+
elif isinstance(tup, type(np.empty(0))):
|
98 |
+
annos = torch.from_numpy(tup).float()
|
99 |
+
targets.append(annos)
|
100 |
+
|
101 |
+
return (torch.stack(imgs, 0), targets)
|
retinaface/facemodels/__init__.py
ADDED
File without changes
|
retinaface/facemodels/net.py
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import time
|
2 |
+
import torch
|
3 |
+
import torch.nn as nn
|
4 |
+
import torchvision.models._utils as _utils
|
5 |
+
import torchvision.models as models
|
6 |
+
import torch.nn.functional as F
|
7 |
+
from torch.autograd import Variable
|
8 |
+
|
9 |
+
def conv_bn(inp, oup, stride = 1, leaky = 0):
|
10 |
+
return nn.Sequential(
|
11 |
+
nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
|
12 |
+
nn.BatchNorm2d(oup),
|
13 |
+
nn.LeakyReLU(negative_slope=leaky, inplace=True)
|
14 |
+
)
|
15 |
+
|
16 |
+
def conv_bn_no_relu(inp, oup, stride):
|
17 |
+
return nn.Sequential(
|
18 |
+
nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
|
19 |
+
nn.BatchNorm2d(oup),
|
20 |
+
)
|
21 |
+
|
22 |
+
def conv_bn1X1(inp, oup, stride, leaky=0):
|
23 |
+
return nn.Sequential(
|
24 |
+
nn.Conv2d(inp, oup, 1, stride, padding=0, bias=False),
|
25 |
+
nn.BatchNorm2d(oup),
|
26 |
+
nn.LeakyReLU(negative_slope=leaky, inplace=True)
|
27 |
+
)
|
28 |
+
|
29 |
+
def conv_dw(inp, oup, stride, leaky=0.1):
|
30 |
+
return nn.Sequential(
|
31 |
+
nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
|
32 |
+
nn.BatchNorm2d(inp),
|
33 |
+
nn.LeakyReLU(negative_slope= leaky,inplace=True),
|
34 |
+
|
35 |
+
nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
|
36 |
+
nn.BatchNorm2d(oup),
|
37 |
+
nn.LeakyReLU(negative_slope= leaky,inplace=True),
|
38 |
+
)
|
39 |
+
|
40 |
+
class SSH(nn.Module):
|
41 |
+
def __init__(self, in_channel, out_channel):
|
42 |
+
super(SSH, self).__init__()
|
43 |
+
assert out_channel % 4 == 0
|
44 |
+
leaky = 0
|
45 |
+
if (out_channel <= 64):
|
46 |
+
leaky = 0.1
|
47 |
+
self.conv3X3 = conv_bn_no_relu(in_channel, out_channel//2, stride=1)
|
48 |
+
|
49 |
+
self.conv5X5_1 = conv_bn(in_channel, out_channel//4, stride=1, leaky = leaky)
|
50 |
+
self.conv5X5_2 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1)
|
51 |
+
|
52 |
+
self.conv7X7_2 = conv_bn(out_channel//4, out_channel//4, stride=1, leaky = leaky)
|
53 |
+
self.conv7x7_3 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1)
|
54 |
+
|
55 |
+
def forward(self, input):
|
56 |
+
conv3X3 = self.conv3X3(input)
|
57 |
+
|
58 |
+
conv5X5_1 = self.conv5X5_1(input)
|
59 |
+
conv5X5 = self.conv5X5_2(conv5X5_1)
|
60 |
+
|
61 |
+
conv7X7_2 = self.conv7X7_2(conv5X5_1)
|
62 |
+
conv7X7 = self.conv7x7_3(conv7X7_2)
|
63 |
+
|
64 |
+
out = torch.cat([conv3X3, conv5X5, conv7X7], dim=1)
|
65 |
+
out = F.relu(out)
|
66 |
+
return out
|
67 |
+
|
68 |
+
class FPN(nn.Module):
|
69 |
+
def __init__(self,in_channels_list,out_channels):
|
70 |
+
super(FPN,self).__init__()
|
71 |
+
leaky = 0
|
72 |
+
if (out_channels <= 64):
|
73 |
+
leaky = 0.1
|
74 |
+
self.output1 = conv_bn1X1(in_channels_list[0], out_channels, stride = 1, leaky = leaky)
|
75 |
+
self.output2 = conv_bn1X1(in_channels_list[1], out_channels, stride = 1, leaky = leaky)
|
76 |
+
self.output3 = conv_bn1X1(in_channels_list[2], out_channels, stride = 1, leaky = leaky)
|
77 |
+
|
78 |
+
self.merge1 = conv_bn(out_channels, out_channels, leaky = leaky)
|
79 |
+
self.merge2 = conv_bn(out_channels, out_channels, leaky = leaky)
|
80 |
+
|
81 |
+
def forward(self, input):
|
82 |
+
# names = list(input.keys())
|
83 |
+
input = list(input.values())
|
84 |
+
|
85 |
+
output1 = self.output1(input[0])
|
86 |
+
output2 = self.output2(input[1])
|
87 |
+
output3 = self.output3(input[2])
|
88 |
+
|
89 |
+
up3 = F.interpolate(output3, size=[output2.size(2), output2.size(3)], mode="nearest")
|
90 |
+
output2 = output2 + up3
|
91 |
+
output2 = self.merge2(output2)
|
92 |
+
|
93 |
+
up2 = F.interpolate(output2, size=[output1.size(2), output1.size(3)], mode="nearest")
|
94 |
+
output1 = output1 + up2
|
95 |
+
output1 = self.merge1(output1)
|
96 |
+
|
97 |
+
out = [output1, output2, output3]
|
98 |
+
return out
|
99 |
+
|
100 |
+
|
101 |
+
|
102 |
+
class MobileNetV1(nn.Module):
|
103 |
+
def __init__(self):
|
104 |
+
super(MobileNetV1, self).__init__()
|
105 |
+
self.stage1 = nn.Sequential(
|
106 |
+
conv_bn(3, 8, 2, leaky = 0.1), # 3
|
107 |
+
conv_dw(8, 16, 1), # 7
|
108 |
+
conv_dw(16, 32, 2), # 11
|
109 |
+
conv_dw(32, 32, 1), # 19
|
110 |
+
conv_dw(32, 64, 2), # 27
|
111 |
+
conv_dw(64, 64, 1), # 43
|
112 |
+
)
|
113 |
+
self.stage2 = nn.Sequential(
|
114 |
+
conv_dw(64, 128, 2), # 43 + 16 = 59
|
115 |
+
conv_dw(128, 128, 1), # 59 + 32 = 91
|
116 |
+
conv_dw(128, 128, 1), # 91 + 32 = 123
|
117 |
+
conv_dw(128, 128, 1), # 123 + 32 = 155
|
118 |
+
conv_dw(128, 128, 1), # 155 + 32 = 187
|
119 |
+
conv_dw(128, 128, 1), # 187 + 32 = 219
|
120 |
+
)
|
121 |
+
self.stage3 = nn.Sequential(
|
122 |
+
conv_dw(128, 256, 2), # 219 +3 2 = 241
|
123 |
+
conv_dw(256, 256, 1), # 241 + 64 = 301
|
124 |
+
)
|
125 |
+
self.avg = nn.AdaptiveAvgPool2d((1,1))
|
126 |
+
self.fc = nn.Linear(256, 1000)
|
127 |
+
|
128 |
+
def forward(self, x):
|
129 |
+
x = self.stage1(x)
|
130 |
+
x = self.stage2(x)
|
131 |
+
x = self.stage3(x)
|
132 |
+
x = self.avg(x)
|
133 |
+
# x = self.model(x)
|
134 |
+
x = x.view(-1, 256)
|
135 |
+
x = self.fc(x)
|
136 |
+
return x
|
137 |
+
|
retinaface/facemodels/retinaface.py
ADDED
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import torch.nn as nn
|
3 |
+
import torchvision.models.detection.backbone_utils as backbone_utils
|
4 |
+
import torchvision.models._utils as _utils
|
5 |
+
import torch.nn.functional as F
|
6 |
+
from collections import OrderedDict
|
7 |
+
|
8 |
+
from facemodels.net import MobileNetV1 as MobileNetV1
|
9 |
+
from facemodels.net import FPN as FPN
|
10 |
+
from facemodels.net import SSH as SSH
|
11 |
+
|
12 |
+
|
13 |
+
|
14 |
+
class ClassHead(nn.Module):
|
15 |
+
def __init__(self,inchannels=512,num_anchors=3):
|
16 |
+
super(ClassHead,self).__init__()
|
17 |
+
self.num_anchors = num_anchors
|
18 |
+
self.conv1x1 = nn.Conv2d(inchannels,self.num_anchors*2,kernel_size=(1,1),stride=1,padding=0)
|
19 |
+
|
20 |
+
def forward(self,x):
|
21 |
+
out = self.conv1x1(x)
|
22 |
+
out = out.permute(0,2,3,1).contiguous()
|
23 |
+
|
24 |
+
return out.view(out.shape[0], -1, 2)
|
25 |
+
|
26 |
+
class BboxHead(nn.Module):
|
27 |
+
def __init__(self,inchannels=512,num_anchors=3):
|
28 |
+
super(BboxHead,self).__init__()
|
29 |
+
self.conv1x1 = nn.Conv2d(inchannels,num_anchors*4,kernel_size=(1,1),stride=1,padding=0)
|
30 |
+
|
31 |
+
def forward(self,x):
|
32 |
+
out = self.conv1x1(x)
|
33 |
+
out = out.permute(0,2,3,1).contiguous()
|
34 |
+
|
35 |
+
return out.view(out.shape[0], -1, 4)
|
36 |
+
|
37 |
+
class LandmarkHead(nn.Module):
|
38 |
+
def __init__(self,inchannels=512,num_anchors=3):
|
39 |
+
super(LandmarkHead,self).__init__()
|
40 |
+
self.conv1x1 = nn.Conv2d(inchannels,num_anchors*10,kernel_size=(1,1),stride=1,padding=0)
|
41 |
+
|
42 |
+
def forward(self,x):
|
43 |
+
out = self.conv1x1(x)
|
44 |
+
out = out.permute(0,2,3,1).contiguous()
|
45 |
+
|
46 |
+
return out.view(out.shape[0], -1, 10)
|
47 |
+
|
48 |
+
class RetinaFace(nn.Module):
|
49 |
+
def __init__(self, cfg = None, phase = 'train'):
|
50 |
+
"""
|
51 |
+
:param cfg: Network related settings.
|
52 |
+
:param phase: train or test.
|
53 |
+
"""
|
54 |
+
super(RetinaFace,self).__init__()
|
55 |
+
self.phase = phase
|
56 |
+
backbone = None
|
57 |
+
if cfg['name'] == 'mobilenet0.25':
|
58 |
+
backbone = MobileNetV1()
|
59 |
+
if cfg['pretrain']:
|
60 |
+
checkpoint = torch.load("./weights/mobilenetV1X0.25_pretrain.tar", map_location=torch.device('cpu'))
|
61 |
+
from collections import OrderedDict
|
62 |
+
new_state_dict = OrderedDict()
|
63 |
+
for k, v in checkpoint['state_dict'].items():
|
64 |
+
name = k[7:] # remove module.
|
65 |
+
new_state_dict[name] = v
|
66 |
+
# load params
|
67 |
+
backbone.load_state_dict(new_state_dict)
|
68 |
+
elif cfg['name'] == 'Resnet50':
|
69 |
+
import torchvision.models as models
|
70 |
+
backbone = models.resnet50(pretrained=cfg['pretrain'])
|
71 |
+
|
72 |
+
self.body = _utils.IntermediateLayerGetter(backbone, cfg['return_layers'])
|
73 |
+
in_channels_stage2 = cfg['in_channel']
|
74 |
+
in_channels_list = [
|
75 |
+
in_channels_stage2 * 2,
|
76 |
+
in_channels_stage2 * 4,
|
77 |
+
in_channels_stage2 * 8,
|
78 |
+
]
|
79 |
+
out_channels = cfg['out_channel']
|
80 |
+
self.fpn = FPN(in_channels_list,out_channels)
|
81 |
+
self.ssh1 = SSH(out_channels, out_channels)
|
82 |
+
self.ssh2 = SSH(out_channels, out_channels)
|
83 |
+
self.ssh3 = SSH(out_channels, out_channels)
|
84 |
+
|
85 |
+
self.ClassHead = self._make_class_head(fpn_num=3, inchannels=cfg['out_channel'])
|
86 |
+
self.BboxHead = self._make_bbox_head(fpn_num=3, inchannels=cfg['out_channel'])
|
87 |
+
self.LandmarkHead = self._make_landmark_head(fpn_num=3, inchannels=cfg['out_channel'])
|
88 |
+
|
89 |
+
def _make_class_head(self,fpn_num=3,inchannels=64,anchor_num=2):
|
90 |
+
classhead = nn.ModuleList()
|
91 |
+
for i in range(fpn_num):
|
92 |
+
classhead.append(ClassHead(inchannels,anchor_num))
|
93 |
+
return classhead
|
94 |
+
|
95 |
+
def _make_bbox_head(self,fpn_num=3,inchannels=64,anchor_num=2):
|
96 |
+
bboxhead = nn.ModuleList()
|
97 |
+
for i in range(fpn_num):
|
98 |
+
bboxhead.append(BboxHead(inchannels,anchor_num))
|
99 |
+
return bboxhead
|
100 |
+
|
101 |
+
def _make_landmark_head(self,fpn_num=3,inchannels=64,anchor_num=2):
|
102 |
+
landmarkhead = nn.ModuleList()
|
103 |
+
for i in range(fpn_num):
|
104 |
+
landmarkhead.append(LandmarkHead(inchannels,anchor_num))
|
105 |
+
return landmarkhead
|
106 |
+
|
107 |
+
def forward(self,inputs):
|
108 |
+
out = self.body(inputs)
|
109 |
+
|
110 |
+
# FPN
|
111 |
+
fpn = self.fpn(out)
|
112 |
+
|
113 |
+
# SSH
|
114 |
+
feature1 = self.ssh1(fpn[0])
|
115 |
+
feature2 = self.ssh2(fpn[1])
|
116 |
+
feature3 = self.ssh3(fpn[2])
|
117 |
+
features = [feature1, feature2, feature3]
|
118 |
+
|
119 |
+
bbox_regressions = torch.cat([self.BboxHead[i](feature) for i, feature in enumerate(features)], dim=1)
|
120 |
+
classifications = torch.cat([self.ClassHead[i](feature) for i, feature in enumerate(features)],dim=1)
|
121 |
+
ldm_regressions = torch.cat([self.LandmarkHead[i](feature) for i, feature in enumerate(features)], dim=1)
|
122 |
+
|
123 |
+
if self.phase == 'train':
|
124 |
+
output = (bbox_regressions, classifications, ldm_regressions)
|
125 |
+
else:
|
126 |
+
output = (bbox_regressions, F.softmax(classifications, dim=-1), ldm_regressions)
|
127 |
+
return output
|
retinaface/layers/__init__.py
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
from .functions import *
|
2 |
+
from .modules import *
|
retinaface/layers/functions/prior_box.py
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
from itertools import product as product
|
3 |
+
import numpy as np
|
4 |
+
from math import ceil
|
5 |
+
|
6 |
+
|
7 |
+
class PriorBox(object):
|
8 |
+
def __init__(self, cfg, image_size=None, phase='train'):
|
9 |
+
super(PriorBox, self).__init__()
|
10 |
+
self.msizes = cfg['msizes']
|
11 |
+
self.steps = cfg['steps']
|
12 |
+
self.clip = cfg['clip']
|
13 |
+
self.image_size = image_size
|
14 |
+
self.feature_maps = [[ceil(self.image_size[0]/step), ceil(self.image_size[1]/step)] for step in self.steps]
|
15 |
+
self.name = "s"
|
16 |
+
|
17 |
+
def forward(self):
|
18 |
+
anchors = []
|
19 |
+
for k, f in enumerate(self.feature_maps):
|
20 |
+
msizes = self.msizes[k]
|
21 |
+
for i, j in product(range(f[0]), range(f[1])):
|
22 |
+
for msize in msizes:
|
23 |
+
s_kx = msize / self.image_size[1]
|
24 |
+
s_ky = msize / self.image_size[0]
|
25 |
+
dense_cx = [x * self.steps[k] / self.image_size[1] for x in [j + 0.5]]
|
26 |
+
dense_cy = [y * self.steps[k] / self.image_size[0] for y in [i + 0.5]]
|
27 |
+
for cy, cx in product(dense_cy, dense_cx):
|
28 |
+
anchors += [cx, cy, s_kx, s_ky]
|
29 |
+
|
30 |
+
# back to torch land
|
31 |
+
output = torch.Tensor(anchors).view(-1, 4)
|
32 |
+
if self.clip:
|
33 |
+
output.clamp_(max=1, min=0)
|
34 |
+
return output
|
retinaface/layers/modules/__init__.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from .multibox_loss import MultiBoxLoss
|
2 |
+
|
3 |
+
__all__ = ['MultiBoxLoss']
|
retinaface/layers/modules/multibox_loss.py
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import torch.nn as nn
|
3 |
+
import torch.nn.functional as F
|
4 |
+
from torch.autograd import Variable
|
5 |
+
from utils.box_utils import match, log_sum_exp
|
6 |
+
from data import cfg_mnet
|
7 |
+
GPU = cfg_mnet['gpu_train']
|
8 |
+
|
9 |
+
class MultiBoxLoss(nn.Module):
|
10 |
+
"""SSD Weighted Loss Function
|
11 |
+
Compute Targets:
|
12 |
+
1) Produce Confidence Target Indices by matching ground truth boxes
|
13 |
+
with (default) 'priorboxes' that have jaccard index > threshold parameter
|
14 |
+
(default threshold: 0.5).
|
15 |
+
2) Produce localization target by 'encoding' variance into offsets of ground
|
16 |
+
truth boxes and their matched 'priorboxes'.
|
17 |
+
3) Hard negative mining to filter the excessive number of negative examples
|
18 |
+
that comes with using a large number of default bounding boxes.
|
19 |
+
(default negative:positive ratio 3:1)
|
20 |
+
Objective Loss:
|
21 |
+
L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N
|
22 |
+
Where, Lconf==the CrossEntropy Loss and Lloc==the SmoothL1 Loss
|
23 |
+
weighted by α which==set to 1 by cross val.
|
24 |
+
Args:
|
25 |
+
c: class confidences,
|
26 |
+
l: predicted boxes,
|
27 |
+
g: ground truth boxes
|
28 |
+
N: number of matched default boxes
|
29 |
+
See: https://arxiv.org/pdf/1512.02325.pdf for more details.
|
30 |
+
"""
|
31 |
+
|
32 |
+
def __init__(self, num_classes, overlap_thresh, prior_for_matching, bkg_label, neg_mining, neg_pos, neg_overlap, encode_target):
|
33 |
+
super(MultiBoxLoss, self).__init__()
|
34 |
+
self.num_classes = num_classes
|
35 |
+
self.threshold = overlap_thresh
|
36 |
+
self.background_label = bkg_label
|
37 |
+
self.encode_target = encode_target
|
38 |
+
self.use_prior_for_matching = prior_for_matching
|
39 |
+
self.do_neg_mining = neg_mining
|
40 |
+
self.negpos_ratio = neg_pos
|
41 |
+
self.neg_overlap = neg_overlap
|
42 |
+
self.variance = [0.1, 0.2]
|
43 |
+
|
44 |
+
def forward(self, predictions, priors, targets):
|
45 |
+
"""Multibox Loss
|
46 |
+
Args:
|
47 |
+
predictions (tuple): A tuple containing loc preds, conf preds,
|
48 |
+
and prior boxes from SSD net.
|
49 |
+
conf shape: torch.size(batch_size,num_priors,num_classes)
|
50 |
+
loc shape: torch.size(batch_size,num_priors,4)
|
51 |
+
priors shape: torch.size(num_priors,4)
|
52 |
+
|
53 |
+
ground_truth (tensor): Ground truth boxes and labels for a batch,
|
54 |
+
shape: [batch_size,num_objs,5] (last idx==the label).
|
55 |
+
"""
|
56 |
+
|
57 |
+
loc_data, conf_data, landm_data = predictions
|
58 |
+
priors = priors
|
59 |
+
num = loc_data.size(0)
|
60 |
+
num_priors = (priors.size(0))
|
61 |
+
|
62 |
+
# match priors (default boxes) and ground truth boxes
|
63 |
+
loc_t = torch.Tensor(num, num_priors, 4)
|
64 |
+
landm_t = torch.Tensor(num, num_priors, 10)
|
65 |
+
conf_t = torch.LongTensor(num, num_priors)
|
66 |
+
for idx in range(num):
|
67 |
+
truths = targets[idx][:, :4].data
|
68 |
+
labels = targets[idx][:, -1].data
|
69 |
+
landms = targets[idx][:, 4:14].data
|
70 |
+
defaults = priors.data
|
71 |
+
match(self.threshold, truths, defaults, self.variance, labels, landms, loc_t, conf_t, landm_t, idx)
|
72 |
+
if GPU:
|
73 |
+
loc_t = loc_t.cuda()
|
74 |
+
conf_t = conf_t.cuda()
|
75 |
+
landm_t = landm_t.cuda()
|
76 |
+
|
77 |
+
zeros = torch.tensor(0).cuda()
|
78 |
+
# landm Loss (Smooth L1)
|
79 |
+
# Shape: [batch,num_priors,10]
|
80 |
+
pos1 = conf_t > zeros
|
81 |
+
num_pos_landm = pos1.long().sum(1, keepdim=True)
|
82 |
+
N1 = max(num_pos_landm.data.sum().float(), 1)
|
83 |
+
pos_idx1 = pos1.unsqueeze(pos1.dim()).expand_as(landm_data)
|
84 |
+
landm_p = landm_data[pos_idx1].view(-1, 10)
|
85 |
+
landm_t = landm_t[pos_idx1].view(-1, 10)
|
86 |
+
loss_landm = F.smooth_l1_loss(landm_p, landm_t, reduction='sum')
|
87 |
+
|
88 |
+
|
89 |
+
pos = conf_t != zeros
|
90 |
+
conf_t[pos] = 1
|
91 |
+
|
92 |
+
# Localization Loss (Smooth L1)
|
93 |
+
# Shape: [batch,num_priors,4]
|
94 |
+
pos_idx = pos.unsqueeze(pos.dim()).expand_as(loc_data)
|
95 |
+
loc_p = loc_data[pos_idx].view(-1, 4)
|
96 |
+
loc_t = loc_t[pos_idx].view(-1, 4)
|
97 |
+
loss_l = F.smooth_l1_loss(loc_p, loc_t, reduction='sum')
|
98 |
+
|
99 |
+
# Compute max conf across batch for hard negative mining
|
100 |
+
batch_conf = conf_data.view(-1, self.num_classes)
|
101 |
+
loss_c = log_sum_exp(batch_conf) - batch_conf.gather(1, conf_t.view(-1, 1))
|
102 |
+
|
103 |
+
# Hard Negative Mining
|
104 |
+
loss_c[pos.view(-1, 1)] = 0 # filter out pos boxes for now
|
105 |
+
loss_c = loss_c.view(num, -1)
|
106 |
+
_, loss_idx = loss_c.sort(1, descending=True)
|
107 |
+
_, idx_rank = loss_idx.sort(1)
|
108 |
+
num_pos = pos.long().sum(1, keepdim=True)
|
109 |
+
num_neg = torch.clamp(self.negpos_ratio*num_pos, max=pos.size(1)-1)
|
110 |
+
neg = idx_rank < num_neg.expand_as(idx_rank)
|
111 |
+
|
112 |
+
# Confidence Loss Including Positive and Negative Examples
|
113 |
+
pos_idx = pos.unsqueeze(2).expand_as(conf_data)
|
114 |
+
neg_idx = neg.unsqueeze(2).expand_as(conf_data)
|
115 |
+
conf_p = conf_data[(pos_idx+neg_idx).gt(0)].view(-1,self.num_classes)
|
116 |
+
targets_weighted = conf_t[(pos+neg).gt(0)]
|
117 |
+
loss_c = F.cross_entropy(conf_p, targets_weighted, reduction='sum')
|
118 |
+
|
119 |
+
# Sum of losses: L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N
|
120 |
+
N = max(num_pos.data.sum().float(), 1)
|
121 |
+
loss_l /= N
|
122 |
+
loss_c /= N
|
123 |
+
loss_landm /= N1
|
124 |
+
|
125 |
+
return loss_l, loss_c, loss_landm
|
retinaface/retinaface_detection.py
ADDED
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''
|
2 |
+
@paper: GAN Prior Embedded Network for Blind Face Restoration in the Wild (CVPR2021)
|
3 |
+
@author: yangxy ([email protected])
|
4 |
+
'''
|
5 |
+
import os
|
6 |
+
import torch
|
7 |
+
import torch.backends.cudnn as cudnn
|
8 |
+
import numpy as np
|
9 |
+
from data import cfg_re50
|
10 |
+
from layers.functions.prior_box import PriorBox
|
11 |
+
from utils.nms.py_cpu_nms import py_cpu_nms
|
12 |
+
import cv2
|
13 |
+
from facemodels.retinaface import RetinaFace
|
14 |
+
from utils.box_utils import decode, decode_landm
|
15 |
+
import time
|
16 |
+
import torch.nn.functional as F
|
17 |
+
|
18 |
+
|
19 |
+
class RetinaFaceDetection(object):
|
20 |
+
def __init__(self, base_dir, device='cuda', network='RetinaFace-R50'):
|
21 |
+
torch.set_grad_enabled(False)
|
22 |
+
cudnn.benchmark = True
|
23 |
+
self.pretrained_path = os.path.join(base_dir, 'weights', network+'.pth')
|
24 |
+
self.device = device #torch.cuda.current_device()
|
25 |
+
self.cfg = cfg_re50
|
26 |
+
self.net = RetinaFace(cfg=self.cfg, phase='test')
|
27 |
+
self.load_model()
|
28 |
+
self.net = self.net.to(device)
|
29 |
+
|
30 |
+
self.mean = torch.tensor([[[[104]], [[117]], [[123]]]]).to(device)
|
31 |
+
|
32 |
+
def check_keys(self, pretrained_state_dict):
|
33 |
+
ckpt_keys = set(pretrained_state_dict.keys())
|
34 |
+
model_keys = set(self.net.state_dict().keys())
|
35 |
+
used_pretrained_keys = model_keys & ckpt_keys
|
36 |
+
unused_pretrained_keys = ckpt_keys - model_keys
|
37 |
+
missing_keys = model_keys - ckpt_keys
|
38 |
+
assert len(used_pretrained_keys) > 0, 'load NONE from pretrained checkpoint'
|
39 |
+
return True
|
40 |
+
|
41 |
+
def remove_prefix(self, state_dict, prefix):
|
42 |
+
''' Old style model==stored with all names of parameters sharing common prefix 'module.' '''
|
43 |
+
f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x
|
44 |
+
return {f(key): value for key, value in state_dict.items()}
|
45 |
+
|
46 |
+
def load_model(self, load_to_cpu=False):
|
47 |
+
#if load_to_cpu:
|
48 |
+
# pretrained_dict = torch.load(self.pretrained_path, map_location=lambda storage, loc: storage)
|
49 |
+
#else:
|
50 |
+
# pretrained_dict = torch.load(self.pretrained_path, map_location=lambda storage, loc: storage.cuda())
|
51 |
+
pretrained_dict = torch.load(self.pretrained_path, map_location=torch.device('cpu'))
|
52 |
+
if "state_dict" in pretrained_dict.keys():
|
53 |
+
pretrained_dict = self.remove_prefix(pretrained_dict['state_dict'], 'module.')
|
54 |
+
else:
|
55 |
+
pretrained_dict = self.remove_prefix(pretrained_dict, 'module.')
|
56 |
+
self.check_keys(pretrained_dict)
|
57 |
+
self.net.load_state_dict(pretrained_dict, strict=False)
|
58 |
+
self.net.eval()
|
59 |
+
|
60 |
+
def detect(self, img_raw, resize=1, confidence_threshold=0.9, nms_threshold=0.4, top_k=5000, keep_top_k=750, save_image=False):
|
61 |
+
img = np.float32(img_raw)
|
62 |
+
|
63 |
+
im_height, im_width = img.shape[:2]
|
64 |
+
ss = 1.0
|
65 |
+
# tricky
|
66 |
+
if max(im_height, im_width) > 1500:
|
67 |
+
ss = 1000.0/max(im_height, im_width)
|
68 |
+
img = cv2.resize(img, (0,0), fx=ss, fy=ss)
|
69 |
+
im_height, im_width = img.shape[:2]
|
70 |
+
|
71 |
+
scale = torch.Tensor([img.shape[1], img.shape[0], img.shape[1], img.shape[0]])
|
72 |
+
img -= (104, 117, 123)
|
73 |
+
img = img.transpose(2, 0, 1)
|
74 |
+
img = torch.from_numpy(img).unsqueeze(0)
|
75 |
+
img = img.to(self.device)
|
76 |
+
scale = scale.to(self.device)
|
77 |
+
|
78 |
+
loc, conf, landms = self.net(img) # forward pass
|
79 |
+
|
80 |
+
priorbox = PriorBox(self.cfg, image_size=(im_height, im_width))
|
81 |
+
priors = priorbox.forward()
|
82 |
+
priors = priors.to(self.device)
|
83 |
+
prior_data = priors.data
|
84 |
+
boxes = decode(loc.data.squeeze(0), prior_data, self.cfg['variance'])
|
85 |
+
boxes = boxes * scale / resize
|
86 |
+
boxes = boxes.cpu().numpy()
|
87 |
+
scores = conf.squeeze(0).data.cpu().numpy()[:, 1]
|
88 |
+
landms = decode_landm(landms.data.squeeze(0), prior_data, self.cfg['variance'])
|
89 |
+
scale1 = torch.Tensor([img.shape[3], img.shape[2], img.shape[3], img.shape[2],
|
90 |
+
img.shape[3], img.shape[2], img.shape[3], img.shape[2],
|
91 |
+
img.shape[3], img.shape[2]])
|
92 |
+
scale1 = scale1.to(self.device)
|
93 |
+
landms = landms * scale1 / resize
|
94 |
+
landms = landms.cpu().numpy()
|
95 |
+
|
96 |
+
# ignore low scores
|
97 |
+
inds = np.where(scores > confidence_threshold)[0]
|
98 |
+
boxes = boxes[inds]
|
99 |
+
landms = landms[inds]
|
100 |
+
scores = scores[inds]
|
101 |
+
|
102 |
+
# keep top-K before NMS
|
103 |
+
order = scores.argsort()[::-1][:top_k]
|
104 |
+
boxes = boxes[order]
|
105 |
+
landms = landms[order]
|
106 |
+
scores = scores[order]
|
107 |
+
|
108 |
+
# do NMS
|
109 |
+
dets = np.hstack((boxes, scores[:, np.newaxis])).astype(np.float32, copy=False)
|
110 |
+
keep = py_cpu_nms(dets, nms_threshold)
|
111 |
+
# keep = nms(dets, nms_threshold,force_cpu=args.cpu)
|
112 |
+
dets = dets[keep, :]
|
113 |
+
landms = landms[keep]
|
114 |
+
|
115 |
+
# keep top-K faster NMS
|
116 |
+
dets = dets[:keep_top_k, :]
|
117 |
+
landms = landms[:keep_top_k, :]
|
118 |
+
|
119 |
+
# sort faces(delete)
|
120 |
+
'''
|
121 |
+
fscores = [det[4] for det in dets]
|
122 |
+
sorted_idx = sorted(range(len(fscores)), key=lambda k:fscores[k], reverse=False) # sort index
|
123 |
+
tmp = [landms[idx] for idx in sorted_idx]
|
124 |
+
landms = np.asarray(tmp)
|
125 |
+
'''
|
126 |
+
|
127 |
+
landms = landms.reshape((-1, 5, 2))
|
128 |
+
landms = landms.transpose((0, 2, 1))
|
129 |
+
landms = landms.reshape(-1, 10, )
|
130 |
+
return dets/ss, landms/ss
|
131 |
+
|
132 |
+
def detect_tensor(self, img, resize=1, confidence_threshold=0.9, nms_threshold=0.4, top_k=5000, keep_top_k=750, save_image=False):
|
133 |
+
im_height, im_width = img.shape[-2:]
|
134 |
+
ss = 1000/max(im_height, im_width)
|
135 |
+
img = F.interpolate(img, scale_factor=ss)
|
136 |
+
im_height, im_width = img.shape[-2:]
|
137 |
+
scale = torch.Tensor([im_width, im_height, im_width, im_height]).to(self.device)
|
138 |
+
img -= self.mean
|
139 |
+
|
140 |
+
loc, conf, landms = self.net(img) # forward pass
|
141 |
+
|
142 |
+
priorbox = PriorBox(self.cfg, image_size=(im_height, im_width))
|
143 |
+
priors = priorbox.forward()
|
144 |
+
priors = priors.to(self.device)
|
145 |
+
prior_data = priors.data
|
146 |
+
boxes = decode(loc.data.squeeze(0), prior_data, self.cfg['variance'])
|
147 |
+
boxes = boxes * scale / resize
|
148 |
+
boxes = boxes.cpu().numpy()
|
149 |
+
scores = conf.squeeze(0).data.cpu().numpy()[:, 1]
|
150 |
+
landms = decode_landm(landms.data.squeeze(0), prior_data, self.cfg['variance'])
|
151 |
+
scale1 = torch.Tensor([img.shape[3], img.shape[2], img.shape[3], img.shape[2],
|
152 |
+
img.shape[3], img.shape[2], img.shape[3], img.shape[2],
|
153 |
+
img.shape[3], img.shape[2]])
|
154 |
+
scale1 = scale1.to(self.device)
|
155 |
+
landms = landms * scale1 / resize
|
156 |
+
landms = landms.cpu().numpy()
|
157 |
+
|
158 |
+
# ignore low scores
|
159 |
+
inds = np.where(scores > confidence_threshold)[0]
|
160 |
+
boxes = boxes[inds]
|
161 |
+
landms = landms[inds]
|
162 |
+
scores = scores[inds]
|
163 |
+
|
164 |
+
# keep top-K before NMS
|
165 |
+
order = scores.argsort()[::-1][:top_k]
|
166 |
+
boxes = boxes[order]
|
167 |
+
landms = landms[order]
|
168 |
+
scores = scores[order]
|
169 |
+
|
170 |
+
# do NMS
|
171 |
+
dets = np.hstack((boxes, scores[:, np.newaxis])).astype(np.float32, copy=False)
|
172 |
+
keep = py_cpu_nms(dets, nms_threshold)
|
173 |
+
# keep = nms(dets, nms_threshold,force_cpu=args.cpu)
|
174 |
+
dets = dets[keep, :]
|
175 |
+
landms = landms[keep]
|
176 |
+
|
177 |
+
# keep top-K faster NMS
|
178 |
+
dets = dets[:keep_top_k, :]
|
179 |
+
landms = landms[:keep_top_k, :]
|
180 |
+
|
181 |
+
# sort faces(delete)
|
182 |
+
'''
|
183 |
+
fscores = [det[4] for det in dets]
|
184 |
+
sorted_idx = sorted(range(len(fscores)), key=lambda k:fscores[k], reverse=False) # sort index
|
185 |
+
tmp = [landms[idx] for idx in sorted_idx]
|
186 |
+
landms = np.asarray(tmp)
|
187 |
+
'''
|
188 |
+
|
189 |
+
landms = landms.reshape((-1, 5, 2))
|
190 |
+
landms = landms.transpose((0, 2, 1))
|
191 |
+
landms = landms.reshape(-1, 10, )
|
192 |
+
return dets/ss, landms/ss
|
retinaface/utils/__init__.py
ADDED
File without changes
|
retinaface/utils/box_utils.py
ADDED
@@ -0,0 +1,330 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import numpy as np
|
3 |
+
|
4 |
+
|
5 |
+
def point_form(boxes):
|
6 |
+
""" Convert prior_boxes to (xmin, ymin, xmax, ymax)
|
7 |
+
representation for comparison to point form ground truth data.
|
8 |
+
Args:
|
9 |
+
boxes: (tensor) center-size default boxes from priorbox layers.
|
10 |
+
Return:
|
11 |
+
boxes: (tensor) Converted xmin, ymin, xmax, ymax form of boxes.
|
12 |
+
"""
|
13 |
+
return torch.cat((boxes[:, :2] - boxes[:, 2:]/2, # xmin, ymin
|
14 |
+
boxes[:, :2] + boxes[:, 2:]/2), 1) # xmax, ymax
|
15 |
+
|
16 |
+
|
17 |
+
def center_size(boxes):
|
18 |
+
""" Convert prior_boxes to (cx, cy, w, h)
|
19 |
+
representation for comparison to center-size form ground truth data.
|
20 |
+
Args:
|
21 |
+
boxes: (tensor) point_form boxes
|
22 |
+
Return:
|
23 |
+
boxes: (tensor) Converted xmin, ymin, xmax, ymax form of boxes.
|
24 |
+
"""
|
25 |
+
return torch.cat((boxes[:, 2:] + boxes[:, :2])/2, # cx, cy
|
26 |
+
boxes[:, 2:] - boxes[:, :2], 1) # w, h
|
27 |
+
|
28 |
+
|
29 |
+
def intersect(box_a, box_b):
|
30 |
+
""" We resize both tensors to [A,B,2] without new malloc:
|
31 |
+
[A,2] -> [A,1,2] -> [A,B,2]
|
32 |
+
[B,2] -> [1,B,2] -> [A,B,2]
|
33 |
+
Then we compute the area of intersect between box_a and box_b.
|
34 |
+
Args:
|
35 |
+
box_a: (tensor) bounding boxes, Shape: [A,4].
|
36 |
+
box_b: (tensor) bounding boxes, Shape: [B,4].
|
37 |
+
Return:
|
38 |
+
(tensor) intersection area, Shape: [A,B].
|
39 |
+
"""
|
40 |
+
A = box_a.size(0)
|
41 |
+
B = box_b.size(0)
|
42 |
+
max_xy = torch.min(box_a[:, 2:].unsqueeze(1).expand(A, B, 2),
|
43 |
+
box_b[:, 2:].unsqueeze(0).expand(A, B, 2))
|
44 |
+
min_xy = torch.max(box_a[:, :2].unsqueeze(1).expand(A, B, 2),
|
45 |
+
box_b[:, :2].unsqueeze(0).expand(A, B, 2))
|
46 |
+
inter = torch.clamp((max_xy - min_xy), min=0)
|
47 |
+
return inter[:, :, 0] * inter[:, :, 1]
|
48 |
+
|
49 |
+
|
50 |
+
def jaccard(box_a, box_b):
|
51 |
+
"""Compute the jaccard overlap of two sets of boxes. The jaccard overlap
|
52 |
+
==simply the intersection over union of two boxes. Here we operate on
|
53 |
+
ground truth boxes and default boxes.
|
54 |
+
E.g.:
|
55 |
+
A ∩ B / A ∪ B = A ∩ B / (area(A) + area(B) - A ∩ B)
|
56 |
+
Args:
|
57 |
+
box_a: (tensor) Ground truth bounding boxes, Shape: [num_objects,4]
|
58 |
+
box_b: (tensor) Prior boxes from priorbox layers, Shape: [num_priors,4]
|
59 |
+
Return:
|
60 |
+
jaccard overlap: (tensor) Shape: [box_a.size(0), box_b.size(0)]
|
61 |
+
"""
|
62 |
+
inter = intersect(box_a, box_b)
|
63 |
+
area_a = ((box_a[:, 2]-box_a[:, 0]) *
|
64 |
+
(box_a[:, 3]-box_a[:, 1])).unsqueeze(1).expand_as(inter) # [A,B]
|
65 |
+
area_b = ((box_b[:, 2]-box_b[:, 0]) *
|
66 |
+
(box_b[:, 3]-box_b[:, 1])).unsqueeze(0).expand_as(inter) # [A,B]
|
67 |
+
union = area_a + area_b - inter
|
68 |
+
return inter / union # [A,B]
|
69 |
+
|
70 |
+
|
71 |
+
def matrix_iou(a, b):
|
72 |
+
"""
|
73 |
+
return iou of a and b, numpy version for data augenmentation
|
74 |
+
"""
|
75 |
+
lt = np.maximum(a[:, np.newaxis, :2], b[:, :2])
|
76 |
+
rb = np.minimum(a[:, np.newaxis, 2:], b[:, 2:])
|
77 |
+
|
78 |
+
area_i = np.prod(rb - lt, axis=2) * (lt < rb).all(axis=2)
|
79 |
+
area_a = np.prod(a[:, 2:] - a[:, :2], axis=1)
|
80 |
+
area_b = np.prod(b[:, 2:] - b[:, :2], axis=1)
|
81 |
+
return area_i / (area_a[:, np.newaxis] + area_b - area_i)
|
82 |
+
|
83 |
+
|
84 |
+
def matrix_iof(a, b):
|
85 |
+
"""
|
86 |
+
return iof of a and b, numpy version for data augenmentation
|
87 |
+
"""
|
88 |
+
lt = np.maximum(a[:, np.newaxis, :2], b[:, :2])
|
89 |
+
rb = np.minimum(a[:, np.newaxis, 2:], b[:, 2:])
|
90 |
+
|
91 |
+
area_i = np.prod(rb - lt, axis=2) * (lt < rb).all(axis=2)
|
92 |
+
area_a = np.prod(a[:, 2:] - a[:, :2], axis=1)
|
93 |
+
return area_i / np.maximum(area_a[:, np.newaxis], 1)
|
94 |
+
|
95 |
+
|
96 |
+
def match(threshold, truths, priors, variances, labels, landms, loc_t, conf_t, landm_t, idx):
|
97 |
+
"""Match each prior box with the ground truth box of the highest jaccard
|
98 |
+
overlap, encode the bounding boxes, then return the matched indices
|
99 |
+
corresponding to both confidence and location preds.
|
100 |
+
Args:
|
101 |
+
threshold: (float) The overlap threshold used when mathing boxes.
|
102 |
+
truths: (tensor) Ground truth boxes, Shape: [num_obj, 4].
|
103 |
+
priors: (tensor) Prior boxes from priorbox layers, Shape: [n_priors,4].
|
104 |
+
variances: (tensor) Variances corresponding to each prior coord,
|
105 |
+
Shape: [num_priors, 4].
|
106 |
+
labels: (tensor) All the class labels for the image, Shape: [num_obj].
|
107 |
+
landms: (tensor) Ground truth landms, Shape [num_obj, 10].
|
108 |
+
loc_t: (tensor) Tensor to be filled w/ endcoded location targets.
|
109 |
+
conf_t: (tensor) Tensor to be filled w/ matched indices for conf preds.
|
110 |
+
landm_t: (tensor) Tensor to be filled w/ endcoded landm targets.
|
111 |
+
idx: (int) current batch index
|
112 |
+
Return:
|
113 |
+
The matched indices corresponding to 1)location 2)confidence 3)landm preds.
|
114 |
+
"""
|
115 |
+
# jaccard index
|
116 |
+
overlaps = jaccard(
|
117 |
+
truths,
|
118 |
+
point_form(priors)
|
119 |
+
)
|
120 |
+
# (Bipartite Matching)
|
121 |
+
# [1,num_objects] best prior for each ground truth
|
122 |
+
best_prior_overlap, best_prior_idx = overlaps.max(1, keepdim=True)
|
123 |
+
|
124 |
+
# ignore hard gt
|
125 |
+
valid_gt_idx = best_prior_overlap[:, 0] >= 0.2
|
126 |
+
best_prior_idx_filter = best_prior_idx[valid_gt_idx, :]
|
127 |
+
if best_prior_idx_filter.shape[0] <= 0:
|
128 |
+
loc_t[idx] = 0
|
129 |
+
conf_t[idx] = 0
|
130 |
+
return
|
131 |
+
|
132 |
+
# [1,num_priors] best ground truth for each prior
|
133 |
+
best_truth_overlap, best_truth_idx = overlaps.max(0, keepdim=True)
|
134 |
+
best_truth_idx.squeeze_(0)
|
135 |
+
best_truth_overlap.squeeze_(0)
|
136 |
+
best_prior_idx.squeeze_(1)
|
137 |
+
best_prior_idx_filter.squeeze_(1)
|
138 |
+
best_prior_overlap.squeeze_(1)
|
139 |
+
best_truth_overlap.index_fill_(0, best_prior_idx_filter, 2) # ensure best prior
|
140 |
+
# TODO refactor: index best_prior_idx with long tensor
|
141 |
+
# ensure every gt matches with its prior of max overlap
|
142 |
+
for j in range(best_prior_idx.size(0)): # 判别此anchor是预测哪一个boxes
|
143 |
+
best_truth_idx[best_prior_idx[j]] = j
|
144 |
+
matches = truths[best_truth_idx] # Shape: [num_priors,4] 此处为每一个anchor对应的bbox取出来
|
145 |
+
conf = labels[best_truth_idx] # Shape: [num_priors] 此处为每一个anchor对应的label取出来
|
146 |
+
conf[best_truth_overlap < threshold] = 0 # label as background overlap<0.35的全部作为负样本
|
147 |
+
loc = encode(matches, priors, variances)
|
148 |
+
|
149 |
+
matches_landm = landms[best_truth_idx]
|
150 |
+
landm = encode_landm(matches_landm, priors, variances)
|
151 |
+
loc_t[idx] = loc # [num_priors,4] encoded offsets to learn
|
152 |
+
conf_t[idx] = conf # [num_priors] top class label for each prior
|
153 |
+
landm_t[idx] = landm
|
154 |
+
|
155 |
+
|
156 |
+
def encode(matched, priors, variances):
|
157 |
+
"""Encode the variances from the priorbox layers into the ground truth boxes
|
158 |
+
we have matched (based on jaccard overlap) with the prior boxes.
|
159 |
+
Args:
|
160 |
+
matched: (tensor) Coords of ground truth for each prior in point-form
|
161 |
+
Shape: [num_priors, 4].
|
162 |
+
priors: (tensor) Prior boxes in center-offset form
|
163 |
+
Shape: [num_priors,4].
|
164 |
+
variances: (list[float]) Variances of priorboxes
|
165 |
+
Return:
|
166 |
+
encoded boxes (tensor), Shape: [num_priors, 4]
|
167 |
+
"""
|
168 |
+
|
169 |
+
# dist b/t match center and prior's center
|
170 |
+
g_cxcy = (matched[:, :2] + matched[:, 2:])/2 - priors[:, :2]
|
171 |
+
# encode variance
|
172 |
+
g_cxcy /= (variances[0] * priors[:, 2:])
|
173 |
+
# match wh / prior wh
|
174 |
+
g_wh = (matched[:, 2:] - matched[:, :2]) / priors[:, 2:]
|
175 |
+
g_wh = torch.log(g_wh) / variances[1]
|
176 |
+
# return target for smooth_l1_loss
|
177 |
+
return torch.cat([g_cxcy, g_wh], 1) # [num_priors,4]
|
178 |
+
|
179 |
+
def encode_landm(matched, priors, variances):
|
180 |
+
"""Encode the variances from the priorbox layers into the ground truth boxes
|
181 |
+
we have matched (based on jaccard overlap) with the prior boxes.
|
182 |
+
Args:
|
183 |
+
matched: (tensor) Coords of ground truth for each prior in point-form
|
184 |
+
Shape: [num_priors, 10].
|
185 |
+
priors: (tensor) Prior boxes in center-offset form
|
186 |
+
Shape: [num_priors,4].
|
187 |
+
variances: (list[float]) Variances of priorboxes
|
188 |
+
Return:
|
189 |
+
encoded landm (tensor), Shape: [num_priors, 10]
|
190 |
+
"""
|
191 |
+
|
192 |
+
# dist b/t match center and prior's center
|
193 |
+
matched = torch.reshape(matched, (matched.size(0), 5, 2))
|
194 |
+
priors_cx = priors[:, 0].unsqueeze(1).expand(matched.size(0), 5).unsqueeze(2)
|
195 |
+
priors_cy = priors[:, 1].unsqueeze(1).expand(matched.size(0), 5).unsqueeze(2)
|
196 |
+
priors_w = priors[:, 2].unsqueeze(1).expand(matched.size(0), 5).unsqueeze(2)
|
197 |
+
priors_h = priors[:, 3].unsqueeze(1).expand(matched.size(0), 5).unsqueeze(2)
|
198 |
+
priors = torch.cat([priors_cx, priors_cy, priors_w, priors_h], dim=2)
|
199 |
+
g_cxcy = matched[:, :, :2] - priors[:, :, :2]
|
200 |
+
# encode variance
|
201 |
+
g_cxcy /= (variances[0] * priors[:, :, 2:])
|
202 |
+
# g_cxcy /= priors[:, :, 2:]
|
203 |
+
g_cxcy = g_cxcy.reshape(g_cxcy.size(0), -1)
|
204 |
+
# return target for smooth_l1_loss
|
205 |
+
return g_cxcy
|
206 |
+
|
207 |
+
|
208 |
+
# Adapted from https://github.com/Hakuyume/chainer-ssd
|
209 |
+
def decode(loc, priors, variances):
|
210 |
+
"""Decode locations from predictions using priors to undo
|
211 |
+
the encoding we did for offset regression at train time.
|
212 |
+
Args:
|
213 |
+
loc (tensor): location predictions for loc layers,
|
214 |
+
Shape: [num_priors,4]
|
215 |
+
priors (tensor): Prior boxes in center-offset form.
|
216 |
+
Shape: [num_priors,4].
|
217 |
+
variances: (list[float]) Variances of priorboxes
|
218 |
+
Return:
|
219 |
+
decoded bounding box predictions
|
220 |
+
"""
|
221 |
+
|
222 |
+
boxes = torch.cat((
|
223 |
+
priors[:, :2] + loc[:, :2] * variances[0] * priors[:, 2:],
|
224 |
+
priors[:, 2:] * torch.exp(loc[:, 2:] * variances[1])), 1)
|
225 |
+
boxes[:, :2] -= boxes[:, 2:] / 2
|
226 |
+
boxes[:, 2:] += boxes[:, :2]
|
227 |
+
return boxes
|
228 |
+
|
229 |
+
def decode_landm(pre, priors, variances):
|
230 |
+
"""Decode landm from predictions using priors to undo
|
231 |
+
the encoding we did for offset regression at train time.
|
232 |
+
Args:
|
233 |
+
pre (tensor): landm predictions for loc layers,
|
234 |
+
Shape: [num_priors,10]
|
235 |
+
priors (tensor): Prior boxes in center-offset form.
|
236 |
+
Shape: [num_priors,4].
|
237 |
+
variances: (list[float]) Variances of priorboxes
|
238 |
+
Return:
|
239 |
+
decoded landm predictions
|
240 |
+
"""
|
241 |
+
landms = torch.cat((priors[:, :2] + pre[:, :2] * variances[0] * priors[:, 2:],
|
242 |
+
priors[:, :2] + pre[:, 2:4] * variances[0] * priors[:, 2:],
|
243 |
+
priors[:, :2] + pre[:, 4:6] * variances[0] * priors[:, 2:],
|
244 |
+
priors[:, :2] + pre[:, 6:8] * variances[0] * priors[:, 2:],
|
245 |
+
priors[:, :2] + pre[:, 8:10] * variances[0] * priors[:, 2:],
|
246 |
+
), dim=1)
|
247 |
+
return landms
|
248 |
+
|
249 |
+
|
250 |
+
def log_sum_exp(x):
|
251 |
+
"""Utility function for computing log_sum_exp while determining
|
252 |
+
This will be used to determine unaveraged confidence loss across
|
253 |
+
all examples in a batch.
|
254 |
+
Args:
|
255 |
+
x (Variable(tensor)): conf_preds from conf layers
|
256 |
+
"""
|
257 |
+
x_max = x.data.max()
|
258 |
+
return torch.log(torch.sum(torch.exp(x-x_max), 1, keepdim=True)) + x_max
|
259 |
+
|
260 |
+
|
261 |
+
# Original author: Francisco Massa:
|
262 |
+
# https://github.com/fmassa/object-detection.torch
|
263 |
+
# Ported to PyTorch by Max deGroot (02/01/2017)
|
264 |
+
def nms(boxes, scores, overlap=0.5, top_k=200):
|
265 |
+
"""Apply non-maximum suppression at test time to avoid detecting too many
|
266 |
+
overlapping bounding boxes for a given object.
|
267 |
+
Args:
|
268 |
+
boxes: (tensor) The location preds for the img, Shape: [num_priors,4].
|
269 |
+
scores: (tensor) The class predscores for the img, Shape:[num_priors].
|
270 |
+
overlap: (float) The overlap thresh for suppressing unnecessary boxes.
|
271 |
+
top_k: (int) The Maximum number of box preds to consider.
|
272 |
+
Return:
|
273 |
+
The indices of the kept boxes with respect to num_priors.
|
274 |
+
"""
|
275 |
+
|
276 |
+
keep = torch.Tensor(scores.size(0)).fill_(0).long()
|
277 |
+
if boxes.numel() == 0:
|
278 |
+
return keep
|
279 |
+
x1 = boxes[:, 0]
|
280 |
+
y1 = boxes[:, 1]
|
281 |
+
x2 = boxes[:, 2]
|
282 |
+
y2 = boxes[:, 3]
|
283 |
+
area = torch.mul(x2 - x1, y2 - y1)
|
284 |
+
v, idx = scores.sort(0) # sort in ascending order
|
285 |
+
# I = I[v >= 0.01]
|
286 |
+
idx = idx[-top_k:] # indices of the top-k largest vals
|
287 |
+
xx1 = boxes.new()
|
288 |
+
yy1 = boxes.new()
|
289 |
+
xx2 = boxes.new()
|
290 |
+
yy2 = boxes.new()
|
291 |
+
w = boxes.new()
|
292 |
+
h = boxes.new()
|
293 |
+
|
294 |
+
# keep = torch.Tensor()
|
295 |
+
count = 0
|
296 |
+
while idx.numel() > 0:
|
297 |
+
i = idx[-1] # index of current largest val
|
298 |
+
# keep.append(i)
|
299 |
+
keep[count] = i
|
300 |
+
count += 1
|
301 |
+
if idx.size(0) == 1:
|
302 |
+
break
|
303 |
+
idx = idx[:-1] # remove kept element from view
|
304 |
+
# load bboxes of next highest vals
|
305 |
+
torch.index_select(x1, 0, idx, out=xx1)
|
306 |
+
torch.index_select(y1, 0, idx, out=yy1)
|
307 |
+
torch.index_select(x2, 0, idx, out=xx2)
|
308 |
+
torch.index_select(y2, 0, idx, out=yy2)
|
309 |
+
# store element-wise max with next highest score
|
310 |
+
xx1 = torch.clamp(xx1, min=x1[i])
|
311 |
+
yy1 = torch.clamp(yy1, min=y1[i])
|
312 |
+
xx2 = torch.clamp(xx2, max=x2[i])
|
313 |
+
yy2 = torch.clamp(yy2, max=y2[i])
|
314 |
+
w.resize_as_(xx2)
|
315 |
+
h.resize_as_(yy2)
|
316 |
+
w = xx2 - xx1
|
317 |
+
h = yy2 - yy1
|
318 |
+
# check sizes of xx1 and xx2.. after each iteration
|
319 |
+
w = torch.clamp(w, min=0.0)
|
320 |
+
h = torch.clamp(h, min=0.0)
|
321 |
+
inter = w*h
|
322 |
+
# IoU = i / (area(a) + area(b) - i)
|
323 |
+
rem_areas = torch.index_select(area, 0, idx) # load remaining areas)
|
324 |
+
union = (rem_areas - inter) + area[i]
|
325 |
+
IoU = inter/union # store result in iou
|
326 |
+
# keep only elements with an IoU <= overlap
|
327 |
+
idx = idx[IoU.le(overlap)]
|
328 |
+
return keep, count
|
329 |
+
|
330 |
+
|
retinaface/utils/nms/__init__.py
ADDED
File without changes
|
retinaface/utils/nms/py_cpu_nms.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# --------------------------------------------------------
|
2 |
+
# Fast R-CNN
|
3 |
+
# Copyright (c) 2015 Microsoft
|
4 |
+
# Licensed under The MIT License [see LICENSE for details]
|
5 |
+
# Written by Ross Girshick
|
6 |
+
# --------------------------------------------------------
|
7 |
+
|
8 |
+
import numpy as np
|
9 |
+
|
10 |
+
def py_cpu_nms(dets, thresh):
|
11 |
+
"""Pure Python NMS baseline."""
|
12 |
+
x1 = dets[:, 0]
|
13 |
+
y1 = dets[:, 1]
|
14 |
+
x2 = dets[:, 2]
|
15 |
+
y2 = dets[:, 3]
|
16 |
+
scores = dets[:, 4]
|
17 |
+
|
18 |
+
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
|
19 |
+
order = scores.argsort()[::-1]
|
20 |
+
|
21 |
+
keep = []
|
22 |
+
while order.size > 0:
|
23 |
+
i = order[0]
|
24 |
+
keep.append(i)
|
25 |
+
xx1 = np.maximum(x1[i], x1[order[1:]])
|
26 |
+
yy1 = np.maximum(y1[i], y1[order[1:]])
|
27 |
+
xx2 = np.minimum(x2[i], x2[order[1:]])
|
28 |
+
yy2 = np.minimum(y2[i], y2[order[1:]])
|
29 |
+
|
30 |
+
w = np.maximum(0.0, xx2 - xx1 + 1)
|
31 |
+
h = np.maximum(0.0, yy2 - yy1 + 1)
|
32 |
+
inter = w * h
|
33 |
+
ovr = inter / (areas[i] + areas[order[1:]] - inter)
|
34 |
+
|
35 |
+
inds = np.where(ovr <= thresh)[0]
|
36 |
+
order = order[inds + 1]
|
37 |
+
|
38 |
+
return keep
|
retinaface/utils/timer.py
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# --------------------------------------------------------
|
2 |
+
# Fast R-CNN
|
3 |
+
# Copyright (c) 2015 Microsoft
|
4 |
+
# Licensed under The MIT License [see LICENSE for details]
|
5 |
+
# Written by Ross Girshick
|
6 |
+
# --------------------------------------------------------
|
7 |
+
|
8 |
+
import time
|
9 |
+
|
10 |
+
|
11 |
+
class Timer(object):
|
12 |
+
"""A simple timer."""
|
13 |
+
def __init__(self):
|
14 |
+
self.total_time = 0.
|
15 |
+
self.calls = 0
|
16 |
+
self.start_time = 0.
|
17 |
+
self.diff = 0.
|
18 |
+
self.average_time = 0.
|
19 |
+
|
20 |
+
def tic(self):
|
21 |
+
# using time.time instead of time.clock because time time.clock
|
22 |
+
# does not normalize for multithreading
|
23 |
+
self.start_time = time.time()
|
24 |
+
|
25 |
+
def toc(self, average=True):
|
26 |
+
self.diff = time.time() - self.start_time
|
27 |
+
self.total_time += self.diff
|
28 |
+
self.calls += 1
|
29 |
+
self.average_time = self.total_time / self.calls
|
30 |
+
if average:
|
31 |
+
return self.average_time
|
32 |
+
else:
|
33 |
+
return self.diff
|
34 |
+
|
35 |
+
def clear(self):
|
36 |
+
self.total_time = 0.
|
37 |
+
self.calls = 0
|
38 |
+
self.start_time = 0.
|
39 |
+
self.diff = 0.
|
40 |
+
self.average_time = 0.
|
selfie.png
ADDED
sr_model/arch_util.py
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import math
|
2 |
+
import torch
|
3 |
+
from torch import nn as nn
|
4 |
+
from torch.nn import functional as F
|
5 |
+
from torch.nn import init as init
|
6 |
+
from torch.nn.modules.batchnorm import _BatchNorm
|
7 |
+
|
8 |
+
@torch.no_grad()
|
9 |
+
def default_init_weights(module_list, scale=1, bias_fill=0, **kwargs):
|
10 |
+
"""Initialize network weights.
|
11 |
+
|
12 |
+
Args:
|
13 |
+
module_list (list[nn.Module] | nn.Module): Modules to be initialized.
|
14 |
+
scale (float): Scale initialized weights, especially for residual
|
15 |
+
blocks. Default: 1.
|
16 |
+
bias_fill (float): The value to fill bias. Default: 0
|
17 |
+
kwargs (dict): Other arguments for initialization function.
|
18 |
+
"""
|
19 |
+
if not isinstance(module_list, list):
|
20 |
+
module_list = [module_list]
|
21 |
+
for module in module_list:
|
22 |
+
for m in module.modules():
|
23 |
+
if isinstance(m, nn.Conv2d):
|
24 |
+
init.kaiming_normal_(m.weight, **kwargs)
|
25 |
+
m.weight.data *= scale
|
26 |
+
if m.bias is not None:
|
27 |
+
m.bias.data.fill_(bias_fill)
|
28 |
+
elif isinstance(m, nn.Linear):
|
29 |
+
init.kaiming_normal_(m.weight, **kwargs)
|
30 |
+
m.weight.data *= scale
|
31 |
+
if m.bias is not None:
|
32 |
+
m.bias.data.fill_(bias_fill)
|
33 |
+
elif isinstance(m, _BatchNorm):
|
34 |
+
init.constant_(m.weight, 1)
|
35 |
+
if m.bias is not None:
|
36 |
+
m.bias.data.fill_(bias_fill)
|
37 |
+
|
38 |
+
|
39 |
+
def make_layer(basic_block, num_basic_block, **kwarg):
|
40 |
+
"""Make layers by stacking the same blocks.
|
41 |
+
|
42 |
+
Args:
|
43 |
+
basic_block (nn.module): nn.module class for basic block.
|
44 |
+
num_basic_block (int): number of blocks.
|
45 |
+
|
46 |
+
Returns:
|
47 |
+
nn.Sequential: Stacked blocks in nn.Sequential.
|
48 |
+
"""
|
49 |
+
layers = []
|
50 |
+
for _ in range(num_basic_block):
|
51 |
+
layers.append(basic_block(**kwarg))
|
52 |
+
return nn.Sequential(*layers)
|
53 |
+
|
54 |
+
|
55 |
+
class ResidualBlockNoBN(nn.Module):
|
56 |
+
"""Residual block without BN.
|
57 |
+
|
58 |
+
It has a style of:
|
59 |
+
---Conv-ReLU-Conv-+-
|
60 |
+
|________________|
|
61 |
+
|
62 |
+
Args:
|
63 |
+
num_feat (int): Channel number of intermediate features.
|
64 |
+
Default: 64.
|
65 |
+
res_scale (float): Residual scale. Default: 1.
|
66 |
+
pytorch_init (bool): If set to True, use pytorch default init,
|
67 |
+
otherwise, use default_init_weights. Default: False.
|
68 |
+
"""
|
69 |
+
|
70 |
+
def __init__(self, num_feat=64, res_scale=1, pytorch_init=False):
|
71 |
+
super(ResidualBlockNoBN, self).__init__()
|
72 |
+
self.res_scale = res_scale
|
73 |
+
self.conv1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1, bias=True)
|
74 |
+
self.conv2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1, bias=True)
|
75 |
+
self.relu = nn.ReLU(inplace=True)
|
76 |
+
|
77 |
+
if not pytorch_init:
|
78 |
+
default_init_weights([self.conv1, self.conv2], 0.1)
|
79 |
+
|
80 |
+
def forward(self, x):
|
81 |
+
identity = x
|
82 |
+
out = self.conv2(self.relu(self.conv1(x)))
|
83 |
+
return identity + out * self.res_scale
|
84 |
+
|
85 |
+
|
86 |
+
class Upsample(nn.Sequential):
|
87 |
+
"""Upsample module.
|
88 |
+
|
89 |
+
Args:
|
90 |
+
scale (int): Scale factor. Supported scales: 2^n and 3.
|
91 |
+
num_feat (int): Channel number of intermediate features.
|
92 |
+
"""
|
93 |
+
|
94 |
+
def __init__(self, scale, num_feat):
|
95 |
+
m = []
|
96 |
+
if (scale & (scale - 1)) == 0: # scale = 2^n
|
97 |
+
for _ in range(int(math.log(scale, 2))):
|
98 |
+
m.append(nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1))
|
99 |
+
m.append(nn.PixelShuffle(2))
|
100 |
+
elif scale == 3:
|
101 |
+
m.append(nn.Conv2d(num_feat, 9 * num_feat, 3, 1, 1))
|
102 |
+
m.append(nn.PixelShuffle(3))
|
103 |
+
else:
|
104 |
+
raise ValueError(f'scale {scale} is not supported. '
|
105 |
+
'Supported scales: 2^n and 3.')
|
106 |
+
super(Upsample, self).__init__(*m)
|
107 |
+
|
108 |
+
# TODO: may write a cpp file
|
109 |
+
def pixel_unshuffle(x, scale):
|
110 |
+
""" Pixel unshuffle.
|
111 |
+
|
112 |
+
Args:
|
113 |
+
x (Tensor): Input feature with shape (b, c, hh, hw).
|
114 |
+
scale (int): Downsample ratio.
|
115 |
+
|
116 |
+
Returns:
|
117 |
+
Tensor: the pixel unshuffled feature.
|
118 |
+
"""
|
119 |
+
b, c, hh, hw = x.size()
|
120 |
+
out_channel = c * (scale**2)
|
121 |
+
assert hh % scale == 0 and hw % scale == 0
|
122 |
+
h = hh // scale
|
123 |
+
w = hw // scale
|
124 |
+
x_view = x.view(b, c, h, scale, w, scale)
|
125 |
+
return x_view.permute(0, 1, 3, 5, 2, 4).reshape(b, out_channel, h, w)
|
sr_model/real_esrnet.py
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import math
|
3 |
+
import torch
|
4 |
+
import numpy as np
|
5 |
+
from rrdbnet_arch import RRDBNet
|
6 |
+
from torch.nn import functional as F
|
7 |
+
|
8 |
+
class RealESRNet(object):
|
9 |
+
def __init__(self, base_dir='./', model=None, scale=2, tile_size=0, tile_pad=10, device='cuda'):
|
10 |
+
self.base_dir = base_dir
|
11 |
+
self.scale = scale
|
12 |
+
self.tile_size = tile_size
|
13 |
+
self.tile_pad = tile_pad
|
14 |
+
self.device = device
|
15 |
+
self.load_srmodel(base_dir, model)
|
16 |
+
|
17 |
+
def load_srmodel(self, base_dir, model):
|
18 |
+
self.srmodel = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=32, num_block=23, num_grow_ch=32, scale=self.scale)
|
19 |
+
if model is None:
|
20 |
+
loadnet = torch.load(os.path.join(self.base_dir, 'weights', 'realesrnet_x%d.pth'%self.scale))
|
21 |
+
else:
|
22 |
+
loadnet = torch.load(os.path.join(self.base_dir, 'weights', model+'_x%d.pth'%self.scale))
|
23 |
+
#print(loadnet['params_ema'].keys)
|
24 |
+
self.srmodel.load_state_dict(loadnet['params_ema'], strict=True)
|
25 |
+
self.srmodel.eval()
|
26 |
+
self.srmodel = self.srmodel.to(self.device)
|
27 |
+
|
28 |
+
def tile_process(self, img):
|
29 |
+
"""It will first crop input images to tiles, and then process each tile.
|
30 |
+
Finally, all the processed tiles are merged into one images.
|
31 |
+
|
32 |
+
Modified from: https://github.com/ata4/esrgan-launcher
|
33 |
+
"""
|
34 |
+
batch, channel, height, width = img.shape
|
35 |
+
output_height = height * self.scale
|
36 |
+
output_width = width * self.scale
|
37 |
+
output_shape = (batch, channel, output_height, output_width)
|
38 |
+
|
39 |
+
# start with black image
|
40 |
+
output = img.new_zeros(output_shape)
|
41 |
+
tiles_x = math.ceil(width / self.tile_size)
|
42 |
+
tiles_y = math.ceil(height / self.tile_size)
|
43 |
+
|
44 |
+
# loop over all tiles
|
45 |
+
for y in range(tiles_y):
|
46 |
+
for x in range(tiles_x):
|
47 |
+
# extract tile from input image
|
48 |
+
ofs_x = x * self.tile_size
|
49 |
+
ofs_y = y * self.tile_size
|
50 |
+
# input tile area on total image
|
51 |
+
input_start_x = ofs_x
|
52 |
+
input_end_x = min(ofs_x + self.tile_size, width)
|
53 |
+
input_start_y = ofs_y
|
54 |
+
input_end_y = min(ofs_y + self.tile_size, height)
|
55 |
+
|
56 |
+
# input tile area on total image with padding
|
57 |
+
input_start_x_pad = max(input_start_x - self.tile_pad, 0)
|
58 |
+
input_end_x_pad = min(input_end_x + self.tile_pad, width)
|
59 |
+
input_start_y_pad = max(input_start_y - self.tile_pad, 0)
|
60 |
+
input_end_y_pad = min(input_end_y + self.tile_pad, height)
|
61 |
+
|
62 |
+
# input tile dimensions
|
63 |
+
input_tile_width = input_end_x - input_start_x
|
64 |
+
input_tile_height = input_end_y - input_start_y
|
65 |
+
tile_idx = y * tiles_x + x + 1
|
66 |
+
input_tile = img[:, :, input_start_y_pad:input_end_y_pad, input_start_x_pad:input_end_x_pad]
|
67 |
+
|
68 |
+
# upscale tile
|
69 |
+
try:
|
70 |
+
with torch.no_grad():
|
71 |
+
output_tile = self.srmodel(input_tile)
|
72 |
+
except RuntimeError as error:
|
73 |
+
print('Error', error)
|
74 |
+
return None
|
75 |
+
if tile_idx%10==0: print(f'\tTile {tile_idx}/{tiles_x * tiles_y}')
|
76 |
+
|
77 |
+
# output tile area on total image
|
78 |
+
output_start_x = input_start_x * self.scale
|
79 |
+
output_end_x = input_end_x * self.scale
|
80 |
+
output_start_y = input_start_y * self.scale
|
81 |
+
output_end_y = input_end_y * self.scale
|
82 |
+
|
83 |
+
# output tile area without padding
|
84 |
+
output_start_x_tile = (input_start_x - input_start_x_pad) * self.scale
|
85 |
+
output_end_x_tile = output_start_x_tile + input_tile_width * self.scale
|
86 |
+
output_start_y_tile = (input_start_y - input_start_y_pad) * self.scale
|
87 |
+
output_end_y_tile = output_start_y_tile + input_tile_height * self.scale
|
88 |
+
|
89 |
+
# put tile into output image
|
90 |
+
output[:, :, output_start_y:output_end_y,
|
91 |
+
output_start_x:output_end_x] = output_tile[:, :, output_start_y_tile:output_end_y_tile,
|
92 |
+
output_start_x_tile:output_end_x_tile]
|
93 |
+
return output
|
94 |
+
|
95 |
+
def process(self, img):
|
96 |
+
img = img.astype(np.float32) / 255.
|
97 |
+
img = torch.from_numpy(np.transpose(img[:, :, [2, 1, 0]], (2, 0, 1))).float()
|
98 |
+
img = img.unsqueeze(0).to(self.device)
|
99 |
+
|
100 |
+
if self.scale == 2:
|
101 |
+
mod_scale = 2
|
102 |
+
elif self.scale == 1:
|
103 |
+
mod_scale = 4
|
104 |
+
else:
|
105 |
+
mod_scale = None
|
106 |
+
if mod_scale is not None:
|
107 |
+
h_pad, w_pad = 0, 0
|
108 |
+
_, _, h, w = img.size()
|
109 |
+
if (h % mod_scale != 0):
|
110 |
+
h_pad = (mod_scale - h % mod_scale)
|
111 |
+
if (w % mod_scale != 0):
|
112 |
+
w_pad = (mod_scale - w % mod_scale)
|
113 |
+
img = F.pad(img, (0, w_pad, 0, h_pad), 'reflect')
|
114 |
+
|
115 |
+
try:
|
116 |
+
with torch.no_grad():
|
117 |
+
if self.tile_size > 0:
|
118 |
+
output = self.tile_process(img)
|
119 |
+
else:
|
120 |
+
output = self.srmodel(img)
|
121 |
+
del img
|
122 |
+
# remove extra pad
|
123 |
+
if mod_scale is not None:
|
124 |
+
_, _, h, w = output.size()
|
125 |
+
output = output[:, :, 0:h - h_pad, 0:w - w_pad]
|
126 |
+
output = output.data.squeeze().float().cpu().clamp_(0, 1).numpy()
|
127 |
+
output = np.transpose(output[[2, 1, 0], :, :], (1, 2, 0))
|
128 |
+
output = (output * 255.0).round().astype(np.uint8)
|
129 |
+
|
130 |
+
return output
|
131 |
+
except Exception as e:
|
132 |
+
print('sr failed:', e)
|
133 |
+
return None
|
sr_model/rrdbnet_arch.py
ADDED
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
from torch import nn as nn
|
3 |
+
from torch.nn import functional as F
|
4 |
+
|
5 |
+
from arch_util import default_init_weights, make_layer, pixel_unshuffle
|
6 |
+
|
7 |
+
|
8 |
+
class ResidualDenseBlock(nn.Module):
|
9 |
+
"""Residual Dense Block.
|
10 |
+
|
11 |
+
Used in RRDB block in ESRGAN.
|
12 |
+
|
13 |
+
Args:
|
14 |
+
num_feat (int): Channel number of intermediate features.
|
15 |
+
num_grow_ch (int): Channels for each growth.
|
16 |
+
"""
|
17 |
+
|
18 |
+
def __init__(self, num_feat=64, num_grow_ch=32):
|
19 |
+
super(ResidualDenseBlock, self).__init__()
|
20 |
+
self.conv1 = nn.Conv2d(num_feat, num_grow_ch, 3, 1, 1)
|
21 |
+
self.conv2 = nn.Conv2d(num_feat + num_grow_ch, num_grow_ch, 3, 1, 1)
|
22 |
+
self.conv3 = nn.Conv2d(num_feat + 2 * num_grow_ch, num_grow_ch, 3, 1, 1)
|
23 |
+
self.conv4 = nn.Conv2d(num_feat + 3 * num_grow_ch, num_grow_ch, 3, 1, 1)
|
24 |
+
self.conv5 = nn.Conv2d(num_feat + 4 * num_grow_ch, num_feat, 3, 1, 1)
|
25 |
+
|
26 |
+
self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
|
27 |
+
|
28 |
+
# initialization
|
29 |
+
default_init_weights([self.conv1, self.conv2, self.conv3, self.conv4, self.conv5], 0.1)
|
30 |
+
|
31 |
+
def forward(self, x):
|
32 |
+
x1 = self.lrelu(self.conv1(x))
|
33 |
+
x2 = self.lrelu(self.conv2(torch.cat((x, x1), 1)))
|
34 |
+
x3 = self.lrelu(self.conv3(torch.cat((x, x1, x2), 1)))
|
35 |
+
x4 = self.lrelu(self.conv4(torch.cat((x, x1, x2, x3), 1)))
|
36 |
+
x5 = self.conv5(torch.cat((x, x1, x2, x3, x4), 1))
|
37 |
+
# Emperically, we use 0.2 to scale the residual for better performance
|
38 |
+
return x5 * 0.2 + x
|
39 |
+
|
40 |
+
|
41 |
+
class RRDB(nn.Module):
|
42 |
+
"""Residual in Residual Dense Block.
|
43 |
+
|
44 |
+
Used in RRDB-Net in ESRGAN.
|
45 |
+
|
46 |
+
Args:
|
47 |
+
num_feat (int): Channel number of intermediate features.
|
48 |
+
num_grow_ch (int): Channels for each growth.
|
49 |
+
"""
|
50 |
+
|
51 |
+
def __init__(self, num_feat, num_grow_ch=32):
|
52 |
+
super(RRDB, self).__init__()
|
53 |
+
self.rdb1 = ResidualDenseBlock(num_feat, num_grow_ch)
|
54 |
+
self.rdb2 = ResidualDenseBlock(num_feat, num_grow_ch)
|
55 |
+
self.rdb3 = ResidualDenseBlock(num_feat, num_grow_ch)
|
56 |
+
|
57 |
+
def forward(self, x):
|
58 |
+
out = self.rdb1(x)
|
59 |
+
out = self.rdb2(out)
|
60 |
+
out = self.rdb3(out)
|
61 |
+
# Emperically, we use 0.2 to scale the residual for better performance
|
62 |
+
return out * 0.2 + x
|
63 |
+
|
64 |
+
class RRDBNet(nn.Module):
|
65 |
+
"""Networks consisting of Residual in Residual Dense Block, which is used
|
66 |
+
in ESRGAN.
|
67 |
+
|
68 |
+
ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks.
|
69 |
+
|
70 |
+
We extend ESRGAN for scale x2 and scale x1.
|
71 |
+
Note: This is one option for scale 1, scale 2 in RRDBNet.
|
72 |
+
We first employ the pixel-unshuffle (an inverse operation of pixelshuffle to reduce the spatial size
|
73 |
+
and enlarge the channel size before feeding inputs into the main ESRGAN architecture.
|
74 |
+
|
75 |
+
Args:
|
76 |
+
num_in_ch (int): Channel number of inputs.
|
77 |
+
num_out_ch (int): Channel number of outputs.
|
78 |
+
num_feat (int): Channel number of intermediate features.
|
79 |
+
Default: 64
|
80 |
+
num_block (int): Block number in the trunk network. Defaults: 23
|
81 |
+
num_grow_ch (int): Channels for each growth. Default: 32.
|
82 |
+
"""
|
83 |
+
|
84 |
+
def __init__(self, num_in_ch, num_out_ch, scale=4, num_feat=64, num_block=23, num_grow_ch=32):
|
85 |
+
super(RRDBNet, self).__init__()
|
86 |
+
self.scale = scale
|
87 |
+
if scale == 2:
|
88 |
+
num_in_ch = num_in_ch * 4
|
89 |
+
elif scale == 1:
|
90 |
+
num_in_ch = num_in_ch * 16
|
91 |
+
self.conv_first = nn.Conv2d(num_in_ch, num_feat, 3, 1, 1)
|
92 |
+
self.body = make_layer(RRDB, num_block, num_feat=num_feat, num_grow_ch=num_grow_ch)
|
93 |
+
self.conv_body = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
|
94 |
+
# upsample
|
95 |
+
self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
|
96 |
+
self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
|
97 |
+
self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1)
|
98 |
+
self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1)
|
99 |
+
|
100 |
+
self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True)
|
101 |
+
|
102 |
+
def forward(self, x):
|
103 |
+
if self.scale == 2:
|
104 |
+
feat = pixel_unshuffle(x, scale=2)
|
105 |
+
elif self.scale == 1:
|
106 |
+
feat = pixel_unshuffle(x, scale=4)
|
107 |
+
else:
|
108 |
+
feat = x
|
109 |
+
feat = self.conv_first(feat)
|
110 |
+
body_feat = self.conv_body(self.body(feat))
|
111 |
+
feat = feat + body_feat
|
112 |
+
# upsample
|
113 |
+
feat = self.lrelu(self.conv_up1(F.interpolate(feat, scale_factor=2, mode='nearest')))
|
114 |
+
feat = self.lrelu(self.conv_up2(F.interpolate(feat, scale_factor=2, mode='nearest')))
|
115 |
+
out = self.conv_last(self.lrelu(self.conv_hr(feat)))
|
116 |
+
return out
|
weights/README.md
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
## Pre-trained Model
|
2 |
+
|
3 |
+
Download RetinaFace model and our pre-trained model and put them here.
|
4 |
+
|
5 |
+
## Pre-trained Model
|
6 |
+
|
7 |
+
Download RetinaFace model and our pre-trained model and put them here.
|
8 |
+
|
9 |
+
[RetinaFace-R50](https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/RetinaFace-R50.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116085&Signature=GlUNW6%2B8FxvxWmE9jKIZYOOciKQ%3D) | [GPEN-512](https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/GPEN-BFR-512.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116208&Signature=hBgvVvKVSNGeXqT8glG%2Bd2t2OKc%3D) | [GPEN-1024-Color](https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/GPEN-Colorization-1024.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1961116315&Signature=9tPavW2h%2F1LhIKiXj73sTQoWqcc%3D) | [realesrnet_x2](https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/realesrnet_x2.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1962694780&Signature=lI%2FolhA%2FyigiTRvoDIVbtMIyhjI%3D) | [realesrnet_x4](https://public-vigen-video.oss-cn-shanghai.aliyuncs.com/robin/models/realesrnet_x4.pth?OSSAccessKeyId=LTAI4G6bfnyW4TA4wFUXTYBe&Expires=1962694847&Signature=MA5E%2FLp88oCz4kFINWdmeuSh7c4%3D)
|