├── models ├── __init__.py ├── utils.py ├── retinaface.py └── net.py ├── utils ├── __init__.py ├── nms │ ├── __init__.py │ └── py_cpu_nms.py ├── timer.py └── box_utils.py ├── weights └── put_your_download_weights_here ├── layers ├── __init__.py ├── modules │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ └── multibox_loss.cpython-37.pyc │ ├── multibox_loss备份.py │ └── multibox_loss.py └── functions │ ├── __pycache__ │ └── prior_box.cpython-37.pyc │ └── prior_box.py ├── test.jpg ├── curve ├── 1.jpg ├── FDDB.png ├── test.jpg └── Widerface.jpg ├── data ├── __init__.py ├── config.py ├── wider_face.py ├── data_augment.py └── FDDB │ └── img_list.txt ├── widerface_evaluate ├── setup.py ├── README.md ├── LICENSE ├── box_overlaps.pyx └── evaluation.py ├── LICENSE ├── convert_to_onnx.py ├── train.py ├── detect.py ├── README.md └── test_widerface.py /models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/nms/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /weights/put_your_download_weights_here: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /layers/__init__.py: -------------------------------------------------------------------------------- 1 | from .functions import * 2 | from .modules import * 3 | -------------------------------------------------------------------------------- /test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/test.jpg -------------------------------------------------------------------------------- /curve/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/curve/1.jpg -------------------------------------------------------------------------------- /curve/FDDB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/curve/FDDB.png -------------------------------------------------------------------------------- /curve/test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/curve/test.jpg -------------------------------------------------------------------------------- /curve/Widerface.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/curve/Widerface.jpg -------------------------------------------------------------------------------- /layers/modules/__init__.py: -------------------------------------------------------------------------------- 1 | from .multibox_loss import MultiBoxLoss 2 | 3 | __all__ = ['MultiBoxLoss'] 4 | -------------------------------------------------------------------------------- /data/__init__.py: -------------------------------------------------------------------------------- 1 | from .wider_face import WiderFaceDetection, detection_collate, make_dataloader 2 | from .data_augment import * 3 | from .config import * 4 | -------------------------------------------------------------------------------- /layers/modules/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/layers/modules/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /layers/functions/__pycache__/prior_box.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/layers/functions/__pycache__/prior_box.cpython-37.pyc -------------------------------------------------------------------------------- /layers/modules/__pycache__/multibox_loss.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuoQuanhao/RetinaFace-Paddle/HEAD/layers/modules/__pycache__/multibox_loss.cpython-37.pyc -------------------------------------------------------------------------------- /widerface_evaluate/setup.py: -------------------------------------------------------------------------------- 1 | """ 2 | WiderFace evaluation code 3 | author: wondervictor 4 | mail: tianhengcheng@gmail.com 5 | copyright@wondervictor 6 | """ 7 | 8 | from distutils.core import setup, Extension 9 | from Cython.Build import cythonize 10 | import numpy 11 | 12 | package = Extension('bbox', ['box_overlaps.pyx'], include_dirs=[numpy.get_include()]) 13 | setup(ext_modules=cythonize([package])) 14 | -------------------------------------------------------------------------------- /widerface_evaluate/README.md: -------------------------------------------------------------------------------- 1 | # WiderFace-Evaluation 2 | Python Evaluation Code for [Wider Face Dataset](http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/) 3 | 4 | 5 | ## Usage 6 | 7 | 8 | ##### before evaluating .... 9 | 10 | ```` 11 | python3 setup.py build_ext --inplace 12 | ```` 13 | 14 | ##### evaluating 15 | 16 | **GroungTruth:** `wider_face_val.mat`, `wider_easy_val.mat`, `wider_medium_val.mat`,`wider_hard_val.mat` 17 | 18 | ```` 19 | python3 evaluation.py -p -g 20 | ```` 21 | 22 | ## Bugs & Problems 23 | please issue 24 | 25 | ## Acknowledgements 26 | 27 | some code borrowed from Sergey Karayev 28 | -------------------------------------------------------------------------------- /data/config.py: -------------------------------------------------------------------------------- 1 | # config.py 2 | 3 | cfg_mnet = { 4 | 'name': 'mobilenet0.25', 5 | 'min_sizes': [[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': True, 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 | 'min_sizes': [[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': 12, 32 | 'ngpu': 1, 33 | 'epoch': 100, 34 | 'decay1': 70, 35 | 'decay2': 90, 36 | 'image_size': 840, 37 | 'pretrain': True, 38 | 'return_layers': {'layer2': 1, 'layer3': 2, 'layer4': 3}, 39 | 'in_channel': 256, 40 | 'out_channel': 256 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 QuanHao Guo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /widerface_evaluate/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Vic Chan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /utils/nms/py_cpu_nms.py: -------------------------------------------------------------------------------- 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 39 | -------------------------------------------------------------------------------- /utils/timer.py: -------------------------------------------------------------------------------- 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. 41 | -------------------------------------------------------------------------------- /layers/functions/prior_box.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | from itertools import product as product 3 | from math import ceil 4 | 5 | 6 | class PriorBox(object): 7 | def __init__(self, cfg, image_size=None, phase='train'): 8 | super(PriorBox, self).__init__() 9 | self.min_sizes = cfg['min_sizes'] 10 | self.steps = cfg['steps'] 11 | self.clip = cfg['clip'] 12 | self.image_size = image_size 13 | self.feature_maps = [[ceil(self.image_size[0]/step), ceil(self.image_size[1]/step)] for step in self.steps] 14 | self.name = "s" 15 | 16 | def forward(self): 17 | anchors = [] 18 | for k, f in enumerate(self.feature_maps): 19 | min_sizes = self.min_sizes[k] 20 | for i, j in product(range(f[0]), range(f[1])): 21 | for min_size in min_sizes: 22 | s_kx = min_size / self.image_size[1] 23 | s_ky = min_size / self.image_size[0] 24 | dense_cx = [x * self.steps[k] / self.image_size[1] for x in [j + 0.5]] 25 | dense_cy = [y * self.steps[k] / self.image_size[0] for y in [i + 0.5]] 26 | for cy, cx in product(dense_cy, dense_cx): 27 | anchors += [cx, cy, s_kx, s_ky] 28 | 29 | # back to torch land 30 | output = paddle.to_tensor(anchors).reshape([-1, 4]) 31 | if self.clip: 32 | output = output.clip(max=1, min=0) 33 | return output 34 | -------------------------------------------------------------------------------- /widerface_evaluate/box_overlaps.pyx: -------------------------------------------------------------------------------- 1 | # -------------------------------------------------------- 2 | # Fast R-CNN 3 | # Copyright (c) 2015 Microsoft 4 | # Licensed under The MIT License [see LICENSE for details] 5 | # Written by Sergey Karayev 6 | # -------------------------------------------------------- 7 | 8 | cimport cython 9 | import numpy as np 10 | cimport numpy as np 11 | 12 | DTYPE = np.float 13 | ctypedef np.float_t DTYPE_t 14 | 15 | def bbox_overlaps( 16 | np.ndarray[DTYPE_t, ndim=2] boxes, 17 | np.ndarray[DTYPE_t, ndim=2] query_boxes): 18 | """ 19 | Parameters 20 | ---------- 21 | boxes: (N, 4) ndarray of float 22 | query_boxes: (K, 4) ndarray of float 23 | Returns 24 | ------- 25 | overlaps: (N, K) ndarray of overlap between boxes and query_boxes 26 | """ 27 | cdef unsigned int N = boxes.shape[0] 28 | cdef unsigned int K = query_boxes.shape[0] 29 | cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) 30 | cdef DTYPE_t iw, ih, box_area 31 | cdef DTYPE_t ua 32 | cdef unsigned int k, n 33 | for k in range(K): 34 | box_area = ( 35 | (query_boxes[k, 2] - query_boxes[k, 0] + 1) * 36 | (query_boxes[k, 3] - query_boxes[k, 1] + 1) 37 | ) 38 | for n in range(N): 39 | iw = ( 40 | min(boxes[n, 2], query_boxes[k, 2]) - 41 | max(boxes[n, 0], query_boxes[k, 0]) + 1 42 | ) 43 | if iw > 0: 44 | ih = ( 45 | min(boxes[n, 3], query_boxes[k, 3]) - 46 | max(boxes[n, 1], query_boxes[k, 1]) + 1 47 | ) 48 | if ih > 0: 49 | ua = float( 50 | (boxes[n, 2] - boxes[n, 0] + 1) * 51 | (boxes[n, 3] - boxes[n, 1] + 1) + 52 | box_area - iw * ih 53 | ) 54 | overlaps[n, k] = iw * ih / ua 55 | return overlaps -------------------------------------------------------------------------------- /models/utils.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | 3 | from paddle import nn 4 | from typing import Dict 5 | 6 | 7 | class IntermediateLayerGetter(nn.LayerDict): 8 | """ 9 | Module wrapper that returns intermediate layers from a model 10 | It has a strong assumption that the modules have been registered 11 | into the model in the same order as they are used. 12 | This means that one should **not** reuse the same nn.Module 13 | twice in the forward if you want this to work. 14 | Additionally, it is only able to query submodules that are directly 15 | assigned to the model. So if `model` is passed, `model.feature1` can 16 | be returned, but not `model.feature1.layer2`. 17 | Args: 18 | model (nn.Layer): model on which we will extract the features 19 | return_layers (Dict[name, new_name]): a dict containing the names 20 | of the modules for which the activations will be returned as 21 | the key of the dict, and the value of the dict is the name 22 | of the returned activation (which the user can specify). 23 | Examples:: 24 | >>> m = torchvision.models.resnet18(pretrained=True) 25 | >>> # extract layer1 and layer3, giving as names `feat1` and feat2` 26 | >>> new_m = torchvision.models._utils.IntermediateLayerGetter(m, 27 | >>> {'layer1': 'feat1', 'layer3': 'feat2'}) 28 | >>> out = new_m(paddle.rand(1, 3, 224, 224)) 29 | >>> print([(k, v.shape) for k, v in out.items()]) 30 | >>> [('feat1', paddle.Size([1, 64, 56, 56])), 31 | >>> ('feat2', paddle.Size([1, 256, 14, 14]))] 32 | """ 33 | _version = 2 34 | __annotations__ = { 35 | "return_layers": Dict[str, str], 36 | } 37 | 38 | def __init__(self, model: nn.Layer, return_layers: Dict[str, str]) -> None: 39 | if not set(return_layers).issubset([name for name, _ in model.named_children()]): 40 | raise ValueError("return_layers are not present in model") 41 | orig_return_layers = return_layers 42 | return_layers = {str(k): str(v) for k, v in return_layers.items()} 43 | layers = OrderedDict() 44 | for name, module in model.named_children(): 45 | layers[name] = module 46 | if name in return_layers: 47 | del return_layers[name] 48 | if not return_layers: 49 | break 50 | 51 | super(IntermediateLayerGetter, self).__init__(layers) 52 | self.return_layers = orig_return_layers 53 | 54 | def forward(self, x): 55 | out = OrderedDict() 56 | for name, module in self.items(): 57 | x = module(x) 58 | if name in self.return_layers: 59 | out_name = self.return_layers[name] 60 | out[out_name] = x 61 | return out 62 | -------------------------------------------------------------------------------- /convert_to_onnx.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import argparse 3 | import paddle 4 | from data import cfg_mnet, cfg_re50 5 | from models.retinaface import RetinaFace 6 | from paddle.static import InputSpec 7 | 8 | 9 | parser = argparse.ArgumentParser(description='Test') 10 | parser.add_argument('-m', '--trained_model', default='./weights/mobilenet0.25_Final.pth', 11 | type=str, help='Trained state_dict file path to open') 12 | parser.add_argument('--network', default='mobile0.25', help='Backbone network mobile0.25 or resnet50') 13 | parser.add_argument('--long_side', default=640, help='when origin_size is false, long_side is scaled size(320 or 640 for long side)') 14 | parser.add_argument('--cpu', action="store_true", default=True, help='Use cpu inference') 15 | 16 | args = parser.parse_args() 17 | 18 | 19 | def check_keys(model, pretrained_state_dict): 20 | ckpt_keys = set(pretrained_state_dict.keys()) 21 | model_keys = set(model.state_dict().keys()) 22 | used_pretrained_keys = model_keys & ckpt_keys 23 | unused_pretrained_keys = ckpt_keys - model_keys 24 | missing_keys = model_keys - ckpt_keys 25 | print('Missing keys:{}'.format(len(missing_keys))) 26 | print('Unused checkpoint keys:{}'.format(len(unused_pretrained_keys))) 27 | print('Used keys:{}'.format(len(used_pretrained_keys))) 28 | assert len(used_pretrained_keys) > 0, 'load NONE from pretrained checkpoint' 29 | return True 30 | 31 | 32 | def remove_prefix(state_dict, prefix): 33 | ''' Old style model is stored with all names of parameters sharing common prefix 'module.' ''' 34 | print('remove prefix \'{}\''.format(prefix)) 35 | f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x 36 | return {f(key): value for key, value in state_dict.items()} 37 | 38 | 39 | def load_model(model, pretrained_path, load_to_cpu): 40 | print('Loading pretrained model from {}'.format(pretrained_path)) 41 | pretrained_dict = paddle.load(pretrained_path) 42 | if "state_dict" in pretrained_dict.keys(): 43 | pretrained_dict = remove_prefix(pretrained_dict['state_dict'], 'module.') 44 | else: 45 | pretrained_dict = remove_prefix(pretrained_dict, 'module.') 46 | check_keys(model, pretrained_dict) 47 | model.load_state_dict(pretrained_dict, strict=False) 48 | return model 49 | 50 | 51 | if __name__ == '__main__': 52 | paddle.set_grad_enabled(False) 53 | cfg = None 54 | if args.network == "mobile0.25": 55 | cfg = cfg_mnet 56 | elif args.network == "resnet50": 57 | cfg = cfg_re50 58 | # net and model 59 | net = RetinaFace(cfg=cfg, phase = 'test') 60 | net = load_model(net, args.trained_model, args.cpu) 61 | net.eval() 62 | print('Finished loading model!') 63 | print(net) 64 | 65 | # ------------------------ export ----------------------------- 66 | output_onnx = './onnx.save/FaceDetector.onnx' 67 | print("==> Exporting model to ONNX format at '{}'".format(output_onnx)) 68 | x_spec = InputSpec([None, 3, args.long_side, args.long_side], 'float32', 'x') 69 | paddle_out = paddle.onnx.export(net, output_onnx, input_spec=[x_spec]) 70 | 71 | 72 | -------------------------------------------------------------------------------- /models/retinaface.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import paddle.nn as nn 3 | from models.utils import IntermediateLayerGetter 4 | import paddle.nn.functional as F 5 | 6 | from models.net import MobileNetV1 as MobileNetV1 7 | from models.net import FPN as FPN 8 | from models.net import SSH as SSH 9 | 10 | 11 | 12 | class ClassHead(nn.Layer): 13 | def __init__(self,inchannels=512,num_anchors=3): 14 | super(ClassHead,self).__init__() 15 | self.num_anchors = num_anchors 16 | self.conv1x1 = nn.Conv2D(inchannels,self.num_anchors*2,kernel_size=(1,1),stride=1,padding=0) 17 | 18 | def forward(self,x): 19 | out = self.conv1x1(x) 20 | out = out.transpose([0,2,3,1]) 21 | 22 | return out.reshape([out.shape[0], -1, 2]) 23 | 24 | class BboxHead(nn.Layer): 25 | def __init__(self,inchannels=512,num_anchors=3): 26 | super(BboxHead,self).__init__() 27 | self.conv1x1 = nn.Conv2D(inchannels,num_anchors*4,kernel_size=(1,1),stride=1,padding=0) 28 | 29 | def forward(self,x): 30 | out = self.conv1x1(x) 31 | out = out.transpose([0,2,3,1]) 32 | 33 | return out.reshape([out.shape[0], -1, 4]) 34 | 35 | class LandmarkHead(nn.Layer): 36 | def __init__(self,inchannels=512,num_anchors=3): 37 | super(LandmarkHead,self).__init__() 38 | self.conv1x1 = nn.Conv2D(inchannels,num_anchors*10,kernel_size=(1,1),stride=1,padding=0) 39 | 40 | def forward(self,x): 41 | out = self.conv1x1(x) 42 | out = out.transpose([0,2,3,1]) 43 | 44 | return out.reshape([out.shape[0], -1, 10]) 45 | 46 | class RetinaFace(nn.Layer): 47 | def __init__(self, cfg = None, phase = 'train'): 48 | """ 49 | :param cfg: Network related settings. 50 | :param phase: train or test. 51 | """ 52 | super(RetinaFace,self).__init__() 53 | self.phase = phase 54 | backbone = None 55 | if cfg['name'] == 'mobilenet0.25': 56 | backbone = MobileNetV1() 57 | if cfg['pretrain']: 58 | checkpoint = paddle.load("./weights/mobilenetV1X0.25_pretrain.pdparams") 59 | backbone.set_state_dict(checkpoint) 60 | elif cfg['name'] == 'Resnet50': 61 | import paddle.vision.models as models 62 | backbone = models.resnet50(pretrained=cfg['pretrain']) 63 | 64 | self.body = IntermediateLayerGetter(backbone, cfg['return_layers']) 65 | in_channels_stage2 = cfg['in_channel'] 66 | in_channels_list = [ 67 | in_channels_stage2 * 2, 68 | in_channels_stage2 * 4, 69 | in_channels_stage2 * 8, 70 | ] 71 | out_channels = cfg['out_channel'] 72 | self.fpn = FPN(in_channels_list,out_channels) 73 | self.ssh1 = SSH(out_channels, out_channels) 74 | self.ssh2 = SSH(out_channels, out_channels) 75 | self.ssh3 = SSH(out_channels, out_channels) 76 | 77 | self.ClassHead = self._make_class_head(fpn_num=5, inchannels=cfg['out_channel']) 78 | self.BboxHead = self._make_bbox_head(fpn_num=5, inchannels=cfg['out_channel']) 79 | self.LandmarkHead = self._make_landmark_head(fpn_num=5, inchannels=cfg['out_channel']) 80 | 81 | def _make_class_head(self,fpn_num=5,inchannels=64,anchor_num=2): 82 | classhead = nn.LayerList() 83 | for i in range(fpn_num): 84 | classhead.append(ClassHead(inchannels,anchor_num)) 85 | return classhead 86 | 87 | def _make_bbox_head(self,fpn_num=5,inchannels=64,anchor_num=2): 88 | bboxhead = nn.LayerList() 89 | for i in range(fpn_num): 90 | bboxhead.append(BboxHead(inchannels,anchor_num)) 91 | return bboxhead 92 | 93 | def _make_landmark_head(self,fpn_num=5,inchannels=64,anchor_num=2): 94 | landmarkhead = nn.LayerList() 95 | for i in range(fpn_num): 96 | landmarkhead.append(LandmarkHead(inchannels,anchor_num)) 97 | return landmarkhead 98 | 99 | def forward(self,inputs): 100 | out = self.body(inputs) 101 | 102 | # FPN 103 | fpn = self.fpn(out) 104 | 105 | # SSH 106 | feature1 = self.ssh1(fpn[0]) 107 | feature2 = self.ssh2(fpn[1]) 108 | feature3 = self.ssh3(fpn[2]) 109 | features = [feature1, feature2, feature3] 110 | 111 | bbox_regressions = paddle.concat([self.BboxHead[i](feature) for i, feature in enumerate(features)], axis=1) 112 | classifications = paddle.concat([self.ClassHead[i](feature) for i, feature in enumerate(features)],axis=1) 113 | ldm_regressions = paddle.concat([self.LandmarkHead[i](feature) for i, feature in enumerate(features)], axis=1) 114 | 115 | if self.phase == 'train': 116 | output = (bbox_regressions, classifications, ldm_regressions) 117 | else: 118 | output = (bbox_regressions, F.softmax(classifications, axis=-1), ldm_regressions) 119 | return output 120 | -------------------------------------------------------------------------------- /models/net.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import paddle.nn as nn 3 | import paddle.nn.functional as F 4 | 5 | def conv_bn(inp, oup, stride = 1, leaky = 0): 6 | return nn.Sequential( 7 | nn.Conv2D(inp, oup, 3, stride, 1, bias_attr=False), 8 | nn.BatchNorm2D(oup), 9 | nn.LeakyReLU(negative_slope=leaky) 10 | ) 11 | 12 | def conv_bn_no_relu(inp, oup, stride): 13 | return nn.Sequential( 14 | nn.Conv2D(inp, oup, 3, stride, 1, bias_attr=False), 15 | nn.BatchNorm2D(oup), 16 | ) 17 | 18 | def conv_bn1X1(inp, oup, stride, leaky=0): 19 | return nn.Sequential( 20 | nn.Conv2D(inp, oup, 1, stride, padding=0, bias_attr=False), 21 | nn.BatchNorm2D(oup), 22 | nn.LeakyReLU(negative_slope=leaky) 23 | ) 24 | 25 | def conv_dw(inp, oup, stride, leaky=0.1): 26 | return nn.Sequential( 27 | nn.Conv2D(inp, inp, 3, stride, 1, groups=inp, bias_attr=False), 28 | nn.BatchNorm2D(inp), 29 | nn.LeakyReLU(negative_slope=leaky), 30 | 31 | nn.Conv2D(inp, oup, 1, 1, 0, bias_attr=False), 32 | nn.BatchNorm2D(oup), 33 | nn.LeakyReLU(negative_slope=leaky), 34 | ) 35 | 36 | class SSH(nn.Layer): 37 | def __init__(self, in_channel, out_channel): 38 | super(SSH, self).__init__() 39 | assert out_channel % 4 == 0 40 | leaky = 0 41 | if (out_channel <= 64): 42 | leaky = 0.1 43 | self.conv3X3 = conv_bn_no_relu(in_channel, out_channel//2, stride=1) 44 | 45 | self.conv5X5_1 = conv_bn(in_channel, out_channel//4, stride=1, leaky = leaky) 46 | self.conv5X5_2 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1) 47 | 48 | self.conv7X7_2 = conv_bn(out_channel//4, out_channel//4, stride=1, leaky = leaky) 49 | self.conv7x7_3 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1) 50 | 51 | def forward(self, input): 52 | conv3X3 = self.conv3X3(input) 53 | 54 | conv5X5_1 = self.conv5X5_1(input) 55 | conv5X5 = self.conv5X5_2(conv5X5_1) 56 | 57 | conv7X7_2 = self.conv7X7_2(conv5X5_1) 58 | conv7X7 = self.conv7x7_3(conv7X7_2) 59 | 60 | out = paddle.concat([conv3X3, conv5X5, conv7X7], axis=1) 61 | out = F.relu(out) 62 | return out 63 | 64 | class FPN(nn.Layer): 65 | def __init__(self,in_channels_list,out_channels): 66 | super(FPN,self).__init__() 67 | leaky = 0 68 | if (out_channels <= 64): 69 | leaky = 0.1 70 | self.output1 = conv_bn1X1(in_channels_list[0], out_channels, stride = 1, leaky = leaky) 71 | self.output2 = conv_bn1X1(in_channels_list[1], out_channels, stride = 1, leaky = leaky) 72 | self.output3 = conv_bn1X1(in_channels_list[2], out_channels, stride = 1, leaky = leaky) 73 | 74 | self.merge1 = conv_bn(out_channels, out_channels, leaky = leaky) 75 | self.merge2 = conv_bn(out_channels, out_channels, leaky = leaky) 76 | 77 | def forward(self, input): 78 | # names = list(input.keys()) 79 | input = list(input.values()) 80 | 81 | output1 = self.output1(input[0]) 82 | output2 = self.output2(input[1]) 83 | output3 = self.output3(input[2]) 84 | 85 | up3 = F.interpolate(output3, size=[output2.shape[2], output2.shape[3]], mode="nearest") 86 | output2 = output2 + up3 87 | output2 = self.merge2(output2) 88 | 89 | up2 = F.interpolate(output2, size=[output1.shape[2], output1.shape[3]], mode="nearest") 90 | output1 = output1 + up2 91 | output1 = self.merge1(output1) 92 | 93 | out = [output1, output2, output3] 94 | return out 95 | 96 | 97 | 98 | class MobileNetV1(nn.Layer): 99 | def __init__(self): 100 | super(MobileNetV1, self).__init__() 101 | self.stage1 = nn.Sequential( 102 | conv_bn(3, 8, 2, leaky = 0.1), # 3 103 | conv_dw(8, 16, 1), # 7 104 | conv_dw(16, 32, 2), # 11 105 | conv_dw(32, 32, 1), # 19 106 | conv_dw(32, 64, 2), # 27 107 | conv_dw(64, 64, 1), # 43 108 | ) 109 | self.stage2 = nn.Sequential( 110 | conv_dw(64, 128, 2), # 43 + 16 = 59 111 | conv_dw(128, 128, 1), # 59 + 32 = 91 112 | conv_dw(128, 128, 1), # 91 + 32 = 123 113 | conv_dw(128, 128, 1), # 123 + 32 = 155 114 | conv_dw(128, 128, 1), # 155 + 32 = 187 115 | conv_dw(128, 128, 1), # 187 + 32 = 219 116 | ) 117 | self.stage3 = nn.Sequential( 118 | conv_dw(128, 256, 2), # 219 +3 2 = 241 119 | conv_dw(256, 256, 1), # 241 + 64 = 301 120 | ) 121 | self.avg = nn.AdaptiveAvgPool2D((1,1)) 122 | self.fc = nn.Linear(256, 1000) 123 | 124 | def forward(self, x): 125 | x = self.stage1(x) 126 | x = self.stage2(x) 127 | x = self.stage3(x) 128 | x = self.avg(x) 129 | # x = self.model(x) 130 | x = x.view(-1, 256) 131 | x = self.fc(x) 132 | return x 133 | 134 | -------------------------------------------------------------------------------- /layers/modules/multibox_loss备份.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import paddle.nn as nn 3 | import paddle.nn.functional as F 4 | from utils.box_utils import match, log_sum_exp 5 | from data import cfg_mnet 6 | GPU = cfg_mnet['gpu_train'] 7 | 8 | class MultiBoxLoss(nn.Layer): 9 | """SSD Weighted Loss Function 10 | Compute Targets: 11 | 1) Produce Confidence Target Indices by matching ground truth boxes 12 | with (default) 'priorboxes' that have jaccard index > threshold parameter 13 | (default threshold: 0.5). 14 | 2) Produce localization target by 'encoding' variance into offsets of ground 15 | truth boxes and their matched 'priorboxes'. 16 | 3) Hard negative mining to filter the excessive number of negative examples 17 | that comes with using a large number of default bounding boxes. 18 | (default negative:positive ratio 3:1) 19 | Objective Loss: 20 | L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N 21 | Where, Lconf is the CrossEntropy Loss and Lloc is the SmoothL1 Loss 22 | weighted by α which is set to 1 by cross val. 23 | Args: 24 | c: class confidences, 25 | l: predicted boxes, 26 | g: ground truth boxes 27 | N: number of matched default boxes 28 | See: https://arxiv.org/pdf/1512.02325.pdf for more details. 29 | """ 30 | 31 | def __init__(self, num_classes, overlap_thresh, prior_for_matching, bkg_label, neg_mining, neg_pos, neg_overlap, encode_target): 32 | super(MultiBoxLoss, self).__init__() 33 | self.num_classes = num_classes 34 | self.threshold = overlap_thresh 35 | self.background_label = bkg_label 36 | self.encode_target = encode_target 37 | self.use_prior_for_matching = prior_for_matching 38 | self.do_neg_mining = neg_mining 39 | self.negpos_ratio = neg_pos 40 | self.neg_overlap = neg_overlap 41 | self.variance = [0.1, 0.2] 42 | 43 | def forward(self, predictions, priors, targets): 44 | """Multibox Loss 45 | Args: 46 | predictions (tuple): A tuple containing loc preds, conf preds, 47 | and prior boxes from SSD net. 48 | conf shape: paddle.shape(batch_size,num_priors,num_classes) 49 | loc shape: paddle.shape(batch_size,num_priors,4) 50 | priors shape: paddle.shape(num_priors,4) 51 | 52 | ground_truth (tensor): Ground truth boxes and labels for a batch, 53 | shape: [batch_size,num_objs,5] (last idx is the label). 54 | """ 55 | 56 | loc_data, conf_data, landm_data = predictions 57 | priors = priors 58 | num = loc_data.shape[0] 59 | num_priors = (priors.shape[0]) 60 | 61 | # match priors (default boxes) and ground truth boxes 62 | loc_t = paddle.randn([num, num_priors, 4]) 63 | landm_t = paddle.randn([num, num_priors, 10]) 64 | conf_t = paddle.zeros([num, num_priors], dtype='int64') 65 | for idx in range(num): 66 | truths = targets[idx][:, :4] 67 | labels = targets[idx][:, -1] 68 | landms = targets[idx][:, 4:14] 69 | defaults = priors 70 | match(self.threshold, truths, defaults, self.variance, labels, landms, loc_t, conf_t, landm_t, idx) 71 | 72 | # landm Loss (Smooth L1) 73 | # Shape: [batch,num_priors,10] 74 | pos1 = conf_t > 0 75 | num_pos_landm = pos1.astype('int64').sum(1, keepdim=True) 76 | N1 = max(num_pos_landm.sum().astype('float32'), 1) 77 | pos_idx1 = pos1.unsqueeze(pos1.dim()).expand_as(landm_data) 78 | landm_p = landm_data.masked_select(pos_idx1).reshape([-1, 10]) 79 | landm_t = landm_t.masked_select(pos_idx1).reshape([-1, 10]) 80 | loss_landm = F.smooth_l1_loss(landm_p, landm_t, reduction='sum') 81 | 82 | 83 | pos = conf_t != 0 84 | 85 | conf_t_temp = conf_t.numpy() 86 | conf_t_temp[pos.numpy()] = 1 87 | conf_t = paddle.to_tensor(conf_t_temp) 88 | # conf_t[pos] = 1 89 | # conf_t = conf_t.add(pos.astype('int64')) 90 | 91 | # Localization Loss (Smooth L1) 92 | # Shape: [batch,num_priors,4] 93 | pos_idx = pos.unsqueeze(pos.dim()).expand_as(loc_data) 94 | loc_p = loc_data.masked_select(pos_idx).reshape([-1, 4]) 95 | loc_t = loc_t.masked_select(pos_idx).reshape([-1, 4]) 96 | loss_l = F.smooth_l1_loss(loc_p, loc_t, reduction='sum') 97 | 98 | # Compute max conf across batch for hard negative mining 99 | batch_conf = conf_data.reshape([-1, self.num_classes]) 100 | loss_c = log_sum_exp(batch_conf) - batch_conf.multiply(paddle.nn.functional.one_hot(conf_t.reshape([-1, 1]), 2).squeeze(1)).sum(1).unsqueeze(1) 101 | 102 | # Hard Negative Mining 103 | # loss_c[pos.reshape([-1, 1])] = 0 # filter out pos boxes for now 104 | loss_c = loss_c * (pos.reshape([-1, 1])==0).astype('float32') 105 | loss_c = loss_c.reshape([num, -1]) 106 | loss_idx = loss_c.argsort(1, descending=True) 107 | idx_rank = loss_idx.argsort(1) 108 | num_pos = pos.astype('int64').sum(1, keepdim=True) 109 | num_neg = paddle.clip(self.negpos_ratio*num_pos, max=pos.shape[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.masked_select((pos_idx.logical_or(neg_idx)).astype('float32') > 0).reshape([-1,self.num_classes]) 116 | targets_weighted = conf_t.masked_select((pos.logical_or(neg)).astype('float32') > 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.sum().astype('float32'), 1) 121 | loss_l /= N 122 | loss_c /= N 123 | loss_landm /= N1 124 | 125 | return loss_l, loss_c, loss_landm 126 | -------------------------------------------------------------------------------- /layers/modules/multibox_loss.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import paddle.nn as nn 3 | import paddle.nn.functional as F 4 | from utils.box_utils import match, log_sum_exp 5 | from data import cfg_mnet 6 | GPU = cfg_mnet['gpu_train'] 7 | 8 | class MultiBoxLoss(nn.Layer): 9 | """SSD Weighted Loss Function 10 | Compute Targets: 11 | 1) Produce Confidence Target Indices by matching ground truth boxes 12 | with (default) 'priorboxes' that have jaccard index > threshold parameter 13 | (default threshold: 0.5). 14 | 2) Produce localization target by 'encoding' variance into offsets of ground 15 | truth boxes and their matched 'priorboxes'. 16 | 3) Hard negative mining to filter the excessive number of negative examples 17 | that comes with using a large number of default bounding boxes. 18 | (default negative:positive ratio 3:1) 19 | Objective Loss: 20 | L(x,c,l,g) = (Lconf(x, c) + αLloc(x,l,g)) / N 21 | Where, Lconf is the CrossEntropy Loss and Lloc is the SmoothL1 Loss 22 | weighted by α which is set to 1 by cross val. 23 | Args: 24 | c: class confidences, 25 | l: predicted boxes, 26 | g: ground truth boxes 27 | N: number of matched default boxes 28 | See: https://arxiv.org/pdf/1512.02325.pdf for more details. 29 | """ 30 | 31 | def __init__(self, num_classes, overlap_thresh, prior_for_matching, bkg_label, neg_mining, neg_pos, neg_overlap, encode_target): 32 | super(MultiBoxLoss, self).__init__() 33 | self.num_classes = num_classes 34 | self.threshold = overlap_thresh 35 | self.background_label = bkg_label 36 | self.encode_target = encode_target 37 | self.use_prior_for_matching = prior_for_matching 38 | self.do_neg_mining = neg_mining 39 | self.negpos_ratio = neg_pos 40 | self.neg_overlap = neg_overlap 41 | self.variance = [0.1, 0.2] 42 | 43 | def forward(self, predictions, priors, targets): 44 | """Multibox Loss 45 | Args: 46 | predictions (tuple): A tuple containing loc preds, conf preds, 47 | and prior boxes from SSD net. 48 | conf shape: paddle.shape(batch_size,num_priors,num_classes) 49 | loc shape: paddle.shape(batch_size,num_priors,4) 50 | priors shape: paddle.shape(num_priors,4) 51 | 52 | ground_truth (tensor): Ground truth boxes and labels for a batch, 53 | shape: [batch_size,num_objs,5] (last idx is the label). 54 | """ 55 | 56 | loc_data, conf_data, landm_data = predictions 57 | priors = priors 58 | num = loc_data.shape[0] 59 | num_priors = (priors.shape[0]) 60 | 61 | # match priors (default boxes) and ground truth boxes 62 | loc_t = paddle.randn([num, num_priors, 4]) 63 | landm_t = paddle.randn([num, num_priors, 10]) 64 | conf_t = paddle.zeros([num, num_priors], dtype='int32') 65 | for idx in range(num): 66 | truths = targets[idx][:, :4] 67 | labels = targets[idx][:, -1] 68 | landms = targets[idx][:, 4:14] 69 | defaults = priors 70 | match(self.threshold, truths, defaults, self.variance, labels, landms, loc_t, conf_t, landm_t, idx) 71 | 72 | # landm Loss (Smooth L1) 73 | # Shape: [batch,num_priors,10] 74 | pos1 = conf_t > 0 75 | num_pos_landm = pos1.astype('int64').sum(1, keepdim=True) 76 | N1 = max(num_pos_landm.sum().astype('float32'), 1) 77 | pos_idx1 = pos1.unsqueeze(pos1.dim()).expand_as(landm_data) 78 | landm_p = landm_data.masked_select(pos_idx1).reshape([-1, 10]) 79 | landm_t = landm_t.masked_select(pos_idx1).reshape([-1, 10]) 80 | loss_landm = F.smooth_l1_loss(landm_p, landm_t, reduction='sum') 81 | 82 | 83 | pos = conf_t != 0 84 | 85 | conf_t_temp = conf_t.numpy() 86 | conf_t_temp[pos.numpy()] = 1 87 | conf_t = paddle.to_tensor(conf_t_temp) 88 | # conf_t[pos] = 1 89 | # conf_t = conf_t.add(pos.astype('int64')) 90 | 91 | # Localization Loss (Smooth L1) 92 | # Shape: [batch,num_priors,4] 93 | pos_idx = pos.unsqueeze(pos.dim()).expand_as(loc_data) 94 | loc_p = loc_data.masked_select(pos_idx).reshape([-1, 4]) 95 | loc_t = loc_t.masked_select(pos_idx).reshape([-1, 4]) 96 | loss_l = F.smooth_l1_loss(loc_p, loc_t, reduction='sum') 97 | 98 | # Compute max conf across batch for hard negative mining 99 | batch_conf = conf_data.reshape([-1, self.num_classes]) 100 | loss_c = log_sum_exp(batch_conf) - batch_conf.multiply(paddle.nn.functional.one_hot(conf_t.reshape([-1, 1]), 2).squeeze(1)).sum(1).unsqueeze(1) 101 | 102 | # Hard Negative Mining 103 | # loss_c[pos.reshape([-1, 1])] = 0 # filter out pos boxes for now 104 | loss_c = loss_c * (pos.reshape([-1, 1])==0).astype('float32') 105 | loss_c = loss_c.reshape([num, -1]) 106 | loss_idx = loss_c.argsort(1, descending=True) 107 | idx_rank = loss_idx.argsort(1) 108 | num_pos = pos.astype('int64').sum(1, keepdim=True) 109 | num_neg = paddle.clip(self.negpos_ratio*num_pos, max=pos.shape[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.masked_select((pos_idx.logical_or(neg_idx)).astype('float32') > 0).reshape([-1,self.num_classes]) 116 | targets_weighted = conf_t.masked_select((pos.logical_or(neg)).astype('float32') > 0) 117 | loss_c = F.cross_entropy(conf_p, targets_weighted.astype('int64'), 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.sum().astype('float32'), 1) 121 | loss_l /= N 122 | loss_c /= N 123 | loss_landm /= N1 124 | 125 | return loss_l, loss_c, loss_landm 126 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import os 3 | import paddle 4 | import paddle.optimizer as optim 5 | import argparse 6 | from data import WiderFaceDetection, detection_collate, preproc, cfg_mnet, cfg_re50, make_dataloader 7 | from layers.modules import MultiBoxLoss 8 | from layers.functions.prior_box import PriorBox 9 | import time 10 | import datetime 11 | import math 12 | from models.retinaface import RetinaFace 13 | 14 | parser = argparse.ArgumentParser(description='Retinaface Training') 15 | parser.add_argument('--training_dataset', default='/home/aistudio/Data/widerface/train/label.txt', help='Training dataset directory') 16 | parser.add_argument('--network', default='mobile0.25', help='Backbone network mobile0.25 or resnet50') 17 | parser.add_argument('--num_workers', default=0, type=int, help='Number of workers used in dataloading') 18 | parser.add_argument('--lr', '--learning-rate', default=1e-3, type=float, help='initial learning rate') 19 | parser.add_argument('--momentum', default=0.9, type=float, help='momentum') 20 | parser.add_argument('--resume_net', default=None, help='resume net for retraining') 21 | parser.add_argument('--resume_epoch', default=0, type=int, help='resume iter for retraining') 22 | parser.add_argument('--weight_decay', default=5e-4, type=float, help='Weight decay for SGD') 23 | parser.add_argument('--gamma', default=0.1, type=float, help='Gamma update for SGD') 24 | parser.add_argument('--save_folder', default='./test/', help='Location to save checkpoint models') 25 | 26 | args = parser.parse_args() 27 | 28 | if not os.path.exists(args.save_folder): 29 | os.mkdir(args.save_folder) 30 | cfg = None 31 | if args.network == "mobile0.25": 32 | cfg = cfg_mnet 33 | elif args.network == "resnet50": 34 | cfg = cfg_re50 35 | 36 | rgb_mean = (104, 117, 123) # bgr order 37 | rgb_std = (57.1,57.4,58.4) 38 | num_classes = 2 39 | img_dim = cfg['image_size'] 40 | num_gpu = cfg['ngpu'] 41 | batch_size = cfg['batch_size'] 42 | max_epoch = cfg['epoch'] 43 | gpu_train = cfg['gpu_train'] 44 | 45 | num_workers = args.num_workers 46 | momentum = args.momentum 47 | weight_decay = args.weight_decay 48 | initial_lr = args.lr 49 | gamma = args.gamma 50 | training_dataset = args.training_dataset 51 | save_folder = args.save_folder 52 | 53 | net = RetinaFace(cfg=cfg) 54 | print("Printing net...") 55 | print(net) 56 | 57 | if args.resume_net is not None: 58 | print('Loading resume network...') 59 | state_dict = paddle.load(args.resume_net) 60 | # create new OrderedDict that does not contain `module.` 61 | from collections import OrderedDict 62 | new_state_dict = OrderedDict() 63 | for k, v in state_dict.items(): 64 | head = k[:7] 65 | if head == 'module.': 66 | name = k[7:] # remove `module.` 67 | else: 68 | name = k 69 | new_state_dict[name] = v 70 | net.set_state_dict(new_state_dict) 71 | 72 | if num_gpu > 1 and gpu_train: 73 | net = paddle.DataParallel(net) 74 | 75 | optimizer = optim.Momentum(parameters=net.parameters(), learning_rate=initial_lr, momentum=momentum, weight_decay=weight_decay) 76 | criterion = MultiBoxLoss(num_classes, 0.35, True, 0, True, 7, 0.35, False) 77 | 78 | priorbox = PriorBox(cfg, image_size=(img_dim, img_dim)) 79 | with paddle.no_grad(): 80 | priors = priorbox.forward() 81 | 82 | def train(): 83 | net.train() 84 | epoch = 0 + args.resume_epoch 85 | print('Loading Dataset...') 86 | 87 | dataset = WiderFaceDetection(training_dataset, preproc(img_dim, rgb_mean, rgb_std)) 88 | 89 | epoch_size = math.ceil(len(dataset) / batch_size) 90 | 91 | stepvalues = (cfg['decay1'] * epoch_size, cfg['decay2'] * epoch_size) 92 | step_index = 0 93 | 94 | if args.resume_epoch > 0: 95 | start_iter = args.resume_epoch * epoch_size 96 | else: 97 | start_iter = 0 98 | max_iter = max_epoch * epoch_size - start_iter 99 | batch_iterator = make_dataloader(dataset, shuffle=True, batchsize=batch_size, distributed=False, num_workers=0, num_iters=max_iter, start_iter=0, collate_fn=detection_collate) 100 | iteration = start_iter 101 | for images, labels in batch_iterator: 102 | if iteration % epoch_size == 0: 103 | if (epoch % 5 == 0 and epoch > 0) or (epoch % 5 == 0 and epoch > cfg['decay1']): 104 | paddle.save(net.state_dict(), save_folder + cfg['name']+ '_epoch_' + str(epoch) + '.pdparams') 105 | epoch += 1 106 | 107 | load_t0 = time.time() 108 | if iteration in stepvalues: 109 | step_index += 1 110 | lr = adjust_learning_rate(optimizer, gamma, epoch, step_index, iteration, epoch_size) 111 | 112 | # forward 113 | out = net(images) 114 | # backprop 115 | loss_l, loss_c, loss_landm = criterion(out, priors, [anno for anno in labels]) 116 | loss = cfg['loc_weight'] * loss_l + loss_c + loss_landm 117 | loss.backward() 118 | optimizer.step() 119 | optimizer.clear_gradients() 120 | load_t1 = time.time() 121 | batch_time = load_t1 - load_t0 122 | eta = int(batch_time * (max_iter - iteration)) 123 | print('Epoch:{}/{} || Epochiter: {}/{} || Iter: {}/{} || Loc: {:.4f} Cla: {:.4f} Landm: {:.4f} || LR: {:.8f} || Batchtime: {:.4f} s || ETA: {}' 124 | .format(epoch, max_epoch, (iteration % epoch_size) + 1, 125 | epoch_size, iteration + 1, max_iter, loss_l.item(), loss_c.item(), loss_landm.item(), lr, batch_time, str(datetime.timedelta(seconds=eta)))) 126 | iteration += 1 127 | 128 | paddle.save(net.state_dict(), save_folder + cfg['name'] + '_Final.pdparams') 129 | 130 | def adjust_learning_rate(optimizer, gamma, epoch, step_index, iteration, epoch_size): 131 | """Sets the learning rate 132 | # Adapted from PyTorch Imagenet example: 133 | """ 134 | warmup_epoch = -1 135 | if epoch <= warmup_epoch: 136 | lr = 1e-6 + (initial_lr-1e-6) * iteration / (epoch_size * warmup_epoch) 137 | else: 138 | lr = initial_lr * (gamma ** (step_index)) 139 | optimizer.set_lr(lr) 140 | return lr 141 | 142 | if __name__ == '__main__': 143 | train() 144 | -------------------------------------------------------------------------------- /data/wider_face.py: -------------------------------------------------------------------------------- 1 | from paddle.io import Dataset 2 | import cv2 3 | import numpy as np 4 | from paddle.io import BatchSampler, DistributedBatchSampler, RandomSampler, SequenceSampler, DataLoader 5 | 6 | class WiderFaceDetection(Dataset): 7 | def __init__(self, txt_path, preproc=None): 8 | self.preproc = preproc 9 | self.imgs_path = [] 10 | self.words = [] 11 | f = open(txt_path,'r') 12 | lines = f.readlines() 13 | isFirst = True 14 | labels = [] 15 | for line in lines: 16 | line = line.rstrip() 17 | if line.startswith('#'): 18 | if isFirst is True: 19 | isFirst = False 20 | else: 21 | labels_copy = labels.copy() 22 | self.words.append(labels_copy) 23 | labels.clear() 24 | path = line[2:] 25 | path = txt_path.replace('label.txt','images/') + path 26 | self.imgs_path.append(path) 27 | else: 28 | line = line.split(' ') 29 | label = [float(x) for x in line] 30 | labels.append(label) 31 | 32 | self.words.append(labels) 33 | 34 | def __len__(self): 35 | return len(self.imgs_path) 36 | 37 | def __getitem__(self, index): 38 | img = cv2.imread(self.imgs_path[index]) 39 | height, width, _ = img.shape 40 | 41 | labels = self.words[index] 42 | annotations = np.zeros((0, 15)) 43 | if len(labels) == 0: 44 | return annotations 45 | for idx, label in enumerate(labels): 46 | annotation = np.zeros((1, 15)) 47 | # bbox 48 | annotation[0, 0] = label[0] # x1 49 | annotation[0, 1] = label[1] # y1 50 | annotation[0, 2] = label[0] + label[2] # x2 51 | annotation[0, 3] = label[1] + label[3] # y2 52 | 53 | # landmarks 54 | annotation[0, 4] = label[4] # l0_x 55 | annotation[0, 5] = label[5] # l0_y 56 | annotation[0, 6] = label[7] # l1_x 57 | annotation[0, 7] = label[8] # l1_y 58 | annotation[0, 8] = label[10] # l2_x 59 | annotation[0, 9] = label[11] # l2_y 60 | annotation[0, 10] = label[13] # l3_x 61 | annotation[0, 11] = label[14] # l3_y 62 | annotation[0, 12] = label[16] # l4_x 63 | annotation[0, 13] = label[17] # l4_y 64 | if (annotation[0, 4]<0): 65 | annotation[0, 14] = -1 66 | else: 67 | annotation[0, 14] = 1 68 | 69 | annotations = np.append(annotations, annotation, axis=0) 70 | target = np.array(annotations) 71 | if self.preproc is not None: 72 | img, target = self.preproc(img, target) 73 | 74 | return img, target 75 | 76 | def detection_collate(batch): 77 | """Custom collate fn for dealing with batches of images that have a different 78 | number of associated object annotations (bounding boxes). 79 | 80 | Arguments: 81 | batch: (tuple) A tuple of tensor images and lists of annotations 82 | 83 | Return: 84 | A tuple containing: 85 | 1) (tensor) batch of images stacked on their 0 dim 86 | 2) (list of tensors) annotations for a given image are stacked on 0 dim 87 | """ 88 | targets = [] 89 | imgs = [] 90 | for sample in batch: 91 | imgs.append(sample[0].astype('float32')) 92 | targets.append(sample[1].astype('float32')) 93 | return (np.stack(imgs, 0), targets) 94 | ''' 95 | targets = [] 96 | imgs = [] 97 | for _, sample in enumerate(batch): 98 | for _, tup in enumerate(sample): 99 | if len(tup.shape) == 3: 100 | imgs.append(tup.astype('float32')) 101 | elif len(tup.shape) == 2: 102 | annos = tup.astype('float32') 103 | targets.append(annos) 104 | ''' 105 | return (np.stack(imgs, 0), targets) 106 | 107 | 108 | def make_dataloader(dataset, shuffle=True, batchsize=12, distributed=False, num_workers=0, num_iters=None, start_iter=0, collate_fn=None): 109 | if distributed: 110 | data_sampler=DistributedBatchSampler(dataset, batch_size=batchsize, shuffle=True, drop_last=True) 111 | dataloader = DataLoader(dataset, batch_sampler=data_sampler, num_workers=num_workers, collate_fn=collate_fn) 112 | 113 | if not distributed and shuffle: 114 | sampler = RandomSampler(dataset) 115 | batch_sampler = BatchSampler(sampler=sampler, batch_size=batchsize, drop_last=True) 116 | if num_iters is not None: 117 | batch_sampler = IterationBasedBatchSampler(batch_sampler, num_iters, start_iter) 118 | dataloader = DataLoader(dataset=dataset, batch_sampler=batch_sampler, num_workers=num_workers, collate_fn=collate_fn) 119 | else: 120 | sampler = SequenceSampler(dataset) 121 | batch_sampler = BatchSampler(sampler=sampler, batch_size=batchsize, drop_last=True) 122 | if num_iters is not None: 123 | batch_sampler = IterationBasedBatchSampler(batch_sampler, num_iters, start_iter) 124 | dataloader = DataLoader(dataset=dataset, batch_sampler=batch_sampler, num_workers=num_workers, collate_fn=collate_fn) 125 | 126 | return dataloader 127 | 128 | 129 | class IterationBasedBatchSampler(BatchSampler): 130 | """ 131 | Wraps a BatchSampler, resampling from it until 132 | a specified number of iterations have been sampled 133 | """ 134 | 135 | def __init__(self, batch_sampler, num_iterations, start_iter=0): 136 | self.batch_sampler = batch_sampler 137 | self.num_iterations = num_iterations 138 | self.start_iter = start_iter 139 | 140 | def __iter__(self): 141 | iteration = self.start_iter 142 | while iteration <= self.num_iterations: 143 | # if the underlying sampler has a set_epoch method, like 144 | # DistributedSampler, used for making each process see 145 | # a different split of the dataset, then set it 146 | if hasattr(self.batch_sampler.sampler, "set_epoch"): 147 | self.batch_sampler.sampler.set_epoch(iteration) 148 | for batch in self.batch_sampler: 149 | iteration += 1 150 | if iteration > self.num_iterations: 151 | break 152 | yield batch 153 | 154 | def __len__(self): 155 | return self.num_iterations 156 | -------------------------------------------------------------------------------- /detect.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import argparse 3 | import paddle 4 | import numpy as np 5 | from data import cfg_mnet, cfg_re50 6 | from layers.functions.prior_box import PriorBox 7 | from utils.nms.py_cpu_nms import py_cpu_nms 8 | import cv2 9 | from models.retinaface import RetinaFace 10 | from utils.box_utils import decode, decode_landm 11 | import time 12 | 13 | parser = argparse.ArgumentParser(description='Retinaface') 14 | 15 | parser.add_argument('-m', '--trained_model', default='./weights/Resnet50_epoch_95.pdparams', 16 | type=str, help='Trained state_dict file path to open') 17 | parser.add_argument('--network', default='resnet50', help='Backbone network mobile0.25 or resnet50') 18 | parser.add_argument('--cpu', action="store_true", default=False, help='Use cpu inference') 19 | parser.add_argument('--confidence_threshold', default=0.02, type=float, help='confidence_threshold') 20 | parser.add_argument('--top_k', default=5000, type=int, help='top_k') 21 | parser.add_argument('--nms_threshold', default=0.4, type=float, help='nms_threshold') 22 | parser.add_argument('--keep_top_k', default=750, type=int, help='keep_top_k') 23 | parser.add_argument('-s', '--save_image', action="store_true", default=True, help='show detection results') 24 | parser.add_argument('--vis_thres', default=0.6, type=float, help='visualization_threshold') 25 | args = parser.parse_args() 26 | 27 | 28 | def check_keys(model, pretrained_state_dict): 29 | ckpt_keys = set(pretrained_state_dict.keys()) 30 | model_keys = set(model.state_dict().keys()) 31 | used_pretrained_keys = model_keys & ckpt_keys 32 | unused_pretrained_keys = ckpt_keys - model_keys 33 | missing_keys = model_keys - ckpt_keys 34 | print('Missing keys:{}'.format(len(missing_keys))) 35 | print('Unused checkpoint keys:{}'.format(len(unused_pretrained_keys))) 36 | print('Used keys:{}'.format(len(used_pretrained_keys))) 37 | assert len(used_pretrained_keys) > 0, 'load NONE from pretrained checkpoint' 38 | return True 39 | 40 | 41 | def remove_prefix(state_dict, prefix): 42 | ''' Old style model is stored with all names of parameters sharing common prefix 'module.' ''' 43 | print('remove prefix \'{}\''.format(prefix)) 44 | f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x 45 | return {f(key): value for key, value in state_dict.items()} 46 | 47 | 48 | def load_model(model, pretrained_path): 49 | print('Loading pretrained model from {}'.format(pretrained_path)) 50 | pretrained_dict = paddle.load(pretrained_path) 51 | if "state_dict" in pretrained_dict.keys(): 52 | pretrained_dict = remove_prefix(pretrained_dict['state_dict'], 'module.') 53 | else: 54 | pretrained_dict = remove_prefix(pretrained_dict, 'module.') 55 | check_keys(model, pretrained_dict) 56 | model.set_state_dict(pretrained_dict) 57 | return model 58 | 59 | 60 | if __name__ == '__main__': 61 | paddle.set_grad_enabled(False) 62 | cfg = None 63 | if args.network == "mobile0.25": 64 | cfg = cfg_mnet 65 | elif args.network == "resnet50": 66 | cfg = cfg_re50 67 | # net and model 68 | net = RetinaFace(cfg=cfg, phase = 'test') 69 | net = load_model(net, args.trained_model) 70 | net.eval() 71 | print('Finished loading model!') 72 | print(net) 73 | 74 | resize = 1 75 | 76 | # testing begin 77 | image_path = "./curve/test.jpg" 78 | img_raw = cv2.imread(image_path, cv2.IMREAD_COLOR) 79 | 80 | img = np.float32(img_raw) 81 | 82 | im_height, im_width, _ = img.shape 83 | scale = paddle.to_tensor([img.shape[1], img.shape[0], img.shape[1], img.shape[0]]) 84 | img -= (104, 117, 123) 85 | img /= (57.1,57.4,58.4) 86 | img = img.transpose(2, 0, 1) 87 | img = paddle.to_tensor(img).unsqueeze(0) 88 | 89 | tic = time.time() 90 | loc, conf, landms = net(img) # forward pass 91 | print('net forward time: {:.4f}'.format(time.time() - tic)) 92 | 93 | priorbox = PriorBox(cfg, image_size=(im_height, im_width)) 94 | priors = priorbox.forward() 95 | prior_data = priors 96 | boxes = decode(loc.squeeze(0), prior_data, cfg['variance']) 97 | boxes = boxes * scale / resize 98 | boxes = boxes.cpu().numpy() 99 | scores = conf.squeeze(0).cpu().numpy()[:, 1] 100 | landms = decode_landm(landms.squeeze(0), prior_data, cfg['variance']) 101 | scale1 = paddle.to_tensor([img.shape[3], img.shape[2], img.shape[3], img.shape[2], 102 | img.shape[3], img.shape[2], img.shape[3], img.shape[2], 103 | img.shape[3], img.shape[2]]) 104 | landms = landms * scale1 / resize 105 | landms = landms.cpu().numpy() 106 | 107 | # ignore low scores 108 | inds = np.where(scores > args.confidence_threshold)[0] 109 | boxes = boxes[inds] 110 | landms = landms[inds] 111 | scores = scores[inds] 112 | 113 | # keep top-K before NMS 114 | order = scores.argsort()[::-1][:args.top_k] 115 | boxes = boxes[order] 116 | landms = landms[order] 117 | scores = scores[order] 118 | 119 | # do NMS 120 | dets = np.hstack((boxes, scores[:, np.newaxis])).astype(np.float32, copy=False) 121 | keep = py_cpu_nms(dets, args.nms_threshold) 122 | # keep = nms(dets, args.nms_threshold,force_cpu=args.cpu) 123 | dets = dets[keep, :] 124 | landms = landms[keep] 125 | 126 | # keep top-K faster NMS 127 | dets = dets[:args.keep_top_k, :] 128 | landms = landms[:args.keep_top_k, :] 129 | 130 | dets = np.concatenate((dets, landms), axis=1) 131 | 132 | # show image 133 | if args.save_image: 134 | for b in dets: 135 | if b[4] < args.vis_thres: 136 | continue 137 | text = "{:.4f}".format(b[4]) 138 | b = list(map(int, b)) 139 | cv2.rectangle(img_raw, (b[0], b[1]), (b[2], b[3]), (0, 0, 255), 2) 140 | cx = b[0] 141 | cy = b[1] + 12 142 | cv2.putText(img_raw, text, (cx, cy), 143 | cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255)) 144 | 145 | # landms 146 | cv2.circle(img_raw, (b[5], b[6]), 1, (0, 0, 255), 4) 147 | cv2.circle(img_raw, (b[7], b[8]), 1, (0, 255, 255), 4) 148 | cv2.circle(img_raw, (b[9], b[10]), 1, (255, 0, 255), 4) 149 | cv2.circle(img_raw, (b[11], b[12]), 1, (0, 255, 0), 4) 150 | cv2.circle(img_raw, (b[13], b[14]), 1, (255, 0, 0), 4) 151 | # save image 152 | 153 | name = "test.jpg" 154 | cv2.imwrite(name, img_raw) 155 | 156 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RetinaFace-Paddle 2 | 3 | 论文提出了一种强大的单阶段面部检测器`RetinaFace`,通过联合外监督(`extra-supervised`)和自监督(`self-supervised`)多任务学习的优势,在各种规模的人脸上执行像素级人脸定位,并实现了在`WIDER FACE`数据集上的最佳表现(**SOTA**) 4 | *** 5 | 6 | ## 数据文件部署 7 | 数据文件可以在[AIStudio下载](https://aistudio.baidu.com/aistudio/datasetdetail/75233),`wider_val.txt`文件可在此处下载[[baidu](https://pan.baidu.com/s/14I8gNODfGkLKOy3BL3on5Q)/mrnh] 8 | ``` 9 | /home/aistudio 10 | |-- Data 11 | | |-- widerface 12 | | |-- train 13 | | |-- images 14 | | |-- label.txt 15 | | |-- test 16 | | |-- images 17 | | |-- label.txt 18 | | |-- val 19 | | |-- images 20 | | |-- label.txt 21 | | |-- wider_val.txt 22 | |-- RetinaFace 23 | | |-- widerface_evaluate(验证时需要自行配置) 24 | | |-- layers 25 | | |-- curve 26 | | |-- utils 27 | | |-- data 28 | | |-- models 29 | | |-- detect.py 30 | | |-- convert_to_onnx.py 31 | | |-- test.py 32 | | |-- train.py 33 | | |-- test_widerface.py 34 | ``` 35 | 36 | ## 训练 37 | 38 | **在使用中需要下载的所有资源文件,训练日志,ground_truth,训练模型以及预训练模型都可在[[baidu](https://pan.baidu.com/s/14I8gNODfGkLKOy3BL3on5Q)/mrnh]** 39 | 40 | ### train from scratch 41 | ```shell 42 | python train.py --network resnet50 43 | ``` 44 | ### train from checkpoint 45 | ```shell 46 | python train.py --network resnet50 --resume_epoch 20 --resume_net ./weights/Resnet50_epoch_20.pdparams 47 | ``` 48 | 需要注意到: 49 | 50 | 1.在训练之前,训练配置保存在`data/config.py`以及`train.py`的`args`参数 51 | 52 | 2.使用多卡训练`multi_gpu_train.py`时,其gpu选取采用spawn机制,你需要手动设置而不是从`data/config.py`获取 53 | 54 | 3.经过验证,本项目还支持轻量化模型`mobilenetV1X0.25`训练,同样你需要下载预训练模型 55 | 56 | ```shell 57 | python train.py --network mobile0.25 58 | ``` 59 | 60 | 61 | ## 评估 62 | 从[此处](https://github.com/wondervictor/WiderFace-Evaluation)下载评估代码,将其命名为`widerface_evaluate`如数据文件配置所示 63 | 64 | 生成预测文本文件 65 | ```shell 66 | python test_widerface.py --trained_model ./torch2paddlemodel/Resnet50_Final.pdparams --network resnet50 67 | ``` 68 | 69 | 进入`widerface_evaluate`,将下载的`ground_truth`放入`widerface_evaluate`文件夹下,编译并评估 70 | ``` 71 | cd /home/aistudio/Retinaface/widerface_evaluate 72 | python setup.py build_ext --inplace 73 | python evaluation.py 74 | ``` 75 | 注意到如果使用[GitHub仓库](https://github.com/GuoQuanhao/RetinaFace-Paddle)在预测时出现报错需要修改`evaluation.py`的`89`行`boxes = np.array(list(map(lambda x: [float(a) for a in x.rstrip('\r\n').split(' ')], lines))).astype('float')`为`boxes = np.array(list(map(lambda x: [float(a) for a in x.rstrip('\r\n').split(' ')[:-1]], lines))).astype('float')` 76 | 77 | **推荐直接使用[AIStudio仓库](https://aistudio.baidu.com/aistudio/projectdetail/2251677?contributionType=1)** 78 | 79 | 评估精度如下 80 | 81 | 82 | ![](https://ai-studio-static-online.cdn.bcebos.com/22ea493018bd45378480db42315bae950e829a02cd904a4b8b91b8e699211a04) 83 | 84 | **在没有复杂后处理的情况下,PaddlePaddle训练结果均高于其余框架** 85 | 86 | **根据论文的mAP精度测试协议,** 87 | `we also make use of the development server (Hard validation subset) of the WIDER Face 88 | Challenge 2018 [33], which employs a more strict evaluation metric of mean AP (mAP) for IoU=0.5:0.05:0.95, rewarding more accurate face detectors.`,**我在repo中更新了`evaluate.py `新增了`mAP`测试协议,只需要注释或做如下替换:** 89 | 90 | ```python 91 | if __name__ == '__main__': 92 | 93 | parser = argparse.ArgumentParser() 94 | parser.add_argument('-p', '--pred', default="./widerface_txt/") 95 | parser.add_argument('-g', '--gt', default='./ground_truth/') 96 | 97 | args = parser.parse_args() 98 | evaluation_mAP(args.pred, args.gt) 99 | ``` 100 | 101 | 运行 102 | ```shell 103 | python evaluation.py 104 | ``` 105 | 结果如下 106 | ``` 107 | iou_thresh=0.50 108 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.24it/s] 109 | ==================== Results ==================== 110 | Hard Val AP: 0.9001669787983496 111 | ================================================= 112 | iou_thresh=0.55 113 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.29it/s] 114 | ==================== Results ==================== 115 | Hard Val AP: 0.8765281335631281 116 | ================================================= 117 | iou_thresh=0.60 118 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.30it/s] 119 | ==================== Results ==================== 120 | Hard Val AP: 0.8361440379223611 121 | ================================================= 122 | iou_thresh=0.65 123 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.29it/s] 124 | ==================== Results ==================== 125 | Hard Val AP: 0.779051487622847 126 | ================================================= 127 | iou_thresh=0.70 128 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.28it/s] 129 | ==================== Results ==================== 130 | Hard Val AP: 0.6888435438730449 131 | ================================================= 132 | iou_thresh=0.75 133 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.26it/s] 134 | ==================== Results ==================== 135 | Hard Val AP: 0.5621200454431498 136 | ================================================= 137 | iou_thresh=0.80 138 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.26it/s] 139 | ==================== Results ==================== 140 | Hard Val AP: 0.39284757764295203 141 | ================================================= 142 | iou_thresh=0.85 143 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.29it/s] 144 | ==================== Results ==================== 145 | Hard Val AP: 0.19579832709560405 146 | ================================================= 147 | iou_thresh=0.90 148 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.27it/s] 149 | ==================== Results ==================== 150 | Hard Val AP: 0.04667405826534609 151 | ================================================= 152 | iou_thresh=0.95 153 | Processing hard: 100%|████████████████████████████████████████████████████████| 61/61 [00:11<00:00, 5.25it/s] 154 | ==================== Results ==================== 155 | Hard Val AP: 0.0016165497954932979 156 | ================================================= 157 | ==================== Results ==================== 158 | mAP: 0.5279790740022274 159 | ================================================= 160 | ``` 161 | 162 | **论文精度为52.318** 163 | 164 | ## TODO 165 | 166 | **convert_to_onnx.py编写完成但暂未验证其实用性** 167 | 168 | ## 推理 169 | ``` 170 | python detect.py 171 | ``` 172 | 你可以从`78`行指定图片路径,默认将读取`./curve/test.jpg`,推理效果如下 173 | 174 |
175 | 176 | # **关于作者** 177 | 178 | 179 | 180 | | 姓名 | 郭权浩 | 181 | | -------- | -------- | 182 | | 学校 | 电子科技大学研2020级 | 183 | | 研究方向 | 计算机视觉 | 184 | | CSDN主页 | [Deep Hao的CSDN主页](https://blog.csdn.net/qq_39567427?spm=1000.2115.3001.5343) | 185 | | GitHub主页 | [Deep Hao的GitHub主页](https://github.com/GuoQuanhao) | 186 | 如有错误,请及时留言纠正,非常蟹蟹! 187 | 后续会有更多论文复现系列推出,欢迎大家有问题留言交流学习,共同进步成长! 188 | -------------------------------------------------------------------------------- /data/data_augment.py: -------------------------------------------------------------------------------- 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, rgb_std): 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 | image /= rgb_std 207 | return image.transpose(2, 0, 1) 208 | 209 | 210 | class preproc(object): 211 | 212 | def __init__(self, img_dim, rgb_means, rgb_stds): 213 | self.img_dim = img_dim 214 | self.rgb_means = rgb_means 215 | self.rgb_stds = rgb_stds 216 | 217 | def __call__(self, image, targets): 218 | assert targets.shape[0] > 0, "this image does not have gt" 219 | 220 | boxes = targets[:, :4].copy() 221 | labels = targets[:, -1].copy() 222 | landm = targets[:, 4:-1].copy() 223 | 224 | image_t, boxes_t, labels_t, landm_t, pad_image_flag = _crop(image, boxes, labels, landm, self.img_dim) 225 | image_t = _distort(image_t) 226 | image_t = _pad_to_square(image_t, self.rgb_means, pad_image_flag) 227 | image_t, boxes_t, landm_t = _mirror(image_t, boxes_t, landm_t) 228 | height, width, _ = image_t.shape 229 | image_t = _resize_subtract_mean(image_t, self.img_dim, self.rgb_means, self.rgb_stds) 230 | boxes_t[:, 0::2] /= width 231 | boxes_t[:, 1::2] /= height 232 | 233 | landm_t[:, 0::2] /= width 234 | landm_t[:, 1::2] /= height 235 | 236 | labels_t = np.expand_dims(labels_t, 1) 237 | targets_t = np.hstack((boxes_t, landm_t, labels_t)) 238 | 239 | return image_t, targets_t 240 | -------------------------------------------------------------------------------- /test_widerface.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import os 3 | import argparse 4 | import paddle 5 | import numpy as np 6 | from data import cfg_mnet, cfg_re50 7 | from layers.functions.prior_box import PriorBox 8 | from utils.nms.py_cpu_nms import py_cpu_nms 9 | import cv2 10 | from models.retinaface import RetinaFace 11 | from utils.box_utils import decode, decode_landm 12 | from utils.timer import Timer 13 | 14 | 15 | parser = argparse.ArgumentParser(description='Retinaface') 16 | parser.add_argument('-m', '--trained_model', default='./test/Resnet50_epoch_90.pdparams', 17 | type=str, help='Trained state_dict file path to open') 18 | parser.add_argument('--network', default='resnet50', help='Backbone network mobile0.25 or resnet50') 19 | parser.add_argument('--origin_size', default=False, type=str, help='Whether use origin image size to evaluate') 20 | parser.add_argument('--save_folder', default='./widerface_evaluate/widerface_txt/', type=str, help='Dir to save txt results') 21 | parser.add_argument('--cpu', action="store_true", default=False, help='Use cpu inference') 22 | parser.add_argument('--dataset_folder', default='/home/aistudio/Data/widerface/val/images/', type=str, help='dataset path') 23 | parser.add_argument('--confidence_threshold', default=0.02, type=float, help='confidence_threshold') 24 | parser.add_argument('--top_k', default=5000, type=int, help='top_k') 25 | parser.add_argument('--nms_threshold', default=0.4, type=float, help='nms_threshold') 26 | parser.add_argument('--keep_top_k', default=750, type=int, help='keep_top_k') 27 | parser.add_argument('-s', '--save_image', action="store_true", default=False, help='show detection results') 28 | parser.add_argument('--vis_thres', default=0.5, type=float, help='visualization_threshold') 29 | args = parser.parse_args() 30 | 31 | 32 | def check_keys(model, pretrained_state_dict): 33 | ckpt_keys = set(pretrained_state_dict.keys()) 34 | model_keys = set(model.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 | print('Missing keys:{}'.format(len(missing_keys))) 39 | print('Unused checkpoint keys:{}'.format(len(unused_pretrained_keys))) 40 | print('Used keys:{}'.format(len(used_pretrained_keys))) 41 | assert len(used_pretrained_keys) > 0, 'load NONE from pretrained checkpoint' 42 | return True 43 | 44 | 45 | def remove_prefix(state_dict, prefix): 46 | ''' Old style model is stored with all names of parameters sharing common prefix 'module.' ''' 47 | print('remove prefix \'{}\''.format(prefix)) 48 | f = lambda x: x.split(prefix, 1)[-1] if x.startswith(prefix) else x 49 | return {f(key): value for key, value in state_dict.items()} 50 | 51 | 52 | def load_model(model, pretrained_path): 53 | print('Loading pretrained model from {}'.format(pretrained_path)) 54 | pretrained_dict = paddle.load(pretrained_path) 55 | if "state_dict" in pretrained_dict.keys(): 56 | pretrained_dict = remove_prefix(pretrained_dict['state_dict'], 'module.') 57 | else: 58 | pretrained_dict = remove_prefix(pretrained_dict, 'module.') 59 | check_keys(model, pretrained_dict) 60 | model.set_state_dict(pretrained_dict) 61 | return model 62 | 63 | 64 | if __name__ == '__main__': 65 | with paddle.no_grad(): 66 | cfg = None 67 | if args.network == "mobile0.25": 68 | cfg = cfg_mnet 69 | elif args.network == "resnet50": 70 | cfg = cfg_re50 71 | # net and model 72 | net = RetinaFace(cfg=cfg, phase = 'test') 73 | net = load_model(net, args.trained_model) 74 | net.eval() 75 | print('Finished loading model!') 76 | print(net) 77 | 78 | # testing dataset 79 | testset_folder = args.dataset_folder 80 | testset_list = args.dataset_folder[:-7] + "wider_val.txt" 81 | 82 | with open(testset_list, 'r') as fr: 83 | test_dataset = fr.read().split() 84 | num_images = len(test_dataset) 85 | 86 | _t = {'forward_pass': Timer(), 'misc': Timer()} 87 | 88 | # testing begin 89 | for i, img_name in enumerate(test_dataset): 90 | image_path = testset_folder + img_name 91 | img_raw = cv2.imread(image_path, cv2.IMREAD_COLOR) 92 | img = np.float32(img_raw) 93 | 94 | # testing scale 95 | target_size = 1600 96 | max_size = 2150 97 | im_shape = img.shape 98 | im_size_min = np.min(im_shape[0:2]) 99 | im_size_max = np.max(im_shape[0:2]) 100 | resize = float(target_size) / float(im_size_min) 101 | # prevent bigger axis from being more than max_size: 102 | if np.round(resize * im_size_max) > max_size: 103 | resize = float(max_size) / float(im_size_max) 104 | if args.origin_size: 105 | resize = 1 106 | 107 | if resize != 1: 108 | img = cv2.resize(img, None, None, fx=resize, fy=resize, interpolation=cv2.INTER_LINEAR) 109 | im_height, im_width, _ = img.shape 110 | scale = paddle.to_tensor([img.shape[1], img.shape[0], img.shape[1], img.shape[0]]) 111 | img -= (104, 117, 123) 112 | img /= (57.1,57.4,58.4) 113 | img = img.transpose(2, 0, 1) 114 | img = paddle.to_tensor(img).unsqueeze(0) 115 | 116 | _t['forward_pass'].tic() 117 | loc, conf, landms = net(img) # forward pass 118 | _t['forward_pass'].toc() 119 | _t['misc'].tic() 120 | priorbox = PriorBox(cfg, image_size=(im_height, im_width)) 121 | priors = priorbox.forward() 122 | boxes = decode(loc.squeeze(0), priors, cfg['variance']) 123 | boxes = boxes * scale / resize 124 | boxes = boxes.cpu().numpy() 125 | scores = conf.squeeze(0).cpu().numpy()[:, 1] 126 | landms = decode_landm(landms.squeeze(0), priors, cfg['variance']) 127 | scale1 = paddle.to_tensor([img.shape[3], img.shape[2], img.shape[3], img.shape[2], 128 | img.shape[3], img.shape[2], img.shape[3], img.shape[2], 129 | img.shape[3], img.shape[2]]) 130 | landms = landms * scale1 / resize 131 | landms = landms.cpu().numpy() 132 | 133 | # ignore low scores 134 | inds = np.where(scores > args.confidence_threshold)[0] 135 | boxes = boxes[inds] 136 | landms = landms[inds] 137 | scores = scores[inds] 138 | 139 | # keep top-K before NMS 140 | order = scores.argsort()[::-1] 141 | # order = scores.argsort()[::-1][:args.top_k] 142 | boxes = boxes[order] 143 | landms = landms[order] 144 | scores = scores[order] 145 | 146 | # do NMS 147 | dets = np.hstack((boxes, scores[:, np.newaxis])).astype(np.float32, copy=False) 148 | keep = py_cpu_nms(dets, args.nms_threshold) 149 | # keep = nms(dets, args.nms_threshold,force_cpu=args.cpu) 150 | dets = dets[keep, :] 151 | landms = landms[keep] 152 | 153 | # keep top-K faster NMS 154 | # dets = dets[:args.keep_top_k, :] 155 | # landms = landms[:args.keep_top_k, :] 156 | 157 | dets = np.concatenate((dets, landms), axis=1) 158 | _t['misc'].toc() 159 | 160 | # -------------------------------------------------------------------- 161 | save_name = args.save_folder + img_name[:-4] + ".txt" 162 | dirname = os.path.dirname(save_name) 163 | if not os.path.isdir(dirname): 164 | os.makedirs(dirname) 165 | with open(save_name, "w") as fd: 166 | bboxs = dets 167 | file_name = os.path.basename(save_name)[:-4] + "\n" 168 | bboxs_num = str(len(bboxs)) + "\n" 169 | fd.write(file_name) 170 | fd.write(bboxs_num) 171 | for box in bboxs: 172 | x = int(box[0]) 173 | y = int(box[1]) 174 | w = int(box[2]) - int(box[0]) 175 | h = int(box[3]) - int(box[1]) 176 | confidence = str(box[4]) 177 | line = str(x) + " " + str(y) + " " + str(w) + " " + str(h) + " " + confidence + " \n" 178 | fd.write(line) 179 | 180 | print('im_detect: {:d}/{:d} forward_pass_time: {:.4f}s misc: {:.4f}s'.format(i + 1, num_images, _t['forward_pass'].average_time, _t['misc'].average_time)) 181 | 182 | # save image 183 | if args.save_image: 184 | for b in dets: 185 | if b[4] < args.vis_thres: 186 | continue 187 | text = "{:.4f}".format(b[4]) 188 | b = list(map(int, b)) 189 | cv2.rectangle(img_raw, (b[0], b[1]), (b[2], b[3]), (0, 0, 255), 2) 190 | cx = b[0] 191 | cy = b[1] + 12 192 | cv2.putText(img_raw, text, (cx, cy), 193 | cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255)) 194 | 195 | # landms 196 | cv2.circle(img_raw, (b[5], b[6]), 1, (0, 0, 255), 4) 197 | cv2.circle(img_raw, (b[7], b[8]), 1, (0, 255, 255), 4) 198 | cv2.circle(img_raw, (b[9], b[10]), 1, (255, 0, 255), 4) 199 | cv2.circle(img_raw, (b[11], b[12]), 1, (0, 255, 0), 4) 200 | cv2.circle(img_raw, (b[13], b[14]), 1, (255, 0, 0), 4) 201 | # save image 202 | if not os.path.exists("./results/"): 203 | os.makedirs("./results/") 204 | name = "./results/" + str(i) + ".jpg" 205 | cv2.imwrite(name, img_raw) 206 | -------------------------------------------------------------------------------- /widerface_evaluate/evaluation.py: -------------------------------------------------------------------------------- 1 | """ 2 | WiderFace evaluation code 3 | author: wondervictor 4 | mail: tianhengcheng@gmail.com 5 | copyright@wondervictor 6 | """ 7 | 8 | import os 9 | import tqdm 10 | import pickle 11 | import argparse 12 | import numpy as np 13 | from scipy.io import loadmat 14 | from bbox import bbox_overlaps 15 | from IPython import embed 16 | 17 | 18 | def get_gt_boxes(gt_dir): 19 | """ gt dir: (wider_face_val.mat, wider_easy_val.mat, wider_medium_val.mat, wider_hard_val.mat)""" 20 | 21 | gt_mat = loadmat(os.path.join(gt_dir, 'wider_face_val.mat')) 22 | hard_mat = loadmat(os.path.join(gt_dir, 'wider_hard_val.mat')) 23 | medium_mat = loadmat(os.path.join(gt_dir, 'wider_medium_val.mat')) 24 | easy_mat = loadmat(os.path.join(gt_dir, 'wider_easy_val.mat')) 25 | 26 | facebox_list = gt_mat['face_bbx_list'] 27 | event_list = gt_mat['event_list'] 28 | file_list = gt_mat['file_list'] 29 | 30 | hard_gt_list = hard_mat['gt_list'] 31 | medium_gt_list = medium_mat['gt_list'] 32 | easy_gt_list = easy_mat['gt_list'] 33 | 34 | return facebox_list, event_list, file_list, hard_gt_list, medium_gt_list, easy_gt_list 35 | 36 | 37 | def get_gt_boxes_from_txt(gt_path, cache_dir): 38 | 39 | cache_file = os.path.join(cache_dir, 'gt_cache.pkl') 40 | if os.path.exists(cache_file): 41 | f = open(cache_file, 'rb') 42 | boxes = pickle.load(f) 43 | f.close() 44 | return boxes 45 | 46 | f = open(gt_path, 'r') 47 | state = 0 48 | lines = f.readlines() 49 | lines = list(map(lambda x: x.rstrip('\r\n'), lines)) 50 | boxes = {} 51 | print(len(lines)) 52 | f.close() 53 | current_boxes = [] 54 | current_name = None 55 | for line in lines: 56 | if state == 0 and '--' in line: 57 | state = 1 58 | current_name = line 59 | continue 60 | if state == 1: 61 | state = 2 62 | continue 63 | 64 | if state == 2 and '--' in line: 65 | state = 1 66 | boxes[current_name] = np.array(current_boxes).astype('float32') 67 | current_name = line 68 | current_boxes = [] 69 | continue 70 | 71 | if state == 2: 72 | box = [float(x) for x in line.split(' ')[:4]] 73 | current_boxes.append(box) 74 | continue 75 | 76 | f = open(cache_file, 'wb') 77 | pickle.dump(boxes, f) 78 | f.close() 79 | return boxes 80 | 81 | 82 | def read_pred_file(filepath): 83 | 84 | with open(filepath, 'r') as f: 85 | lines = f.readlines() 86 | img_file = lines[0].rstrip('\n\r') 87 | lines = lines[2:] 88 | 89 | boxes = np.array(list(map(lambda x: [float(a) for a in x.rstrip('\r\n').split(' ')], lines))).astype('float') 90 | return img_file.split('/')[-1], boxes 91 | 92 | 93 | def get_preds(pred_dir): 94 | events = os.listdir(pred_dir) 95 | boxes = dict() 96 | pbar = tqdm.tqdm(events) 97 | 98 | for event in pbar: 99 | pbar.set_description('Reading Predictions ') 100 | event_dir = os.path.join(pred_dir, event) 101 | event_images = os.listdir(event_dir) 102 | current_event = dict() 103 | for imgtxt in event_images: 104 | imgname, _boxes = read_pred_file(os.path.join(event_dir, imgtxt)) 105 | current_event[imgname.rstrip('.jpg')] = _boxes 106 | boxes[event] = current_event 107 | return boxes 108 | 109 | 110 | def norm_score(pred): 111 | """ norm score 112 | pred {key: [[x1,y1,x2,y2,s]]} 113 | """ 114 | 115 | max_score = 0 116 | min_score = 1 117 | 118 | for _, k in pred.items(): 119 | for _, v in k.items(): 120 | if len(v) == 0: 121 | continue 122 | _min = np.min(v[:, -1]) 123 | _max = np.max(v[:, -1]) 124 | max_score = max(_max, max_score) 125 | min_score = min(_min, min_score) 126 | 127 | diff = max_score - min_score 128 | for _, k in pred.items(): 129 | for _, v in k.items(): 130 | if len(v) == 0: 131 | continue 132 | v[:, -1] = (v[:, -1] - min_score)/diff 133 | 134 | 135 | def image_eval(pred, gt, ignore, iou_thresh): 136 | """ single image evaluation 137 | pred: Nx5 138 | gt: Nx4 139 | ignore: 140 | """ 141 | 142 | _pred = pred.copy() 143 | _gt = gt.copy() 144 | pred_recall = np.zeros(_pred.shape[0]) 145 | recall_list = np.zeros(_gt.shape[0]) 146 | proposal_list = np.ones(_pred.shape[0]) 147 | 148 | _pred[:, 2] = _pred[:, 2] + _pred[:, 0] 149 | _pred[:, 3] = _pred[:, 3] + _pred[:, 1] 150 | _gt[:, 2] = _gt[:, 2] + _gt[:, 0] 151 | _gt[:, 3] = _gt[:, 3] + _gt[:, 1] 152 | 153 | overlaps = bbox_overlaps(_pred[:, :4], _gt) 154 | 155 | for h in range(_pred.shape[0]): 156 | 157 | gt_overlap = overlaps[h] 158 | max_overlap, max_idx = gt_overlap.max(), gt_overlap.argmax() 159 | if max_overlap >= iou_thresh: 160 | if ignore[max_idx] == 0: 161 | recall_list[max_idx] = -1 162 | proposal_list[h] = -1 163 | elif recall_list[max_idx] == 0: 164 | recall_list[max_idx] = 1 165 | 166 | r_keep_index = np.where(recall_list == 1)[0] 167 | pred_recall[h] = len(r_keep_index) 168 | return pred_recall, proposal_list 169 | 170 | 171 | def img_pr_info(thresh_num, pred_info, proposal_list, pred_recall): 172 | pr_info = np.zeros((thresh_num, 2)).astype('float') 173 | for t in range(thresh_num): 174 | 175 | thresh = 1 - (t+1)/thresh_num 176 | r_index = np.where(pred_info[:, 4] >= thresh)[0] 177 | if len(r_index) == 0: 178 | pr_info[t, 0] = 0 179 | pr_info[t, 1] = 0 180 | else: 181 | r_index = r_index[-1] 182 | p_index = np.where(proposal_list[:r_index+1] == 1)[0] 183 | pr_info[t, 0] = len(p_index) 184 | pr_info[t, 1] = pred_recall[r_index] 185 | return pr_info 186 | 187 | 188 | def dataset_pr_info(thresh_num, pr_curve, count_face): 189 | _pr_curve = np.zeros((thresh_num, 2)) 190 | for i in range(thresh_num): 191 | _pr_curve[i, 0] = pr_curve[i, 1] / pr_curve[i, 0] 192 | _pr_curve[i, 1] = pr_curve[i, 1] / count_face 193 | return _pr_curve 194 | 195 | 196 | def voc_ap(rec, prec): 197 | 198 | # correct AP calculation 199 | # first append sentinel values at the end 200 | mrec = np.concatenate(([0.], rec, [1.])) 201 | mpre = np.concatenate(([0.], prec, [0.])) 202 | 203 | # compute the precision envelope 204 | for i in range(mpre.size - 1, 0, -1): 205 | mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) 206 | 207 | # to calculate area under PR curve, look for points 208 | # where X axis (recall) changes value 209 | i = np.where(mrec[1:] != mrec[:-1])[0] 210 | 211 | # and sum (\Delta recall) * prec 212 | ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) 213 | return ap 214 | 215 | 216 | def evaluation(pred, gt_path, iou_thresh=0.5): 217 | pred = get_preds(pred) 218 | norm_score(pred) 219 | facebox_list, event_list, file_list, hard_gt_list, medium_gt_list, easy_gt_list = get_gt_boxes(gt_path) 220 | event_num = len(event_list) 221 | thresh_num = 1000 222 | settings = ['easy', 'medium', 'hard'] 223 | setting_gts = [easy_gt_list, medium_gt_list, hard_gt_list] 224 | aps = [] 225 | for setting_id in range(3): 226 | # different setting 227 | gt_list = setting_gts[setting_id] 228 | count_face = 0 229 | pr_curve = np.zeros((thresh_num, 2)).astype('float') 230 | # [hard, medium, easy] 231 | pbar = tqdm.tqdm(range(event_num)) 232 | for i in pbar: 233 | pbar.set_description('Processing {}'.format(settings[setting_id])) 234 | event_name = str(event_list[i][0][0]) 235 | img_list = file_list[i][0] 236 | pred_list = pred[event_name] 237 | sub_gt_list = gt_list[i][0] 238 | # img_pr_info_list = np.zeros((len(img_list), thresh_num, 2)) 239 | gt_bbx_list = facebox_list[i][0] 240 | 241 | for j in range(len(img_list)): 242 | pred_info = pred_list[str(img_list[j][0][0])] 243 | 244 | gt_boxes = gt_bbx_list[j][0].astype('float') 245 | keep_index = sub_gt_list[j][0] 246 | count_face += len(keep_index) 247 | 248 | if len(gt_boxes) == 0 or len(pred_info) == 0: 249 | continue 250 | ignore = np.zeros(gt_boxes.shape[0]) 251 | if len(keep_index) != 0: 252 | ignore[keep_index-1] = 1 253 | pred_recall, proposal_list = image_eval(pred_info, gt_boxes, ignore, iou_thresh) 254 | 255 | _img_pr_info = img_pr_info(thresh_num, pred_info, proposal_list, pred_recall) 256 | 257 | pr_curve += _img_pr_info 258 | pr_curve = dataset_pr_info(thresh_num, pr_curve, count_face) 259 | 260 | propose = pr_curve[:, 0] 261 | recall = pr_curve[:, 1] 262 | 263 | ap = voc_ap(recall, propose) 264 | aps.append(ap) 265 | 266 | print("==================== Results ====================") 267 | print("Easy Val AP: {}".format(aps[0])) 268 | print("Medium Val AP: {}".format(aps[1])) 269 | print("Hard Val AP: {}".format(aps[2])) 270 | print("=================================================") 271 | 272 | 273 | def evaluation_mAP(pred, gt_path, iou_thresh_list=np.arange(0.5,1.00,0.05)): 274 | pred = get_preds(pred) 275 | norm_score(pred) 276 | facebox_list, event_list, file_list, hard_gt_list, medium_gt_list, easy_gt_list = get_gt_boxes(gt_path) 277 | event_num = len(event_list) 278 | thresh_num = 1000 279 | aps = [] 280 | for iou_thresh in iou_thresh_list: 281 | print('iou_thresh={:.2f}'.format(iou_thresh)) 282 | # different setting 283 | gt_list = hard_gt_list 284 | count_face = 0 285 | pr_curve = np.zeros((thresh_num, 2)).astype('float') 286 | # [hard, medium, easy] 287 | pbar = tqdm.tqdm(range(event_num)) 288 | for i in pbar: 289 | pbar.set_description('Processing {}'.format('hard')) 290 | event_name = str(event_list[i][0][0]) 291 | img_list = file_list[i][0] 292 | pred_list = pred[event_name] 293 | sub_gt_list = gt_list[i][0] 294 | gt_bbx_list = facebox_list[i][0] 295 | 296 | for j in range(len(img_list)): 297 | pred_info = pred_list[str(img_list[j][0][0])] 298 | 299 | gt_boxes = gt_bbx_list[j][0].astype('float') 300 | keep_index = sub_gt_list[j][0] 301 | count_face += len(keep_index) 302 | 303 | if len(gt_boxes) == 0 or len(pred_info) == 0: 304 | continue 305 | ignore = np.zeros(gt_boxes.shape[0]) 306 | if len(keep_index) != 0: 307 | ignore[keep_index-1] = 1 308 | pred_recall, proposal_list = image_eval(pred_info, gt_boxes, ignore, iou_thresh) 309 | 310 | _img_pr_info = img_pr_info(thresh_num, pred_info, proposal_list, pred_recall) 311 | 312 | pr_curve += _img_pr_info 313 | pr_curve = dataset_pr_info(thresh_num, pr_curve, count_face) 314 | 315 | propose = pr_curve[:, 0] 316 | recall = pr_curve[:, 1] 317 | 318 | ap = voc_ap(recall, propose) 319 | aps.append(ap) 320 | print("==================== Results ====================") 321 | print("Hard Val AP: {}".format(aps[-1])) 322 | print("=================================================") 323 | 324 | print("==================== Results ====================") 325 | print("mAP: {}".format(np.mean(aps))) 326 | print("=================================================") 327 | if __name__ == '__main__': 328 | 329 | parser = argparse.ArgumentParser() 330 | parser.add_argument('-p', '--pred') 331 | parser.add_argument('-g', '--gt', default='/Users/Vic/Downloads/eval_tools/ground_truth/') 332 | 333 | args = parser.parse_args() 334 | # evaluation(args.pred, args.gt) 335 | evaluation_mAP(args.pred, args.gt) 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | -------------------------------------------------------------------------------- /utils/box_utils.py: -------------------------------------------------------------------------------- 1 | import paddle 2 | import numpy as np 3 | 4 | 5 | def index_fill(input, index, update): 6 | ''' 7 | achieve Tensor.index_fill method 8 | only for this repo, it's not common use 9 | ''' 10 | for i in range(len(index)): 11 | input[index[i]] = update 12 | 13 | return input 14 | 15 | 16 | def point_form(boxes): 17 | """ Convert prior_boxes to (xmin, ymin, xmax, ymax) 18 | representation for comparison to point form ground truth data. 19 | Args: 20 | boxes: (tensor) center-size default boxes from priorbox layers. 21 | Return: 22 | boxes: (tensor) Converted xmin, ymin, xmax, ymax form of boxes. 23 | """ 24 | return paddle.concat((boxes[:, :2] - boxes[:, 2:]/2, # xmin, ymin 25 | boxes[:, :2] + boxes[:, 2:]/2), 1) # xmax, ymax 26 | 27 | 28 | def center_size(boxes): 29 | """ Convert prior_boxes to (cx, cy, w, h) 30 | representation for comparison to center-size form ground truth data. 31 | Args: 32 | boxes: (tensor) point_form boxes 33 | Return: 34 | boxes: (tensor) Converted xmin, ymin, xmax, ymax form of boxes. 35 | """ 36 | return paddle.concat((boxes[:, 2:] + boxes[:, :2])/2, # cx, cy 37 | boxes[:, 2:] - boxes[:, :2], 1) # w, h 38 | 39 | 40 | def intersect(box_a, box_b): 41 | """ We resize both tensors to [A,B,2] without new malloc: 42 | [A,2] -> [A,1,2] -> [A,B,2] 43 | [B,2] -> [1,B,2] -> [A,B,2] 44 | Then we compute the area of intersect between box_a and box_b. 45 | Args: 46 | box_a: (tensor) bounding boxes, Shape: [A,4]. 47 | box_b: (tensor) bounding boxes, Shape: [B,4]. 48 | Return: 49 | (tensor) intersection area, Shape: [A,B]. 50 | """ 51 | A = box_a.shape[0] 52 | B = box_b.shape[0] 53 | max_xy = paddle.minimum(box_a[:, 2:].unsqueeze(1).expand([A, B, 2]), 54 | box_b[:, 2:].unsqueeze(0).expand([A, B, 2])) 55 | min_xy = paddle.maximum(box_a[:, :2].unsqueeze(1).expand([A, B, 2]), 56 | box_b[:, :2].unsqueeze(0).expand([A, B, 2])) 57 | inter = paddle.clip(max_xy - min_xy, min=0) 58 | return inter[:, :, 0] * inter[:, :, 1] 59 | 60 | 61 | def jaccard(box_a, box_b): 62 | """Compute the jaccard overlap of two sets of boxes. The jaccard overlap 63 | is simply the intersection over union of two boxes. Here we operate on 64 | ground truth boxes and default boxes. 65 | E.g.: 66 | A ∩ B / A ∪ B = A ∩ B / (area(A) + area(B) - A ∩ B) 67 | Args: 68 | box_a: (tensor) Ground truth bounding boxes, Shape: [num_objects,4] 69 | box_b: (tensor) Prior boxes from priorbox layers, Shape: [num_priors,4] 70 | Return: 71 | jaccard overlap: (tensor) Shape: [box_a.shape[0], box_b.shape[0]] 72 | """ 73 | inter = intersect(box_a, box_b) 74 | area_a = ((box_a[:, 2]-box_a[:, 0]) * 75 | (box_a[:, 3]-box_a[:, 1])).unsqueeze(1).expand_as(inter) # [A,B] 76 | area_b = ((box_b[:, 2]-box_b[:, 0]) * 77 | (box_b[:, 3]-box_b[:, 1])).unsqueeze(0).expand_as(inter) # [A,B] 78 | union = area_a + area_b - inter 79 | return inter / union # [A,B] 80 | 81 | 82 | def matrix_iou(a, b): 83 | """ 84 | return iou of a and b, numpy version for data augenmentation 85 | """ 86 | lt = np.maximum(a[:, np.newaxis, :2], b[:, :2]) 87 | rb = np.minimum(a[:, np.newaxis, 2:], b[:, 2:]) 88 | 89 | area_i = np.prod(rb - lt, axis=2) * (lt < rb).all(axis=2) 90 | area_a = np.prod(a[:, 2:] - a[:, :2], axis=1) 91 | area_b = np.prod(b[:, 2:] - b[:, :2], axis=1) 92 | return area_i / (area_a[:, np.newaxis] + area_b - area_i) 93 | 94 | 95 | def matrix_iof(a, b): 96 | """ 97 | return iof of a and b, numpy version for data augenmentation 98 | """ 99 | lt = np.maximum(a[:, np.newaxis, :2], b[:, :2]) 100 | rb = np.minimum(a[:, np.newaxis, 2:], b[:, 2:]) 101 | 102 | area_i = np.prod(rb - lt, axis=2) * (lt < rb).all(axis=2) 103 | area_a = np.prod(a[:, 2:] - a[:, :2], axis=1) 104 | return area_i / np.maximum(area_a[:, np.newaxis], 1) 105 | 106 | 107 | def match(threshold, truths, priors, variances, labels, landms, loc_t, conf_t, landm_t, idx): 108 | """Match each prior box with the ground truth box of the highest jaccard 109 | overlap, encode the bounding boxes, then return the matched indices 110 | corresponding to both confidence and location preds. 111 | Args: 112 | threshold: (float) The overlap threshold used when mathing boxes. 113 | truths: (tensor) Ground truth boxes, Shape: [num_obj, 4]. 114 | priors: (tensor) Prior boxes from priorbox layers, Shape: [n_priors,4]. 115 | variances: (tensor) Variances corresponding to each prior coord, 116 | Shape: [num_priors, 4]. 117 | labels: (tensor) All the class labels for the image, Shape: [num_obj]. 118 | landms: (tensor) Ground truth landms, Shape [num_obj, 10]. 119 | loc_t: (tensor) Tensor to be filled w/ endcoded location targets. 120 | conf_t: (tensor) Tensor to be filled w/ matched indices for conf preds. 121 | landm_t: (tensor) Tensor to be filled w/ endcoded landm targets. 122 | idx: (int) current batch index 123 | Return: 124 | The matched indices corresponding to 1)location 2)confidence 3)landm preds. 125 | """ 126 | # jaccard index 127 | overlaps = jaccard( 128 | truths, 129 | point_form(priors) 130 | ) 131 | # (Bipartite Matching) 132 | # [1,num_objects] best prior for each ground truth 133 | best_prior_overlap, best_prior_idx = overlaps.max(1, keepdim=True), overlaps.argmax(1, keepdim=True) 134 | 135 | # ignore hard gt 136 | valid_gt_idx = best_prior_overlap[:, 0] >= 0.2 137 | best_prior_idx_filter = best_prior_idx.masked_select(valid_gt_idx.unsqueeze(1)).unsqueeze(1) 138 | if best_prior_idx_filter.shape[0] <= 0: 139 | loc_t[idx] = 0 140 | conf_t[idx] = 0 141 | return 142 | 143 | # [1,num_priors] best ground truth for each prior 144 | best_truth_overlap, best_truth_idx = overlaps.max(0, keepdim=True), overlaps.argmax(0, keepdim=True) 145 | best_truth_idx = best_truth_idx.squeeze(0) 146 | best_truth_overlap = best_truth_overlap.squeeze(0) 147 | best_prior_idx = best_prior_idx.squeeze(1) 148 | best_prior_idx_filter = best_prior_idx_filter.squeeze(1) 149 | best_prior_overlap = best_prior_overlap.squeeze(1) 150 | best_truth_overlap = index_fill(best_truth_overlap, best_prior_idx_filter, 2) # ensure best prior 151 | # TODO refactor: index best_prior_idx with long tensor 152 | # ensure every gt matches with its prior of max overlap 153 | for j in range(best_prior_idx.shape[0]): # 判别此anchor是预测哪一个boxes 154 | best_truth_idx[best_prior_idx[j]] = j 155 | 156 | matches = paddle.to_tensor(truths.numpy()[best_truth_idx.numpy()]) # Shape: [num_priors,4] 此处为每一个anchor对应的bbox取出来 157 | conf = paddle.to_tensor(labels.numpy()[best_truth_idx.numpy()]) # Shape: [num_priors] 此处为每一个anchor对应的label取出来 158 | temp_conf = conf.numpy() 159 | temp_conf[(best_truth_overlap < threshold).numpy()] = 0 # label as background overlap<0.35的全部作为负样本 160 | conf = paddle.to_tensor(temp_conf).astype('int32') 161 | loc = encode(matches, priors, variances) 162 | matches_landm = paddle.to_tensor(landms.numpy()[best_truth_idx.numpy()]) 163 | landm = encode_landm(matches_landm, priors, variances) 164 | loc_t[idx] = loc # [num_priors,4] encoded offsets to learn 165 | conf_t[idx] = conf # [num_priors] top class label for each prior 166 | landm_t[idx] = landm 167 | 168 | 169 | def encode(matched, priors, variances): 170 | """Encode the variances from the priorbox layers into the ground truth boxes 171 | we have matched (based on jaccard overlap) with the prior boxes. 172 | Args: 173 | matched: (tensor) Coords of ground truth for each prior in point-form 174 | Shape: [num_priors, 4]. 175 | priors: (tensor) Prior boxes in center-offset form 176 | Shape: [num_priors,4]. 177 | variances: (list[float]) Variances of priorboxes 178 | Return: 179 | encoded boxes (tensor), Shape: [num_priors, 4] 180 | """ 181 | 182 | # dist b/t match center and prior's center 183 | g_cxcy = (matched[:, :2] + matched[:, 2:])/2 - priors[:, :2] 184 | # encode variance 185 | g_cxcy /= (variances[0] * priors[:, 2:]) 186 | # match wh / prior wh 187 | g_wh = (matched[:, 2:] - matched[:, :2]) / priors[:, 2:] 188 | g_wh = paddle.log(g_wh) / variances[1] 189 | # return target for smooth_l1_loss 190 | return paddle.concat([g_cxcy, g_wh], 1) # [num_priors,4] 191 | 192 | def encode_landm(matched, priors, variances): 193 | """Encode the variances from the priorbox layers into the ground truth boxes 194 | we have matched (based on jaccard overlap) with the prior boxes. 195 | Args: 196 | matched: (tensor) Coords of ground truth for each prior in point-form 197 | Shape: [num_priors, 10]. 198 | priors: (tensor) Prior boxes in center-offset form 199 | Shape: [num_priors,4]. 200 | variances: (list[float]) Variances of priorboxes 201 | Return: 202 | encoded landm (tensor), Shape: [num_priors, 10] 203 | """ 204 | 205 | # dist b/t match center and prior's center 206 | matched = paddle.reshape(matched, [matched.shape[0], 5, 2]) 207 | priors_cx = priors[:, 0].unsqueeze(1).expand([matched.shape[0], 5]).unsqueeze(2) 208 | priors_cy = priors[:, 1].unsqueeze(1).expand([matched.shape[0], 5]).unsqueeze(2) 209 | priors_w = priors[:, 2].unsqueeze(1).expand([matched.shape[0], 5]).unsqueeze(2) 210 | priors_h = priors[:, 3].unsqueeze(1).expand([matched.shape[0], 5]).unsqueeze(2) 211 | priors = paddle.concat([priors_cx, priors_cy, priors_w, priors_h], axis=2) 212 | g_cxcy = matched[:, :, :2] - priors[:, :, :2] 213 | # encode variance 214 | g_cxcy /= (variances[0] * priors[:, :, 2:]) 215 | # g_cxcy /= priors[:, :, 2:] 216 | g_cxcy = g_cxcy.reshape([g_cxcy.shape[0], -1]) 217 | # return target for smooth_l1_loss 218 | return g_cxcy 219 | 220 | 221 | # Adapted from https://github.com/Hakuyume/chainer-ssd 222 | def decode(loc, priors, variances): 223 | """Decode locations from predictions using priors to undo 224 | the encoding we did for offset regression at train time. 225 | Args: 226 | loc (tensor): location predictions for loc layers, 227 | Shape: [num_priors,4] 228 | priors (tensor): Prior boxes in center-offset form. 229 | Shape: [num_priors,4]. 230 | variances: (list[float]) Variances of priorboxes 231 | Return: 232 | decoded bounding box predictions 233 | """ 234 | 235 | boxes = paddle.concat(( 236 | priors[:, :2] + loc[:, :2] * variances[0] * priors[:, 2:], 237 | priors[:, 2:] * paddle.exp(loc[:, 2:] * variances[1])), 1) 238 | boxes[:, :2] -= boxes[:, 2:] / 2 239 | boxes[:, 2:] += boxes[:, :2] 240 | return boxes 241 | 242 | def decode_landm(pre, priors, variances): 243 | """Decode landm from predictions using priors to undo 244 | the encoding we did for offset regression at train time. 245 | Args: 246 | pre (tensor): landm predictions for loc layers, 247 | Shape: [num_priors,10] 248 | priors (tensor): Prior boxes in center-offset form. 249 | Shape: [num_priors,4]. 250 | variances: (list[float]) Variances of priorboxes 251 | Return: 252 | decoded landm predictions 253 | """ 254 | landms = paddle.concat((priors[:, :2] + pre[:, :2] * variances[0] * priors[:, 2:], 255 | priors[:, :2] + pre[:, 2:4] * variances[0] * priors[:, 2:], 256 | priors[:, :2] + pre[:, 4:6] * variances[0] * priors[:, 2:], 257 | priors[:, :2] + pre[:, 6:8] * variances[0] * priors[:, 2:], 258 | priors[:, :2] + pre[:, 8:10] * variances[0] * priors[:, 2:], 259 | ), axis=1) 260 | return landms 261 | 262 | 263 | def log_sum_exp(x): 264 | """Utility function for computing log_sum_exp while determining 265 | This will be used to determine unaveraged confidence loss across 266 | all examples in a batch. 267 | Args: 268 | x (Variable(tensor)): conf_preds from conf layers 269 | """ 270 | x_max = x.max() 271 | return paddle.log(paddle.sum(paddle.exp(x-x_max), 1, keepdim=True)) + x_max 272 | 273 | 274 | # Original author: Francisco Massa: 275 | # https://github.com/fmassa/object-detection.torch 276 | # Ported to PyTorch by Max deGroot (02/01/2017) 277 | def nms(boxes, scores, overlap=0.5, top_k=200): 278 | """Apply non-maximum suppression at test time to avoid detecting too many 279 | overlapping bounding boxes for a given object. 280 | Args: 281 | boxes: (tensor) The location preds for the img, Shape: [num_priors,4]. 282 | scores: (tensor) The class predscores for the img, Shape:[num_priors]. 283 | overlap: (float) The overlap thresh for suppressing unnecessary boxes. 284 | top_k: (int) The Maximum number of box preds to consider. 285 | Return: 286 | The indices of the kept boxes with respect to num_priors. 287 | """ 288 | 289 | keep = paddle.to_tensor(scores.shape[0]).fill_(0).long() 290 | if boxes.numel() == 0: 291 | return keep 292 | x1 = boxes[:, 0] 293 | y1 = boxes[:, 1] 294 | x2 = boxes[:, 2] 295 | y2 = boxes[:, 3] 296 | area = paddle.multiply(x2 - x1, y2 - y1) 297 | v, idx = scores.sort(0) # sort in ascending order 298 | # I = I[v >= 0.01] 299 | idx = idx[-top_k:] # indices of the top-k largest vals 300 | xx1 = boxes.new() 301 | yy1 = boxes.new() 302 | xx2 = boxes.new() 303 | yy2 = boxes.new() 304 | w = boxes.new() 305 | h = boxes.new() 306 | 307 | # keep = paddle.Tensor() 308 | count = 0 309 | while idx.numel() > 0: 310 | i = idx[-1] # index of current largest val 311 | # keep.append(i) 312 | keep[count] = i 313 | count += 1 314 | if idx.shape[0] == 1: 315 | break 316 | idx = idx[:-1] # remove kept element from view 317 | # load bboxes of next highest vals 318 | paddle.index_select(x1, 0, idx, out=xx1) 319 | paddle.index_select(y1, 0, idx, out=yy1) 320 | paddle.index_select(x2, 0, idx, out=xx2) 321 | paddle.index_select(y2, 0, idx, out=yy2) 322 | # store element-wise max with next highest score 323 | xx1 = paddle.clip(xx1, min=x1[i]) 324 | yy1 = paddle.clip(yy1, min=y1[i]) 325 | xx2 = paddle.clip(xx2, max=x2[i]) 326 | yy2 = paddle.clip(yy2, max=y2[i]) 327 | w.resize_as_(xx2) 328 | h.resize_as_(yy2) 329 | w = xx2 - xx1 330 | h = yy2 - yy1 331 | # check sizes of xx1 and xx2.. after each iteration 332 | w = paddle.clip(w, min=0.0) 333 | h = paddle.clip(h, min=0.0) 334 | inter = w*h 335 | # IoU = i / (area(a) + area(b) - i) 336 | rem_areas = paddle.index_select(area, 0, idx) # load remaining areas) 337 | union = (rem_areas - inter) + area[i] 338 | IoU = inter/union # store result in iou 339 | # keep only elements with an IoU <= overlap 340 | idx = idx[IoU.le(overlap)] 341 | return keep, count 342 | 343 | 344 | -------------------------------------------------------------------------------- /data/FDDB/img_list.txt: -------------------------------------------------------------------------------- 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 2846 | --------------------------------------------------------------------------------