├── .gitattributes ├── .gitignore ├── Dockerfile ├── README.md ├── config ├── __init__.py └── parameters.py ├── fig ├── 1.gif ├── 1575527368225.png ├── 1575530185666.png ├── 1575530264099.png ├── 2.gif └── 3.gif ├── lib ├── __init__.py ├── center_loss.py ├── dataset.py ├── generate_captcha.py ├── optimizer.py └── scheduler.py ├── model ├── BNNeck.py ├── IBN.py ├── __init__.py ├── captchaNet.py ├── dense.py ├── dualpooling.py ├── model.py ├── res18.py └── senet.py ├── predict.py ├── requirements.txt ├── result └── submission.csv ├── run.py ├── test.py ├── train.py └── utils ├── Visdom.py ├── __init__.py ├── cutoff.py ├── dataAug.py ├── randomCropPatch.py └── randomSelect.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.pyc 3 | *.jpg 4 | *.xml 5 | *.iml 6 | .idea/Visdom.py 7 | *.json 8 | *.out 9 | *.pth 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | from conda/miniconda3-centos7 2 | workdir /code 3 | copy . /code 4 | run pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 计算机挑战赛 2019 验证码识别竞赛 一等奖方案 2 | 3 | 4 | ###
1. Background
5 | 6 | 基于进行改进,原版中数据集采用的captcha库自动生成的图片,可以随意制定生成数量,并且相对而言生成的图片比较简单。 7 | 8 | 本次项目是全国高校计算机能力挑战赛中的人工智能赛道里的验证码识别,该比赛需要识别26(大写)+26(小写)+数字(10)= 62个字符,随机组成的四位验证码图片。训练集仅有5000张,并且识别的难度系数较大,人眼有时候也很容易识别出错。 9 | 10 | 11 | 12 | ###
2. Environment
13 | 14 | - 显存:4G+ 15 | 16 | - Ubuntu16.04 17 | 18 | - numpy 19 | 20 | - pandas 21 | 22 | - torch==1.3.1 23 | 24 | - torchnet==0.0.4 25 | 26 | - torchvision==0.2.0 27 | 28 | - tqdm 29 | 30 | - visdom 31 | 32 | > 可通过pip install -r requirements.txt进行环境的安装 33 | 34 | ###
3. Dataset
35 | 36 | ![1575527368225](./fig/1575527368225.png) 37 | 38 | 比赛提供的数据集如图所示,120$\times$40的像素的图片,然后标签是由图片名称提供的。训练集测试集划分:80%的数据用于训练集,20%的数据用于测试集。 39 | 40 | - 训练图片个数为:3988 41 | 42 | - 测试图片个数为:1000 43 | 44 | 训练的数据还是明显不够的,考虑使用数据增强,通过查找github上很多做数据增强的库,最终选择了Augmentor库作为图像增强的库。 45 | 46 | 安装方式:`pip install Augmentor` 47 | 48 | API: 49 | 50 | 由于验证码与普通的分类图片有一定区别,所以选择的增强方式有一定局限,经过几轮实验,最终选取了distortion类的方法作为具体增强方法,输入为训练所用的图片,输出设置为原来图片个数的2倍,具体代码见dataAug.py, 核心代码如下: 51 | 52 | ```python 53 | def get_distortion_pipline(path, num): 54 | p = Augmentor.Pipeline(path) 55 | p.zoom(probability=0.5, min_factor=1.05, max_factor=1.05) 56 | p.random_distortion(probability=1, grid_width=6, grid_height=2, magnitude=3) 57 | p.sample(num) 58 | return p 59 | ``` 60 | 61 | 将得到的图片重命名为auged_train文件夹,最终数据集组成如下: 62 | 63 | ``` 64 | root 65 | - data 66 | - train:3988张 67 | - test:1000张 68 | - auged_train:7976张 69 | ``` 70 | 71 | > 如果需要数据集请联系我,联系方式在最后 72 | > 73 | > 链接:https://pan.baidu.com/s/13BmN7Na4ESTPAgyfBAHMxA 74 | > 提取码:v4nk 75 | 76 | 数据集结构的组织,从网盘下载数据以后,按照以下文件夹格式进行组织: 77 | 78 | ``` 79 | - data 80 | - train 81 | - test 82 | - auged_train 83 | ``` 84 | 85 | 然后就可以训练了。 86 | 87 | ###
4. Structure
88 | 89 | ``` 90 | root 91 | - config 92 | - parameters.py 主要包括超参数,最重要的是learning rate 93 | - lib 94 | - center_loss.py 将center loss引入,用于训练 95 | - dataset.py 包装Dataset,针对train文件夹和auged_train文件夹内容各自写了一个处理类 96 | - generate_captcha.py 生成简单的数据集,在没有官方数据集的情况下 97 | - optimizer.py RAdam, AdamW, label smooth等新的optimizer 98 | - scheduler.py 新增了warmup机制 99 | - model 100 | - BNNeck.py 基于resnet18使用了bnnect结构,来自罗浩大佬行人检测中的trick 101 | - CaptchaNet.py 手工构建的一个简单网络,原有库提供的 102 | - dense.py 更改backbone,使用dense121作为backbone,其他也可以更改 103 | - dualpooling.py 在resnet18基础上添加了dual pooling,增加了信息 104 | - IBN.py 使用ibn模块,以resnet18为基础 105 | - model.py resnet18,添加dropout 106 | - res18.py 引入了attention机制和dual pooling 107 | - senet.py 将senet作为backbone 108 | - result 109 | - submission.csv 结果保存 110 | - utils 111 | - cutoff.py 数据增强方法,不适合验证码,可以用在普通图片 112 | - dataAug.py 使用Agumentor进行数据增强 113 | - Visdom.py 使用visdom记录log,进行可视化 114 | - predict.py 引入了多模型预测,然后分析结果 115 | - run.py 与predict类似,不过是单模型的预测 116 | - test.py 规定测试模型权重,待测试图片路径,对测试集进行测试 117 | - train.py 模型的训练,每个epoch先训练所有的train,然后训练所有的auged_train图片 118 | ``` 119 | 120 | ###
5. Result
121 | 122 | 最好结果: 123 | 124 | ResNet18+Dropout(0.5)+RAdam+DataAugmentation+lr(3e-4) = 98.4%测试集准确率,线上A榜:97% 125 | 126 | ![1575530185666](./fig/1575530185666.png) 127 | 128 | 129 | 130 | 模型分析:分析四个模型,python predict.py 观察预测出错的结果,评判模型好坏,最终选择了0号模型。 131 | 132 | ![1575530264099](./fig/1575530264099.png) 133 | 134 | ###
6. Procedure
135 | 136 | 调参过程记录:null代表未记录 137 | 138 | | Name | item1 | item2 | item3 | item4 | item5 | 测试:线上 | 139 | | ---------- | -------- | ---------------------- | ------- | ----- | --------- | --------------- | 140 | | baseline0 | ResNet18 | lr=1e-3 | 4:1划分 | Adam | | 88%:84% | 141 | | baseline1 | ResNet34 | lr=1e-3 | 4:1划分 | Adam | | 90%:84% | 142 | | baseline2 | ResNet18 | lr=1e-3 | 4:1划分 | RAdam | | null:**90%** | 143 | | baseline3 | ResNet18 | lr=3e-4 | 4:1划分 | RAdam | | 未收敛 | 144 | | baseline4 | ResNet18 | lr=1e-1 | 4:1划分 | RAdam | | 96.4%:87% | 145 | | baseline5 | ResNet18 | lr=1e-1 | 4:1划分 | RAdam | aug0 | 98%:**93%** | 146 | | baseline6 | ResNet18 | lr=1e-1 | 9:1划分 | RAdam | aug1 | 60%:null | 147 | | baseline7 | ResNet18 | lr=1e-3 | 4:1划分 | RAdam | aug2 | null:94% | 148 | | baseline8 | ResNet18 | lr=1e-3 | 4:1划分 | AdamW | aug2 | 98.4%:92.56% | 149 | | baseline9 | ResNet18 | lr=1e-3 | 4:1划分 | RAdam | aug3 | null:93.52% | 150 | | baseline10 | ResNet18 | lr=1e-3 | 4:1划分 | RAdam | aug4 | null:94.16% | 151 | | baseline11 | ResNet18 | lr=1e-3 | 9:1划分 | RAdam | aug5 | 60%:null | 152 | | baseline12 | ResNet18 | lr=3.5e-4 | 4:1划分 | RAdam | aug2 | null:**94.72%** | 153 | | baseline13 | ResNet18 | lr=3.5e-4 decay:6e-4 | 4:1划分 | RAdam | aug2 | null:**95.16%** | 154 | | baseline14 | ResNet18 | lr=3.5e-4 decay:7e-4 | 4:1划分 | RAdam | aug2 | bad | 155 | | baseline15 | ResNet18 | lr=3.5e-5 decay:6.5e-4 | 4:1划分 | RAdam | aug2 | null:95% | 156 | | baseline16 | ResNet18 | lr=3.5e-5 decay:6.5e-4 | 4:1划分 | RAdam | drop(0.5) | null:97% | 157 | 158 | 以上的aug代表数据增强: 159 | 160 | - **aug0:** +distrotion 161 | 162 | - **aug1**: 9:1划分+扩增3倍 163 | 164 | - **aug2**: +distortion+zoom 165 | 166 | - **aug3:** +tilt+扩增两倍 167 | 168 | - **aug4:** aug2+aug3混合 169 | 170 | - **aug5:** 9:1划分 +tilt倾斜 171 | 172 | 数据增强示意图: 173 | 174 | | example1 | example2 | example3 | 175 | | :---------------: | :---------------: | :---------------: | 176 | | ![1](./fig/1.gif) | ![2](./fig/2.gif) | ![3](./fig/3.gif) | 177 | 178 | 后期由于错过了提交时间,只能进行测试集上的测试,主要方案有以下: 179 | 180 | - learning rate scheduler尝试:CosineAnnealingLR, ReduceLROnPlateau,StepLR,MultiStepLR 181 | - 更改backbone: senet, densenet 182 | - 在res18基础上添加:attention机制,dual pooling, ibn模块,bnneck等 183 | - 尝试center loss,收敛很慢,但是效果应该不错 184 | 185 | 还未尝试的方案: 186 | 187 | - label smooth 188 | - 多模型ensemble 189 | 190 | --- 191 | 192 | 193 | - CSDN: 194 | 195 | - 博客园: 196 | 197 | 198 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/config/__init__.py -------------------------------------------------------------------------------- /config/parameters.py: -------------------------------------------------------------------------------- 1 | tensorLength = 248 2 | charLength = 62 3 | charNumber = 4 4 | ImageWidth = 120 5 | ImageHeight = 40 6 | 7 | learningRate = 3e-4 # 3e-4 #3.5e-4 # 1e-2 8 | totalEpoch = 600 9 | batchSize = 4 10 | printCircle = 10 11 | 12 | trainPath = "./data/train" 13 | augedTrainPath = "./data/auged_train" 14 | testPath = "./data/test" -------------------------------------------------------------------------------- /fig/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/1.gif -------------------------------------------------------------------------------- /fig/1575527368225.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/1575527368225.png -------------------------------------------------------------------------------- /fig/1575530185666.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/1575530185666.png -------------------------------------------------------------------------------- /fig/1575530264099.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/1575530264099.png -------------------------------------------------------------------------------- /fig/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/2.gif -------------------------------------------------------------------------------- /fig/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/fig/3.gif -------------------------------------------------------------------------------- /lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/lib/__init__.py -------------------------------------------------------------------------------- /lib/center_loss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | 5 | class CenterLoss(nn.Module): 6 | """Center loss. 7 | 8 | Reference: 9 | Wen et al. A Discriminative Feature Learning Approach for Deep Face Recognition. ECCV 2016. 10 | 11 | Args: 12 | num_classes (int): number of classes. 13 | feat_dim (int): feature dimension. 14 | """ 15 | 16 | def __init__(self, num_classes=10, feat_dim=2, use_gpu=True): 17 | super(CenterLoss, self).__init__() 18 | self.num_classes = num_classes 19 | self.feat_dim = feat_dim 20 | self.use_gpu = use_gpu 21 | 22 | if self.use_gpu: 23 | self.centers = nn.Parameter(torch.randn( 24 | self.num_classes, self.feat_dim).cuda()) 25 | else: 26 | self.centers = nn.Parameter( 27 | torch.randn(self.num_classes, self.feat_dim)) 28 | 29 | def forward(self, x, labels): 30 | """ 31 | Args: 32 | x: feature matrix with shape (batch_size, feat_dim). 33 | labels: ground truth labels with shape (batch_size). 34 | """ 35 | batch_size = x.size(0) 36 | distmat = torch.pow(x, 2).sum(dim=1, keepdim=True).expand(batch_size, self.num_classes) + \ 37 | torch.pow(self.centers, 2).sum(dim=1, keepdim=True).expand( 38 | self.num_classes, batch_size).t() 39 | distmat.addmm_(1, -2, x, self.centers.t()) 40 | 41 | classes = torch.arange(self.num_classes).long() 42 | if self.use_gpu: 43 | classes = classes.cuda() 44 | labels = labels.unsqueeze(1).expand(batch_size, self.num_classes) 45 | mask = labels.eq(classes.expand(batch_size, self.num_classes)) 46 | 47 | dist = distmat * mask.float() 48 | loss = dist.clamp(min=1e-12, max=1e+12).sum() / batch_size 49 | 50 | return loss 51 | -------------------------------------------------------------------------------- /lib/dataset.py: -------------------------------------------------------------------------------- 1 | import os 2 | from PIL import Image 3 | from torch.utils import data 4 | import numpy as np 5 | from torchvision import transforms as T 6 | from config.parameters import * 7 | import torch as t 8 | # from dataAug import get_aug_pipline 9 | import re 10 | 11 | nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 12 | lower_char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 13 | 'v', 'w', 'x', 'y', 'z'] 14 | upper_char = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 15 | 'V', 'W', 'X', 'Y', 'Z'] 16 | 17 | 18 | def StrtoLabel(Str): 19 | # print(Str) 20 | label = [] 21 | for i in range(0, charNumber): 22 | if Str[i] >= '0' and Str[i] <= '9': 23 | label.append(ord(Str[i]) - ord('0')) 24 | elif Str[i] >= 'a' and Str[i] <= 'z': 25 | label.append(ord(Str[i]) - ord('a') + 10) 26 | else: 27 | label.append(ord(Str[i]) - ord('A') + 36) 28 | return label 29 | 30 | 31 | def LabeltoStr(Label): 32 | Str = "" 33 | for i in Label: 34 | if i <= 9: 35 | Str += chr(ord('0') + i) 36 | elif i <= 35: 37 | Str += chr(ord('a') + i - 10) 38 | else: 39 | Str += chr(ord('A') + i - 36) 40 | return Str 41 | 42 | class augCaptcha(data.Dataset): 43 | def __init__(self, root, train=True): 44 | self.imgsPath = [os.path.join(root, img) for img in os.listdir(root)] 45 | # p = get_aug_pipline() 46 | self.transform = T.Compose([ 47 | T.Resize((ImageHeight, ImageWidth)), 48 | # p.torch_transform(), 49 | T.ToTensor(), 50 | T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) 51 | ]) 52 | 53 | def __getitem__(self, index): 54 | imgPath = self.imgsPath[index] 55 | # print(imgPath) 56 | img_name = os.path.basename(imgPath) 57 | # print(img_name) 58 | pattern = re.compile(r'\w+_original_(\d*\w*)') 59 | label = pattern.search(img_name).groups()[0] 60 | # print(label) 61 | # label = imgPath.split("/")[-1].split(".")[0] 62 | # print(label) 63 | labelTensor = t.Tensor(StrtoLabel(label)) 64 | data = Image.open(imgPath) 65 | # print(data.size) 66 | data = self.transform(data) 67 | # print(data.shape) 68 | return data, labelTensor 69 | 70 | def __len__(self): 71 | return len(self.imgsPath) 72 | 73 | class Captcha(data.Dataset): 74 | def __init__(self, root, train=True): 75 | self.imgsPath = [os.path.join(root, img) for img in os.listdir(root)] 76 | # p = get_aug_pipline() 77 | self.transform = T.Compose([ 78 | T.Resize((ImageHeight, ImageWidth)), 79 | # p.torch_transform(), 80 | T.ToTensor(), 81 | T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) 82 | ]) 83 | 84 | def __getitem__(self, index): 85 | imgPath = self.imgsPath[index] 86 | # print(imgPath) 87 | label = imgPath.split("/")[-1].split(".")[0] 88 | # print(label) 89 | labelTensor = t.Tensor(StrtoLabel(label)) 90 | data = Image.open(imgPath) 91 | # print(data.size) 92 | data = self.transform(data) 93 | # print(data.shape) 94 | return data, labelTensor 95 | 96 | def __len__(self): 97 | return len(self.imgsPath) 98 | 99 | 100 | if __name__ == '__main__': 101 | trainDataset = Captcha(trainRoot, train=True) 102 | # print(trainDataset.__getitem__(1000)) 103 | # data = Image.open("./训练数据集\\ZzN3.jpg") 104 | # data.show() 105 | # trainDataset.__getitem__(4224) 106 | # labelTensor = t.zeros(tensorLength) 107 | labelTensor = StrtoLabel("34Tt") 108 | print(labelTensor) 109 | print(LabeltoStr(labelTensor)) 110 | -------------------------------------------------------------------------------- /lib/generate_captcha.py: -------------------------------------------------------------------------------- 1 | from captcha.image import ImageCaptcha 2 | import random as rd 3 | 4 | # 该文件用于随机生成大量的验证码 5 | nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 6 | lower_char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 7 | 'v', 'w', 'x', 'y', 'z'] 8 | upper_char = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 9 | 'V', 'W', 'X', 'Y', 'Z'] 10 | 11 | 12 | def get_width(): 13 | return int(100 + 40 * rd.random()) 14 | 15 | 16 | def get_height(): 17 | return int(45 + 20 * rd.random()) 18 | 19 | 20 | def get_string(): 21 | string = "" 22 | for i in range(4): 23 | select = rd.randint(1, 3) 24 | if select == 1: 25 | index = rd.randint(0, 9) 26 | string += nums[index] 27 | elif select == 2: 28 | index = rd.randint(0, 25) 29 | string += lower_char[index] 30 | else: 31 | index = rd.randint(0, 25) 32 | string += upper_char[index] 33 | return string 34 | 35 | 36 | def get_captcha(num, path): 37 | font_sizes = [x for x in range(40, 45)] 38 | for i in range(num): 39 | print(i) 40 | imc = ImageCaptcha(get_width(), get_height(), font_sizes=font_sizes) 41 | name = get_string() 42 | image = imc.generate_image(name) 43 | image.save(path + name + ".jpg") 44 | 45 | 46 | if __name__ == '__main__': 47 | get_captcha(10000, "./data/train") 48 | get_captcha(2000, "./data/test") 49 | -------------------------------------------------------------------------------- /lib/optimizer.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import math 3 | import torch 4 | from torch.optim.optimizer import Optimizer, required 5 | 6 | class RAdam(Optimizer): 7 | 8 | def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=0): 9 | defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay) 10 | self.buffer = [[None, None, None] for ind in range(10)] 11 | super(RAdam, self).__init__(params, defaults) 12 | 13 | def __setstate__(self, state): 14 | super(RAdam, self).__setstate__(state) 15 | 16 | def step(self, closure=None): 17 | loss = None 18 | if closure is not None: 19 | loss = closure() 20 | 21 | for group in self.param_groups: 22 | for p in group['params']: 23 | if p.grad is None: 24 | continue 25 | grad = p.grad.data.float() 26 | if grad.is_sparse: 27 | raise RuntimeError('RAdam does not support sparse gradients') 28 | 29 | p_data_fp32 = p.data.float() 30 | 31 | state = self.state[p] 32 | 33 | if len(state) == 0: 34 | state['step'] = 0 35 | state['exp_avg'] = torch.zeros_like(p_data_fp32) 36 | state['exp_avg_sq'] = torch.zeros_like(p_data_fp32) 37 | else: 38 | state['exp_avg'] = state['exp_avg'].type_as(p_data_fp32) 39 | state['exp_avg_sq'] = state['exp_avg_sq'].type_as(p_data_fp32) 40 | 41 | exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq'] 42 | beta1, beta2 = group['betas'] 43 | 44 | exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad) 45 | exp_avg.mul_(beta1).add_(1 - beta1, grad) 46 | 47 | state['step'] += 1 48 | buffered = self.buffer[int(state['step'] % 10)] 49 | if state['step'] == buffered[0]: 50 | N_sma, step_size = buffered[1], buffered[2] 51 | else: 52 | buffered[0] = state['step'] 53 | beta2_t = beta2 ** state['step'] 54 | N_sma_max = 2 / (1 - beta2) - 1 55 | N_sma = N_sma_max - 2 * state['step'] * beta2_t / (1 - beta2_t) 56 | buffered[1] = N_sma 57 | 58 | # more conservative since it's an approximated value 59 | if N_sma >= 5: 60 | step_size = group['lr'] * math.sqrt((1 - beta2_t) * (N_sma - 4) / (N_sma_max - 4) * (N_sma - 2) / N_sma * N_sma_max / (N_sma_max - 2)) / (1 - beta1 ** state['step']) 61 | else: 62 | step_size = group['lr'] / (1 - beta1 ** state['step']) 63 | buffered[2] = step_size 64 | 65 | if group['weight_decay'] != 0: 66 | p_data_fp32.add_(-group['weight_decay'] * group['lr'], p_data_fp32) 67 | 68 | # more conservative since it's an approximated value 69 | if N_sma >= 5: 70 | denom = exp_avg_sq.sqrt().add_(group['eps']) 71 | p_data_fp32.addcdiv_(-step_size, exp_avg, denom) 72 | else: 73 | p_data_fp32.add_(-step_size, exp_avg) 74 | 75 | p.data.copy_(p_data_fp32) 76 | 77 | return loss 78 | 79 | class AdamW(Optimizer): 80 | 81 | def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=0, warmup = 0): 82 | if not 0.0 <= lr: 83 | raise ValueError("Invalid learning rate: {}".format(lr)) 84 | if not 0.0 <= eps: 85 | raise ValueError("Invalid epsilon value: {}".format(eps)) 86 | if not 0.0 <= betas[0] < 1.0: 87 | raise ValueError("Invalid beta parameter at index 0: {}".format(betas[0])) 88 | if not 0.0 <= betas[1] < 1.0: 89 | raise ValueError("Invalid beta parameter at index 1: {}".format(betas[1])) 90 | 91 | defaults = dict(lr=lr, betas=betas, eps=eps, 92 | weight_decay=weight_decay, warmup = warmup) 93 | super(AdamW, self).__init__(params, defaults) 94 | 95 | def __setstate__(self, state): 96 | super(AdamW, self).__setstate__(state) 97 | 98 | def step(self, closure=None): 99 | loss = None 100 | if closure is not None: 101 | loss = closure() 102 | 103 | for group in self.param_groups: 104 | 105 | for p in group['params']: 106 | if p.grad is None: 107 | continue 108 | grad = p.grad.data.float() 109 | if grad.is_sparse: 110 | raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead') 111 | 112 | p_data_fp32 = p.data.float() 113 | 114 | state = self.state[p] 115 | 116 | if len(state) == 0: 117 | state['step'] = 0 118 | state['exp_avg'] = torch.zeros_like(p_data_fp32) 119 | state['exp_avg_sq'] = torch.zeros_like(p_data_fp32) 120 | else: 121 | state['exp_avg'] = state['exp_avg'].type_as(p_data_fp32) 122 | state['exp_avg_sq'] = state['exp_avg_sq'].type_as(p_data_fp32) 123 | 124 | exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq'] 125 | beta1, beta2 = group['betas'] 126 | 127 | state['step'] += 1 128 | 129 | exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad) 130 | exp_avg.mul_(beta1).add_(1 - beta1, grad) 131 | 132 | denom = exp_avg_sq.sqrt().add_(group['eps']) 133 | bias_correction1 = 1 - beta1 ** state['step'] 134 | bias_correction2 = 1 - beta2 ** state['step'] 135 | 136 | if group['warmup'] > state['step']: 137 | scheduled_lr = 1e-8 + state['step'] * group['lr'] / group['warmup'] 138 | else: 139 | scheduled_lr = group['lr'] 140 | 141 | step_size = scheduled_lr * math.sqrt(bias_correction2) / bias_correction1 142 | 143 | if group['weight_decay'] != 0: 144 | p_data_fp32.add_(-group['weight_decay'] * scheduled_lr, p_data_fp32) 145 | 146 | p_data_fp32.addcdiv_(-step_size, exp_avg, denom) 147 | 148 | p.data.copy_(p_data_fp32) 149 | 150 | return loss 151 | 152 | ''' 153 | criterion = LabelSmoothSoftmaxCE(lb_pos=0.9, lb_neg=5e-3) 154 | loss = criterion(out, lbs) 155 | ''' 156 | class LabelSmoothSoftmaxCE(nn.Module): 157 | def __init__(self, 158 | lb_pos=0.9, 159 | lb_neg=0.005, 160 | reduction='mean', 161 | lb_ignore=255, 162 | ): 163 | super(LabelSmoothSoftmaxCE, self).__init__() 164 | self.lb_pos = lb_pos 165 | self.lb_neg = lb_neg 166 | self.reduction = reduction 167 | self.lb_ignore = lb_ignore 168 | self.log_softmax = nn.LogSoftmax(1) 169 | 170 | def forward(self, logits, label): 171 | logs = self.log_softmax(logits) 172 | ignore = label.data.cpu() == self.lb_ignore 173 | n_valid = (ignore == 0).sum() 174 | label[ignore] = 0 175 | lb_one_hot = logits.data.clone().zero_().scatter_(1, label.unsqueeze(1), 1) 176 | label = self.lb_pos * lb_one_hot + self.lb_neg * (1-lb_one_hot) 177 | ignore = ignore.nonzero() 178 | _, M = ignore.size() 179 | a, *b = ignore.chunk(M, dim=1) 180 | label[[a, torch.arange(label.size(1)), *b]] = 0 181 | 182 | if self.reduction == 'mean': 183 | loss = -torch.sum(torch.sum(logs*label, dim=1)) / n_valid 184 | elif self.reduction == 'none': 185 | loss = -torch.sum(logs*label, dim=1) 186 | return loss 187 | 188 | class LSR(nn.Module): 189 | def __init__(self, e=0.1, reduction='mean'): 190 | super().__init__() 191 | self.log_softmax = nn.LogSoftmax(dim=1) 192 | self.e = e 193 | self.reduction=reduction 194 | def _one_hot(self, labels, classes, value=1): 195 | """ 196 | convert labels to one hot vectors 197 | args: 198 | labels: torch tensor [label1, label2...] 199 | classes: int, num of classes 200 | value: label value in one hot value, defalt to 1 201 | return: 202 | return one hot format labels in shape[bs, classes] 203 | """ 204 | one_hot = torch.zeros(labels.size()[0], classes) 205 | labels = labels.view(labels.size()[0],-1) 206 | value_added = torch.Tensor(labels.size()[0], 1).fill_(value) 207 | 208 | value_added = value_added.to(labels.device) 209 | one_hot = one_hot.to(labels.device) 210 | 211 | one_hot.scatter_add_(1, labels, value_added) 212 | return one_hot 213 | def _smooth_label(self, target, length, smooth_factor): 214 | """ 215 | args: 216 | targets: formate [label1, label2, label_batch size] 217 | length: length of one-hot format (num of classes) 218 | smooth facter: smooth factor 219 | """ 220 | one_hot = self._one_hot(target, length, value=1-smooth_factor) 221 | one_hot += smooth_factor / length 222 | return one_hot.to(target.device) 223 | -------------------------------------------------------------------------------- /lib/scheduler.py: -------------------------------------------------------------------------------- 1 | from torch.optim.lr_scheduler import ReduceLROnPlateau 2 | from torch.optim.lr_scheduler import _LRScheduler 3 | 4 | from torch.optim.lr_scheduler import _LRScheduler 5 | 6 | 7 | class GradualWarmupScheduler(_LRScheduler): 8 | """ 9 | Args: 10 | mutliplier : target learnnig rate = base lr *multiplier 11 | total epoch : target learning rate is reached at total epoch gradually 12 | after scheduler: after target_epoch , use this schedueler(ReduceLROnPlateau) 13 | """ 14 | 15 | def __init__(self, optimizer, multiplier, total_epoch, after_scheduler=None): 16 | self.multiplier = multiplier 17 | if self.multiplier <= 1.: 18 | raise ValueError('mutliplier should be greater than 1') 19 | self.total_epoch = total_epoch 20 | self.after_scheduler = after_scheduler 21 | self.finished = False 22 | super().__init__(optimizer) 23 | 24 | def get_lr(self): 25 | if self.last_epoch > self.total_epoch: 26 | if self.after_scheduler: 27 | if not self.finished: 28 | self.after_scheduler.base_lrs = [ 29 | base_lr * self.multiplier for base_lr in self.base_lrs] 30 | self.finished = True 31 | return self.after_scheduler.get_lr() 32 | return [base_lr * self.multiplier for base_lr in self.base_lrs] 33 | return [base_lr * ((self.multiplier-1.0)*self.last_epoch / self.total_epoch+1.) for base_lr in self.base_lrs] 34 | 35 | def step(self, epoch=None): 36 | if self.finished and self.after_scheduler: 37 | return self.after_scheduler.step(epoch) 38 | else: 39 | return super(GradualWarmupScheduler, self).step(epoch) 40 | -------------------------------------------------------------------------------- /model/BNNeck.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | from torchvision.models import ResNet 10 | from torchvision.models.resnet import BasicBlock 11 | from model.model import weights_init_kaiming, weights_init_classifier 12 | 13 | 14 | class ClassBlock(nn.Module): 15 | def __init__(self, 16 | input_dim, 17 | class_num, 18 | dropout=False, 19 | relu=False, 20 | num_bottleneck=512): 21 | super(ClassBlock, self).__init__() 22 | add_block = [] 23 | #add_block += [nn.Linear(input_dim, num_bottleneck)] 24 | num_bottleneck = input_dim 25 | add_block += [nn.BatchNorm1d(num_bottleneck)] 26 | if relu: 27 | add_block += [nn.LeakyReLU(0.1)] 28 | if dropout: 29 | add_block += [nn.Dropout(p=0.5)] 30 | add_block = nn.Sequential(*add_block) 31 | add_block.apply(weights_init_kaiming) 32 | 33 | classifier = [] 34 | classifier += [nn.Linear(num_bottleneck, class_num)] 35 | classifier = nn.Sequential(*classifier) 36 | classifier.apply(weights_init_classifier) 37 | 38 | self.add_block = add_block 39 | self.classifier = classifier 40 | 41 | def forward(self, x): 42 | f = self.add_block(x) 43 | f_norm = f.norm(p=2, dim=1, keepdim=True) + 1e-8 44 | f = f.div(f_norm) 45 | x = self.classifier(f) 46 | return x 47 | 48 | 49 | class bnneck(nn.Module): 50 | def __init__(self, class_num=62): 51 | super(bnneck, self).__init__() 52 | resnet = ResNet(BasicBlock, [2, 2, 2, 2]) 53 | self.base_model = nn.Sequential( 54 | resnet.conv1, 55 | resnet.bn1, 56 | resnet.relu, 57 | resnet.layer1, 58 | resnet.layer2, 59 | resnet.layer3, 60 | resnet.layer4 61 | ) 62 | self.maxpool = nn.AdaptiveMaxPool2d(1) 63 | self.bnneck = nn.BatchNorm1d(256) 64 | self.bnneck.bias.requires_grad_(False) # no shift 65 | self.reduce_layer = nn.Conv2d(512, 256, 1) 66 | 67 | # self.classifier = ClassBlock(512, 1024) 68 | self.fc1 = nn.Sequential( 69 | nn.Linear(256, class_num)) 70 | self.fc2 = nn.Sequential( 71 | nn.Linear(256, class_num)) 72 | self.fc3 = nn.Sequential( 73 | nn.Linear(256, class_num)) 74 | self.fc4 = nn.Sequential( 75 | nn.Linear(256, class_num)) 76 | 77 | def forward(self, x): 78 | bs = x.shape[0] 79 | x = self.base_model(x) 80 | x = self.maxpool(x) 81 | x = self.reduce_layer(x).view(bs, -1) 82 | feat = self.bnneck(x) 83 | if not self.training: 84 | feat = nn.functional.normalize(feat, dim=1, p=2) 85 | x1 = self.fc1(feat) 86 | x2 = self.fc2(feat) 87 | x3 = self.fc3(feat) 88 | x4 = self.fc4(feat) 89 | return x1, x2, x3, x4 90 | 91 | def save(self, circle): 92 | name = "./weights/bnneck" + str(circle) + ".pth" 93 | torch.save(self.state_dict(), name) 94 | name2 = "./weights/bnneck_new.pth" 95 | torch.save(self.state_dict(), name2) 96 | 97 | def load_model(self, weight_path): 98 | fileList = os.listdir("./weights/") 99 | # print(fileList) 100 | if "bnneck_new.pth" in fileList: 101 | name = "./weights/bnneck_new.pth" 102 | self.load_state_dict(t.load(name)) 103 | print("the latest model has been load") 104 | elif os.path.isfile(weight_path): 105 | self.load_state_dict(t.load(weight_path)) 106 | print("load %s success!" % weight_path) 107 | else: 108 | print("%s do not exists." % weight_path) 109 | -------------------------------------------------------------------------------- /model/IBN.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import math 4 | import torch.utils.model_zoo as model_zoo 5 | 6 | 7 | __all__ = ['ResNet', 'resnet50_ibn_a', 'resnet101_ibn_a', 8 | 'resnet152_ibn_a'] 9 | 10 | 11 | model_urls = { 12 | 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', 13 | 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', 14 | 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', 15 | } 16 | 17 | 18 | def conv3x3(in_planes, out_planes, stride=1): 19 | "3x3 convolution with padding" 20 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, 21 | padding=1, bias=False) 22 | 23 | 24 | class BasicBlock(nn.Module): 25 | expansion = 1 26 | 27 | def __init__(self, inplanes, planes, stride=1, downsample=None): 28 | super(BasicBlock, self).__init__() 29 | self.conv1 = conv3x3(inplanes, planes, stride) 30 | self.bn1 = nn.BatchNorm2d(planes) 31 | self.relu = nn.ReLU(inplace=True) 32 | self.conv2 = conv3x3(planes, planes) 33 | self.bn2 = nn.BatchNorm2d(planes) 34 | self.downsample = downsample 35 | self.stride = stride 36 | 37 | def forward(self, x): 38 | residual = x 39 | 40 | out = self.conv1(x) 41 | out = self.bn1(out) 42 | out = self.relu(out) 43 | 44 | out = self.conv2(out) 45 | out = self.bn2(out) 46 | 47 | if self.downsample is not None: 48 | residual = self.downsample(x) 49 | 50 | out += residual 51 | out = self.relu(out) 52 | 53 | return out 54 | 55 | 56 | class IBN(nn.Module): 57 | def __init__(self, planes): 58 | super(IBN, self).__init__() 59 | half1 = int(planes/2) 60 | self.half = half1 61 | half2 = planes - half1 62 | self.IN = nn.InstanceNorm2d(half1, affine=True) 63 | self.BN = nn.BatchNorm2d(half2) 64 | 65 | def forward(self, x): 66 | split = torch.split(x, self.half, 1) 67 | out1 = self.IN(split[0].contiguous()) 68 | out2 = self.BN(split[1].contiguous()) 69 | out = torch.cat((out1, out2), 1) 70 | return out 71 | 72 | 73 | class Bottleneck(nn.Module): 74 | expansion = 4 75 | 76 | def __init__(self, inplanes, planes, ibn=False, stride=1, downsample=None): 77 | super(Bottleneck, self).__init__() 78 | self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) 79 | if ibn: 80 | self.bn1 = IBN(planes) 81 | else: 82 | self.bn1 = nn.BatchNorm2d(planes) 83 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, 84 | padding=1, bias=False) 85 | self.bn2 = nn.BatchNorm2d(planes) 86 | self.conv3 = nn.Conv2d( 87 | planes, planes * self.expansion, kernel_size=1, bias=False) 88 | self.bn3 = nn.BatchNorm2d(planes * self.expansion) 89 | self.relu = nn.ReLU(inplace=True) 90 | self.downsample = downsample 91 | self.stride = stride 92 | 93 | def forward(self, x): 94 | residual = x 95 | 96 | out = self.conv1(x) 97 | out = self.bn1(out) 98 | out = self.relu(out) 99 | 100 | out = self.conv2(out) 101 | out = self.bn2(out) 102 | out = self.relu(out) 103 | 104 | out = self.conv3(out) 105 | out = self.bn3(out) 106 | 107 | if self.downsample is not None: 108 | residual = self.downsample(x) 109 | 110 | out += residual 111 | out = self.relu(out) 112 | 113 | return out 114 | 115 | 116 | class ResNet(nn.Module): 117 | 118 | def __init__(self, block, layers, num_classes=1000): 119 | scale = 64 120 | self.inplanes = scale 121 | super(ResNet, self).__init__() 122 | self.conv1 = nn.Conv2d(3, scale, kernel_size=7, stride=2, padding=3, 123 | bias=False) 124 | self.bn1 = nn.BatchNorm2d(scale) 125 | self.relu = nn.ReLU(inplace=True) 126 | self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 127 | self.layer1 = self._make_layer(block, scale, layers[0]) 128 | self.layer2 = self._make_layer(block, scale*2, layers[1], stride=2) 129 | self.layer3 = self._make_layer(block, scale*4, layers[2], stride=2) 130 | self.layer4 = self._make_layer(block, scale*8, layers[3], stride=2) 131 | self.avgpool = nn.AvgPool2d(7) 132 | self.fc = nn.Linear(scale * 8 * block.expansion, num_classes) 133 | 134 | for m in self.modules(): 135 | if isinstance(m, nn.Conv2d): 136 | n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 137 | m.weight.data.normal_(0, math.sqrt(2. / n)) 138 | elif isinstance(m, nn.BatchNorm2d): 139 | m.weight.data.fill_(1) 140 | m.bias.data.zero_() 141 | elif isinstance(m, nn.InstanceNorm2d): 142 | m.weight.data.fill_(1) 143 | m.bias.data.zero_() 144 | 145 | def _make_layer(self, block, planes, blocks, stride=1): 146 | downsample = None 147 | if stride != 1 or self.inplanes != planes * block.expansion: 148 | downsample = nn.Sequential( 149 | nn.Conv2d(self.inplanes, planes * block.expansion, 150 | kernel_size=1, stride=stride, bias=False), 151 | nn.BatchNorm2d(planes * block.expansion), 152 | ) 153 | 154 | layers = [] 155 | ibn = True 156 | if planes == 512: 157 | ibn = False 158 | layers.append(block(self.inplanes, planes, ibn, stride, downsample)) 159 | self.inplanes = planes * block.expansion 160 | for i in range(1, blocks): 161 | layers.append(block(self.inplanes, planes, ibn)) 162 | 163 | return nn.Sequential(*layers) 164 | 165 | def forward(self, x): 166 | x = self.conv1(x) 167 | x = self.bn1(x) 168 | x = self.relu(x) 169 | x = self.maxpool(x) 170 | 171 | x = self.layer1(x) 172 | x = self.layer2(x) 173 | x = self.layer3(x) 174 | x = self.layer4(x) 175 | 176 | x = self.avgpool(x) 177 | x = x.view(x.size(0), -1) 178 | x = self.fc(x) 179 | 180 | return x 181 | 182 | 183 | class res_ibn(nn.Module): 184 | def __init__(self, class_num=62): 185 | super(res_ibn, self).__init__() 186 | model_ft = ResNet(Bottleneck, [2, 2, 2, 2]) 187 | self.base_model = nn.Sequential(*list(model_ft.children())[:-3]) 188 | # attention schema 189 | self.avgpool = nn.AdaptiveAvgPool2d(1) 190 | self.maxpool = nn.AdaptiveMaxPool2d(1) 191 | self.sign = nn.Sigmoid() 192 | in_plances = 1024 193 | ratio = 8 194 | self.a_fc1 = nn.Conv2d(in_plances, in_plances//ratio, 1, bias=False) 195 | self.a_relu = nn.ReLU() 196 | self.a_fc2 = nn.Conv2d(in_plances//ratio, in_plances, 1, bias=False) 197 | 198 | self.avg_pool = nn.AdaptiveAvgPool2d(1) 199 | self.max_pool = nn.AdaptiveMaxPool2d(1) 200 | self.reduce_layer = nn.Conv2d(2048, 256, 1) 201 | 202 | # self.classifier = ClassBlock(512, 1024) 203 | self.fc1 = nn.Sequential(nn.Dropout(0.5), 204 | nn.Linear(256, class_num)) 205 | self.fc2 = nn.Sequential(nn.Dropout(0.5), 206 | nn.Linear(256, class_num)) 207 | self.fc3 = nn.Sequential(nn.Dropout(0.5), 208 | nn.Linear(256, class_num)) 209 | self.fc4 = nn.Sequential(nn.Dropout(0.5), 210 | nn.Linear(256, class_num)) 211 | 212 | def forward(self, x): 213 | bs = x.shape[0] 214 | x = self.base_model(x) 215 | # channel attention 216 | avgout = self.a_fc2(self.a_relu(self.a_fc1(self.avgpool(x)))) 217 | maxout = self.a_fc2(self.a_relu(self.a_fc1(self.maxpool(x)))) 218 | ca = self.sign(avgout+maxout) 219 | # joint 220 | x = x * ca.expand_as(x) 221 | 222 | # fuse avgpool and maxpool 223 | xx1 = self.avg_pool(x) # .view(bs, -1).squeeze() 224 | xx2 = self.max_pool(x) # .view(bs, -1).squeeze() 225 | # xx1 = self.avg_pool(x) 226 | # xx2 = self.max_pool(x) 227 | # fuse the feature by concat 228 | x = torch.cat([xx1, xx2], dim=1) 229 | x = self.reduce_layer(x).view(bs, -1) 230 | # print(x.shape) 231 | x1 = self.fc1(x) 232 | x2 = self.fc2(x) 233 | x3 = self.fc3(x) 234 | x4 = self.fc4(x) 235 | return x1, x2, x3, x4 236 | 237 | def save(self, circle): 238 | name = "./weights/res18" + str(circle) + ".pth" 239 | torch.save(self.state_dict(), name) 240 | name2 = "./weights/res18_new.pth" 241 | torch.save(self.state_dict(), name2) 242 | 243 | def load_model(self, weight_path): 244 | fileList = os.listdir("./weights/") 245 | # print(fileList) 246 | if "res18_new.pth" in fileList: 247 | name = "./weights/res18_new.pth" 248 | self.load_state_dict(t.load(name)) 249 | print("the latest model has been load") 250 | elif os.path.isfile(weight_path): 251 | self.load_state_dict(t.load(weight_path)) 252 | print("load %s success!" % weight_path) 253 | else: 254 | print("%s do not exists." % weight_path) 255 | 256 | 257 | def resnet50_ibn_a(pretrained=False, **kwargs): 258 | """Constructs a ResNet-50 model. 259 | Args: 260 | pretrained (bool): If True, returns a model pre-trained on ImageNet 261 | """ 262 | model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) 263 | if pretrained: 264 | model.load_state_dict(model_zoo.load_url(model_urls['resnet50'])) 265 | return model 266 | 267 | 268 | def resnet101_ibn_a(pretrained=False, **kwargs): 269 | """Constructs a ResNet-101 model. 270 | Args: 271 | pretrained (bool): If True, returns a model pre-trained on ImageNet 272 | """ 273 | model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) 274 | if pretrained: 275 | model.load_state_dict(model_zoo.load_url(model_urls['resnet101'])) 276 | return model 277 | 278 | 279 | def resnet152_ibn_a(pretrained=False, **kwargs): 280 | """Constructs a ResNet-152 model. 281 | Args: 282 | pretrained (bool): If True, returns a model pre-trained on ImageNet 283 | """ 284 | model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) 285 | if pretrained: 286 | model.load_state_dict(model_zoo.load_url(model_urls['resnet152'])) 287 | return model 288 | -------------------------------------------------------------------------------- /model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/model/__init__.py -------------------------------------------------------------------------------- /model/captchaNet.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | 10 | 11 | class CaptchaNet(nn.Module): 12 | def __init__(self): 13 | super(CaptchaNet, self).__init__() 14 | self.conv1 = nn.Conv2d(3, 5, 5) 15 | self.conv2 = nn.Conv2d(5, 10, 5) 16 | self.conv3 = nn.Conv2d(10, 16, 6) 17 | self.fc1 = nn.Linear(4 * 12 * 16, 512) 18 | # 这是四个用于输出四个字符的线性层 19 | self.fc2 = nn.Linear(512, 256) 20 | self.fc3 = nn.Linear(256, 128) 21 | self.fc41 = nn.Linear(128, 62) 22 | self.fc42 = nn.Linear(128, 62) 23 | self.fc43 = nn.Linear(128, 62) 24 | self.fc44 = nn.Linear(128, 62) 25 | 26 | def forward(self, x): 27 | # 输入为3*128*64,经过第一层为5*62*30 28 | x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) 29 | # 输出形状10*29*13 30 | x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2)) 31 | # 输出形状16*12*4 32 | x = F.max_pool2d(F.relu(self.conv3(x)), (2, 2)) 33 | # print(x.size()) 34 | x = x.view(-1, 768) 35 | x = self.fc1(x) 36 | x = F.relu(x) 37 | x = self.fc2(x) 38 | x = F.relu(x) 39 | x = self.fc3(x) 40 | x = F.relu(x) 41 | x1 = F.softmax(self.fc41(x), dim=1) 42 | x2 = F.softmax(self.fc42(x), dim=1) 43 | x3 = F.softmax(self.fc43(x), dim=1) 44 | x4 = F.softmax(self.fc44(x), dim=1) 45 | return x1, x2, x3, x4 46 | 47 | def save(self, circle): 48 | name = "./weights/net" + str(circle) + ".pth" 49 | t.save(self.state_dict(), name) 50 | name2 = "./weights/net_new.pth" 51 | t.save(self.state_dict(), name2) 52 | 53 | def load_model(self, weight_path): 54 | fileList = os.listdir("./weights/") 55 | # print(fileList) 56 | if "net_new.pth" in fileList: 57 | name = "./weights/net_new.pth" 58 | self.load_state_dict(t.load(name)) 59 | print("the latest model has been load") 60 | else: 61 | self.load_state_dict(t.load(weight_path)) 62 | print("load %s success!" % weight_path) 63 | 64 | -------------------------------------------------------------------------------- /model/dense.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | from model.model import weights_init_kaiming, weights_init_classifier 10 | 11 | class ClassBlock(nn.Module): 12 | def __init__(self, 13 | input_dim, 14 | class_num, 15 | dropout=False, 16 | relu=False, 17 | num_bottleneck=512): 18 | super(ClassBlock, self).__init__() 19 | add_block = [] 20 | #add_block += [nn.Linear(input_dim, num_bottleneck)] 21 | num_bottleneck = input_dim 22 | add_block += [nn.BatchNorm1d(num_bottleneck)] 23 | if relu: 24 | add_block += [nn.LeakyReLU(0.1)] 25 | if dropout: 26 | add_block += [nn.Dropout(p=0.5)] 27 | add_block = nn.Sequential(*add_block) 28 | add_block.apply(weights_init_kaiming) 29 | 30 | classifier = [] 31 | classifier += [nn.Linear(num_bottleneck, class_num)] 32 | classifier = nn.Sequential(*classifier) 33 | classifier.apply(weights_init_classifier) 34 | 35 | self.add_block = add_block 36 | self.classifier = classifier 37 | 38 | def forward(self, x): 39 | f = self.add_block(x) 40 | f_norm = f.norm(p=2, dim=1, keepdim=True) + 1e-8 41 | f = f.div(f_norm) 42 | x = self.classifier(f) 43 | return x 44 | 45 | class dense121(nn.Module): 46 | def __init__(self, class_num=62): 47 | super(dense121, self).__init__() 48 | self.model = models.densenet121(pretrained=True).features 49 | # .densenet121(pretrained=False).features 50 | self.relu = nn.ReLU(inplace=True) 51 | self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) 52 | # self.flat = torch.flatten(dims=1) 53 | # model_ft.avgpool = nn.AdaptiveAvgPool2d((1, 1)) 54 | num_of_feature = 1024 55 | self.classifier = ClassBlock(1024, 1024) 56 | self.drop = nn.Dropout(0.5) 57 | self.fc1 = nn.Linear(num_of_feature, class_num) 58 | self.fc2 = nn.Linear(num_of_feature, class_num) 59 | self.fc3 = nn.Linear(num_of_feature, class_num) 60 | self.fc4 = nn.Linear(num_of_feature, class_num) 61 | 62 | def forward(self, x): 63 | x = self.model(x) 64 | x = self.relu(x) 65 | x = self.avgpool(x) 66 | # x = self.flat(x) 67 | x = torch.squeeze(x) 68 | x = self.classifier(x) 69 | x = self.drop(x) 70 | x1 = self.fc1(x) 71 | x2 = self.fc2(x) 72 | x3 = self.fc3(x) 73 | x4 = self.fc4(x) 74 | return x1, x2, x3, x4 75 | 76 | def save(self, circle): 77 | name = "./weights/net" + str(circle) + ".pth" 78 | t.save(self.state_dict(), name) 79 | name2 = "./weights/net_new.pth" 80 | t.save(self.state_dict(), name2) 81 | 82 | def load_model(self, weight_path): 83 | fileList = os.listdir("./weights/") 84 | # print(fileList) 85 | if "net_new.pth" in fileList: 86 | name = "./weights/net_new.pth" 87 | self.load_state_dict(t.load(name)) 88 | print("the latest model has been load") 89 | elif os.path.isfile(weight_path): 90 | self.load_state_dict(t.load(weight_path)) 91 | print("load %s success!" % weight_path) 92 | else: 93 | print("%s do not exists." % weight_path) -------------------------------------------------------------------------------- /model/dualpooling.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | 10 | 11 | def weights_init_classifier(m): 12 | classname = m.__class__.__name__ 13 | if classname.find('Linear') != -1: 14 | init.normal_(m.weight.data, std=0.001) 15 | init.constant_(m.bias.data, 0.0) 16 | 17 | 18 | def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): 19 | """3x3 convolution with padding""" 20 | return nn.Conv2d(in_planes, 21 | out_planes, 22 | kernel_size=3, 23 | stride=stride, 24 | padding=dilation, 25 | groups=groups, 26 | bias=False, 27 | dilation=dilation) 28 | 29 | 30 | def conv1x1(in_planes, out_planes, stride=1): 31 | """1x1 convolution""" 32 | return nn.Conv2d(in_planes, 33 | out_planes, 34 | kernel_size=1, 35 | stride=stride, 36 | bias=False) 37 | 38 | 39 | class ResidualBlock(nn.Module): 40 | def __init__(self, inchannel, outchannel, stride=1): 41 | super(ResidualBlock, self).__init__() 42 | self.left = nn.Sequential( 43 | nn.Conv2d(inchannel, 44 | outchannel, 45 | kernel_size=3, 46 | stride=stride, 47 | padding=1, 48 | bias=False), 49 | nn.BatchNorm2d(outchannel, track_running_stats=True), 50 | nn.ReLU(inplace=True), 51 | nn.Conv2d(outchannel, 52 | outchannel, 53 | kernel_size=3, 54 | stride=1, 55 | padding=1, 56 | bias=False), 57 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 58 | self.shortcut = nn.Sequential() 59 | if stride != 1 or inchannel != outchannel: 60 | self.shortcut = nn.Sequential( 61 | nn.Conv2d(inchannel, 62 | outchannel, 63 | kernel_size=1, 64 | stride=stride, 65 | bias=False), 66 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 67 | 68 | def forward(self, x): 69 | out = self.left(x) 70 | out += self.shortcut(x) 71 | out = F.relu(out) 72 | return out 73 | 74 | 75 | class Bottleneck(nn.Module): 76 | def __init__(self, inchannel, outchannel, stride=1): 77 | super(ResidualBlock, self).__init__() 78 | self.bottle = nn.Sequential( 79 | nn.Conv2d(inchannel, 80 | outchannel, 81 | kernel_size=1, 82 | stride=1, 83 | padding=0, 84 | bias=False), 85 | nn.BatchNorm2d(outchannel, track_running_stats=True), 86 | nn.Conv2d(inchannel, 87 | outchannel, 88 | kernel_size=3, 89 | stride=stride, 90 | padding=1, 91 | bias=False), 92 | nn.BatchNorm2d(outchannel, track_running_stats=True), 93 | nn.Conv2d(outchannel, 94 | outchannel, 95 | kernel_size=1, 96 | stride=1, 97 | padding=0, 98 | bias=False), 99 | nn.BatchNorm2d(outchannel, track_running_stats=True), 100 | nn.ReLU(inplace=True)) 101 | self.shortcut = nn.Sequential() 102 | if stride != 1 or inchannel != outchannel: 103 | self.shortcut = nn.Sequential( 104 | nn.Conv2d(inchannel, 105 | outchannel, 106 | kernel_size=1, 107 | stride=stride, 108 | bias=False), 109 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 110 | 111 | def forward(self, x): 112 | out = self.left(x) 113 | out += self.shortcut(x) 114 | out = F.relu(out) 115 | return out 116 | 117 | 118 | class DualResNet(nn.Module): 119 | def __init__(self, ResidualBlock, num_classes=62): 120 | super(DualResNet, self).__init__() 121 | self.inchannel = 64 122 | self.conv1 = nn.Sequential( 123 | nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False), 124 | nn.BatchNorm2d(64, track_running_stats=True), 125 | nn.ReLU(), 126 | ) 127 | # https://blog.csdn.net/weixin_43624538/article/details/85049699 128 | # part 1: ResidualBlock basic 129 | # res18 2 2 2 2 130 | # res34 3 4 6 3 131 | self.layer1 = self.make_layer(ResidualBlock, 64, 2, stride=1) 132 | self.layer2 = self.make_layer(ResidualBlock, 128, 2, stride=2) 133 | self.layer3 = self.make_layer(ResidualBlock, 256, 2, stride=2) 134 | self.layer4 = self.make_layer(ResidualBlock, 512, 2, stride=2) 135 | self.maxpool = nn.AdaptiveMaxPool2d(1) 136 | self.avgpool = nn.AdaptiveAvgPool2d(1) 137 | self.reduce_layer = nn.Conv2d(1024, 512, 1) 138 | 139 | self.drop = nn.Dropout(0.5) 140 | self.fc1 = nn.Linear(512, num_classes) 141 | self.fc2 = nn.Linear(512, num_classes) 142 | self.fc3 = nn.Linear(512, num_classes) 143 | self.fc4 = nn.Linear(512, num_classes) 144 | 145 | def make_layer(self, block, channels, num_blocks, stride): 146 | strides = [stride] + [1] * (num_blocks - 1) # strides=[1,1] 147 | layers = [] 148 | for stride in strides: 149 | layers.append(block(self.inchannel, channels, stride)) 150 | self.inchannel = channels 151 | return nn.Sequential(*layers) 152 | 153 | def forward(self, x): 154 | bs = x.shape[0] 155 | x = self.conv1(x) 156 | x = self.layer1(x) 157 | x = self.layer2(x) 158 | x = self.layer3(x) 159 | x = self.layer4(x) 160 | x1 = self.maxpool(x) 161 | x2 = self.avgpool(x) 162 | x = torch.cat([x1,x2], dim=1) 163 | x = self.reduce_layer(x).view(bs, -1) 164 | x = self.drop(x) 165 | y1 = self.fc1(x) 166 | y2 = self.fc2(x) 167 | y3 = self.fc3(x) 168 | y4 = self.fc4(x) 169 | return y1, y2, y3, y4 170 | 171 | def save(self, circle): 172 | name = "./weights/DualresNet" + str(circle) + ".pth" 173 | t.save(self.state_dict(), name) 174 | name2 = "./weights/DualresNet_new.pth" 175 | t.save(self.state_dict(), name2) 176 | 177 | def load_model(self, weight_path): 178 | fileList = os.listdir("./weights/") 179 | # print(fileList) 180 | if "DualresNet_new.pth" in fileList: 181 | name = "./weights/DualresNet_new.pth" 182 | self.load_state_dict(t.load(name)) 183 | print("the latest model has been load") 184 | elif os.path.exists(weight_path): 185 | self.load_state_dict(t.load(weight_path)) 186 | print("load %s success!" % weight_path) 187 | 188 | 189 | class ClassBlock(nn.Module): 190 | def __init__(self, 191 | input_dim, 192 | class_num, 193 | dropout=False, 194 | relu=False, 195 | num_bottleneck=512): 196 | super(ClassBlock, self).__init__() 197 | add_block = [] 198 | #add_block += [nn.Linear(input_dim, num_bottleneck)] 199 | num_bottleneck = input_dim 200 | add_block += [nn.BatchNorm1d(num_bottleneck)] 201 | if relu: 202 | add_block += [nn.LeakyReLU(0.1)] 203 | if dropout: 204 | add_block += [nn.Dropout(p=0.5)] 205 | add_block = nn.Sequential(*add_block) 206 | add_block.apply(weights_init_kaiming) 207 | 208 | classifier = [] 209 | classifier += [nn.Linear(num_bottleneck, class_num)] 210 | classifier = nn.Sequential(*classifier) 211 | classifier.apply(weights_init_classifier) 212 | 213 | self.add_block = add_block 214 | self.classifier = classifier 215 | 216 | def forward(self, x): 217 | f = self.add_block(x) 218 | f_norm = f.norm(p=2, dim=1, keepdim=True) + 1e-8 219 | f = f.div(f_norm) 220 | x = self.classifier(f) 221 | return x 222 | 223 | 224 | def weights_init_kaiming(m): 225 | classname = m.__class__.__name__ 226 | # print(classname) 227 | if classname.find('Conv') != -1: 228 | init.kaiming_normal(m.weight.data, a=0, mode='fan_in') 229 | elif classname.find('Linear') != -1: 230 | init.kaiming_normal(m.weight.data, a=0, mode='fan_out') 231 | init.constant(m.bias.data, 0.0) 232 | elif classname.find('BatchNorm1d') != -1: 233 | init.normal_(m.weight.data, 1.0, 0.02) 234 | init.constant_(m.bias.data, 0.0) 235 | -------------------------------------------------------------------------------- /model/model.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | 10 | 11 | def weights_init_classifier(m): 12 | classname = m.__class__.__name__ 13 | if classname.find('Linear') != -1: 14 | init.normal_(m.weight.data, std=0.001) 15 | init.constant_(m.bias.data, 0.0) 16 | 17 | 18 | def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): 19 | """3x3 convolution with padding""" 20 | return nn.Conv2d(in_planes, 21 | out_planes, 22 | kernel_size=3, 23 | stride=stride, 24 | padding=dilation, 25 | groups=groups, 26 | bias=False, 27 | dilation=dilation) 28 | 29 | 30 | def conv1x1(in_planes, out_planes, stride=1): 31 | """1x1 convolution""" 32 | return nn.Conv2d(in_planes, 33 | out_planes, 34 | kernel_size=1, 35 | stride=stride, 36 | bias=False) 37 | 38 | 39 | class ResidualBlock(nn.Module): 40 | def __init__(self, inchannel, outchannel, stride=1): 41 | super(ResidualBlock, self).__init__() 42 | self.left = nn.Sequential( 43 | nn.Conv2d(inchannel, 44 | outchannel, 45 | kernel_size=3, 46 | stride=stride, 47 | padding=1, 48 | bias=False), 49 | nn.BatchNorm2d(outchannel, track_running_stats=True), 50 | nn.ReLU(inplace=True), 51 | nn.Conv2d(outchannel, 52 | outchannel, 53 | kernel_size=3, 54 | stride=1, 55 | padding=1, 56 | bias=False), 57 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 58 | self.shortcut = nn.Sequential() 59 | if stride != 1 or inchannel != outchannel: 60 | self.shortcut = nn.Sequential( 61 | nn.Conv2d(inchannel, 62 | outchannel, 63 | kernel_size=1, 64 | stride=stride, 65 | bias=False), 66 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 67 | 68 | def forward(self, x): 69 | out = self.left(x) 70 | out += self.shortcut(x) 71 | out = F.relu(out) 72 | return out 73 | 74 | 75 | class Bottleneck(nn.Module): 76 | def __init__(self, inchannel, outchannel, stride=1): 77 | super(ResidualBlock, self).__init__() 78 | self.bottle = nn.Sequential( 79 | nn.Conv2d(inchannel, 80 | outchannel, 81 | kernel_size=1, 82 | stride=1, 83 | padding=0, 84 | bias=False), 85 | nn.BatchNorm2d(outchannel, track_running_stats=True), 86 | nn.Conv2d(inchannel, 87 | outchannel, 88 | kernel_size=3, 89 | stride=stride, 90 | padding=1, 91 | bias=False), 92 | nn.BatchNorm2d(outchannel, track_running_stats=True), 93 | nn.Conv2d(outchannel, 94 | outchannel, 95 | kernel_size=1, 96 | stride=1, 97 | padding=0, 98 | bias=False), 99 | nn.BatchNorm2d(outchannel, track_running_stats=True), 100 | nn.ReLU(inplace=True)) 101 | self.shortcut = nn.Sequential() 102 | if stride != 1 or inchannel != outchannel: 103 | self.shortcut = nn.Sequential( 104 | nn.Conv2d(inchannel, 105 | outchannel, 106 | kernel_size=1, 107 | stride=stride, 108 | bias=False), 109 | nn.BatchNorm2d(outchannel, track_running_stats=True)) 110 | 111 | def forward(self, x): 112 | out = self.left(x) 113 | out += self.shortcut(x) 114 | out = F.relu(out) 115 | return out 116 | 117 | 118 | class ResNet(nn.Module): 119 | def __init__(self, ResidualBlock, num_classes=62): 120 | super(ResNet, self).__init__() 121 | self.inchannel = 64 122 | self.conv1 = nn.Sequential( 123 | nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False), 124 | nn.BatchNorm2d(64, track_running_stats=True), 125 | nn.ReLU(), 126 | ) 127 | # https://blog.csdn.net/weixin_43624538/article/details/85049699 128 | # part 1: ResidualBlock basic 129 | # res18 2 2 2 2 130 | # res34 3 4 6 3 131 | self.layer1 = self.make_layer(ResidualBlock, 64, 2, stride=1) 132 | self.layer2 = self.make_layer(ResidualBlock, 128, 2, stride=2) 133 | self.layer3 = self.make_layer(ResidualBlock, 256, 2, stride=2) 134 | self.layer4 = self.make_layer(ResidualBlock, 512, 2, stride=2) 135 | self.drop = nn.Dropout(0.5) 136 | # self.drop2 = nn.Dropout(0.5) 137 | # self.drop3 = nn.Dropout(0.5) 138 | # self.drop4 = nn.Dropout(0.5) 139 | self.fc1 = nn.Linear(512, num_classes) 140 | self.fc2 = nn.Linear(512, num_classes) 141 | self.fc3 = nn.Linear(512, num_classes) 142 | self.fc4 = nn.Linear(512, num_classes) 143 | 144 | def make_layer(self, block, channels, num_blocks, stride): 145 | strides = [stride] + [1] * (num_blocks - 1) # strides=[1,1] 146 | layers = [] 147 | for stride in strides: 148 | layers.append(block(self.inchannel, channels, stride)) 149 | self.inchannel = channels 150 | return nn.Sequential(*layers) 151 | 152 | def forward(self, x): 153 | x = self.conv1(x) 154 | x = self.layer1(x) 155 | x = self.layer2(x) 156 | x = self.layer3(x) 157 | x = self.layer4(x) 158 | x = nn.AdaptiveAvgPool2d(1)(x) 159 | x = x.view(-1, 512) 160 | x = self.drop(x) 161 | y1 = self.fc1(x) 162 | y2 = self.fc2(x) 163 | y3 = self.fc3(x) 164 | y4 = self.fc4(x) 165 | return y1, y2, y3, y4 166 | 167 | def save(self, circle): 168 | name = "./weights/resNet" + str(circle) + ".pth" 169 | t.save(self.state_dict(), name) 170 | name2 = "./weights/resNet_new.pth" 171 | t.save(self.state_dict(), name2) 172 | 173 | def load_model(self, weight_path): 174 | if os.path.exists(weight_path): 175 | self.load_state_dict(t.load(weight_path, map_location='cpu')) 176 | print("load %s success!" % weight_path) 177 | 178 | 179 | class ClassBlock(nn.Module): 180 | def __init__(self, 181 | input_dim, 182 | class_num, 183 | dropout=False, 184 | relu=False, 185 | num_bottleneck=512): 186 | super(ClassBlock, self).__init__() 187 | add_block = [] 188 | #add_block += [nn.Linear(input_dim, num_bottleneck)] 189 | num_bottleneck = input_dim 190 | add_block += [nn.BatchNorm1d(num_bottleneck)] 191 | if relu: 192 | add_block += [nn.LeakyReLU(0.1)] 193 | if dropout: 194 | add_block += [nn.Dropout(p=0.5)] 195 | add_block = nn.Sequential(*add_block) 196 | add_block.apply(weights_init_kaiming) 197 | 198 | classifier = [] 199 | classifier += [nn.Linear(num_bottleneck, class_num)] 200 | classifier = nn.Sequential(*classifier) 201 | classifier.apply(weights_init_classifier) 202 | 203 | self.add_block = add_block 204 | self.classifier = classifier 205 | 206 | def forward(self, x): 207 | f = self.add_block(x) 208 | f_norm = f.norm(p=2, dim=1, keepdim=True) + 1e-8 209 | f = f.div(f_norm) 210 | x = self.classifier(f) 211 | return x 212 | 213 | 214 | def weights_init_kaiming(m): 215 | classname = m.__class__.__name__ 216 | # print(classname) 217 | if classname.find('Conv') != -1: 218 | init.kaiming_normal(m.weight.data, a=0, mode='fan_in') 219 | elif classname.find('Linear') != -1: 220 | init.kaiming_normal(m.weight.data, a=0, mode='fan_out') 221 | init.constant(m.bias.data, 0.0) 222 | elif classname.find('BatchNorm1d') != -1: 223 | init.normal_(m.weight.data, 1.0, 0.02) 224 | init.constant_(m.bias.data, 0.0) 225 | -------------------------------------------------------------------------------- /model/res18.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | from torch import nn 4 | import torch.nn.functional as F 5 | import os 6 | from torchvision import models 7 | from torch.nn import init 8 | import torch 9 | from torchvision.models import ResNet 10 | from torchvision.models.resnet import BasicBlock 11 | from model.model import weights_init_kaiming, weights_init_classifier 12 | 13 | class ClassBlock(nn.Module): 14 | def __init__(self, 15 | input_dim, 16 | class_num, 17 | dropout=False, 18 | relu=False, 19 | num_bottleneck=512): 20 | super(ClassBlock, self).__init__() 21 | add_block = [] 22 | #add_block += [nn.Linear(input_dim, num_bottleneck)] 23 | num_bottleneck = input_dim 24 | add_block += [nn.BatchNorm1d(num_bottleneck)] 25 | if relu: 26 | add_block += [nn.LeakyReLU(0.1)] 27 | if dropout: 28 | add_block += [nn.Dropout(p=0.5)] 29 | add_block = nn.Sequential(*add_block) 30 | add_block.apply(weights_init_kaiming) 31 | 32 | classifier = [] 33 | classifier += [nn.Linear(num_bottleneck, class_num)] 34 | classifier = nn.Sequential(*classifier) 35 | classifier.apply(weights_init_classifier) 36 | 37 | self.add_block = add_block 38 | self.classifier = classifier 39 | 40 | def forward(self, x): 41 | f = self.add_block(x) 42 | f_norm = f.norm(p=2, dim=1, keepdim=True) + 1e-8 43 | f = f.div(f_norm) 44 | x = self.classifier(f) 45 | return x 46 | 47 | class res18(nn.Module): 48 | def __init__(self, class_num=62): 49 | super(res18, self).__init__() 50 | model_ft = ResNet(BasicBlock, [2, 2, 2, 2]) 51 | self.base_model = nn.Sequential(*list(model_ft.children())[:-3]) 52 | # attention schema 53 | self.avgpool = nn.AdaptiveAvgPool2d(1) 54 | self.maxpool = nn.AdaptiveMaxPool2d(1) 55 | self.sign = nn.Sigmoid() 56 | in_plances = 256 57 | ratio = 8 58 | self.a_fc1 = nn.Conv2d(in_plances,in_plances//ratio,1,bias=False) 59 | self.a_relu = nn.ReLU() 60 | self.a_fc2 = nn.Conv2d(in_plances//ratio, in_plances, 1, bias=False) 61 | 62 | self.avg_pool = nn.AdaptiveAvgPool2d(1) 63 | self.max_pool = nn.AdaptiveMaxPool2d(1) 64 | self.reduce_layer = nn.Conv2d(512, 256, 1) 65 | 66 | # self.classifier = ClassBlock(512, 1024) 67 | self.fc1 = nn.Sequential(nn.Dropout(0.5), 68 | nn.Linear(256, class_num)) 69 | self.fc2 = nn.Sequential(nn.Dropout(0.5), 70 | nn.Linear(256, class_num)) 71 | self.fc3 = nn.Sequential(nn.Dropout(0.5), 72 | nn.Linear(256, class_num)) 73 | self.fc4 = nn.Sequential(nn.Dropout(0.5), 74 | nn.Linear(256, class_num)) 75 | 76 | def forward(self, x): 77 | bs = x.shape[0] 78 | x = self.base_model(x) 79 | # channel attention 80 | avgout = self.a_fc2(self.a_relu(self.a_fc1(self.avgpool(x)))) 81 | maxout = self.a_fc2(self.a_relu(self.a_fc1(self.maxpool(x)))) 82 | ca = self.sign(avgout+maxout) 83 | # joint 84 | x = x * ca.expand_as(x) 85 | 86 | # fuse avgpool and maxpool 87 | xx1 = self.avg_pool(x)#.view(bs, -1).squeeze() 88 | xx2 = self.max_pool(x)#.view(bs, -1).squeeze() 89 | # xx1 = self.avg_pool(x) 90 | # xx2 = self.max_pool(x) 91 | # fuse the feature by concat 92 | x = torch.cat([xx1, xx2], dim=1) 93 | x = self.reduce_layer(x).view(bs,-1) 94 | # print(x.shape) 95 | x1 = self.fc1(x) 96 | x2 = self.fc2(x) 97 | x3 = self.fc3(x) 98 | x4 = self.fc4(x) 99 | return x1, x2, x3, x4 100 | 101 | def save(self, circle): 102 | name = "./weights/res18" + str(circle) + ".pth" 103 | torch.save(self.state_dict(), name) 104 | name2 = "./weights/res18_new.pth" 105 | torch.save(self.state_dict(), name2) 106 | 107 | def load_model(self, weight_path): 108 | fileList = os.listdir("./weights/") 109 | # print(fileList) 110 | if "res18_new.pth" in fileList: 111 | name = "./weights/res18_new.pth" 112 | self.load_state_dict(t.load(name)) 113 | print("the latest model has been load") 114 | elif os.path.isfile(weight_path): 115 | self.load_state_dict(t.load(weight_path)) 116 | print("load %s success!" % weight_path) 117 | else: 118 | print("%s do not exists." % weight_path) 119 | -------------------------------------------------------------------------------- /model/senet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | # from torch.hub import load_state_dict_from_url 3 | from torchvision.models import ResNet 4 | import torch 5 | import torch as t 6 | import os 7 | 8 | class SELayer(nn.Module): 9 | def __init__(self, channel, reduction=16): 10 | super(SELayer, self).__init__() 11 | self.avg_pool = nn.AdaptiveAvgPool2d(1) 12 | self.fc = nn.Sequential( 13 | nn.Linear(channel, channel // reduction, bias=False), 14 | nn.ReLU(inplace=True), 15 | nn.Linear(channel // reduction, channel, bias=False), 16 | nn.Sigmoid() 17 | ) 18 | 19 | def forward(self, x): 20 | b, c, _, _ = x.size() 21 | y = self.avg_pool(x).view(b, c) 22 | y = self.fc(y).view(b, c, 1, 1) 23 | return x * y.expand_as(x) 24 | 25 | 26 | def conv3x3(in_planes, out_planes, stride=1): 27 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False) 28 | 29 | 30 | class SEBasicBlock(nn.Module): 31 | expansion = 1 32 | 33 | def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, 34 | base_width=64, dilation=1, norm_layer=None, 35 | *, reduction=16): 36 | super(SEBasicBlock, self).__init__() 37 | self.conv1 = conv3x3(inplanes, planes, stride) 38 | self.bn1 = nn.BatchNorm2d(planes) 39 | self.relu = nn.ReLU(inplace=True) 40 | self.conv2 = conv3x3(planes, planes, 1) 41 | self.bn2 = nn.BatchNorm2d(planes) 42 | self.se = SELayer(planes, reduction) 43 | self.downsample = downsample 44 | self.stride = stride 45 | 46 | def forward(self, x): 47 | residual = x 48 | out = self.conv1(x) 49 | out = self.bn1(out) 50 | out = self.relu(out) 51 | 52 | out = self.conv2(out) 53 | out = self.bn2(out) 54 | out = self.se(out) 55 | 56 | if self.downsample is not None: 57 | residual = self.downsample(x) 58 | 59 | out += residual 60 | out = self.relu(out) 61 | 62 | return out 63 | 64 | 65 | class SEBottleneck(nn.Module): 66 | expansion = 4 67 | 68 | def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, 69 | base_width=64, dilation=1, norm_layer=None, 70 | *, reduction=16): 71 | super(SEBottleneck, self).__init__() 72 | self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) 73 | self.bn1 = nn.BatchNorm2d(planes) 74 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, 75 | padding=1, bias=False) 76 | self.bn2 = nn.BatchNorm2d(planes) 77 | self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) 78 | self.bn3 = nn.BatchNorm2d(planes * 4) 79 | self.relu = nn.ReLU(inplace=True) 80 | self.se = SELayer(planes * 4, reduction) 81 | self.downsample = downsample 82 | self.stride = stride 83 | 84 | def forward(self, x): 85 | residual = x 86 | 87 | out = self.conv1(x) 88 | out = self.bn1(out) 89 | out = self.relu(out) 90 | 91 | out = self.conv2(out) 92 | out = self.bn2(out) 93 | out = self.relu(out) 94 | 95 | out = self.conv3(out) 96 | out = self.bn3(out) 97 | out = self.se(out) 98 | 99 | if self.downsample is not None: 100 | residual = self.downsample(x) 101 | 102 | out += residual 103 | out = self.relu(out) 104 | 105 | return out 106 | 107 | 108 | def se_resnet18(num_classes=1_000): 109 | """Constructs a ResNet-18 model. 110 | Args: 111 | pretrained (bool): If True, returns a model pre-trained on ImageNet 112 | """ 113 | model = ResNet(SEBasicBlock, [2, 2, 2, 2], num_classes=num_classes) 114 | model.avgpool = nn.AdaptiveAvgPool2d(1) 115 | return model 116 | 117 | 118 | def se_resnet34(num_classes=1_000): 119 | """Constructs a ResNet-34 model. 120 | Args: 121 | pretrained (bool): If True, returns a model pre-trained on ImageNet 122 | """ 123 | model = ResNet(SEBasicBlock, [3, 4, 6, 3], num_classes=num_classes) 124 | model.avgpool = nn.AdaptiveAvgPool2d(1) 125 | return model 126 | 127 | 128 | def se_resnet50(num_classes=1_000, pretrained=False): 129 | """Constructs a ResNet-50 model. 130 | Args: 131 | pretrained (bool): If True, returns a model pre-trained on ImageNet 132 | """ 133 | model = ResNet(SEBottleneck, [3, 4, 6, 3], num_classes=num_classes) 134 | model.avgpool = nn.AdaptiveAvgPool2d(1) 135 | # if pretrained: 136 | # model.load_state_dict(load_state_dict_from_url( 137 | # "https://github.com/moskomule/senet.pytorch/releases/download/archive/seresnet50-60a8950a85b2b.pkl")) 138 | return model 139 | 140 | 141 | def se_resnet101(num_classes=1_000): 142 | """Constructs a ResNet-101 model. 143 | Args: 144 | pretrained (bool): If True, returns a model pre-trained on ImageNet 145 | """ 146 | model = ResNet(SEBottleneck, [3, 4, 23, 3], num_classes=num_classes) 147 | model.avgpool = nn.AdaptiveAvgPool2d(1) 148 | return model 149 | 150 | 151 | def se_resnet152(num_classes=1_000): 152 | """Constructs a ResNet-152 model. 153 | Args: 154 | pretrained (bool): If True, returns a model pre-trained on ImageNet 155 | """ 156 | model = ResNet(SEBottleneck, [3, 8, 36, 3], num_classes=num_classes) 157 | model.avgpool = nn.AdaptiveAvgPool2d(1) 158 | return model 159 | 160 | 161 | class CifarSEBasicBlock(nn.Module): 162 | def __init__(self, inplanes, planes, stride=1, reduction=16): 163 | super(CifarSEBasicBlock, self).__init__() 164 | self.conv1 = conv3x3(inplanes, planes, stride) 165 | self.bn1 = nn.BatchNorm2d(planes) 166 | self.relu = nn.ReLU(inplace=True) 167 | self.conv2 = conv3x3(planes, planes) 168 | self.bn2 = nn.BatchNorm2d(planes) 169 | self.se = SELayer(planes, reduction) 170 | if inplanes != planes: 171 | self.downsample = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=1, stride=stride, bias=False), 172 | nn.BatchNorm2d(planes)) 173 | else: 174 | self.downsample = lambda x: x 175 | self.stride = stride 176 | 177 | def forward(self, x): 178 | residual = self.downsample(x) 179 | out = self.conv1(x) 180 | out = self.bn1(out) 181 | out = self.relu(out) 182 | 183 | out = self.conv2(out) 184 | out = self.bn2(out) 185 | out = self.se(out) 186 | 187 | out += residual 188 | out = self.relu(out) 189 | 190 | return out 191 | 192 | 193 | class CifarSEResNet(nn.Module): 194 | def __init__(self, block, n_size, num_classes=10, reduction=16): 195 | super(CifarSEResNet, self).__init__() 196 | self.inplane = 16 197 | self.conv1 = nn.Conv2d( 198 | 3, self.inplane, kernel_size=3, stride=1, padding=1, bias=False) 199 | self.bn1 = nn.BatchNorm2d(self.inplane) 200 | self.relu = nn.ReLU(inplace=True) 201 | self.layer1 = self._make_layer( 202 | block, 16, blocks=n_size, stride=1, reduction=reduction) 203 | self.layer2 = self._make_layer( 204 | block, 32, blocks=n_size, stride=2, reduction=reduction) 205 | self.layer3 = self._make_layer( 206 | block, 64, blocks=n_size, stride=2, reduction=reduction) 207 | self.avgpool = nn.AdaptiveAvgPool2d(1) 208 | self.fc = nn.Linear(64, num_classes) 209 | self.initialize() 210 | 211 | def initialize(self): 212 | for m in self.modules(): 213 | if isinstance(m, nn.Conv2d): 214 | nn.init.kaiming_normal_(m.weight) 215 | elif isinstance(m, nn.BatchNorm2d): 216 | nn.init.constant_(m.weight, 1) 217 | nn.init.constant_(m.bias, 0) 218 | 219 | def _make_layer(self, block, planes, blocks, stride, reduction): 220 | strides = [stride] + [1] * (blocks - 1) 221 | layers = [] 222 | for stride in strides: 223 | layers.append(block(self.inplane, planes, stride, reduction)) 224 | self.inplane = planes 225 | 226 | return nn.Sequential(*layers) 227 | 228 | def forward(self, x): 229 | x = self.conv1(x) 230 | x = self.bn1(x) 231 | x = self.relu(x) 232 | 233 | x = self.layer1(x) 234 | x = self.layer2(x) 235 | x = self.layer3(x) 236 | 237 | x = self.avgpool(x) 238 | x = x.view(x.size(0), -1) 239 | x = self.fc(x) 240 | 241 | return x 242 | 243 | 244 | class CifarSEPreActResNet(CifarSEResNet): 245 | def __init__(self, block, n_size, num_classes=10, reduction=16): 246 | super(CifarSEPreActResNet, self).__init__( 247 | block, n_size, num_classes, reduction) 248 | self.bn1 = nn.BatchNorm2d(self.inplane) 249 | self.initialize() 250 | 251 | def forward(self, x): 252 | x = self.conv1(x) 253 | x = self.layer1(x) 254 | x = self.layer2(x) 255 | x = self.layer3(x) 256 | 257 | x = self.bn1(x) 258 | x = self.relu(x) 259 | 260 | x = self.avgpool(x) 261 | x = x.view(x.size(0), -1) 262 | x = self.fc(x) 263 | 264 | 265 | def se_resnet20(**kwargs): 266 | """Constructs a ResNet-18 model. 267 | """ 268 | model = CifarSEResNet(CifarSEBasicBlock, 3, **kwargs) 269 | return model 270 | 271 | 272 | def se_resnet32(**kwargs): 273 | """Constructs a ResNet-34 model. 274 | """ 275 | model = CifarSEResNet(CifarSEBasicBlock, 5, **kwargs) 276 | return model 277 | 278 | 279 | def se_resnet56(**kwargs): 280 | """Constructs a ResNet-34 model. 281 | """ 282 | model = CifarSEResNet(CifarSEBasicBlock, 9, **kwargs) 283 | return model 284 | 285 | 286 | def se_preactresnet20(**kwargs): 287 | """Constructs a ResNet-18 model. 288 | """ 289 | model = CifarSEPreActResNet(CifarSEBasicBlock, 3, **kwargs) 290 | return model 291 | 292 | 293 | def se_preactresnet32(**kwargs): 294 | """Constructs a ResNet-34 model. 295 | """ 296 | model = CifarSEPreActResNet(CifarSEBasicBlock, 5, **kwargs) 297 | return model 298 | 299 | 300 | def se_preactresnet56(**kwargs): 301 | """Constructs a ResNet-34 model. 302 | """ 303 | model = CifarSEPreActResNet(CifarSEBasicBlock, 9, **kwargs) 304 | return model 305 | 306 | 307 | class senet(nn.Module): 308 | def __init__(self, class_num=62): 309 | super(senet, self).__init__() 310 | self.model = ResNet( 311 | SEBasicBlock, [2, 2, 2, 2], num_classes=class_num) 312 | self.model.fc = nn.Linear(512, 256) 313 | self.model.avgpool = nn.AdaptiveAvgPool2d((1,1)) 314 | self.drop = nn.Dropout(0.5) 315 | self.fc1 = nn.Linear(256, class_num) 316 | self.fc2 = nn.Linear(256, class_num) 317 | self.fc3 = nn.Linear(256, class_num) 318 | self.fc4 = nn.Linear(256, class_num) 319 | 320 | def forward(self, x): 321 | x = self.model(x) 322 | x = self.drop(x) 323 | y1 = self.fc1(x) 324 | y2 = self.fc2(x) 325 | y3 = self.fc3(x) 326 | y4 = self.fc4(x) 327 | return y1, y2, y3, y4 328 | 329 | def save(self, circle): 330 | name = "./weights/senet" + str(circle) + ".pth" 331 | torch.save(self.state_dict(), name) 332 | name2 = "./weights/senet_new.pth" 333 | torch.save(self.state_dict(), name2) 334 | 335 | def load_model(self, weight_path): 336 | fileList = os.listdir("./weights/") 337 | # print(fileList) 338 | if "net_new.pth" in fileList: 339 | name = "./weights/senet_new.pth" 340 | self.load_state_dict(t.load(name)) 341 | print("the latest model has been load") 342 | elif os.path.isfile(weight_path): 343 | self.load_state_dict(t.load(weight_path)) 344 | print("load %s success!" % weight_path) 345 | else: 346 | print("%s do not exists." % weight_path) -------------------------------------------------------------------------------- /predict.py: -------------------------------------------------------------------------------- 1 | from model.model import * 2 | from lib.dataset import * 3 | from train import * 4 | from config.parameters import * 5 | import torch as t 6 | from torch import nn 7 | import torch.nn.functional as F 8 | import os, shutil 9 | from PIL import Image 10 | from torch.utils import data 11 | import numpy as np 12 | from torchvision import transforms as T 13 | from config.parameters import * 14 | import torch as t 15 | import csv 16 | import time 17 | 18 | from model.dense import dense121 19 | from model.senet import senet 20 | from model.res18 import res18 21 | from model.dualpooling import DualResNet 22 | from model.BNNeck import bnneck 23 | 24 | os.environ['CUDA_VISIBLE_DEVICES']='1' 25 | 26 | class Dataset4Captcha(data.Dataset): 27 | def __init__(self, root, train=True): 28 | self.imgsPath = [os.path.join(root, img) for img in os.listdir(root)] 29 | self.transform = T.Compose([ 30 | T.Resize((ImageHeight, ImageWidth)), 31 | T.ToTensor(), 32 | T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) 33 | ]) 34 | 35 | def __getitem__(self, index): 36 | imgPath = self.imgsPath[index] 37 | # print(imgPath) 38 | label = imgPath.split("/")[-1] 39 | # labelTensor = t.Tensor(StrtoLabel(label)) 40 | data = Image.open(imgPath) 41 | # print(data.size) 42 | data = self.transform(data) 43 | # print(data.shape) 44 | return data, label 45 | 46 | def __len__(self): 47 | return len(self.imgsPath) 48 | 49 | def predict(model, dataLoader, csv_file): 50 | f = open(csv_file,"w") 51 | csv_writer = csv.writer(f) 52 | csv_writer.writerow(["ID","label"]) 53 | print("\t%-9s\t%-4s" % ("ID", "label")) 54 | 55 | for circle, input in enumerate(dataLoader, 0): 56 | x, label = input 57 | label = list(label)[0] 58 | # print(label) 59 | if t.cuda.is_available(): 60 | x = x.cuda() 61 | 62 | y1, y2, y3, y4 = model(x) 63 | y1, y2, y3, y4 = y1.topk(1, dim=1)[1].view(1, 1), y2.topk(1, dim=1)[1].view(1, 1), \ 64 | y3.topk(1, dim=1)[1].view(1, 1), y4.topk(1, dim=1)[1].view(1, 1) 65 | y = t.cat((y1, y2, y3, y4), dim=1) 66 | # print(x,label,y) 67 | decLabel = LabeltoStr([y[0][0], y[0][1], y[0][2], y[0][3]]) 68 | # print("predict %s is %s " % (label, decLabel)) 69 | csv_writer.writerow([label,decLabel]) 70 | print("%d\t%-9s\t%-4s" % (circle, label, decLabel)) 71 | # print("real: %s -> %s , %s" % (realLabel, decLabel, str(realLabel == decLabel))) 72 | f.close() 73 | 74 | def getLabel(model, x): 75 | y1, y2, y3, y4 = model(x) 76 | y1, y2, y3, y4 = y1.topk(1, dim=1)[1].view(1, 1), y2.topk(1, dim=1)[1].view(1, 1), \ 77 | y3.topk(1, dim=1)[1].view(1, 1), y4.topk(1, dim=1)[1].view(1, 1) 78 | y = t.cat((y1, y2, y3, y4), dim=1) 79 | # print(x,label,y) 80 | decLabel = LabeltoStr([y[0][0], y[0][1], y[0][2], y[0][3]]) 81 | return decLabel 82 | 83 | def predict_all(model_list, dataLoader, csv_file): 84 | f = open(csv_file, "w") 85 | csv_writer = csv.writer(f) 86 | csv_writer.writerow(["ID", "label"]) 87 | print("\t%-9s\t%-4s" % ("ID", "label")) 88 | 89 | num_of_model = len(model_list) 90 | 91 | for circle, input in enumerate(dataLoader, 0): 92 | x, label = input 93 | label = list(label)[0] 94 | if t.cuda.is_available(): 95 | x = x.cuda() 96 | 97 | result_list = [] 98 | 99 | for i in range(num_of_model): 100 | model = model_list[i] 101 | decLabel = getLabel(model, x) 102 | result_list.append(decLabel) 103 | 104 | csv_writer.writerow([label, decLabel]) 105 | # print("%d\t%-9s\t%-4s" % (circle, label, decLabel)) 106 | # if result_list[0] != result_list[1] or \ 107 | # result_list[0] != result_list[2] or \ 108 | # result_list[1] != result_list[2]: 109 | if len(set(result_list)) != 1: 110 | print("%d\t%-9s\t" % (circle, label), end='') 111 | append_name = "_" 112 | for i in range(num_of_model): 113 | print(" %-5s" % result_list[i], end='') 114 | append_name = append_name + "_"+ str(i) + "_"+ result_list[i] 115 | print() 116 | shutil.copy(os.path.join("/home/sunqilin/dpj/captcha.Pytorch/test", label), 117 | os.path.join("/home/sunqilin/dpj/captcha.Pytorch/wrong", 118 | label.split('.')[0]+append_name+".jpg")) 119 | time.sleep(1) 120 | 121 | f.close() 122 | 123 | if __name__ == '__main__': 124 | import argparse 125 | parser = argparse.ArgumentParser(description="weightpath") 126 | parser.add_argument("--weight_path", type=str, 127 | default="./weights/bnnect_with_center_loss/bnneck_new.pth") 128 | parser.add_argument("--test_path", type=str, default="./test") 129 | args = parser.parse_args() 130 | 131 | model1 = ResNet(ResidualBlock) 132 | model2 = bnneck() 133 | model3 = DualResNet(ResidualBlock) 134 | model4 = bnneck() 135 | 136 | model1.eval() 137 | model2.eval() 138 | model3.eval() 139 | model4.eval() 140 | 141 | model1.load_model("./weights/best/resNet_new.pth") 142 | model2.load_model("./weights/bnnect_with_center_loss/bnneck_new.pth") 143 | model3.load_model("./weights/DualresNet/DualresNet_new.pth") 144 | model4.load_model("./weights/bnnect_multistepLR/bnneck_new.pth") 145 | 146 | if t.cuda.is_available(): 147 | model1 = model1.cuda() 148 | model2 = model2.cuda() 149 | model3 = model3.cuda() 150 | model4 = model4.cuda() 151 | 152 | userTestDataset = Dataset4Captcha(args.test_path, train=True) 153 | userTestDataLoader = DataLoader(userTestDataset, batch_size=1, 154 | shuffle=False, num_workers=1) 155 | 156 | model_list = [] 157 | model_list.append(model1) 158 | model_list.append(model2) 159 | model_list.append(model3) 160 | model_list.append(model4) 161 | 162 | predict_all(model_list, userTestDataLoader, csv_file="./submission.csv") 163 | # predict(model, userTestDataLoader, csv_file="./submission.csv") 164 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | pandas 3 | imageio 4 | torch==1.3.1 5 | torchnet==0.0.4 6 | torchvision==0.2.0 7 | tqdm 8 | visdom -------------------------------------------------------------------------------- /result/submission.csv: -------------------------------------------------------------------------------- 1 | ID,label 2 | 3028.jpg,qWRl 3 | 4081.jpg,Rfyg 4 | 1411.jpg,u9I5 5 | 3511.jpg,610S 6 | 174.jpg,0iVB 7 | 4711.jpg,U78o 8 | 4160.jpg,5Ciu 9 | 4118.jpg,dc1d 10 | 219.jpg,epsV 11 | 3477.jpg,aYRX 12 | 2332.jpg,ojjO 13 | 1727.jpg,cuP8 14 | 4203.jpg,1scK 15 | 1590.jpg,WvQt 16 | 4018.jpg,ZJqR 17 | 999.jpg,q4fh 18 | 2850.jpg,cC6o 19 | 702.jpg,ChKy 20 | 1220.jpg,Bi2n 21 | 1725.jpg,zf7p 22 | 3837.jpg,cFiF 23 | 4333.jpg,UqDC 24 | 693.jpg,gbgn 25 | 4925.jpg,wiwB 26 | 908.jpg,fy6R 27 | 4315.jpg,JK0T 28 | 1491.jpg,2xe4 29 | 1097.jpg,Rms6 30 | 2505.jpg,fKiH 31 | 4113.jpg,MkBf 32 | 2928.jpg,Z1Zs 33 | 1291.jpg,w5DA 34 | 4437.jpg,lv2u 35 | 1265.jpg,ZmCo 36 | 1397.jpg,569l 37 | 4903.jpg,Jstu 38 | 2187.jpg,Otw8 39 | 4617.jpg,vS8U 40 | 3220.jpg,SX8W 41 | 1647.jpg,osWP 42 | 1948.jpg,C1nM 43 | 3448.jpg,qao4 44 | 369.jpg,Mp6N 45 | 3004.jpg,cQBs 46 | 3208.jpg,WNP9 47 | 2060.jpg,8H2z 48 | 659.jpg,vB7d 49 | 291.jpg,aqD8 50 | 349.jpg,x2Jb 51 | 3441.jpg,BkgQ 52 | 412.jpg,PvDy 53 | 4567.jpg,IXaU 54 | 3264.jpg,FgxJ 55 | 2297.jpg,a7qB 56 | 641.jpg,Cbgx 57 | 1863.jpg,N24A 58 | 4119.jpg,Ivh7 59 | 3652.jpg,gEUE 60 | 1501.jpg,aSLM 61 | 1521.jpg,avwL 62 | 4218.jpg,GkvA 63 | 2459.jpg,3f4y 64 | 4490.jpg,wkVT 65 | 85.jpg,Gdqb 66 | 2389.jpg,6eP1 67 | 1313.jpg,JUxK 68 | 3214.jpg,K33X 69 | 2700.jpg,ykC9 70 | 2790.jpg,LVML 71 | 57.jpg,KGlQ 72 | 2385.jpg,WBMv 73 | 3338.jpg,b4ow 74 | 3617.jpg,Dgga 75 | 611.jpg,ms2G 76 | 2707.jpg,HZpX 77 | 1788.jpg,dP8R 78 | 4852.jpg,fhYQ 79 | 340.jpg,8La0 80 | 2272.jpg,iUKL 81 | 606.jpg,LFVq 82 | 4688.jpg,H2t0 83 | 3112.jpg,y8I9 84 | 4402.jpg,gNIm 85 | 2148.jpg,4TTm 86 | 1794.jpg,jLid 87 | 1800.jpg,oyGe 88 | 2204.jpg,zbR9 89 | 2988.jpg,O7XL 90 | 4611.jpg,nJnJ 91 | 1915.jpg,NseX 92 | 2543.jpg,HZC3 93 | 1806.jpg,9YOF 94 | 4560.jpg,R8N5 95 | 2453.jpg,SD4y 96 | 1926.jpg,k5tN 97 | 3267.jpg,feAH 98 | 926.jpg,WKxR 99 | 967.jpg,geVy 100 | 4390.jpg,Vqmn 101 | 1811.jpg,0mus 102 | 2876.jpg,uyeV 103 | 673.jpg,RgdC 104 | 2770.jpg,56vj 105 | 4505.jpg,OE5t 106 | 1752.jpg,JLFu 107 | 4352.jpg,ENzx 108 | 1076.jpg,OD8X 109 | 4034.jpg,APSY 110 | 1162.jpg,lzRU 111 | 1487.jpg,GUht 112 | 944.jpg,rQOZ 113 | 4309.jpg,rr3T 114 | 3106.jpg,1VNf 115 | 745.jpg,Xeu2 116 | 2286.jpg,UjxC 117 | 178.jpg,vP6q 118 | 249.jpg,mxpG 119 | 199.jpg,bbXd 120 | 1308.jpg,nOgy 121 | 1044.jpg,EptC 122 | 3883.jpg,5j4k 123 | 3507.jpg,Z65Q 124 | 4667.jpg,mCbw 125 | 1724.jpg,6eTB 126 | 1842.jpg,WL77 127 | 662.jpg,XkV6 128 | 2961.jpg,DoPx 129 | 1934.jpg,HkYw 130 | 1927.jpg,kJDG 131 | 2644.jpg,VZA4 132 | 838.jpg,tDk5 133 | 1126.jpg,klVH 134 | 446.jpg,dCWK 135 | 675.jpg,zaKr 136 | 1187.jpg,DVnn 137 | 4111.jpg,tyqe 138 | 3694.jpg,IZrZ 139 | 235.jpg,LKgo 140 | 1095.jpg,rkdG 141 | 4495.jpg,YGqN 142 | 3818.jpg,qQRY 143 | 1293.jpg,opqV 144 | 1453.jpg,gv7m 145 | 1691.jpg,ajhS 146 | 4883.jpg,j3Vd 147 | 4888.jpg,OWJS 148 | 1041.jpg,wC3y 149 | 258.jpg,Uoqc 150 | 4146.jpg,LneS 151 | 4514.jpg,7WzY 152 | 2324.jpg,jrwp 153 | 3308.jpg,Visu 154 | 330.jpg,H8X1 155 | 4703.jpg,5aQ3 156 | 905.jpg,zJTq 157 | 4461.jpg,ohPY 158 | 1201.jpg,k8UC 159 | 1341.jpg,WFpO 160 | 1687.jpg,gauH 161 | 2695.jpg,FkUo 162 | 882.jpg,q7sR 163 | 1583.jpg,Oh4C 164 | 243.jpg,L0Ad 165 | 1541.jpg,zA8i 166 | 3763.jpg,Lbz5 167 | 988.jpg,zZOL 168 | 655.jpg,Fgst 169 | 2799.jpg,xjrd 170 | 1933.jpg,KmD3 171 | 1887.jpg,O9bt 172 | 2582.jpg,XEEQ 173 | 3097.jpg,uDa3 174 | 3611.jpg,iNx1 175 | 3525.jpg,tY86 176 | 2643.jpg,2apt 177 | 558.jpg,zRrT 178 | 880.jpg,F7tv 179 | 4809.jpg,rIpj 180 | 321.jpg,5z3y 181 | 2349.jpg,cglh 182 | 2856.jpg,1A33 183 | 2929.jpg,uPk0 184 | 1709.jpg,2QJt 185 | 1138.jpg,Pred 186 | 3456.jpg,oARZ 187 | 1388.jpg,8LSw 188 | 1216.jpg,7YLi 189 | 405.jpg,8DQp 190 | 434.jpg,HG3v 191 | 2884.jpg,Mo3I 192 | 4464.jpg,4m8T 193 | 2377.jpg,fLe6 194 | 489.jpg,AydD 195 | 2384.jpg,SqWT 196 | 3535.jpg,AZ9n 197 | 1818.jpg,zPfx 198 | 1133.jpg,QHuS 199 | 1594.jpg,bEoe 200 | 3821.jpg,rvz3 201 | 3838.jpg,ySli 202 | 1013.jpg,mp21 203 | 4684.jpg,yteZ 204 | 2613.jpg,x2cd 205 | 976.jpg,MtGv 206 | 1122.jpg,3EJq 207 | 4543.jpg,mUhW 208 | 652.jpg,0UQ1 209 | 3804.jpg,KgYG 210 | 4840.jpg,KO3J 211 | 769.jpg,uLWw 212 | 3891.jpg,FV75 213 | 1232.jpg,29Hp 214 | 1032.jpg,P92x 215 | 1976.jpg,sgyy 216 | 1145.jpg,rsLw 217 | 2651.jpg,DnEJ 218 | 2374.jpg,V7XK 219 | 2975.jpg,RXgu 220 | 2189.jpg,TvfN 221 | 3491.jpg,v66J 222 | 4804.jpg,sikV 223 | 3637.jpg,DVic 224 | 1407.jpg,F166 225 | 1158.jpg,njCJ 226 | 4451.jpg,iLYI 227 | 1004.jpg,IpgW 228 | 4872.jpg,0ndn 229 | 3873.jpg,bvkI 230 | 4228.jpg,0VdD 231 | 2523.jpg,rjda 232 | 1554.jpg,ApfE 233 | 4221.jpg,mKnw 234 | 779.jpg,Qktq 235 | 3046.jpg,2h5l 236 | 1481.jpg,monC 237 | 2817.jpg,nR5I 238 | 1813.jpg,12Bg 239 | 1085.jpg,Byi0 240 | 2937.jpg,AtUn 241 | 2890.jpg,LcVZ 242 | 3718.jpg,rGZz 243 | 3073.jpg,FREn 244 | 3163.jpg,w7mR 245 | 2103.jpg,gE0M 246 | 3991.jpg,KSyY 247 | 3547.jpg,JJ3p 248 | 4909.jpg,5yM1 249 | 3475.jpg,RSWk 250 | 3670.jpg,C41v 251 | 162.jpg,UgaH 252 | 1447.jpg,EliB 253 | 2400.jpg,JM22 254 | 1751.jpg,B8Fj 255 | 2821.jpg,Asv2 256 | 4815.jpg,CmQh 257 | 2370.jpg,k7mC 258 | 1149.jpg,tIs5 259 | 680.jpg,9GBk 260 | 2819.jpg,HSfK 261 | 3169.jpg,LoxD 262 | 4379.jpg,7TMk 263 | 4091.jpg,nwTx 264 | 2133.jpg,N0aQ 265 | 4544.jpg,8NTa 266 | 2348.jpg,csUv 267 | 3447.jpg,PeWE 268 | 3390.jpg,G8rZ 269 | 3350.jpg,NbXZ 270 | 4320.jpg,PsNY 271 | 2110.jpg,6ykQ 272 | 1769.jpg,yMta 273 | 875.jpg,SBoh 274 | 3337.jpg,BZaO 275 | 1325.jpg,UraY 276 | 2489.jpg,NsQE 277 | 2680.jpg,skKc 278 | 2504.jpg,8fi4 279 | 3835.jpg,Tlbn 280 | 767.jpg,0YdU 281 | 539.jpg,qmSZ 282 | 3953.jpg,TxE0 283 | 1028.jpg,BwD1 284 | 4973.jpg,uyaC 285 | 314.jpg,ZbbU 286 | 2062.jpg,zav5 287 | 364.jpg,MmHU 288 | 1898.jpg,6N8J 289 | 2069.jpg,pOPI 290 | 4219.jpg,eYcV 291 | 4908.jpg,c0SK 292 | 1330.jpg,rIm6 293 | 1719.jpg,ef8U 294 | 2795.jpg,ylhc 295 | 3276.jpg,VLoN 296 | 2205.jpg,OX1y 297 | 2273.jpg,BYcV 298 | 1314.jpg,xI4e 299 | 2716.jpg,9AYx 300 | 1458.jpg,iYgv 301 | 3816.jpg,IOIe 302 | 1438.jpg,mfcm 303 | 1332.jpg,N9k8 304 | 95.jpg,t0GX 305 | 1975.jpg,CXkr 306 | 2596.jpg,N2iR 307 | 377.jpg,1aM6 308 | 722.jpg,517C 309 | 4750.jpg,Z86Z 310 | 4039.jpg,MNem 311 | 2448.jpg,fZ36 312 | 1673.jpg,qrFk 313 | 4025.jpg,GzKW 314 | 1665.jpg,AhcL 315 | 2199.jpg,pDZp 316 | 1383.jpg,afiq 317 | 333.jpg,KoW4 318 | 1264.jpg,ITkl 319 | 451.jpg,SOo5 320 | 3003.jpg,rnVH 321 | 1608.jpg,OfDV 322 | 4981.jpg,VBd7 323 | 2731.jpg,RQZG 324 | 3184.jpg,rr0Z 325 | 4220.jpg,miUJ 326 | 2089.jpg,cEt2 327 | 1844.jpg,nwwb 328 | 3697.jpg,gXDc 329 | 4273.jpg,CcZP 330 | 4485.jpg,lTQD 331 | 3892.jpg,s2HB 332 | 1551.jpg,3Ccj 333 | 4498.jpg,C86G 334 | 806.jpg,3t9n 335 | 3564.jpg,QGfm 336 | 1600.jpg,yKxc 337 | 3149.jpg,zPcf 338 | 2465.jpg,vPvu 339 | 2203.jpg,lg08 340 | 2995.jpg,IWhX 341 | 1657.jpg,5IkV 342 | 3937.jpg,gdgr 343 | 3400.jpg,opI5 344 | 3706.jpg,BwYk 345 | 4590.jpg,MBon 346 | 166.jpg,2uGe 347 | 4660.jpg,CUxL 348 | 2902.jpg,MejW 349 | 287.jpg,2ZZ9 350 | 3997.jpg,Pvw6 351 | 4475.jpg,ctLk 352 | 3616.jpg,eR23 353 | 833.jpg,7J7G 354 | 3356.jpg,DMxe 355 | 2912.jpg,XhSp 356 | 3405.jpg,hIXY 357 | 3512.jpg,1XeJ 358 | 2804.jpg,RmZl 359 | 792.jpg,lsGz 360 | 2224.jpg,80rO 361 | 608.jpg,mwwK 362 | 3632.jpg,EdDB 363 | 1007.jpg,qAMs 364 | 864.jpg,SoDR 365 | 4921.jpg,UOw4 366 | 2492.jpg,ntHi 367 | 1289.jpg,Z5ZW 368 | 2302.jpg,R3CH 369 | 566.jpg,upX2 370 | 4355.jpg,Ca46 371 | 598.jpg,RA1s 372 | 4952.jpg,KLzc 373 | 2724.jpg,xVWQ 374 | 3054.jpg,QUmO 375 | 4878.jpg,Om7t 376 | 3969.jpg,ifZ6 377 | 4594.jpg,0v1m 378 | 1194.jpg,gttR 379 | 264.jpg,arJP 380 | 3151.jpg,3MQj 381 | 1456.jpg,IYQR 382 | 1027.jpg,inkU 383 | 4577.jpg,2EyY 384 | 3737.jpg,Hfcz 385 | 4687.jpg,dHXc 386 | 4695.jpg,pfUO 387 | 790.jpg,mge2 388 | 3393.jpg,vOYK 389 | 1787.jpg,INUW 390 | 524.jpg,zevd 391 | 1900.jpg,69NU 392 | 1424.jpg,3ya8 393 | 1726.jpg,6AyK 394 | 2733.jpg,p24g 395 | 839.jpg,nuph 396 | 1417.jpg,JYSF 397 | 947.jpg,GMJG 398 | 2597.jpg,KI0K 399 | 3853.jpg,bx6Q 400 | 4013.jpg,OQKI 401 | 2023.jpg,p5Ox 402 | 1271.jpg,A6Pf 403 | 3331.jpg,62UW 404 | 4388.jpg,SbSa 405 | 3284.jpg,7JXP 406 | 3363.jpg,WjVg 407 | 1582.jpg,PGt7 408 | 282.jpg,qdzn 409 | 484.jpg,fecJ 410 | 2521.jpg,tiUh 411 | 226.jpg,qmDC 412 | 3485.jpg,H76l 413 | 2626.jpg,zCGn 414 | 31.jpg,b86y 415 | 2841.jpg,cFs0 416 | 4898.jpg,9qEE 417 | 4566.jpg,B0o7 418 | 1837.jpg,6eMn 419 | 1510.jpg,XYeb 420 | 3508.jpg,Y454 421 | 453.jpg,HELD 422 | 2142.jpg,Dsmi 423 | 3951.jpg,YJLm 424 | 1222.jpg,ahX6 425 | 713.jpg,7bji 426 | 4963.jpg,64z3 427 | 916.jpg,T2MK 428 | 1693.jpg,Ad71 429 | 3137.jpg,vT6v 430 | 3820.jpg,zte3 431 | 3802.jpg,HiCQ 432 | 4997.jpg,2uki 433 | 3045.jpg,f6SG 434 | 1901.jpg,Jy2Y 435 | 2107.jpg,fWcO 436 | 3921.jpg,NRuj 437 | 4385.jpg,oe9d 438 | 3135.jpg,U7FS 439 | 2157.jpg,t3Yb 440 | 3945.jpg,OvoY 441 | 3810.jpg,tR5n 442 | 2079.jpg,gmO2 443 | 3530.jpg,enxU 444 | 3048.jpg,TLL9 445 | 4598.jpg,NNrw 446 | 13.jpg,u38E 447 | 4838.jpg,vtRr 448 | 1250.jpg,X42Y 449 | 663.jpg,o5FH 450 | 2852.jpg,sokH 451 | 2063.jpg,gPWG 452 | 764.jpg,mMYh 453 | 2948.jpg,dnvy 454 | 4640.jpg,VS6t 455 | 4791.jpg,BkMr 456 | 2401.jpg,2egC 457 | 2145.jpg,oURC 458 | 3827.jpg,rLye 459 | 4858.jpg,hZzS 460 | 4017.jpg,orQ6 461 | 170.jpg,bTLn 462 | 615.jpg,3noz 463 | 3043.jpg,41ro 464 | 3566.jpg,y6gg 465 | 4173.jpg,BrvM 466 | 1607.jpg,UfpV 467 | 559.jpg,GCoB 468 | 2175.jpg,BEXp 469 | 1207.jpg,29ha 470 | 447.jpg,E0d3 471 | 3297.jpg,2nBG 472 | 2086.jpg,04oj 473 | 1306.jpg,NApy 474 | 3919.jpg,EdXG 475 | 3361.jpg,Q2nu 476 | 4522.jpg,XatM 477 | 4182.jpg,KYTc 478 | 1643.jpg,fRxL 479 | 4455.jpg,8aF5 480 | 2854.jpg,BvmH 481 | 2915.jpg,1DDT 482 | 3190.jpg,PpDP 483 | 4224.jpg,dBbs 484 | 4900.jpg,5xY9 485 | 3586.jpg,ROb6 486 | 32.jpg,lFRz 487 | 441.jpg,qWaP 488 | 695.jpg,yPRn 489 | 4476.jpg,UEM6 490 | 3722.jpg,ckPK 491 | 3440.jpg,2Qgl 492 | 4426.jpg,IHxe 493 | 3693.jpg,K8Sl 494 | 982.jpg,SDVA 495 | 4694.jpg,tdU6 496 | 4859.jpg,hzJ1 497 | 797.jpg,GCGS 498 | 4011.jpg,wmy5 499 | 3906.jpg,J24O 500 | 3590.jpg,MQEQ 501 | 2734.jpg,mzlS 502 | 4071.jpg,i6GO 503 | 4353.jpg,NvE8 504 | 714.jpg,DNAA 505 | 541.jpg,ONOB 506 | 3203.jpg,9NJz 507 | 4762.jpg,BJ5t 508 | 1169.jpg,HV0X 509 | 4245.jpg,yM5W 510 | 2106.jpg,GuHh 511 | 444.jpg,8TOO 512 | 1609.jpg,wMxZ 513 | 4324.jpg,5ai8 514 | 4572.jpg,HSrA 515 | 545.jpg,NFXp 516 | 2239.jpg,oOxf 517 | 3161.jpg,exx6 518 | 2354.jpg,Mkax 519 | 2903.jpg,mJBg 520 | 1426.jpg,udXX 521 | 2917.jpg,HFSr 522 | 457.jpg,ftaa 523 | 2678.jpg,y51S 524 | 4395.jpg,od2I 525 | 2019.jpg,OXMa 526 | 2038.jpg,O73I 527 | 2099.jpg,15Hk 528 | 2620.jpg,0r5E 529 | 3282.jpg,Zb99 530 | 1414.jpg,l0HR 531 | 2423.jpg,b6Z2 532 | 4167.jpg,L7xX 533 | 2984.jpg,9krn 534 | 3836.jpg,VWaT 535 | 4771.jpg,RXyi 536 | 904.jpg,d8Xx 537 | 1378.jpg,TSFB 538 | 1953.jpg,YyLQ 539 | 4971.jpg,XgDr 540 | 4347.jpg,fxmu 541 | 3861.jpg,f3rM 542 | 4584.jpg,p5En 543 | 3608.jpg,lSzc 544 | 2560.jpg,rWGf 545 | 206.jpg,88FW 546 | 2303.jpg,RROx 547 | 1196.jpg,Jbn1 548 | 3232.jpg,mP1C 549 | 4229.jpg,Jmee 550 | 3399.jpg,cJC0 551 | 983.jpg,wYMY 552 | 320.jpg,MrqY 553 | 1287.jpg,fcYG 554 | 58.jpg,MUKZ 555 | 4162.jpg,CgTb 556 | 1650.jpg,93Ct 557 | 398.jpg,zD1I 558 | 2794.jpg,3c2i 559 | 667.jpg,CqIF 560 | 2996.jpg,rWei 561 | 2179.jpg,h14u 562 | 4121.jpg,0S6m 563 | 1353.jpg,st3C 564 | 914.jpg,opoN 565 | 3051.jpg,IFxf 566 | 4781.jpg,jjG8 567 | 3521.jpg,YDxS 568 | 1218.jpg,lvFG 569 | 1322.jpg,hMYV 570 | 4122.jpg,21ml 571 | 4743.jpg,yoOI 572 | 1273.jpg,pS7u 573 | 3060.jpg,Ykfq 574 | 1441.jpg,NZlU 575 | 522.jpg,MEYh 576 | 4492.jpg,AyL7 577 | 2020.jpg,7908 578 | 1880.jpg,sj3R 579 | 1385.jpg,YMX0 580 | 2161.jpg,7f7r 581 | 1718.jpg,LP0v 582 | 402.jpg,HJmK 583 | 1943.jpg,V4wG 584 | 2109.jpg,tcCL 585 | 3793.jpg,NZX3 586 | 1855.jpg,wmpE 587 | 3719.jpg,Pa1w 588 | 35.jpg,V7T8 589 | 2279.jpg,SUeu 590 | 4784.jpg,Oyjh 591 | 2683.jpg,VatZ 592 | 4040.jpg,fTSd 593 | 645.jpg,rjW3 594 | 980.jpg,cXJv 595 | 1744.jpg,CW0a 596 | 3196.jpg,48OY 597 | 3596.jpg,fltM 598 | 4471.jpg,rYdm 599 | 1679.jpg,csLy 600 | 2594.jpg,827j 601 | 3918.jpg,5hTK 602 | 2143.jpg,T6Gm 603 | 389.jpg,Kcke 604 | 812.jpg,1iyG 605 | 2242.jpg,YLio 606 | 4186.jpg,BalD 607 | 413.jpg,jn49 608 | 4764.jpg,i5oC 609 | 4548.jpg,Fn6e 610 | 467.jpg,z9iU 611 | 2617.jpg,zbJO 612 | 298.jpg,J6D8 613 | 4272.jpg,4n5g 614 | 145.jpg,A8dp 615 | 2104.jpg,HdaA 616 | 4894.jpg,ZVmQ 617 | 2930.jpg,zxrG 618 | 1365.jpg,sg9H 619 | 3263.jpg,o0EH 620 | 3964.jpg,AhOa 621 | 1895.jpg,Sa58 622 | 38.jpg,jQIv 623 | 3198.jpg,VES1 624 | 456.jpg,EumI 625 | 744.jpg,HS7o 626 | 3457.jpg,IxN2 627 | 2774.jpg,rM1B 628 | 4197.jpg,WZ8h 629 | 2073.jpg,7RqM 630 | 421.jpg,p40A 631 | 913.jpg,H4uF 632 | 1094.jpg,Mj5n 633 | 2758.jpg,th39 634 | 986.jpg,ZwMe 635 | 4287.jpg,TA1V 636 | 3436.jpg,SPJp 637 | 2360.jpg,maU6 638 | 2780.jpg,J7xC 639 | 3823.jpg,K8iA 640 | 26.jpg,ldof 641 | 3324.jpg,PMmc 642 | 172.jpg,XUfU 643 | 729.jpg,GvqR 644 | 4008.jpg,JVjw 645 | 831.jpg,78Lb 646 | 3554.jpg,452d 647 | 4339.jpg,7rFF 648 | 569.jpg,PI8V 649 | 118.jpg,NLBp 650 | 955.jpg,FVle 651 | 2299.jpg,txI3 652 | 4524.jpg,26py 653 | 1517.jpg,rCqt 654 | 2362.jpg,mmdB 655 | 1408.jpg,uob3 656 | 1686.jpg,QlSX 657 | 1398.jpg,V9Q5 658 | 1036.jpg,50I6 659 | 163.jpg,Z4hP 660 | 3580.jpg,DRu6 661 | 1016.jpg,0lDA 662 | 2098.jpg,LzwB 663 | 2137.jpg,8H93 664 | 269.jpg,zv10 665 | 4207.jpg,rZpA 666 | 2307.jpg,rKaS 667 | 585.jpg,WQCm 668 | 2632.jpg,zkb1 669 | 1688.jpg,j58O 670 | 697.jpg,fPRd 671 | 4230.jpg,J3vU 672 | 2776.jpg,LmII 673 | 306.jpg,CAgs 674 | 2431.jpg,Y6yY 675 | 1439.jpg,xh4E 676 | 3153.jpg,ddCn 677 | 640.jpg,ewXN 678 | 1675.jpg,0VxV 679 | 1195.jpg,1r1V 680 | 4777.jpg,TEqU 681 | 4595.jpg,qBSI 682 | 4619.jpg,fd2L 683 | 1461.jpg,Avv3 684 | 1991.jpg,D1Nv 685 | 1939.jpg,iKg8 686 | 1974.jpg,Bca4 687 | 4375.jpg,N3e9 688 | 3640.jpg,FRaH 689 | 3578.jpg,t4va 690 | 508.jpg,OqE2 691 | 3408.jpg,G3Gn 692 | 2801.jpg,7skc 693 | 171.jpg,yEHS 694 | 2538.jpg,eTew 695 | 848.jpg,JbEP 696 | 1452.jpg,6t2O 697 | 4713.jpg,mCj4 698 | 1569.jpg,NTZY 699 | 4509.jpg,TymP 700 | 3321.jpg,oHYb 701 | 470.jpg,Z3ju 702 | 4217.jpg,uqS2 703 | 1640.jpg,019M 704 | 236.jpg,1gAy 705 | 204.jpg,0HfD 706 | 4843.jpg,c06Q 707 | 2066.jpg,spTy 708 | 418.jpg,TA1U 709 | 937.jpg,1dMn 710 | 169.jpg,51d2 711 | 1827.jpg,omvO 712 | 4892.jpg,XDdr 713 | 2764.jpg,75eU 714 | 1547.jpg,b3Sv 715 | 309.jpg,Kv8r 716 | 2341.jpg,8e8M 717 | 2518.jpg,AZiO 718 | 1779.jpg,Bj40 719 | 3628.jpg,4oDT 720 | 2230.jpg,LIST 721 | 2009.jpg,zZ5L 722 | 3912.jpg,xY6z 723 | 4769.jpg,2pwA 724 | 4792.jpg,UrKe 725 | 4210.jpg,zKIt 726 | 2717.jpg,XOtk 727 | 553.jpg,lSHd 728 | 1561.jpg,RyHm 729 | 4436.jpg,ZSuy 730 | 3809.jpg,qrjr 731 | 4880.jpg,xfxT 732 | 709.jpg,ZOlc 733 | 573.jpg,03DJ 734 | 4523.jpg,yugj 735 | 2750.jpg,dOd6 736 | 4685.jpg,AABl 737 | 706.jpg,gUVR 738 | 4015.jpg,z1s1 739 | 4942.jpg,b8Ei 740 | 2577.jpg,40pM 741 | 1351.jpg,Wc9i 742 | 89.jpg,BAV6 743 | 4862.jpg,t1kn 744 | 4313.jpg,jh7f 745 | 1876.jpg,uw4C 746 | 1153.jpg,5sz8 747 | 149.jpg,nyyo 748 | 4292.jpg,G7eq 749 | 2135.jpg,pnlt 750 | 2945.jpg,GuHG 751 | 4409.jpg,oPlR 752 | 2932.jpg,yCjA 753 | 2311.jpg,D90x 754 | 3304.jpg,gouq 755 | 3459.jpg,aAo0 756 | 3287.jpg,903a 757 | 3254.jpg,zd4E 758 | 4483.jpg,jO4N 759 | 658.jpg,V6Le 760 | 4342.jpg,SRVd 761 | 4023.jpg,UmPU 762 | 2399.jpg,vsBJ 763 | 176.jpg,QfAZ 764 | 1564.jpg,k6HV 765 | 3070.jpg,Tf48 766 | 3721.jpg,Vpdf 767 | 1357.jpg,KAk8 768 | 2835.jpg,5zvL 769 | 3141.jpg,g2Yc 770 | 3665.jpg,5G9o 771 | 622.jpg,741K 772 | 497.jpg,R9MX 773 | 4257.jpg,I6w2 774 | 510.jpg,Q0Lw 775 | 2451.jpg,8pUx 776 | 2105.jpg,su5D 777 | 1137.jpg,DWLu 778 | 4494.jpg,6CFZ 779 | 1899.jpg,P8R3 780 | 3879.jpg,ikBu 781 | 1940.jpg,e3uv 782 | 216.jpg,FcQo 783 | 2497.jpg,NQvt 784 | 3947.jpg,I56X 785 | 491.jpg,deJQ 786 | 3200.jpg,qvWD 787 | 4627.jpg,IkVJ 788 | 2663.jpg,ZBdR 789 | 4274.jpg,K33Z 790 | 660.jpg,VC0I 791 | 2611.jpg,PZjj 792 | 1215.jpg,3Jsj 793 | 991.jpg,kyb1 794 | 4593.jpg,68go 795 | 4613.jpg,vHlB 796 | 1633.jpg,0slC 797 | 347.jpg,7y6y 798 | 4344.jpg,4rav 799 | 3922.jpg,AHZV 800 | 460.jpg,joMV 801 | 3342.jpg,AiHk 802 | 3147.jpg,cxPh 803 | 3189.jpg,2uNr 804 | 653.jpg,hhFZ 805 | 4194.jpg,LHrV 806 | 4964.jpg,GgiR 807 | 4022.jpg,zpzA 808 | 261.jpg,5nED 809 | 2265.jpg,CLaF 810 | 3093.jpg,RZF7 811 | 438.jpg,m12H 812 | 936.jpg,AF6z 813 | 1677.jpg,grno 814 | 3.jpg,pCS6 815 | 677.jpg,3K5W 816 | 4454.jpg,RKCv 817 | 2031.jpg,83S4 818 | 250.jpg,djpt 819 | 3934.jpg,FfpK 820 | 1839.jpg,8bEt 821 | 2645.jpg,qRSq 822 | 2771.jpg,m44I 823 | 4991.jpg,5sxK 824 | 4834.jpg,3c1S 825 | 4658.jpg,BHXW 826 | 2910.jpg,JdwH 827 | 1524.jpg,wDNq 828 | 4141.jpg,hLak 829 | 1393.jpg,PKQc 830 | 3478.jpg,aGJb 831 | 3224.jpg,kFHB 832 | 1183.jpg,urTY 833 | 4499.jpg,HVuv 834 | 3157.jpg,APqa 835 | 2999.jpg,TB9I 836 | 75.jpg,9qTj 837 | 3666.jpg,ZQG8 838 | 3927.jpg,IrWs 839 | 2515.jpg,CAZK 840 | 4808.jpg,vzW5 841 | 3486.jpg,FkTR 842 | 4164.jpg,DAkl 843 | 353.jpg,QgDi 844 | 3559.jpg,y5A1 845 | 2781.jpg,JttM 846 | 2563.jpg,TRyB 847 | 4046.jpg,d2a0 848 | 861.jpg,HB71 849 | 591.jpg,5OFf 850 | 131.jpg,T0GC 851 | 2294.jpg,DzIr 852 | 2813.jpg,lEop 853 | 2754.jpg,MXca 854 | 1451.jpg,FkHc 855 | 1237.jpg,tWEe 856 | 2687.jpg,SBud 857 | 3236.jpg,B2vx 858 | 3743.jpg,UQ3T 859 | 208.jpg,1tGV 860 | 2366.jpg,X37k 861 | 2941.jpg,jbcx 862 | 711.jpg,ha2d 863 | 3434.jpg,ZHlm 864 | 3435.jpg,fEPY 865 | 1791.jpg,qUD7 866 | 193.jpg,5zDC 867 | 3118.jpg,RzWY 868 | 4530.jpg,lSCm 869 | 4500.jpg,oiBT 870 | 1785.jpg,l88v 871 | 222.jpg,O6Vl 872 | 2355.jpg,OMTu 873 | 1715.jpg,UB0D 874 | 224.jpg,4h7U 875 | 2024.jpg,TGRo 876 | 1708.jpg,bPWI 877 | 4906.jpg,k5ce 878 | 1712.jpg,UUkU 879 | 4657.jpg,2dmH 880 | 390.jpg,AJXg 881 | 2358.jpg,FSun 882 | 1498.jpg,qjYe 883 | 2968.jpg,rUkh 884 | 4714.jpg,T79p 885 | 4078.jpg,sNfy 886 | 4767.jpg,DWTg 887 | 4557.jpg,gFUc 888 | 2136.jpg,t708 889 | 3678.jpg,uoDt 890 | 2.jpg,YiVL 891 | 1525.jpg,qn05 892 | 899.jpg,jH5h 893 | 3751.jpg,X7WM 894 | 4083.jpg,WhFv 895 | 4345.jpg,P2MS 896 | 1260.jpg,BH53 897 | 2007.jpg,Mfbb 898 | 3733.jpg,kaUr 899 | 3294.jpg,JLhb 900 | 3974.jpg,nyCj 901 | 646.jpg,Zxqk 902 | 1073.jpg,4o1I 903 | 4529.jpg,u7Kh 904 | 1266.jpg,Pc9O 905 | 3285.jpg,K6Sw 906 | 2000.jpg,sREW 907 | 3482.jpg,pARG 908 | 2812.jpg,JAJn 909 | 1275.jpg,wcGX 910 | 3096.jpg,mVfu 911 | 2652.jpg,fGAL 912 | 2935.jpg,nDXv 913 | 1664.jpg,CDAW 914 | 4564.jpg,M4tP 915 | 946.jpg,fKUq 916 | 2164.jpg,lxQ2 917 | 3768.jpg,xFEY 918 | 1140.jpg,fawz 919 | 1130.jpg,jWYe 920 | 1488.jpg,QCAd 921 | 4699.jpg,BPo5 922 | 424.jpg,CHjC 923 | 3549.jpg,puUc 924 | 2904.jpg,L6FB 925 | 339.jpg,08il 926 | 1672.jpg,BJqp 927 | 4877.jpg,P7sK 928 | 992.jpg,5Rnh 929 | 2584.jpg,qK5n 930 | 61.jpg,3741 931 | 355.jpg,lysu 932 | 4424.jpg,Ef9A 933 | 319.jpg,fu9u 934 | 4392.jpg,erTS 935 | 1706.jpg,b0dI 936 | 993.jpg,aJGB 937 | 784.jpg,b8TD 938 | 819.jpg,vc9i 939 | 2122.jpg,sT8h 940 | 4044.jpg,xGBo 941 | 2296.jpg,aDnK 942 | 2288.jpg,bnVb 943 | 3942.jpg,Bluy 944 | 102.jpg,BmvY 945 | 2583.jpg,91PC 946 | 2715.jpg,MzV1 947 | 4774.jpg,CJBT 948 | 181.jpg,A2cZ 949 | 3180.jpg,d5XU 950 | 3497.jpg,UQER 951 | 4300.jpg,pDVs 952 | 1941.jpg,AAh6 953 | 240.jpg,Q2XE 954 | 3880.jpg,lcj2 955 | 519.jpg,BTtS 956 | 537.jpg,bUHo 957 | 1631.jpg,egFa 958 | 1063.jpg,BuSz 959 | 1518.jpg,vZSn 960 | 4396.jpg,EAK2 961 | 2757.jpg,w06y 962 | 1205.jpg,KtxU 963 | 1047.jpg,dv2f 964 | 1294.jpg,bTwV 965 | 3786.jpg,HOWB 966 | 954.jpg,MMVN 967 | 1733.jpg,kP8b 968 | 3742.jpg,26rH 969 | 1795.jpg,PRFs 970 | 4700.jpg,ajlB 971 | 1851.jpg,1shu 972 | 2529.jpg,dty0 973 | 4884.jpg,YeCp 974 | 157.jpg,rLwP 975 | 4994.jpg,BVY3 976 | 14.jpg,utZh 977 | 3687.jpg,IYWm 978 | 1771.jpg,H2vJ 979 | 1963.jpg,MWvb 980 | 2730.jpg,cIJ9 981 | 459.jpg,mMTO 982 | 4170.jpg,70pc 983 | 2670.jpg,Sp8o 984 | 1025.jpg,IqnJ 985 | 4261.jpg,Ytuh 986 | 251.jpg,ei0a 987 | 4236.jpg,FjkT 988 | 4982.jpg,AGii 989 | 4701.jpg,7c47 990 | 2475.jpg,A94H 991 | 674.jpg,BT2v 992 | 2310.jpg,RgfP 993 | 2436.jpg,1rfD 994 | 1695.jpg,pQzp 995 | 384.jpg,b6ly 996 | 2507.jpg,CZB7 997 | 4168.jpg,aEyo 998 | 1685.jpg,7Tfe 999 | 2295.jpg,W0kf 1000 | 4308.jpg,6ZNV 1001 | 1090.jpg,gwjm 1002 | 4702.jpg,RfDB 1003 | 2371.jpg,n5s1 1004 | 3698.jpg,61Td 1005 | 4163.jpg,egyO 1006 | 4538.jpg,Emes 1007 | 618.jpg,i8l3 1008 | 2753.jpg,D1rL 1009 | 3515.jpg,bOey 1010 | 4728.jpg,3sxr 1011 | 3675.jpg,5Vbh 1012 | 3087.jpg,SkWR 1013 | 1469.jpg,XYMQ 1014 | 4288.jpg,KEDG 1015 | 2792.jpg,3D7r 1016 | 2361.jpg,hIwG 1017 | 4946.jpg,kyJk 1018 | 48.jpg,QRTy 1019 | 4239.jpg,Dqww 1020 | 2068.jpg,g1Tj 1021 | 4147.jpg,5Ixk 1022 | 3847.jpg,Jcz1 1023 | 37.jpg,xqyh 1024 | 3888.jpg,E2kM 1025 | 1475.jpg,fJaJ 1026 | 4914.jpg,dASI 1027 | 2392.jpg,ZpFV 1028 | 4148.jpg,FQLG 1029 | 356.jpg,q9c3 1030 | 1581.jpg,NdXX 1031 | 2849.jpg,8LSw 1032 | 888.jpg,Xilc 1033 | 1945.jpg,VMPR 1034 | 1496.jpg,Qp4X 1035 | 1281.jpg,cQJr 1036 | 3355.jpg,wSij 1037 | 1531.jpg,XHXH 1038 | 4820.jpg,Kb0h 1039 | 1416.jpg,CqJL 1040 | 3574.jpg,Zsr4 1041 | 1801.jpg,yo1j 1042 | 266.jpg,2NN0 1043 | 1910.jpg,D056 1044 | 3876.jpg,5xdU 1045 | 4865.jpg,NG4K 1046 | 574.jpg,bZyP 1047 | 2335.jpg,BuVb 1048 | 1587.jpg,deOC 1049 | 619.jpg,oF1X 1050 | 1613.jpg,FdNp 1051 | 217.jpg,hvcW 1052 | 2121.jpg,Y9VI 1053 | 795.jpg,nQN4 1054 | 3301.jpg,WLkP 1055 | 4065.jpg,h5tc 1056 | 4578.jpg,OqqC 1057 | 1386.jpg,PgTa 1058 | 4643.jpg,y7uL 1059 | 3417.jpg,SaiO 1060 | 3226.jpg,6jLc 1061 | 4481.jpg,TsCQ 1062 | 3537.jpg,qdXs 1063 | 4718.jpg,Ou82 1064 | 2840.jpg,y9zc 1065 | 3500.jpg,5dqW 1066 | 2967.jpg,LK96 1067 | 4874.jpg,Qh7h 1068 | 929.jpg,TIuB 1069 | 4712.jpg,M715 1070 | 925.jpg,DEcn 1071 | 60.jpg,DNlz 1072 | 88.jpg,BwRN 1073 | 2447.jpg,4Jic 1074 | 2976.jpg,b9ho 1075 | 4698.jpg,0hoE 1076 | 3053.jpg,AoCv 1077 | 1435.jpg,Izzm 1078 | 2488.jpg,r2At 1079 | 2183.jpg,k0jW 1080 | 1134.jpg,PieC 1081 | 4970.jpg,1itT 1082 | 2249.jpg,iSc6 1083 | 4129.jpg,SuaL 1084 | 3583.jpg,ab6k 1085 | 3917.jpg,GOGy 1086 | 3240.jpg,IbBX 1087 | 196.jpg,NK7A 1088 | 3780.jpg,Jfws 1089 | 137.jpg,78XM 1090 | 1604.jpg,7mjj 1091 | 3872.jpg,BqCm 1092 | 915.jpg,nkju 1093 | 981.jpg,IQI9 1094 | 712.jpg,3wDU 1095 | 4001.jpg,oBCG 1096 | 4112.jpg,0WtD 1097 | 2156.jpg,hEtV 1098 | 4936.jpg,ZD1J 1099 | 1792.jpg,o3X7 1100 | 2542.jpg,BIZQ 1101 | 1646.jpg,ioS5 1102 | 2579.jpg,1uug 1103 | 3898.jpg,LKPN 1104 | 1527.jpg,gAjz 1105 | 42.jpg,WG79 1106 | 3627.jpg,dgHS 1107 | 2139.jpg,50cS 1108 | 1756.jpg,Wovx 1109 | 82.jpg,miml 1110 | 504.jpg,6y69 1111 | 3402.jpg,jXfa 1112 | 262.jpg,3osp 1113 | 867.jpg,jaGM 1114 | 994.jpg,8amS 1115 | 3889.jpg,L1Ih 1116 | 4250.jpg,MQs6 1117 | 821.jpg,Zq9c 1118 | 3243.jpg,CdD6 1119 | 480.jpg,PeYL 1120 | 4639.jpg,BQJI 1121 | 3604.jpg,1s9P 1122 | 920.jpg,zsEe 1123 | 16.jpg,UHur 1124 | 3278.jpg,tcae 1125 | 1384.jpg,KvHW 1126 | 3674.jpg,s5nx 1127 | 4817.jpg,dLFz 1128 | 4602.jpg,nIbf 1129 | 1907.jpg,UKq4 1130 | 296.jpg,5ViF 1131 | 4918.jpg,jbFa 1132 | 2712.jpg,qQra 1133 | 3212.jpg,wRdI 1134 | 4138.jpg,iXjd 1135 | 928.jpg,oM9h 1136 | 3121.jpg,AcYH 1137 | 354.jpg,c2hc 1138 | 1571.jpg,ZI5p 1139 | 3191.jpg,7Thl 1140 | 3472.jpg,6SmB 1141 | 2625.jpg,WfXM 1142 | 731.jpg,BoyE 1143 | 4579.jpg,DpCc 1144 | 1367.jpg,K4n5 1145 | 2713.jpg,k517 1146 | 2640.jpg,7zFf 1147 | 4249.jpg,t6Lh 1148 | 2749.jpg,omi6 1149 | 76.jpg,Haef 1150 | 350.jpg,RFS9 1151 | 3502.jpg,QUtx 1152 | 4237.jpg,7rOm 1153 | 4232.jpg,P9ty 1154 | 1307.jpg,1kpw 1155 | 4995.jpg,0sNr 1156 | 3247.jpg,uXFn 1157 | 2002.jpg,ZmTG 1158 | 3458.jpg,hYnU 1159 | 2919.jpg,UlRo 1160 | 1009.jpg,FmOG 1161 | 3299.jpg,oK4O 1162 | 4592.jpg,rXmQ 1163 | 3510.jpg,kI2J 1164 | 4474.jpg,3C2r 1165 | 2067.jpg,yZr1 1166 | 3164.jpg,Vl8c 1167 | 4331.jpg,XC8K 1168 | 1304.jpg,ALZV 1169 | 4045.jpg,9hEi 1170 | 530.jpg,0Kg0 1171 | 3471.jpg,onFx 1172 | 2390.jpg,YojK 1173 | 1430.jpg,50b0 1174 | 449.jpg,Q5aN 1175 | 4731.jpg,RjtZ 1176 | 3246.jpg,xKuT 1177 | 4552.jpg,Dysd 1178 | 179.jpg,OsNn 1179 | 433.jpg,Z5BY 1180 | 3148.jpg,9RYl 1181 | 1188.jpg,7GOT 1182 | 1809.jpg,YdAW 1183 | 2397.jpg,RH29 1184 | 2218.jpg,bZFL 1185 | 3423.jpg,shXf 1186 | 1300.jpg,YEv9 1187 | 1781.jpg,U8of 1188 | 4854.jpg,iM2j 1189 | 642.jpg,ZQhd 1190 | 4752.jpg,w5X2 1191 | 4302.jpg,wMOR 1192 | 2982.jpg,7l6R 1193 | 3976.jpg,qT07 1194 | 2499.jpg,p2kb 1195 | 1772.jpg,X7z4 1196 | 597.jpg,iJEp 1197 | 2588.jpg,5KcH 1198 | 1579.jpg,6YNN 1199 | 4812.jpg,QQ99 1200 | 4655.jpg,kJk2 1201 | 4105.jpg,AFBJ 1202 | 627.jpg,ui4X 1203 | 911.jpg,0q9d 1204 | 1619.jpg,SVlg 1205 | 1747.jpg,QEtN 1206 | 4312.jpg,dAzs 1207 | 2810.jpg,P2MF 1208 | 707.jpg,tXGE 1209 | 1278.jpg,nxeu 1210 | 2340.jpg,jXOK 1211 | 233.jpg,a9IZ 1212 | 2820.jpg,08xv 1213 | 3030.jpg,ZVVt 1214 | 1932.jpg,UUft 1215 | 4645.jpg,dssB 1216 | 1493.jpg,2MdB 1217 | 563.jpg,wfdp 1218 | 3352.jpg,UW9p 1219 | 923.jpg,e1c1 1220 | 518.jpg,2moE 1221 | 1980.jpg,pNuU 1222 | 3018.jpg,aF9G 1223 | 4341.jpg,aFY2 1224 | 2033.jpg,OtaL 1225 | 3758.jpg,9ovz 1226 | 3765.jpg,mrp9 1227 | 3253.jpg,DdEA 1228 | 1612.jpg,zRCI 1229 | 8.jpg,ekY4 1230 | 766.jpg,YpZu 1231 | 760.jpg,dnSg 1232 | 3312.jpg,kRJO 1233 | 2496.jpg,bIYN 1234 | 919.jpg,G1PE 1235 | 2807.jpg,Q9Ma 1236 | 538.jpg,Qwms 1237 | 4254.jpg,2lfd 1238 | 2997.jpg,6WvB 1239 | 3058.jpg,wdJE 1240 | 1952.jpg,IEJz 1241 | 3392.jpg,yHpd 1242 | 4064.jpg,zRaP 1243 | 357.jpg,B3AC 1244 | 4357.jpg,zG8L 1245 | 52.jpg,W7YK 1246 | 2072.jpg,NP0s 1247 | 3023.jpg,zgOM 1248 | 4819.jpg,mfsr 1249 | 3464.jpg,1cwI 1250 | 897.jpg,eMMg 1251 | 2586.jpg,PojM 1252 | 1634.jpg,jcgs 1253 | 4737.jpg,wESK 1254 | 1202.jpg,p1li 1255 | 4666.jpg,hRyE 1256 | 158.jpg,j6jl 1257 | 2618.jpg,pyTE 1258 | 3076.jpg,D7Qk 1259 | 1074.jpg,WBce 1260 | 1425.jpg,LxJn 1261 | 4109.jpg,xFsi 1262 | 4450.jpg,AvkI 1263 | 4116.jpg,qGdM 1264 | 1946.jpg,QeL7 1265 | 3968.jpg,i9xx 1266 | 1645.jpg,QCtk 1267 | 4913.jpg,fmbH 1268 | 3055.jpg,SUql 1269 | 152.jpg,lsHx 1270 | 3775.jpg,IbLQ 1271 | 3094.jpg,8GuY 1272 | 720.jpg,TU0Z 1273 | 3720.jpg,CVl0 1274 | 1399.jpg,cIpC 1275 | 307.jpg,f1N5 1276 | 1526.jpg,pXlO 1277 | 4201.jpg,XGkO 1278 | 4216.jpg,hZov 1279 | 4074.jpg,C3j1 1280 | 1204.jpg,ij8l 1281 | 3929.jpg,RP8d 1282 | 494.jpg,7by9 1283 | 2654.jpg,ws1C 1284 | 3519.jpg,gZ4p 1285 | 1362.jpg,YZ1C 1286 | 3099.jpg,5Xyd 1287 | 2141.jpg,vn6z 1288 | 771.jpg,CO8P 1289 | 231.jpg,21dy 1290 | 1347.jpg,vgL5 1291 | 1297.jpg,usCK 1292 | 2502.jpg,9uYO 1293 | 2783.jpg,fpsU 1294 | 278.jpg,z0T7 1295 | 4161.jpg,NEr0 1296 | 276.jpg,kEKC 1297 | 121.jpg,aRX7 1298 | 4103.jpg,VGHh 1299 | 3353.jpg,sqjS 1300 | 3383.jpg,EFuP 1301 | 189.jpg,OAfr 1302 | 1499.jpg,35pa 1303 | 2769.jpg,ELis 1304 | 4856.jpg,GNa7 1305 | 3534.jpg,wEzQ 1306 | 4863.jpg,KLOH 1307 | 1894.jpg,ZRpF 1308 | 4948.jpg,IKTO 1309 | 1086.jpg,mac0 1310 | 1419.jpg,52tv 1311 | 4244.jpg,J40W 1312 | 1746.jpg,19cy 1313 | 2778.jpg,CiS8 1314 | 2571.jpg,JZs1 1315 | 3425.jpg,FfkK 1316 | 852.jpg,tERF 1317 | 2714.jpg,VxnY 1318 | 2739.jpg,qRtu 1319 | 2306.jpg,D42B 1320 | 4580.jpg,v6iS 1321 | 990.jpg,k7oG 1322 | 895.jpg,YqdQ 1323 | 326.jpg,XZvY 1324 | 3109.jpg,Bchq 1325 | 4240.jpg,C5Vr 1326 | 4009.jpg,wdQY 1327 | 4031.jpg,a7V7 1328 | 165.jpg,sOaf 1329 | 2022.jpg,BPE4 1330 | 2151.jpg,dlXj 1331 | 3439.jpg,OJ5f 1332 | 4374.jpg,J0pv 1333 | 1704.jpg,qMzO 1334 | 4634.jpg,o2Aw 1335 | 1233.jpg,MA8b 1336 | 4301.jpg,Qwl4 1337 | 228.jpg,NwjA 1338 | 3260.jpg,ODSY 1339 | 4291.jpg,LnGb 1340 | 1128.jpg,NYuE 1341 | 3960.jpg,Cl6C 1342 | 3796.jpg,hm6P 1343 | 1762.jpg,nHWD 1344 | 3433.jpg,27bY 1345 | 2608.jpg,5F5e 1346 | 2486.jpg,fxN1 1347 | 2415.jpg,U5uE 1348 | 2013.jpg,F1wh 1349 | 730.jpg,z1GU 1350 | 3723.jpg,kZCk 1351 | 3340.jpg,MPvm 1352 | 4442.jpg,vOHi 1353 | 1060.jpg,Egvn 1354 | 1509.jpg,RL25 1355 | 846.jpg,Pzi1 1356 | 4362.jpg,g2kP 1357 | 3894.jpg,w8eT 1358 | 4721.jpg,13EB 1359 | 481.jpg,pSsB 1360 | 1490.jpg,Y1sc 1361 | 1327.jpg,hCv1 1362 | 3625.jpg,4oP7 1363 | 3882.jpg,aLGC 1364 | 3520.jpg,eRi5 1365 | 2427.jpg,DBx9 1366 | 4080.jpg,px9W 1367 | 2416.jpg,TMMu 1368 | 918.jpg,7Ay3 1369 | 3599.jpg,DBfj 1370 | 694.jpg,PbO7 1371 | 379.jpg,ZrkG 1372 | 4096.jpg,awvX 1373 | 511.jpg,sdbY 1374 | 4047.jpg,KfSw 1375 | 4504.jpg,dBuH 1376 | 2719.jpg,pQCx 1377 | 2254.jpg,qZED 1378 | 717.jpg,fObe 1379 | 4628.jpg,FiIM 1380 | 521.jpg,wfaA 1381 | 4449.jpg,JTbD 1382 | 4003.jpg,fHLc 1383 | 4114.jpg,Sf0D 1384 | 394.jpg,VLyz 1385 | 1176.jpg,1FyZ 1386 | 3431.jpg,2gjI 1387 | 4263.jpg,douI 1388 | 2114.jpg,TqFk 1389 | 3688.jpg,QOGU 1390 | 1252.jpg,sRm1 1391 | 3014.jpg,qWrN 1392 | 4749.jpg,GenI 1393 | 3671.jpg,8wLP 1394 | 2117.jpg,T1p6 1395 | 3467.jpg,3hCP 1396 | 1472.jpg,ciGL 1397 | 4871.jpg,WIXT 1398 | 134.jpg,rUTq 1399 | 4417.jpg,X14g 1400 | 2484.jpg,IQkn 1401 | 668.jpg,34b8 1402 | 703.jpg,eVHY 1403 | 3651.jpg,nZvc 1404 | 4246.jpg,ru0P 1405 | 2802.jpg,wG28 1406 | 2418.jpg,5W1a 1407 | 3343.jpg,yjb0 1408 | 2316.jpg,xfKr 1409 | 4487.jpg,I8Zu 1410 | 3958.jpg,EpSw 1411 | 4691.jpg,6GQ0 1412 | 927.jpg,Cqn5 1413 | 1185.jpg,oXoT 1414 | 3104.jpg,dfbq 1415 | 1591.jpg,4nQx 1416 | 778.jpg,Gcj5 1417 | 2888.jpg,HTYu 1418 | 1917.jpg,v4Po 1419 | 4802.jpg,UnM3 1420 | 738.jpg,dJ9m 1421 | 2309.jpg,QfFi 1422 | 576.jpg,rSyz 1423 | 1446.jpg,j67l 1424 | 4933.jpg,mYWx 1425 | 4264.jpg,S50K 1426 | 1511.jpg,mUk6 1427 | 2191.jpg,9DPL 1428 | 91.jpg,v0we 1429 | 2870.jpg,BtDh 1430 | 256.jpg,xno9 1431 | 2553.jpg,O9vN 1432 | 3011.jpg,zTlA 1433 | 1966.jpg,3yUJ 1434 | 4669.jpg,EXwP 1435 | 368.jpg,u78z 1436 | 2677.jpg,flWf 1437 | 2711.jpg,Jend 1438 | 3971.jpg,kdPD 1439 | 4124.jpg,zMhb 1440 | 1310.jpg,FWTB 1441 | 3817.jpg,Z8Nc 1442 | 1824.jpg,CTy7 1443 | 2235.jpg,5BOa 1444 | 3715.jpg,oiNT 1445 | 2872.jpg,XEJr 1446 | 1710.jpg,LIQ2 1447 | 2992.jpg,XtIa 1448 | 551.jpg,pKNU 1449 | 3307.jpg,P52s 1450 | 599.jpg,keoB 1451 | 2936.jpg,OjM8 1452 | 338.jpg,t37U 1453 | 910.jpg,K4QL 1454 | 1292.jpg,jirY 1455 | 2048.jpg,BeIA 1456 | 4004.jpg,nADe 1457 | 2160.jpg,GH8s 1458 | 45.jpg,wf8T 1459 | 509.jpg,RMoj 1460 | 302.jpg,pMwU 1461 | 4866.jpg,WYaZ 1462 | 153.jpg,e4KN 1463 | 1732.jpg,wZ7n 1464 | 892.jpg,HR1m 1465 | 3248.jpg,5ExT 1466 | 3367.jpg,xy5U 1467 | 2978.jpg,TGkb 1468 | 2398.jpg,hjqH 1469 | 2955.jpg,HMDv 1470 | 4940.jpg,A1Ft 1471 | 1124.jpg,zZ5E 1472 | 3221.jpg,lt4c 1473 | 4612.jpg,fv6I 1474 | 2519.jpg,oo2n 1475 | 2442.jpg,hyva 1476 | 3379.jpg,4P1s 1477 | 496.jpg,Sp21 1478 | 1667.jpg,CaAJ 1479 | 2639.jpg,lWTR 1480 | 3057.jpg,whUq 1481 | 816.jpg,wOZW 1482 | 1316.jpg,n3PN 1483 | 3956.jpg,9wOT 1484 | 284.jpg,zyoW 1485 | 3103.jpg,da82 1486 | 1626.jpg,6E9x 1487 | 1236.jpg,eAR7 1488 | 1763.jpg,DcBI 1489 | 2809.jpg,0h09 1490 | 3638.jpg,4ISj 1491 | 4968.jpg,hEzq 1492 | 1161.jpg,9qef 1493 | 4420.jpg,oYyU 1494 | 1536.jpg,quMG 1495 | 789.jpg,ZRzo 1496 | 1483.jpg,yURV 1497 | 834.jpg,JQPx 1498 | 2182.jpg,9GbE 1499 | 4386.jpg,KHUW 1500 | 1848.jpg,BEp5 1501 | 3110.jpg,sWfS 1502 | 123.jpg,FOi1 1503 | 1790.jpg,zQiT 1504 | 255.jpg,hx4X 1505 | 1208.jpg,NmZd 1506 | 4835.jpg,Eu1Q 1507 | 4432.jpg,30VG 1508 | 3311.jpg,Nif8 1509 | 3069.jpg,bjGz 1510 | 4870.jpg,RYYj 1511 | 2414.jpg,JzA1 1512 | 4372.jpg,X2pW 1513 | 3984.jpg,xScL 1514 | 2300.jpg,1pNA 1515 | 4460.jpg,w0BP 1516 | 2779.jpg,wvv1 1517 | 4782.jpg,fLcc 1518 | 180.jpg,bbO3 1519 | 2628.jpg,ltN1 1520 | 3771.jpg,3lYw 1521 | 2723.jpg,L1FX 1522 | 2012.jpg,pC2o 1523 | 188.jpg,LsLs 1524 | 1668.jpg,NB2Z 1525 | 4181.jpg,HI5y 1526 | 502.jpg,3QVV 1527 | 2827.jpg,lehm 1528 | 1129.jpg,vCnH 1529 | 4506.jpg,7n5i 1530 | 29.jpg,jhVp 1531 | 4985.jpg,R07E 1532 | 4556.jpg,9etk 1533 | 3618.jpg,FwsA 1534 | 557.jpg,hq5l 1535 | 4799.jpg,BGqV 1536 | 3709.jpg,XxlW 1537 | 3540.jpg,cdse 1538 | 1931.jpg,lBd9 1539 | 4679.jpg,0cDa 1540 | 1648.jpg,9JMy 1541 | 25.jpg,rg6T 1542 | 2858.jpg,a8Tg 1543 | 1993.jpg,A7UQ 1544 | 4024.jpg,kqvt 1545 | 3010.jpg,ZxwD 1546 | 4969.jpg,R21n 1547 | 855.jpg,6cvx 1548 | 452.jpg,izYl 1549 | 1955.jpg,K2nJ 1550 | 4061.jpg,81fT 1551 | 3501.jpg,xys7 1552 | 698.jpg,Kj3J 1553 | 2649.jpg,HsD5 1554 | 2630.jpg,8IId 1555 | 4693.jpg,aY3c 1556 | 1681.jpg,oazo 1557 | 1473.jpg,yvkW 1558 | 2339.jpg,dCTD 1559 | 3009.jpg,IQ46 1560 | 4427.jpg,DEkx 1561 | 3859.jpg,AsGk 1562 | 4853.jpg,ovLx 1563 | 66.jpg,y3HI 1564 | 2694.jpg,gT2R 1565 | 3989.jpg,EOXT 1566 | 3349.jpg,Hzoy 1567 | 4042.jpg,k4qb 1568 | 4139.jpg,eq0i 1569 | 3015.jpg,YMxM 1570 | 1366.jpg,gZZ6 1571 | 1482.jpg,Bgaz 1572 | 639.jpg,c1dI 1573 | 2149.jpg,EZtb 1574 | 1212.jpg,8Fv8 1575 | 4842.jpg,IUHD 1576 | 3139.jpg,dR1P 1577 | 3056.jpg,eiml 1578 | 3100.jpg,5P4m 1579 | 4441.jpg,qXg4 1580 | 1018.jpg,n52i 1581 | 2551.jpg,EN7O 1582 | 1256.jpg,RTup 1583 | 4825.jpg,Fjxx 1584 | 1812.jpg,mmNW 1585 | 874.jpg,Q34J 1586 | 2641.jpg,BtLG 1587 | 99.jpg,MY1A 1588 | 322.jpg,pLeW 1589 | 3084.jpg,X0uG 1590 | 440.jpg,bqGs 1591 | 3759.jpg,o6Db 1592 | 1578.jpg,dC4A 1593 | 2650.jpg,Atm3 1594 | 4319.jpg,ZhIY 1595 | 4403.jpg,FOz0 1596 | 3089.jpg,V9yS 1597 | 2855.jpg,IbBf 1598 | 4827.jpg,837f 1599 | 2255.jpg,T08o 1600 | 3636.jpg,BjAj 1601 | 1224.jpg,uZAU 1602 | 2163.jpg,ke4Q 1603 | 2824.jpg,MXV3 1604 | 4651.jpg,gawB 1605 | 492.jpg,WWoA 1606 | 3988.jpg,Mmzj 1607 | 2916.jpg,GFYA 1608 | 2260.jpg,8xGE 1609 | 3001.jpg,AshH 1610 | 3158.jpg,9iJU 1611 | 1770.jpg,seFi 1612 | 18.jpg,TbrZ 1613 | 1776.jpg,FvVd 1614 | 1497.jpg,CA2U 1615 | 1623.jpg,ysPI 1616 | 2853.jpg,UJVY 1617 | 3542.jpg,KN12 1618 | 800.jpg,BntN 1619 | 1248.jpg,eGid 1620 | 2420.jpg,6pkC 1621 | 1043.jpg,x8is 1622 | 3451.jpg,mj0c 1623 | 4664.jpg,8Y7B 1624 | 1020.jpg,eogk 1625 | 1108.jpg,yq8L 1626 | 3514.jpg,MGj7 1627 | 4661.jpg,bbZy 1628 | 471.jpg,tpQa 1629 | 499.jpg,e1zb 1630 | 1937.jpg,cYiF 1631 | 3345.jpg,FC6l 1632 | 3347.jpg,9as0 1633 | 4545.jpg,4Mn5 1634 | 3518.jpg,Io3O 1635 | 837.jpg,tn34 1636 | 3022.jpg,AWc1 1637 | 2938.jpg,cRIP 1638 | 3218.jpg,2JDe 1639 | 2517.jpg,aMxE 1640 | 192.jpg,AkK1 1641 | 4734.jpg,8Pqp 1642 | 411.jpg,lkiD 1643 | 4927.jpg,L4hE 1644 | 4998.jpg,gCQU 1645 | 1420.jpg,vT8a 1646 | 801.jpg,qZxk 1647 | 4822.jpg,Df6c 1648 | 4158.jpg,577q 1649 | 396.jpg,JCXO 1650 | 3558.jpg,B8ef 1651 | 3481.jpg,RvLD 1652 | 2676.jpg,va29 1653 | 3035.jpg,egNU 1654 | 4618.jpg,f9J2 1655 | 554.jpg,XhBF 1656 | 3044.jpg,8rl3 1657 | 2248.jpg,nmuq 1658 | 1344.jpg,qamd 1659 | 604.jpg,dFcx 1660 | 4329.jpg,obsU 1661 | 2831.jpg,ez3m 1662 | 472.jpg,wl5W 1663 | 4686.jpg,LY1e 1664 | 938.jpg,ZZw7 1665 | 3339.jpg,EWxI 1666 | 2064.jpg,a7Ed 1667 | 4920.jpg,R9Is 1668 | 3808.jpg,Sbox 1669 | 1539.jpg,BAfA 1670 | 2533.jpg,iy36 1671 | 1340.jpg,W7i2 1672 | 238.jpg,S8m8 1673 | 2474.jpg,T2VY 1674 | 2500.jpg,3OwK 1675 | 2037.jpg,Jiqn 1676 | 2773.jpg,MTch 1677 | 4742.jpg,zz1D 1678 | 1214.jpg,boZF 1679 | 4088.jpg,fbfA 1680 | 286.jpg,W7u2 1681 | 762.jpg,tYn0 1682 | 2672.jpg,j9L2 1683 | 2788.jpg,KWBg 1684 | 3489.jpg,Dcru 1685 | 3814.jpg,hW4y 1686 | 4709.jpg,CzAy 1687 | 4520.jpg,utbh 1688 | 3119.jpg,ucyZ 1689 | 4826.jpg,Dody 1690 | 1449.jpg,9mTx 1691 | 2217.jpg,gusq 1692 | 425.jpg,FmjN 1693 | 1575.jpg,ZFaY 1694 | 4955.jpg,alNd 1695 | 3803.jpg,waAV 1696 | 187.jpg,adNn 1697 | 3165.jpg,Jghf 1698 | 21.jpg,rVYt 1699 | 1947.jpg,nZPM 1700 | 3418.jpg,8nKK 1701 | 359.jpg,0P3C 1702 | 2267.jpg,zezq 1703 | 1175.jpg,4knz 1704 | 3409.jpg,pS6I 1705 | 623.jpg,rFxu 1706 | 2186.jpg,lyL1 1707 | 4010.jpg,9y3m 1708 | 56.jpg,aWOb 1709 | 2973.jpg,fhcj 1710 | 700.jpg,rlaL 1711 | 1653.jpg,G1IK 1712 | 3680.jpg,GNOo 1713 | 1815.jpg,jQ6K 1714 | 1415.jpg,K6Ub 1715 | 1836.jpg,w6dY 1716 | 301.jpg,dNHI 1717 | 3598.jpg,75GU 1718 | 3777.jpg,LXT8 1719 | 212.jpg,TAeD 1720 | 560.jpg,dBEA 1721 | 4459.jpg,9kcW 1722 | 2343.jpg,fn1W 1723 | 2231.jpg,zFf7 1724 | 4625.jpg,s2Ir 1725 | 4793.jpg,xDwM 1726 | 194.jpg,kJMV 1727 | 633.jpg,O3AQ 1728 | 293.jpg,PX8z 1729 | 1008.jpg,QGNM 1730 | 393.jpg,4dYS 1731 | 4824.jpg,TV3C 1732 | 2830.jpg,wsFo 1733 | 578.jpg,rDM2 1734 | 957.jpg,morE 1735 | 3252.jpg,SR0S 1736 | 1528.jpg,SScF 1737 | 2094.jpg,5HIm 1738 | 247.jpg,cYgv 1739 | 2589.jpg,AyfU 1740 | 2721.jpg,eKxh 1741 | 1797.jpg,v0pf 1742 | 3846.jpg,bWnJ 1743 | 4607.jpg,rDPW 1744 | 1532.jpg,Kq3B 1745 | 279.jpg,NLnO 1746 | 4107.jpg,qIiT 1747 | 613.jpg,tLwh 1748 | 3461.jpg,px2H 1749 | 257.jpg,OaI4 1750 | 3162.jpg,lLli 1751 | 1082.jpg,gt1B 1752 | 3543.jpg,pEHR 1753 | 1057.jpg,rBGN 1754 | 2562.jpg,aDte 1755 | 2862.jpg,c4gY 1756 | 2314.jpg,o8ry 1757 | 2880.jpg,dVT1 1758 | 4282.jpg,BGxc 1759 | 2445.jpg,SQAh 1760 | 679.jpg,yNdm 1761 | 2081.jpg,QWnR 1762 | 3293.jpg,Clyh 1763 | 4151.jpg,yaqG 1764 | 3897.jpg,gcN3 1765 | 3083.jpg,ieaX 1766 | 3179.jpg,GtoQ 1767 | 3522.jpg,xyBL 1768 | 2508.jpg,gzjF 1769 | 34.jpg,Wnyh 1770 | 1402.jpg,m9oX 1771 | 879.jpg,LNzT 1772 | 3862.jpg,Jrum 1773 | 3124.jpg,DfZU 1774 | 1272.jpg,GDsI 1775 | 625.jpg,qLuR 1776 | 2671.jpg,iH5y 1777 | 3115.jpg,C8yc 1778 | 773.jpg,NQOe 1779 | 1999.jpg,PFQA 1780 | 4051.jpg,r5dP 1781 | 2329.jpg,q3c3 1782 | 1852.jpg,HgpT 1783 | 1219.jpg,jtam 1784 | 4732.jpg,s4P5 1785 | 2315.jpg,SKtF 1786 | 4484.jpg,M90O 1787 | 1376.jpg,tHEX 1788 | 3788.jpg,3VOn 1789 | 2268.jpg,2qwW 1790 | 4496.jpg,p45U 1791 | 1352.jpg,0dc9 1792 | 1739.jpg,NRCt 1793 | 1500.jpg,zcfW 1794 | 2520.jpg,FcBn 1795 | 996.jpg,dWBJ 1796 | 3571.jpg,4NCK 1797 | 272.jpg,oIQz 1798 | 3724.jpg,xH3E 1799 | 4378.jpg,0rN8 1800 | 1350.jpg,dJNQ 1801 | 4957.jpg,LxUm 1802 | 2269.jpg,WugR 1803 | 4248.jpg,irwu 1804 | 2319.jpg,NJoE 1805 | 2668.jpg,lNgk 1806 | 686.jpg,wkvZ 1807 | 2406.jpg,QRLd 1808 | 3320.jpg,jxzz 1809 | 4102.jpg,aOX0 1810 | 3192.jpg,bbb1 1811 | 4979.jpg,Tu19 1812 | 1872.jpg,hw9R 1813 | 1406.jpg,oxc8 1814 | 1448.jpg,tSM6 1815 | 1636.jpg,u3Tn 1816 | 341.jpg,Ba3D 1817 | 4928.jpg,rius 1818 | 281.jpg,jjQ1 1819 | 3952.jpg,gOD0 1820 | 1576.jpg,KcpO 1821 | 87.jpg,wuDS 1822 | 934.jpg,mouf 1823 | 3155.jpg,buW8 1824 | 2065.jpg,8RME 1825 | 4704.jpg,53iy 1826 | 2380.jpg,R7yW 1827 | 3744.jpg,bDCU 1828 | 3600.jpg,GcYW 1829 | 4183.jpg,94Rg 1830 | 4033.jpg,AKXa 1831 | 849.jpg,4p6O 1832 | 2913.jpg,kUww 1833 | 1198.jpg,7uID 1834 | 2572.jpg,9kU7 1835 | 2595.jpg,dr2o 1836 | 3344.jpg,jg0H 1837 | 4412.jpg,70T9 1838 | 2610.jpg,qLNs 1839 | 2833.jpg,iGUf 1840 | 448.jpg,Qww9 1841 | 2490.jpg,c0ft 1842 | 1454.jpg,TmbY 1843 | 2430.jpg,y39N 1844 | 1656.jpg,LMAj 1845 | 2321.jpg,RoXj 1846 | 2404.jpg,BrtZ 1847 | 4697.jpg,A9EY 1848 | 62.jpg,BkEA 1849 | 747.jpg,yJPH 1850 | 161.jpg,I8pR 1851 | 749.jpg,10dI 1852 | 135.jpg,7oyr 1853 | 487.jpg,B5kU 1854 | 4443.jpg,mlq1 1855 | 4070.jpg,yJZg 1856 | 2943.jpg,z6sv 1857 | 593.jpg,bESy 1858 | 654.jpg,dEE8 1859 | 431.jpg,Wap1 1860 | 3752.jpg,haWR 1861 | 2925.jpg,ToMs 1862 | 856.jpg,tLCR 1863 | 312.jpg,PaSG 1864 | 4206.jpg,C12f 1865 | 4284.jpg,0Tig 1866 | 4035.jpg,lzhC 1867 | 2111.jpg,KYC9 1868 | 3839.jpg,3k3y 1869 | 4473.jpg,YalD 1870 | 4532.jpg,Aw4i 1871 | 1637.jpg,Dipg 1872 | 1989.jpg,bnuo 1873 | 2889.jpg,j693 1874 | 1280.jpg,Dgji 1875 | 3120.jpg,5mpy 1876 | 3829.jpg,cLJN 1877 | 476.jpg,kWfe 1878 | 43.jpg,inCn 1879 | 4425.jpg,sdsK 1880 | 4976.jpg,sPgC 1881 | 4511.jpg,gZDu 1882 | 1049.jpg,qEV1 1883 | 1091.jpg,NcCV 1884 | 1830.jpg,j9zf 1885 | 4041.jpg,IATm 1886 | 3296.jpg,CTIx 1887 | 2873.jpg,HTzx 1888 | 3663.jpg,ieKT 1889 | 2755.jpg,47HW 1890 | 4435.jpg,Ihbo 1891 | 543.jpg,BkXl 1892 | 4133.jpg,Stuz 1893 | 2180.jpg,ckCc 1894 | 1268.jpg,u1hZ 1895 | 280.jpg,oNd6 1896 | 672.jpg,3HBp 1897 | 380.jpg,G4uG 1898 | 3098.jpg,TBuD 1899 | 2394.jpg,pljM 1900 | 4527.jpg,77Kc 1901 | 4366.jpg,wydY 1902 | 4633.jpg,691w 1903 | 2981.jpg,05xb 1904 | 825.jpg,aWKZ 1905 | 4814.jpg,pgHV 1906 | 1749.jpg,OGT8 1907 | 1017.jpg,DM4r 1908 | 4901.jpg,Rmew 1909 | 130.jpg,xa4k 1910 | 1363.jpg,GT7P 1911 | 1375.jpg,cIq3 1912 | 3682.jpg,aMek 1913 | 115.jpg,QXMD 1914 | 2605.jpg,h9l6 1915 | 3251.jpg,qq4T 1916 | 4016.jpg,hx0N 1917 | 886.jpg,kb4z 1918 | 3932.jpg,vQBJ 1919 | 477.jpg,FEdP 1920 | 2581.jpg,IkAw 1921 | 3624.jpg,WXas 1922 | 2437.jpg,oYcR 1923 | 3705.jpg,QUhO 1924 | 1652.jpg,1Lsu 1925 | 1006.jpg,20du 1926 | 2468.jpg,RPpV 1927 | 1960.jpg,SHSd 1928 | 1484.jpg,DdjK 1929 | 4597.jpg,WvM1 1930 | 2015.jpg,plxH 1931 | 46.jpg,uwe4 1932 | 73.jpg,HAY9 1933 | 4828.jpg,BqT6 1934 | 263.jpg,EngY 1935 | 4376.jpg,Qq5W 1936 | 1444.jpg,K4Ys 1937 | 3657.jpg,GJX4 1938 | 2920.jpg,vldO 1939 | 4953.jpg,Pw8s 1940 | 1391.jpg,FvXK 1941 | 2777.jpg,3bRM 1942 | 1263.jpg,HmhH 1943 | 4542.jpg,fz6N 1944 | 1768.jpg,r8It 1945 | 3387.jpg,FTMg 1946 | 1227.jpg,zo7d 1947 | 2440.jpg,Ok4Q 1948 | 2221.jpg,spWY 1949 | 3020.jpg,dFjc 1950 | 1470.jpg,wMjj 1951 | 4534.jpg,Mb8I 1952 | 3081.jpg,hRJA 1953 | 185.jpg,u5ts 1954 | 2547.jpg,xvfe 1955 | 2410.jpg,2zfw 1956 | 2681.jpg,Y2yu 1957 | 2263.jpg,Ivkk 1958 | 808.jpg,jcFd 1959 | 1284.jpg,ECQt 1960 | 1574.jpg,cKq5 1961 | 2911.jpg,31Pq 1962 | 4656.jpg,3gCG 1963 | 1867.jpg,P13s 1964 | 2188.jpg,zmQh 1965 | 3893.jpg,SSfi 1966 | 564.jpg,HezF 1967 | 346.jpg,57HJ 1968 | 3533.jpg,yu3u 1969 | 1092.jpg,RYOm 1970 | 589.jpg,xgZM 1971 | 3926.jpg,38Pz 1972 | 648.jpg,RmyN 1973 | 681.jpg,16sb 1974 | 15.jpg,DEEE 1975 | 3261.jpg,PktT 1976 | 912.jpg,1vEr 1977 | 313.jpg,jjST 1978 | 1520.jpg,FFEz 1979 | 2673.jpg,1miS 1980 | 2865.jpg,H9zz 1981 | 1432.jpg,PZjv 1982 | 4002.jpg,HFDv 1983 | 2096.jpg,Paot 1984 | 1696.jpg,9kvw 1985 | 4801.jpg,V0VQ 1986 | 3396.jpg,cNMN 1987 | 4818.jpg,0a8n 1988 | 5000.jpg,i169 1989 | 1401.jpg,Hzv6 1990 | 190.jpg,z61p 1991 | 3877.jpg,NGj3 1992 | 2536.jpg,v3hR 1993 | 3645.jpg,lQ0N 1994 | 906.jpg,z0rO 1995 | 4349.jpg,xCK5 1996 | 3037.jpg,e3HH 1997 | 949.jpg,xFn2 1998 | 1065.jpg,amZO 1999 | 2246.jpg,lVC7 2000 | 2222.jpg,91xO 2001 | 890.jpg,wHlP 2002 | 1649.jpg,Aq58 2003 | 2829.jpg,t6xE 2004 | 3760.jpg,Za9G 2005 | 3378.jpg,xlyO 2006 | 3494.jpg,jkaQ 2007 | 4807.jpg,b6vH 2008 | 4850.jpg,8bX1 2009 | 4383.jpg,biVR 2010 | 4316.jpg,zb7a 2011 | 3644.jpg,EwRi 2012 | 3686.jpg,BFsg 2013 | 3516.jpg,KzN8 2014 | 2986.jpg,yZxV 2015 | 1722.jpg,dYhA 2016 | 3755.jpg,He8P 2017 | 3732.jpg,5WFf 2018 | 3681.jpg,wz6N 2019 | 847.jpg,5fVc 2020 | 4882.jpg,pNVN 2021 | 2223.jpg,wxbB 2022 | 2541.jpg,kOe3 2023 | 3381.jpg,O33Y 2024 | 1474.jpg,Y7MJ 2025 | 4055.jpg,T1CZ 2026 | 952.jpg,vHCz 2027 | 2696.jpg,d8in 2028 | 2138.jpg,6hOW 2029 | 4185.jpg,JL6m 2030 | 3107.jpg,j5hf 2031 | 4429.jpg,A5v1 2032 | 741.jpg,vHAj 2033 | 3914.jpg,ne8M 2034 | 3692.jpg,CThM 2035 | 289.jpg,yTcJ 2036 | 2602.jpg,Ab5a 2037 | 3579.jpg,YlFe 2038 | 1858.jpg,kYLa 2039 | 630.jpg,0z2T 2040 | 2368.jpg,gwys 2041 | 1457.jpg,qZas 2042 | 4193.jpg,9w8i 2043 | 1596.jpg,6xvT 2044 | 1669.jpg,KKTW 2045 | 548.jpg,0uh2 2046 | 3669.jpg,NT8b 2047 | 3242.jpg,SDi9 2048 | 517.jpg,6xGm 2049 | 1632.jpg,GZMc 2050 | 1311.jpg,1ywT 2051 | 4145.jpg,QQ2s 2052 | 4134.jpg,Z6aF 2053 | 3745.jpg,LKcx 2054 | 3778.jpg,UY0W 2055 | 1394.jpg,NBlZ 2056 | 1862.jpg,X4qU 2057 | 728.jpg,024g 2058 | 4275.jpg,wvLF 2059 | 2036.jpg,xO6G 2060 | 577.jpg,X83V 2061 | 950.jpg,3FYC 2062 | 794.jpg,b07e 2063 | 4575.jpg,yay1 2064 | 3250.jpg,ro9L 2065 | 1702.jpg,dFFi 2066 | 3370.jpg,icR0 2067 | 1225.jpg,1aN7 2068 | 2568.jpg,RmAM 2069 | 2102.jpg,7DTi 2070 | 2705.jpg,Obdc 2071 | 671.jpg,WNZH 2072 | 4294.jpg,LGAD 2073 | 1916.jpg,cIp4 2074 | 975.jpg,ZeIZ 2075 | 1877.jpg,LesD 2076 | 4681.jpg,gaYv 2077 | 3130.jpg,n2dj 2078 | 2080.jpg,eChp 2079 | 4380.jpg,tyoT 2080 | 4233.jpg,H1ek 2081 | 4069.jpg,ykEV 2082 | 2006.jpg,u4JG 2083 | 1243.jpg,Cpe0 2084 | 1312.jpg,FrRS 2085 | 536.jpg,tMmP 2086 | 3939.jpg,M3qJ 2087 | 2857.jpg,DSBA 2088 | 4052.jpg,Eh8b 2089 | 3762.jpg,lJtm 2090 | 2592.jpg,0a3y 2091 | 2559.jpg,B99D 2092 | 1550.jpg,friB 2093 | 4152.jpg,iQO2 2094 | 3834.jpg,R46x 2095 | 963.jpg,x2rt 2096 | 2768.jpg,9sSN 2097 | 2461.jpg,dwzV 2098 | 2895.jpg,eFiM 2099 | 4363.jpg,IS8U 2100 | 1925.jpg,DFeN 2101 | 1113.jpg,wvrZ 2102 | 1563.jpg,rQy4 2103 | 2356.jpg,MzHu 2104 | 1502.jpg,ecPv 2105 | 542.jpg,bQ4p 2106 | 4975.jpg,0ypm 2107 | 2232.jpg,0brA 2108 | 4252.jpg,LnDd 2109 | 4785.jpg,pAdZ 2110 | 4857.jpg,H6fY 2111 | 155.jpg,UuGp 2112 | 1965.jpg,9pJN 2113 | 4497.jpg,9NFe 2114 | 4937.jpg,PXRx 2115 | 3012.jpg,2AYm 2116 | 584.jpg,LvTS 2117 | 4123.jpg,IHL4 2118 | 417.jpg,WXas 2119 | 1001.jpg,whwJ 2120 | 3746.jpg,2adt 2121 | 3225.jpg,iKMC 2122 | 3655.jpg,kJyP 2123 | 4772.jpg,EJ95 2124 | 3185.jpg,tPgF 2125 | 3909.jpg,hW6Q 2126 | 2806.jpg,SODo 2127 | 3498.jpg,BB3i 2128 | 2818.jpg,8yr0 2129 | 4446.jpg,gwSZ 2130 | 1962.jpg,2wov 2131 | 2765.jpg,yfy5 2132 | 3201.jpg,1DL4 2133 | 1364.jpg,JWBc 2134 | 4501.jpg,ZgvA 2135 | 2785.jpg,rnqp 2136 | 4778.jpg,4fF5 2137 | 1857.jpg,Mg0u 2138 | 3695.jpg,bUZS 2139 | 4760.jpg,cDHF 2140 | 3899.jpg,Xuy9 2141 | 4343.jpg,nTPb 2142 | 4528.jpg,0en1 2143 | 3749.jpg,A3mG 2144 | 1889.jpg,v8rV 2145 | 3446.jpg,CStk 2146 | 1440.jpg,f9KE 2147 | 184.jpg,ATIB 2148 | 2704.jpg,KDbE 2149 | 4935.jpg,mWKJ 2150 | 3828.jpg,nt4d 2151 | 1261.jpg,RvNu 2152 | 4601.jpg,TJWr 2153 | 547.jpg,eH8d 2154 | 4855.jpg,djzq 2155 | 4569.jpg,thwf 2156 | 317.jpg,YRXO 2157 | 665.jpg,p6QR 2158 | 614.jpg,GRMm 2159 | 4797.jpg,J3aA 2160 | 1064.jpg,14fQ 2161 | 2129.jpg,zltr 2162 | 44.jpg,lLCy 2163 | 2977.jpg,CayC 2164 | 4868.jpg,O6oZ 2165 | 2293.jpg,8PsC 2166 | 4507.jpg,nRqN 2167 | 3470.jpg,mtSs 2168 | 1412.jpg,3vjg 2169 | 3468.jpg,V72P 2170 | 4846.jpg,J3Js 2171 | 1555.jpg,CVXX 2172 | 571.jpg,iKiw 2173 | 4179.jpg,k0Cm 2174 | 3289.jpg,2Owp 2175 | 3905.jpg,xNVw 2176 | 877.jpg,IETJ 2177 | 4665.jpg,8ktp 2178 | 763.jpg,CTDd 2179 | 2213.jpg,DMsU 2180 | 3364.jpg,h0EP 2181 | 2805.jpg,Xc6O 2182 | 4610.jpg,6KYC 2183 | 2573.jpg,RcJY 2184 | 2229.jpg,DG62 2185 | 430.jpg,y4vR 2186 | 2443.jpg,wjKv 2187 | 1766.jpg,1Pis 2188 | 586.jpg,jsGv 2189 | 65.jpg,6lMC 2190 | 1177.jpg,E0kC 2191 | 1820.jpg,foWQ 2192 | 1548.jpg,Dtaj 2193 | 3310.jpg,pfrT 2194 | 2762.jpg,vHSn 2195 | 737.jpg,g9P0 2196 | 1875.jpg,BwbW 2197 | 1477.jpg,z6xE 2198 | 1807.jpg,hvjU 2199 | 1051.jpg,yH8U 2200 | 4951.jpg,uGAr 2201 | 4938.jpg,D3OD 2202 | 1516.jpg,uAQK 2203 | 894.jpg,cbmJ 2204 | 962.jpg,wKTD 2205 | 4212.jpg,woka 2206 | 2346.jpg,MTVy 2207 | 1969.jpg,ifss 2208 | 4259.jpg,bEQT 2209 | 1977.jpg,dSve 2210 | 4931.jpg,8x76 2211 | 2118.jpg,DBBR 2212 | 1556.jpg,sVV6 2213 | 2604.jpg,XT7h 2214 | 1938.jpg,k4kX 2215 | 2661.jpg,DQy6 2216 | 1080.jpg,I1dG 2217 | 129.jpg,nOZ4 2218 | 3848.jpg,a5N9 2219 | 4670.jpg,oC14 2220 | 3375.jpg,JgyX 2221 | 1856.jpg,su87 2222 | 3432.jpg,XFS9 2223 | 4456.jpg,HJpm 2224 | 1156.jpg,qy2M 2225 | 108.jpg,n3Lb 2226 | 4535.jpg,e6X7 2227 | 2593.jpg,KrfH 2228 | 4747.jpg,LE8M 2229 | 736.jpg,QfnE 2230 | 2405.jpg,3WD4 2231 | 2637.jpg,VPQS 2232 | 1022.jpg,6MrR 2233 | 1081.jpg,pGO1 2234 | 2864.jpg,HHec 2235 | 603.jpg,0Tf8 2236 | 1868.jpg,PrYI 2237 | 1598.jpg,KgiE 2238 | 4398.jpg,wFMN 2239 | 2477.jpg,Wanx 2240 | 4832.jpg,jFcB 2241 | 2211.jpg,8b7k 2242 | 602.jpg,geJL 2243 | 2344.jpg,oQr2 2244 | 945.jpg,FX2e 2245 | 3492.jpg,iHCh 2246 | 3653.jpg,iEKN 2247 | 1338.jpg,ofJ0 2248 | 2028.jpg,8qIh 2249 | 2095.jpg,MO0o 2250 | 2901.jpg,JOs3 2251 | 4318.jpg,A2nC 2252 | 3805.jpg,ThGl 2253 | 2766.jpg,DntO 2254 | 1666.jpg,bxkJ 2255 | 3890.jpg,xrQD 2256 | 122.jpg,dh8Z 2257 | 3136.jpg,DyvL 2258 | 415.jpg,uULg 2259 | 2798.jpg,f5PG 2260 | 2501.jpg,rdzb 2261 | 1107.jpg,ACR0 2262 | 3541.jpg,uoRJ 2263 | 3555.jpg,8lIY 2264 | 1328.jpg,BmIZ 2265 | 1764.jpg,SAwJ 2266 | 1883.jpg,yyy3 2267 | 51.jpg,5ryV 2268 | 2011.jpg,ph5R 2269 | 2452.jpg,Lqje 2270 | 2746.jpg,gpdG 2271 | 1615.jpg,ZGIU 2272 | 1443.jpg,1G6R 2273 | 1249.jpg,2xDN 2274 | 4675.jpg,DODS 2275 | 3150.jpg,xlrE 2276 | 4438.jpg,cVnc 2277 | 3925.jpg,3S8m 2278 | 3315.jpg,6T86 2279 | 1584.jpg,ltFW 2280 | 2859.jpg,ATZn 2281 | 4106.jpg,JEQu 2282 | 1019.jpg,sv24 2283 | 4369.jpg,RQ5e 2284 | 631.jpg,6Ldh 2285 | 1767.jpg,RXjv 2286 | 3903.jpg,rmzq 2287 | 3204.jpg,GjcF 2288 | 656.jpg,I9K1 2289 | 386.jpg,gQds 2290 | 1262.jpg,S6s1 2291 | 3202.jpg,ZyYq 2292 | 2478.jpg,GsGh 2293 | 215.jpg,yHkO 2294 | 2823.jpg,jIew 2295 | 782.jpg,QfcW 2296 | 4786.jpg,ZJhT 2297 | 84.jpg,ydXH 2298 | 3286.jpg,1OBR 2299 | 4502.jpg,CFVO 2300 | 3374.jpg,jAqn 2301 | 4582.jpg,2mPW 2302 | 3584.jpg,HU4E 2303 | 4649.jpg,FJCz 2304 | 3643.jpg,i3Mb 2305 | 2338.jpg,SCcb 2306 | 4153.jpg,Xw15 2307 | 2860.jpg,jVlh 2308 | 2587.jpg,QLwc 2309 | 2789.jpg,wp1T 2310 | 3609.jpg,xFLB 2311 | 1914.jpg,9MDi 2312 | 419.jpg,x3OZ 2313 | 2284.jpg,245P 2314 | 809.jpg,n0kE 2315 | 1661.jpg,OPC2 2316 | 793.jpg,cZ3e 2317 | 4641.jpg,3XS5 2318 | 3174.jpg,ifqm 2319 | 507.jpg,pDnw 2320 | 3621.jpg,gdYz 2321 | 2548.jpg,i9mh 2322 | 4225.jpg,SZDG 2323 | 917.jpg,dk6O 2324 | 3449.jpg,2y8V 2325 | 4325.jpg,vjGR 2326 | 748.jpg,f6vZ 2327 | 3245.jpg,TpwK 2328 | 4647.jpg,dRaU 2329 | 1850.jpg,4nts 2330 | 2775.jpg,1y0U 2331 | 1817.jpg,WbkC 2332 | 1033.jpg,UwPR 2333 | 592.jpg,2MDi 2334 | 2842.jpg,0fi3 2335 | 1380.jpg,isEY 2336 | 930.jpg,JMIE 2337 | 1655.jpg,FJor 2338 | 3710.jpg,heka 2339 | 3851.jpg,h6L6 2340 | 4993.jpg,fuqq 2341 | 1992.jpg,Incy 2342 | 634.jpg,GyGY 2343 | 1303.jpg,nMFf 2344 | 4663.jpg,1rHw 2345 | 2412.jpg,8qAP 2346 | 1337.jpg,uS3M 2347 | 2878.jpg,i1MN 2348 | 1620.jpg,0Brp 2349 | 3002.jpg,shWj 2350 | 2245.jpg,Rykq 2351 | 4788.jpg,cn8h 2352 | 3831.jpg,uBLW 2353 | 3736.jpg,qntu 2354 | 4165.jpg,wFhw 2355 | 2030.jpg,fHjq 2356 | 2600.jpg,QEpm 2357 | 2083.jpg,uDji 2358 | 4662.jpg,2Qla 2359 | 4215.jpg,4EAs 2360 | 3860.jpg,MrRD 2361 | 3704.jpg,DOnF 2362 | 1530.jpg,JjH6 2363 | 144.jpg,fLng 2364 | 12.jpg,KlN6 2365 | 3800.jpg,J4qz 2366 | 1558.jpg,xW2R 2367 | 567.jpg,FmXW 2368 | 245.jpg,JHXP 2369 | 2738.jpg,RQVr 2370 | 3239.jpg,fTkl 2371 | 3215.jpg,osVh 2372 | 69.jpg,AY4V 2373 | 1210.jpg,ESmn 2374 | 2146.jpg,VOC8 2375 | 4806.jpg,FyF4 2376 | 4733.jpg,mPC9 2377 | 2702.jpg,gqXm 2378 | 2383.jpg,Rxuy 2379 | 3108.jpg,SFr2 2380 | 485.jpg,GC3p 2381 | 2689.jpg,WMCS 2382 | 1296.jpg,9fLU 2383 | 4214.jpg,JZVv 2384 | 3795.jpg,BVMg 2385 | 1083.jpg,p0iv 2386 | 3186.jpg,F5Ts 2387 | 2527.jpg,rvti 2388 | 4796.jpg,Ar9J 2389 | 2511.jpg,BwIf 2390 | 4912.jpg,fPMZ 2391 | 4813.jpg,YWeg 2392 | 3754.jpg,vIo1 2393 | 935.jpg,qb7U 2394 | 3008.jpg,HyU4 2395 | 1259.jpg,0Tx2 2396 | 3794.jpg,fmZs 2397 | 11.jpg,OPRp 2398 | 4359.jpg,8IKQ 2399 | 288.jpg,g5jE 2400 | 1750.jpg,ve18 2401 | 1890.jpg,wyGx 2402 | 4019.jpg,W62K 2403 | 3844.jpg,DvQl 2404 | 1651.jpg,WKuB 2405 | 3000.jpg,KXzt 2406 | 4095.jpg,fAj6 2407 | 4036.jpg,Or6D 2408 | 2413.jpg,zDrE 2409 | 1716.jpg,1Gbu 2410 | 2708.jpg,p3Ct 2411 | 4307.jpg,Zk1S 2412 | 2471.jpg,T1FJ 2413 | 2662.jpg,Xt0Y 2414 | 4574.jpg,gUOU 2415 | 1179.jpg,uTtV 2416 | 1504.jpg,6bqu 2417 | 3979.jpg,4b2g 2418 | 3975.jpg,pLfZ 2419 | 725.jpg,JL0C 2420 | 1689.jpg,ZuuQ 2421 | 1641.jpg,J6TV 2422 | 822.jpg,fGCQ 2423 | 2275.jpg,hOf0 2424 | 803.jpg,BAUI 2425 | 47.jpg,0pMr 2426 | 3915.jpg,hoDI 2427 | 1979.jpg,JEi0 2428 | 372.jpg,ecG4 2429 | 4014.jpg,tpVF 2430 | 3961.jpg,0i4a 2431 | 1321.jpg,dabN 2432 | 2900.jpg,pWRu 2433 | 609.jpg,ycTj 2434 | 2897.jpg,SC15 2435 | 3712.jpg,UCPA 2436 | 4736.jpg,L5jo 2437 | 351.jpg,Cg9J 2438 | 4238.jpg,0UrF 2439 | 4758.jpg,rRRR 2440 | 1692.jpg,Zbrk 2441 | 2085.jpg,cvVq 2442 | 223.jpg,flUC 2443 | 53.jpg,yEMx 2444 | 3517.jpg,IuC8 2445 | 1680.jpg,2unG 2446 | 3258.jpg,Xaaa 2447 | 4286.jpg,XAny 2448 | 1055.jpg,OIYu 2449 | 4488.jpg,tXpb 2450 | 2614.jpg,mJ3R 2451 | 1854.jpg,clMk 2452 | 1888.jpg,ACaJ 2453 | 1370.jpg,VEPq 2454 | 4896.jpg,aElq 2455 | 1537.jpg,66Ww 2456 | 1054.jpg,HP7P 2457 | 3896.jpg,kow0 2458 | 3175.jpg,8uHz 2459 | 337.jpg,pTfT 2460 | 1345.jpg,iul6 2461 | 3052.jpg,npA1 2462 | 4573.jpg,zijI 2463 | 1464.jpg,IEc6 2464 | 4351.jpg,NpVr 2465 | 3257.jpg,FVU1 2466 | 3134.jpg,a1rs 2467 | 4433.jpg,6zbO 2468 | 902.jpg,5BVa 2469 | 4440.jpg,ovLj 2470 | 1611.jpg,oWJX 2471 | 1832.jpg,aylC 2472 | 4886.jpg,rEiM 2473 | 862.jpg,R15G 2474 | 4735.jpg,WDox 2475 | 2934.jpg,ios0 2476 | 3999.jpg,Fj1F 2477 | 3132.jpg,8Kfc 2478 | 1023.jpg,68dH 2479 | 173.jpg,C0Rm 2480 | 3437.jpg,uDfS 2481 | 4837.jpg,OFXP 2482 | 3741.jpg,3Zso 2483 | 1382.jpg,77RR 2484 | 1674.jpg,NzK2 2485 | 3622.jpg,Ckfi 2486 | 2664.jpg,J8cr 2487 | 328.jpg,7r9F 2488 | 1061.jpg,a6xJ 2489 | 22.jpg,dPX9 2490 | 4692.jpg,7XlL 2491 | 3602.jpg,0BQC 2492 | 2742.jpg,Zeor 2493 | 1986.jpg,793e 2494 | 220.jpg,BmZ3 2495 | 116.jpg,nLnH 2496 | 4075.jpg,NUKK 2497 | 3717.jpg,CKZO 2498 | 3509.jpg,Hzz4 2499 | 2409.jpg,xyVK 2500 | 3328.jpg,52gq 2501 | 316.jpg,J4Cr 2502 | 2528.jpg,qc7X 2503 | 535.jpg,oGuO 2504 | 4415.jpg,SsD7 2505 | 2845.jpg,D3Vc 2506 | 361.jpg,N03Q 2507 | 1318.jpg,qWGd 2508 | 2763.jpg,5O1L 2509 | 2185.jpg,M4LC 2510 | 3575.jpg,PZZW 2511 | 160.jpg,quui 2512 | 275.jpg,neaT 2513 | 3397.jpg,NP0S 2514 | 2701.jpg,B4aq 2515 | 3699.jpg,D3fe 2516 | 54.jpg,DKmm 2517 | 2940.jpg,iU6a 2518 | 3790.jpg,SOXh 2519 | 4266.jpg,MIxK 2520 | 4890.jpg,MGNp 2521 | 997.jpg,QX8H 2522 | 4021.jpg,ocSe 2523 | 3042.jpg,QdB0 2524 | 1234.jpg,zxXe 2525 | 1593.jpg,MSmb 2526 | 3271.jpg,TfkG 2527 | 1562.jpg,OZFW 2528 | 570.jpg,0lqp 2529 | 3256.jpg,aQut 2530 | 200.jpg,hYTE 2531 | 501.jpg,wJTM 2532 | 98.jpg,VQhx 2533 | 4962.jpg,qHf9 2534 | 817.jpg,Sk39 2535 | 4708.jpg,TgPO 2536 | 3594.jpg,jTpE 2537 | 1956.jpg,evvP 2538 | 2168.jpg,r3mo 2539 | 4306.jpg,7EOA 2540 | 3852.jpg,cywa 2541 | 4290.jpg,tGSt 2542 | 1035.jpg,6Wqy 2543 | 2479.jpg,3zBg 2544 | 1972.jpg,bmWf 2545 | 2786.jpg,3Jce 2546 | 3673.jpg,YkR0 2547 | 4330.jpg,Id9Z 2548 | 4922.jpg,CBxE 2549 | 3691.jpg,TW2y 2550 | 1144.jpg,zArC 2551 | 2424.jpg,c6wU 2552 | 186.jpg,LkT8 2553 | 248.jpg,OO0H 2554 | 1422.jpg,BBqp 2555 | 1783.jpg,2Gro 2556 | 4726.jpg,Tcd5 2557 | 4768.jpg,ScgS 2558 | 4761.jpg,Tkuq 2559 | 3443.jpg,Iron 2560 | 2956.jpg,2wd7 2561 | 1231.jpg,C7AK 2562 | 41.jpg,LWBh 2563 | 2238.jpg,uNhK 2564 | 843.jpg,AXGx 2565 | 4635.jpg,EbaU 2566 | 4127.jpg,jbgz 2567 | 2018.jpg,s4Lw 2568 | 2885.jpg,7qXV 2569 | 4084.jpg,ljvJ 2570 | 2761.jpg,cVu7 2571 | 237.jpg,2Bb7 2572 | 3438.jpg,C79U 2573 | 127.jpg,0Jdl 2574 | 1714.jpg,CtXs 2575 | 1356.jpg,taRK 2576 | 1404.jpg,y4Sr 2577 | 2100.jpg,C7NH 2578 | 2480.jpg,SGOM 2579 | 2965.jpg,J0q3 2580 | 3505.jpg,XQOi 2581 | 2041.jpg,ZsTT 2582 | 1629.jpg,E0PG 2583 | 1489.jpg,CrEQ 2584 | 4603.jpg,lQp3 2585 | 2467.jpg,OZeP 2586 | 1288.jpg,UIIR 2587 | 2532.jpg,c3IT 2588 | 1045.jpg,5vsV 2589 | 1728.jpg,uNvB 2590 | 1622.jpg,cqKY 2591 | 3977.jpg,Qpmi 2592 | 770.jpg,eAZk 2593 | 2525.jpg,z33n 2594 | 4243.jpg,aJ8j 2595 | 2851.jpg,2BVX 2596 | 2759.jpg,u6aN 2597 | 1721.jpg,SdjY 2598 | 4457.jpg,N84o 2599 | 3664.jpg,WBPh 2600 | 1320.jpg,kW7K 2601 | 869.jpg,BkhS 2602 | 4745.jpg,AzXV 2603 | 3217.jpg,1rZe 2604 | 637.jpg,sTld 2605 | 23.jpg,E09m 2606 | 932.jpg,br5F 2607 | 1379.jpg,fGWY 2608 | 3885.jpg,acZM 2609 | 168.jpg,6znk 2610 | 2972.jpg,ZUCp 2611 | 3238.jpg,h7Yo 2612 | 1101.jpg,jfBi 2613 | 1560.jpg,yLbn 2614 | 397.jpg,DE59 2615 | 1403.jpg,UMVf 2616 | 3923.jpg,CRXt 2617 | 1505.jpg,Pwt0 2618 | 4899.jpg,rHXn 2619 | 4919.jpg,TLF7 2620 | 1066.jpg,yIcg 2621 | 3774.jpg,X17h 2622 | 1172.jpg,ohi6 2623 | 36.jpg,hUhM 2624 | 4188.jpg,Fv0h 2625 | 4410.jpg,pIw2 2626 | 3634.jpg,Dtbn 2627 | 1605.jpg,kBfU 2628 | 1720.jpg,sDNF 2629 | 3938.jpg,9v6A 2630 | 3748.jpg,jHYC 2631 | 156.jpg,tJHS 2632 | 3455.jpg,dxa8 2633 | 2244.jpg,b3P9 2634 | 4280.jpg,H448 2635 | 246.jpg,4RMb 2636 | 1479.jpg,tpBX 2637 | 4126.jpg,zzo7 2638 | 2228.jpg,X4TM 2639 | 1285.jpg,gDSK 2640 | 4370.jpg,bJvR 2641 | 4606.jpg,aoUv 2642 | 3513.jpg,zY4g 2643 | 3346.jpg,rZXQ 2644 | 556.jpg,05YH 2645 | 2126.jpg,9aPY 2646 | 1015.jpg,WAkN 2647 | 3306.jpg,aKKt 2648 | 2308.jpg,9Dub 2649 | 3901.jpg,1z5N 2650 | 3193.jpg,YMTm 2651 | 1120.jpg,S2mX 2652 | 3916.jpg,DKP3 2653 | 3766.jpg,Czzm 2654 | 1468.jpg,ZLq2 2655 | 2964.jpg,VNlF 2656 | 1139.jpg,hlON 2657 | 4314.jpg,c0DH 2658 | 148.jpg,4aPj 2659 | 940.jpg,SpK8 2660 | 4094.jpg,IpZy 2661 | 4101.jpg,9Ux7 2662 | 2979.jpg,QdiN 2663 | 1803.jpg,y938 2664 | 1697.jpg,F4iz 2665 | 1885.jpg,35LB 2666 | 4875.jpg,k5S1 2667 | 3384.jpg,mn0y 2668 | 2422.jpg,fWTV 2669 | 1223.jpg,5wTy 2670 | 751.jpg,xaYc 2671 | 3552.jpg,OO87 2672 | 3329.jpg,33QX 2673 | 1911.jpg,7SFz 2674 | 2165.jpg,DM4v 2675 | 2026.jpg,FfqY 2676 | 3325.jpg,jmpS 2677 | 458.jpg,8d88 2678 | 2298.jpg,ArfA 2679 | 3886.jpg,3zdJ 2680 | 3424.jpg,sCeO 2681 | 2863.jpg,CLfB 2682 | 676.jpg,o8aa 2683 | 3422.jpg,MsTf 2684 | 1290.jpg,AhZS 2685 | 3957.jpg,ajuz 2686 | 4358.jpg,fmVJ 2687 | 1734.jpg,9ntR 2688 | 1707.jpg,OxJP 2689 | 1723.jpg,5c0o 2690 | 2277.jpg,D7Rz 2691 | 2557.jpg,pl1Q 2692 | 2868.jpg,z4PX 2693 | 2097.jpg,BrRq 2694 | 2196.jpg,Gru7 2695 | 3972.jpg,hC1x 2696 | 3144.jpg,YVtV 2697 | 4821.jpg,P1zK 2698 | 1737.jpg,AVgr 2699 | 2832.jpg,tqQS 2700 | 3603.jpg,RGSJ 2701 | 3183.jpg,yBTL 2702 | 1190.jpg,kaAN 2703 | 3764.jpg,z85E 2704 | 4987.jpg,hyhz 2705 | 1843.jpg,wzd3 2706 | 3567.jpg,YFyg 2707 | 4864.jpg,Kmp1 2708 | 4977.jpg,lkmL 2709 | 1217.jpg,1gXQ 2710 | 2181.jpg,ZVWk 2711 | 4672.jpg,dteH 2712 | 3570.jpg,zz5r 2713 | 300.jpg,J2PV 2714 | 1012.jpg,NP32 2715 | 1405.jpg,64To 2716 | 2815.jpg,S0UE 2717 | 3869.jpg,A11S 2718 | 575.jpg,Q4V6 2719 | 958.jpg,0gVr 2720 | 2047.jpg,T90z 2721 | 2622.jpg,6yna 2722 | 588.jpg,IHU5 2723 | 1460.jpg,pzjz 2724 | 374.jpg,CF0I 2725 | 2108.jpg,wd8K 2726 | 4609.jpg,bbI4 2727 | 391.jpg,S2L9 2728 | 1319.jpg,HwcP 2729 | 860.jpg,1V3q 2730 | 568.jpg,ZUae 2731 | 1699.jpg,JTti 2732 | 546.jpg,VQcw 2733 | 1577.jpg,gl1B 2734 | 4393.jpg,mRib 2735 | 582.jpg,luSh 2736 | 1864.jpg,qzho 2737 | 3406.jpg,so3v 2738 | 3462.jpg,gBRx 2739 | 696.jpg,7On5 2740 | 2540.jpg,Kuwi 2741 | 1038.jpg,rpyh 2742 | 3792.jpg,OW4l 2743 | 3696.jpg,MK8q 2744 | 933.jpg,9Mbz 2745 | 3262.jpg,G9kQ 2746 | 2569.jpg,uqHA 2747 | 1621.jpg,sgPZ 2748 | 2472.jpg,ulO4 2749 | 4169.jpg,PJJZ 2750 | 3783.jpg,EClp 2751 | 3357.jpg,wxAs 2752 | 939.jpg,eFD9 2753 | 1010.jpg,wkWe 2754 | 4394.jpg,O5NN 2755 | 4621.jpg,lbiy 2756 | 92.jpg,l2e1 2757 | 332.jpg,9VIU 2758 | 3241.jpg,xdMC 2759 | 4746.jpg,URw4 2760 | 580.jpg,0djp 2761 | 3016.jpg,S1Sx 2762 | 488.jpg,Z5TA 2763 | 1189.jpg,9zBV 2764 | 3895.jpg,xBWD 2765 | 3587.jpg,n7yL 2766 | 1309.jpg,1J96 2767 | 3551.jpg,hhY1 2768 | 3420.jpg,BAZN 2769 | 254.jpg,lOlA 2770 | 2516.jpg,gDL7 2771 | 3469.jpg,PxMu 2772 | 3679.jpg,xtkI 2773 | 2838.jpg,tgVz 2774 | 4596.jpg,z3l8 2775 | 1903.jpg,D7XY 2776 | 2462.jpg,6d9M 2777 | 2561.jpg,CPOG 2778 | 3642.jpg,7lp2 2779 | 3377.jpg,Lr2V 2780 | 1580.jpg,SuJZ 2781 | 3863.jpg,cGFz 2782 | 4085.jpg,VowG 2783 | 1466.jpg,dLy6 2784 | 1759.jpg,uBhY 2785 | 2317.jpg,GG1w 2786 | 1786.jpg,aE98 2787 | 3068.jpg,sBXV 2788 | 4967.jpg,B93f 2789 | 3660.jpg,7IzX 2790 | 2861.jpg,k44J 2791 | 1610.jpg,cCFj 2792 | 4076.jpg,qcVE 2793 | 1936.jpg,X0Lm 2794 | 1034.jpg,K6yD 2795 | 2591.jpg,umPI 2796 | 2616.jpg,IiHv 2797 | 1070.jpg,EaGe 2798 | 416.jpg,fP0D 2799 | 4000.jpg,lLNy 2800 | 2292.jpg,oBDy 2801 | 909.jpg,aYlk 2802 | 3474.jpg,dyaU 2803 | 2767.jpg,j4IV 2804 | 3998.jpg,QXva 2805 | 1331.jpg,Hwtc 2806 | 2839.jpg,FpoQ 2807 | 960.jpg,5MVS 2808 | 3623.jpg,Qrea 2809 | 59.jpg,U1Cj 2810 | 1919.jpg,4v5P 2811 | 1157.jpg,hnVh 2812 | 3088.jpg,FDfa 2813 | 3146.jpg,qswD 2814 | 3581.jpg,YV7K 2815 | 2537.jpg,UqM1 2816 | 2088.jpg,RnjP 2817 | 1804.jpg,nvEt 2818 | 4467.jpg,0oHS 2819 | 1711.jpg,Z7YS 2820 | 2119.jpg,gU1t 2821 | 1729.jpg,hKyU 2822 | 689.jpg,p6JJ 2823 | 3063.jpg,bnvq 2824 | 1096.jpg,qQyC 2825 | 1983.jpg,Wskz 2826 | 4348.jpg,rrgr 2827 | 4537.jpg,vr1k 2828 | 439.jpg,sD0H 2829 | 462.jpg,fRgG 2830 | 2318.jpg,61BM 2831 | 4887.jpg,4Qs8 2832 | 2124.jpg,RQIn 2833 | 3797.jpg,2cQg 2834 | 3427.jpg,3Idl 2835 | 3582.jpg,xbP6 2836 | 1186.jpg,G9I1 2837 | 1267.jpg,XFPY 2838 | 683.jpg,jYyZ 2839 | 1507.jpg,SD5Y 2840 | 1893.jpg,WtqG 2841 | 4006.jpg,555J 2842 | 4753.jpg,XsT3 2843 | 2219.jpg,frOt 2844 | 4586.jpg,xr27 2845 | 1853.jpg,mQPd 2846 | 2274.jpg,tz26 2847 | 726.jpg,cFuN 2848 | 2784.jpg,hnrY 2849 | 4399.jpg,QMbI 2850 | 3631.jpg,sZby 2851 | 3207.jpg,Ee9x 2852 | 638.jpg,NUSj 2853 | 1630.jpg,Xhjg 2854 | 388.jpg,LGcv 2855 | 4512.jpg,jKUl 2856 | 50.jpg,pBKf 2857 | 4765.jpg,xgeT 2858 | 2737.jpg,0kH1 2859 | 4491.jpg,YUQW 2860 | 2266.jpg,dgcA 2861 | 4422.jpg,jEvE 2862 | 4763.jpg,QfoG 2863 | 1614.jpg,rwQI 2864 | 2046.jpg,KTDQ 2865 | 781.jpg,zNAs 2866 | 3850.jpg,wt4W 2867 | 2159.jpg,PEdk 2868 | 4907.jpg,Gmiy 2869 | 2722.jpg,ij3r 2870 | 2971.jpg,bXi6 2871 | 345.jpg,jMUJ 2872 | 4677.jpg,Np3W 2873 | 3990.jpg,bsix 2874 | 826.jpg,4wPk 2875 | 1324.jpg,SfGJ 2876 | 601.jpg,fdAX 2877 | 4553.jpg,sBwI 2878 | 4696.jpg,DMoJ 2879 | 2814.jpg,YV0H 2880 | 810.jpg,FxF0 2881 | 2793.jpg,zOUY 2882 | 4600.jpg,AiHT 2883 | 1834.jpg,7OUe 2884 | 4020.jpg,ggzO 2885 | 865.jpg,rCAZ 2886 | 139.jpg,lAoi 2887 | 579.jpg,L8pB 2888 | 1929.jpg,lWOY 2889 | 583.jpg,uc9I 2890 | 4923.jpg,F5Pn 2891 | 3959.jpg,xeNS 2892 | 3369.jpg,bU8s 2893 | 783.jpg,QQk8 2894 | 3199.jpg,Guwt 2895 | 4110.jpg,QUeN 2896 | 594.jpg,NwCp 2897 | 898.jpg,5J1K 2898 | 3244.jpg,p83t 2899 | 1731.jpg,UFSZ 2900 | 3495.jpg,euiF 2901 | 647.jpg,muUF 2902 | 3026.jpg,XwaD 2903 | 907.jpg,nRgr 2904 | 24.jpg,TUdT 2905 | 3973.jpg,CLna 2906 | 4683.jpg,HtI1 2907 | 515.jpg,Zojx 2908 | 1821.jpg,dMrA 2909 | 534.jpg,Augz 2910 | 3077.jpg,WGhR 2911 | 2469.jpg,Qs5L 2912 | 1455.jpg,NEFB 2913 | 4934.jpg,R7sf 2914 | 4710.jpg,56kR 2915 | 2544.jpg,FuWk 2916 | 3536.jpg,nD71 2917 | 1298.jpg,DCau 2918 | 1703.jpg,idpr 2919 | 1897.jpg,dLQR 2920 | 1705.jpg,ehf9 2921 | 4565.jpg,CWq3 2922 | 324.jpg,QVjN 2923 | 777.jpg,4zF7 2924 | 2970.jpg,5US9 2925 | 759.jpg,uTRm 2926 | 1230.jpg,CMAs 2927 | 1595.jpg,MkZG 2928 | 1628.jpg,6Ur9 2929 | 4269.jpg,eM8t 2930 | 2735.jpg,sgOU 2931 | 3875.jpg,EnZv 2932 | 2808.jpg,PJhT 2933 | 3930.jpg,hAul 2934 | 311.jpg,WFU7 2935 | 4411.jpg,bWSL 2936 | 2039.jpg,sGcs 2937 | 978.jpg,7L2d 2938 | 4205.jpg,FHTX 2939 | 828.jpg,sqYM 2940 | 71.jpg,QQRT 2941 | 3703.jpg,pOPm 2942 | 1780.jpg,h16Q 2943 | 3488.jpg,fGm4 2944 | 4941.jpg,kIZf 2945 | 4089.jpg,vFBr 2946 | 4277.jpg,sLbC 2947 | 3841.jpg,7feg 2948 | 4644.jpg,YCDe 2949 | 2227.jpg,odbr 2950 | 3946.jpg,C5ML 2951 | 126.jpg,VENn 2952 | 3962.jpg,fTsG 2953 | 4242.jpg,lYb6 2954 | 607.jpg,MSmq 2955 | 2816.jpg,MQfO 2956 | 4128.jpg,m4Yo 2957 | 1557.jpg,VVyC 2958 | 2435.jpg,Sn4a 2959 | 1603.jpg,4sA6 2960 | 4629.jpg,WUUI 2961 | 2140.jpg,6hFR 2962 | 2421.jpg,XdBM 2963 | 329.jpg,mXQM 2964 | 1904.jpg,Xjd6 2965 | 3936.jpg,vyzq 2966 | 4199.jpg,DC0V 2967 | 4960.jpg,RNic 2968 | 4851.jpg,3bWQ 2969 | 1859.jpg,Vj5F 2970 | 1005.jpg,fT4M 2971 | 3335.jpg,0UjX 2972 | 1445.jpg,Syd5 2973 | 4057.jpg,OOSC 2974 | 4929.jpg,l5Se 2975 | 2732.jpg,YY7e 2976 | 1413.jpg,FtyW 2977 | 2177.jpg,YtA2 2978 | 442.jpg,ghbx 2979 | 2131.jpg,pBaK 2980 | 2352.jpg,b02J 2981 | 406.jpg,9goS 2982 | 3059.jpg,ZFpn 2983 | 83.jpg,RoFf 2984 | 506.jpg,jPVp 2985 | 776.jpg,dFXs 2986 | 4187.jpg,CEWY 2987 | 2658.jpg,3KWl 2988 | 2330.jpg,6sHs 2989 | 710.jpg,60w1 2990 | 2127.jpg,KHii 2991 | 4581.jpg,fqzT 2992 | 2178.jpg,snQi 2993 | 1170.jpg,qsYT 2994 | 2791.jpg,z2vM 2995 | 3812.jpg,sSLH 2996 | 3725.jpg,to1M 2997 | 3767.jpg,rAdo 2998 | 4196.jpg,2f7X 2999 | 859.jpg,B4RI 3000 | 3711.jpg,gpOj 3001 | 3526.jpg,NXtk 3002 | 750.jpg,5YSo 3003 | 1429.jpg,w4mM 3004 | 1982.jpg,XsW9 3005 | 2290.jpg,KdBo 3006 | 4297.jpg,h3BZ 3007 | 734.jpg,QMjQ 3008 | 3288.jpg,tsQO 3009 | 3503.jpg,LWW3 3010 | 3966.jpg,NCBH 3011 | 3557.jpg,i3uh 3012 | 4795.jpg,r7V3 3013 | 366.jpg,6jyA 3014 | 4869.jpg,ZOlu 3015 | 4876.jpg,1lsV 3016 | 2206.jpg,fyHK 3017 | 885.jpg,EaVQ 3018 | 292.jpg,Vig4 3019 | 4626.jpg,JqhO 3020 | 335.jpg,MRek 3021 | 2326.jpg,kO47 3022 | 3924.jpg,F01L 3023 | 2379.jpg,hWFc 3024 | 1678.jpg,CZZy 3025 | 2147.jpg,Np2c 3026 | 1973.jpg,vD6n 3027 | 4568.jpg,lvwu 3028 | 2334.jpg,sDRw 3029 | 2726.jpg,4VMI 3030 | 1203.jpg,cvwR 3031 | 4989.jpg,qbYm 3032 | 2959.jpg,s3cE 3033 | 1228.jpg,uBYq 3034 | 3138.jpg,GOMf 3035 | 1635.jpg,Pk20 3036 | 4060.jpg,muJn 3037 | 998.jpg,9PmY 3038 | 2931.jpg,ewA5 3039 | 93.jpg,BUn6 3040 | 2631.jpg,0AhQ 3041 | 4413.jpg,r19H 3042 | 1730.jpg,leFU 3043 | 1395.jpg,Sw3F 3044 | 2393.jpg,6Mj1 3045 | 3330.jpg,G2N6 3046 | 2599.jpg,Swu7 3047 | 2070.jpg,bxib 3048 | 4387.jpg,O8ue 3049 | 3980.jpg,szNU 3050 | 429.jpg,o5yV 3051 | 4479.jpg,JfAx 3052 | 2703.jpg,ZZWM 3053 | 2090.jpg,x3t4 3054 | 39.jpg,D2Jn 3055 | 2209.jpg,rBsa 3056 | 3404.jpg,fxOd 3057 | 4192.jpg,snWp 3058 | 112.jpg,Ih5Z 3059 | 931.jpg,qJYK 3060 | 1235.jpg,djYW 3061 | 3126.jpg,0FO1 3062 | 2042.jpg,dJcg 3063 | 4620.jpg,fTiQ 3064 | 3983.jpg,0kwm 3065 | 94.jpg,lRgT 3066 | 2264.jpg,ZA3C 3067 | 2669.jpg,78pR 3068 | 4090.jpg,n4tx 3069 | 1361.jpg,Fbn2 3070 | 1071.jpg,n0sq 3071 | 2004.jpg,ni2L 3072 | 2914.jpg,g32Z 3073 | 1103.jpg,9iS0 3074 | 1171.jpg,lM7I 3075 | 1471.jpg,1MAJ 3076 | 294.jpg,0YEM 3077 | 1042.jpg,UfUw 3078 | 4289.jpg,Cu1m 3079 | 1597.jpg,6Vm7 3080 | 687.jpg,4YJZ 3081 | 2494.jpg,lKtb 3082 | 218.jpg,KaQk 3083 | 1098.jpg,F1cc 3084 | 2027.jpg,FhYs 3085 | 1371.jpg,zGpH 3086 | 815.jpg,lgSo 3087 | 2192.jpg,P1SA 3088 | 1961.jpg,DiuK 3089 | 4630.jpg,zhPN 3090 | 4720.jpg,ly7r 3091 | 4755.jpg,waQ0 3092 | 4470.jpg,8Eyg 3093 | 758.jpg,9pB7 3094 | 4027.jpg,UpcK 3095 | 4646.jpg,cGYb 3096 | 4555.jpg,QqeK 3097 | 953.jpg,xcjL 3098 | 740.jpg,6CnY 3099 | 1002.jpg,n6jF 3100 | 1088.jpg,YiXL 3101 | 4350.jpg,ktEh 3102 | 2271.jpg,FTtP 3103 | 3231.jpg,yjg2 3104 | 2751.jpg,QRBy 3105 | 1778.jpg,wFTH 3106 | 1586.jpg,JrAz 3107 | 2686.jpg,VrZo 3108 | 4334.jpg,uzSl 3109 | 4803.jpg,kVq2 3110 | 3635.jpg,c9On 3111 | 3658.jpg,SYNh 3112 | 4980.jpg,soJi 3113 | 785.jpg,tUaV 3114 | 3787.jpg,70Gy 3115 | 3298.jpg,zt19 3116 | 4510.jpg,92uE 3117 | 4836.jpg,sS0q 3118 | 3047.jpg,flud 3119 | 1816.jpg,BOh9 3120 | 2363.jpg,p5Jb 3121 | 401.jpg,2LMg 3122 | 30.jpg,1sGC 3123 | 3095.jpg,kTrK 3124 | 2665.jpg,f26D 3125 | 1274.jpg,uUfK 3126 | 478.jpg,w8Wp 3127 | 4208.jpg,y9v5 3128 | 3027.jpg,w5jV 3129 | 2325.jpg,EGLs 3130 | 3359.jpg,pEfF 3131 | 2653.jpg,xFIp 3132 | 3412.jpg,dBkz 3133 | 1026.jpg,SjO5 3134 | 3857.jpg,u6HT 3135 | 55.jpg,Htrz 3136 | 650.jpg,NNGR 3137 | 167.jpg,88f2 3138 | 409.jpg,CkKz 3139 | 977.jpg,zv9t 3140 | 818.jpg,lPQg 3141 | 1549.jpg,quls 3142 | 1935.jpg,HDsc 3143 | 2491.jpg,lLig 3144 | 1136.jpg,mbRx 3145 | 3326.jpg,3ERN 3146 | 4789.jpg,ub4m 3147 | 2258.jpg,1W9K 3148 | 2043.jpg,7wnF 3149 | 757.jpg,48Cc 3150 | 4336.jpg,cZxx 3151 | 2646.jpg,usoN 3152 | 4739.jpg,48W3 3153 | 2796.jpg,I69r 3154 | 2924.jpg,Mf7f 3155 | 455.jpg,PqPg 3156 | 4845.jpg,yIeA 3157 | 581.jpg,UYr4 3158 | 4439.jpg,EBj6 3159 | 4588.jpg,ewfb 3160 | 4310.jpg,K1pJ 3161 | 2052.jpg,FDWY 3162 | 3629.jpg,pSo6 3163 | 2053.jpg,i8R3 3164 | 3465.jpg,H4i0 3165 | 4174.jpg,aEiO 3166 | 3967.jpg,9onY 3167 | 2843.jpg,zMJC 3168 | 3411.jpg,EJWs 3169 | 3597.jpg,yXk2 3170 | 463.jpg,3J50 3171 | 3394.jpg,Yw6U 3172 | 97.jpg,DOhV 3173 | 4589.jpg,uDsx 3174 | 2869.jpg,BULd 3175 | 4086.jpg,cbEg 3176 | 1805.jpg,wAZo 3177 | 4636.jpg,EGNV 3178 | 4332.jpg,WXEX 3179 | 3731.jpg,bnDL 3180 | 2760.jpg,Rdgg 3181 | 4354.jpg,Eogy 3182 | 3878.jpg,U0LB 3183 | 2629.jpg,OzoB 3184 | 1342.jpg,Gzqr 3185 | 1046.jpg,psoQ 3186 | 2347.jpg,mOvM 3187 | 4154.jpg,u4zT 3188 | 1660.jpg,fCnR 3189 | 605.jpg,UQUt 3190 | 3504.jpg,3mGR 3191 | 150.jpg,mx6V 3192 | 1618.jpg,mjo2 3193 | 1174.jpg,3dmQ 3194 | 4007.jpg,tQo7 3195 | 1123.jpg,eoYP 3196 | 1845.jpg,m1Qn 3197 | 2025.jpg,gFNg 3198 | 3341.jpg,MPfY 3199 | 2450.jpg,cJpE 3200 | 4276.jpg,McQh 3201 | 565.jpg,AKUp 3202 | 3129.jpg,Hv3f 3203 | 1343.jpg,UNwR 3204 | 404.jpg,uoch 3205 | 1492.jpg,q1OK 3206 | 804.jpg,J7uB 3207 | 1226.jpg,4pld 3208 | 1638.jpg,L9Hc 3209 | 4905.jpg,va7O 3210 | 552.jpg,mfuB 3211 | 2130.jpg,UBob 3212 | 562.jpg,9RxA 3213 | 3757.jpg,FRmC 3214 | 3965.jpg,BJug 3215 | 9.jpg,Q0JI 3216 | 4706.jpg,07eH 3217 | 4267.jpg,5ts5 3218 | 3978.jpg,olQU 3219 | 4092.jpg,7AH3 3220 | 1276.jpg,y1sF 3221 | 2539.jpg,tZE7 3222 | 3928.jpg,r2rC 3223 | 626.jpg,oXuU 3224 | 2556.jpg,7Lkf 3225 | 3080.jpg,dVZp 3226 | 4178.jpg,UN37 3227 | 678.jpg,5ySC 3228 | 2408.jpg,abg4 3229 | 768.jpg,0bqk 3230 | 3996.jpg,7d4D 3231 | 3463.jpg,HW6H 3232 | 4241.jpg,HtsI 3233 | 1213.jpg,ssRg 3234 | 209.jpg,Pyw8 3235 | 2879.jpg,6QeB 3236 | 3874.jpg,Eakc 3237 | 3610.jpg,ZSQi 3238 | 4043.jpg,F9OF 3239 | 3382.jpg,7ex1 3240 | 1163.jpg,80Yz 3241 | 513.jpg,Qi47 3242 | 3707.jpg,WD7M 3243 | 1743.jpg,fRFC 3244 | 1374.jpg,Kc62 3245 | 3430.jpg,UfE4 3246 | 3309.jpg,3xhP 3247 | 2585.jpg,9hjw 3248 | 1512.jpg,JvKg 3249 | 2169.jpg,mGFn 3250 | 669.jpg,kOhV 3251 | 4583.jpg,lPQ6 3252 | 2276.jpg,4vCg 3253 | 4570.jpg,jkDK 3254 | 699.jpg,avq3 3255 | 1421.jpg,kvFM 3256 | 4525.jpg,WEmy 3257 | 2087.jpg,L5Hp 3258 | 183.jpg,SBsE 3259 | 198.jpg,k6r7 3260 | 4131.jpg,Nv5N 3261 | 427.jpg,lPgA 3262 | 4322.jpg,8teH 3263 | 3902.jpg,iG6Q 3264 | 887.jpg,4E8P 3265 | 2747.jpg,0EDL 3266 | 2692.jpg,z3Zh 3267 | 1921.jpg,VP8b 3268 | 1985.jpg,JyLX 3269 | 4142.jpg,0WVs 3270 | 3593.jpg,NwkV 3271 | 1567.jpg,8brT 3272 | 277.jpg,xwXg 3273 | 1757.jpg,VxxW 3274 | 4444.jpg,GlC0 3275 | 4143.jpg,C5Vq 3276 | 1436.jpg,XkxJ 3277 | 851.jpg,ouvw 3278 | 2417.jpg,PStj 3279 | 474.jpg,LqVg 3280 | 4298.jpg,Iseb 3281 | 1121.jpg,dE8T 3282 | 4204.jpg,ll2s 3283 | 1742.jpg,HAsM 3284 | 1409.jpg,UPmY 3285 | 705.jpg,g6q7 3286 | 1950.jpg,sRlE 3287 | 3612.jpg,ZPfY 3288 | 4794.jpg,o3ny 3289 | 4389.jpg,zhJ3 3290 | 903.jpg,Ouei 3291 | 1358.jpg,UU3m 3292 | 3376.jpg,PrXD 3293 | 475.jpg,qYQq 3294 | 2388.jpg,OlsY 3295 | 4916.jpg,ZkJo 3296 | 3092.jpg,2zOv 3297 | 4722.jpg,hZXO 3298 | 4631.jpg,rJVb 3299 | 242.jpg,gbDD 3300 | 1164.jpg,0eBQ 3301 | 941.jpg,1Po6 3302 | 4231.jpg,paZt 3303 | 649.jpg,7KOp 3304 | 3729.jpg,gF95 3305 | 3560.jpg,1dm0 3306 | 3358.jpg,GOsp 3307 | 1522.jpg,7H3F 3308 | 3275.jpg,gmIq 3309 | 1881.jpg,BZ1c 3310 | 4434.jpg,FhC8 3311 | 1437.jpg,m4EM 3312 | 3371.jpg,UMY3 3313 | 2748.jpg,nfRE 3314 | 3105.jpg,eZTu 3315 | 761.jpg,J08l 3316 | 4489.jpg,qqgy 3317 | 3313.jpg,GQD7 3318 | 482.jpg,DhP8 3319 | 3944.jpg,Yf3Y 3320 | 873.jpg,eeYF 3321 | 3249.jpg,kbUJ 3322 | 979.jpg,MxpI 3323 | 3354.jpg,AE1n 3324 | 325.jpg,eVT0 3325 | 2433.jpg,W2x8 3326 | 2729.jpg,CorI 3327 | 4391.jpg,e8g8 3328 | 732.jpg,qoqn 3329 | 824.jpg,GQEq 3330 | 1654.jpg,G9Hd 3331 | 1240.jpg,ypHz 3332 | 4571.jpg,cJQl 3333 | 3606.jpg,Uh39 3334 | 3128.jpg,ji7E 3335 | 889.jpg,UrBb 3336 | 1463.jpg,a1Oa 3337 | 765.jpg,n0oZ 3338 | 624.jpg,fCZu 3339 | 1014.jpg,ZhFK 3340 | 3314.jpg,6iod 3341 | 3963.jpg,WAVv 3342 | 3160.jpg,7DaN 3343 | 4547.jpg,XVod 3344 | 4966.jpg,wOWN 3345 | 4652.jpg,VjCs 3346 | 1392.jpg,FEsH 3347 | 684.jpg,hO3E 3348 | 1377.jpg,qRYV 3349 | 2942.jpg,WGt1 3350 | 3050.jpg,ZWkR 3351 | 3078.jpg,izTa 3352 | 3562.jpg,ke5O 3353 | 4125.jpg,z4tA 3354 | 3738.jpg,I0ps 3355 | 2565.jpg,Hwu5 3356 | 666.jpg,OlzG 3357 | 4949.jpg,jPBT 3358 | 4816.jpg,ZG6G 3359 | 2128.jpg,jDnW 3360 | 3667.jpg,z4G9 3361 | 1902.jpg,hezu 3362 | 387.jpg,vqrk 3363 | 2001.jpg,ygW3 3364 | 3272.jpg,GTtD 3365 | 4175.jpg,KXWO 3366 | 1031.jpg,KVP8 3367 | 4171.jpg,EV6X 3368 | 3303.jpg,mZk9 3369 | 363.jpg,hwjw 3370 | 1978.jpg,Vnul 3371 | 3654.jpg,mzsI 3372 | 3668.jpg,OjHa 3373 | 520.jpg,amY6 3374 | 4958.jpg,lofg 3375 | 2905.jpg,ezEB 3376 | 4140.jpg,qBsG 3377 | 1690.jpg,MJIt 3378 | 3318.jpg,CEY8 3379 | 3690.jpg,4SRc 3380 | 1753.jpg,1XMo 3381 | 532.jpg,roUF 3382 | 3982.jpg,A3pO 3383 | 381.jpg,o642 3384 | 718.jpg,HkJ3 3385 | 1923.jpg,ykM1 3386 | 4961.jpg,SKkB 3387 | 253.jpg,X29g 3388 | 4404.jpg,LmKf 3389 | 3213.jpg,Pdwy 3390 | 3233.jpg,Kyqn 3391 | 1741.jpg,iqVw 3392 | 3649.jpg,aVzf 3393 | 1920.jpg,0vHg 3394 | 40.jpg,dHUl 3395 | 86.jpg,VFHr 3396 | 80.jpg,4NzA 3397 | 4811.jpg,8ZHV 3398 | 2201.jpg,Upr2 3399 | 2580.jpg,I8fQ 3400 | 111.jpg,6asA 3401 | 1958.jpg,CLLo 3402 | 1833.jpg,NolV 3403 | 3630.jpg,tJpG 3404 | 727.jpg,IzzV 3405 | 2927.jpg,hulc 3406 | 2256.jpg,JZR5 3407 | 2270.jpg,qKpV 3408 | 2035.jpg,vGlV 3409 | 2893.jpg,aFhg 3410 | 2906.jpg,JN7R 3411 | 4741.jpg,hslD 3412 | 1944.jpg,U1dK 3413 | 3235.jpg,D556 3414 | 2800.jpg,yZ6B 3415 | 4748.jpg,qlEU 3416 | 1928.jpg,vPwH 3417 | 1024.jpg,1VoA 3418 | 3981.jpg,vATt 3419 | 225.jpg,12R3 3420 | 3740.jpg,l57m 3421 | 1828.jpg,Tn8D 3422 | 922.jpg,ZZ8W 3423 | 3421.jpg,bryy 3424 | 1912.jpg,qm6V 3425 | 3391.jpg,mKNv 3426 | 526.jpg,oSrA 3427 | 4549.jpg,k8hQ 3428 | 4416.jpg,VVvv 3429 | 1254.jpg,vpIp 3430 | 3255.jpg,8q2j 3431 | 1253.jpg,vD4A 3432 | 844.jpg,bmXI 3433 | 1075.jpg,pxap 3434 | 4561.jpg,m3HT 3435 | 1242.jpg,dIYY 3436 | 244.jpg,JoLm 3437 | 4177.jpg,wQu5 3438 | 4166.jpg,uZOd 3439 | 3870.jpg,Ydck 3440 | 972.jpg,PJNl 3441 | 3490.jpg,sI7W 3442 | 4622.jpg,GWqs 3443 | 845.jpg,G7Kh 3444 | 3843.jpg,qZKK 3445 | 2510.jpg,wX5e 3446 | 4717.jpg,xRkA 3447 | 1542.jpg,eO0l 3448 | 1336.jpg,YaZQ 3449 | 505.jpg,JRvh 3450 | 466.jpg,6R9n 3451 | 2376.jpg,zPzu 3452 | 3572.jpg,9fkg 3453 | 4469.jpg,FVPs 3454 | 4638.jpg,LpQD 3455 | 1814.jpg,eqPQ 3456 | 3855.jpg,ctcc 3457 | 704.jpg,5ooN 3458 | 2202.jpg,mIQy 3459 | 1431.jpg,aMig 3460 | 820.jpg,WcND 3461 | 1662.jpg,z9f2 3462 | 1160.jpg,hxNd 3463 | 3268.jpg,fb4n 3464 | 4256.jpg,yf7t 3465 | 620.jpg,NeUf 3466 | 1155.jpg,ZRSu 3467 | 1173.jpg,ATpI 3468 | 4323.jpg,WAJp 3469 | 4546.jpg,Mrna 3470 | 1295.jpg,FIGw 3471 | 4654.jpg,OCZ1 3472 | 3900.jpg,zOTm 3473 | 2226.jpg,qe7u 3474 | 1865.jpg,jPWr 3475 | 896.jpg,MX6g 3476 | 3480.jpg,xfZp 3477 | 774.jpg,oxPa 3478 | 4725.jpg,3p0O 3479 | 901.jpg,OvjY 3480 | 1970.jpg,woRL 3481 | 2425.jpg,y5fS 3482 | 878.jpg,7hy8 3483 | 252.jpg,JOYs 3484 | 3133.jpg,24Br 3485 | 1112.jpg,3JfU 3486 | 1193.jpg,jbDT 3487 | 3779.jpg,Amxw 3488 | 4676.jpg,EtSW 3489 | 1589.jpg,dLt3 3490 | 4191.jpg,bUDH 3491 | 4823.jpg,msQ4 3492 | 2054.jpg,PhSb 3493 | 3613.jpg,sEkP 3494 | 3029.jpg,KblU 3495 | 4384.jpg,vlGo 3496 | 3647.jpg,rqIh 3497 | 3395.jpg,itgR 3498 | 105.jpg,cTml 3499 | 1221.jpg,L1LB 3500 | 4904.jpg,jRBv 3501 | 2386.jpg,EsHv 3502 | 1847.jpg,aRXX 3503 | 2531.jpg,suiV 3504 | 3453.jpg,kn6K 3505 | 1450.jpg,Zo82 3506 | 2216.jpg,R1vV 3507 | 2682.jpg,zVp8 3508 | 4924.jpg,oqxN 3509 | 4155.jpg,MwoI 3510 | 2752.jpg,Syqq 3511 | 1246.jpg,T9jV 3512 | 3429.jpg,0Hnl 3513 | 1701.jpg,UPGp 3514 | 2660.jpg,Ykka 3515 | 2391.jpg,O3dn 3516 | 1269.jpg,IgIl 3517 | 4067.jpg,bu6Q 3518 | 629.jpg,2KQY 3519 | 107.jpg,8d5S 3520 | 735.jpg,Mg4e 3521 | 2278.jpg,Jglo 3522 | 2082.jpg,5WQm 3523 | 4283.jpg,y2a3 3524 | 1930.jpg,Ez5j 3525 | 17.jpg,WZw2 3526 | 3801.jpg,5i2m 3527 | 4915.jpg,Hcvk 3528 | 970.jpg,TLYl 3529 | 382.jpg,MCT8 3530 | 461.jpg,UxUS 3531 | 2426.jpg,W9is 3532 | 2482.jpg,7LPk 3533 | 2674.jpg,u3qJ 3534 | 4367.jpg,8mli 3535 | 595.jpg,nIR3 3536 | 1765.jpg,yeqR 3537 | 3791.jpg,rUCO 3538 | 796.jpg,J8hj 3539 | 1535.jpg,hQ6Y 3540 | 4576.jpg,l3O4 3541 | 1418.jpg,pb0f 3542 | 4891.jpg,77Gk 3543 | 3532.jpg,3NCv 3544 | 2958.jpg,irFy 3545 | 295.jpg,JFmu 3546 | 3550.jpg,yUUe 3547 | 1389.jpg,3TSJ 3548 | 2320.jpg,xKFQ 3549 | 617.jpg,HFe2 3550 | 2772.jpg,y4dF 3551 | 753.jpg,35y2 3552 | 3701.jpg,emBp 3553 | 4999.jpg,S0Kk 3554 | 3913.jpg,6tTw 3555 | 830.jpg,KWLu 3556 | 4144.jpg,h3nk 3557 | 3111.jpg,nZ8q 3558 | 1796.jpg,7oHg 3559 | 4551.jpg,Oi98 3560 | 1886.jpg,MoNS 3561 | 4716.jpg,wr8R 3562 | 2174.jpg,3TBr 3563 | 106.jpg,N6HE 3564 | 4719.jpg,n1N8 3565 | 3145.jpg,JIA0 3566 | 2032.jpg,qElX 3567 | 3672.jpg,1EIy 3568 | 3911.jpg,LnNa 3569 | 2345.jpg,0OkI 3570 | 4382.jpg,yXKd 3571 | 4082.jpg,YUzu 3572 | 3563.jpg,2lXn 3573 | 1838.jpg,ODWu 3574 | 1334.jpg,dyTS 3575 | 1698.jpg,Ys9d 3576 | 2666.jpg,7a28 3577 | 4053.jpg,B67m 3578 | 514.jpg,hvWK 3579 | 1167.jpg,Xsu0 3580 | 3006.jpg,4NNU 3581 | 2969.jpg,QlbN 3582 | 1627.jpg,OIry 3583 | 4608.jpg,W14d 3584 | 1735.jpg,DH3S 3585 | 4117.jpg,TNms 3586 | 1000.jpg,hFSU 3587 | 473.jpg,DNND 3588 | 4974.jpg,xccd 3589 | 2291.jpg,89l2 3590 | 4381.jpg,wzYa 3591 | 3995.jpg,E7dn 3592 | 3072.jpg,iQtk 3593 | 1987.jpg,kQlF 3594 | 4200.jpg,QBwT 3595 | 2101.jpg,t5Og 3596 | 2896.jpg,74JI 3597 | 1335.jpg,P6N7 3598 | 2907.jpg,nqio 3599 | 4787.jpg,b9I6 3600 | 2008.jpg,auLO 3601 | 4097.jpg,MLYu 3602 | 2836.jpg,kXJd 3603 | 1592.jpg,FD8Z 3604 | 3907.jpg,LDcU 3605 | 841.jpg,fZHX 3606 | 3734.jpg,6sXl 3607 | 971.jpg,Ga6M 3608 | 3152.jpg,hPdj 3609 | 616.jpg,SNfp 3610 | 4668.jpg,T8Af 3611 | 1486.jpg,QdrE 3612 | 1782.jpg,3HUu 3613 | 1148.jpg,THPt 3614 | 2513.jpg,fhcs 3615 | 3414.jpg,ZWG5 3616 | 2554.jpg,jO9A 3617 | 4447.jpg,fVdc 3618 | 4558.jpg,PAnn 3619 | 4810.jpg,zbZm 3620 | 2387.jpg,SpAW 3621 | 2005.jpg,5f0v 3622 | 891.jpg,bHon 3623 | 1159.jpg,ADCE 3624 | 64.jpg,9Y2g 3625 | 4364.jpg,tja5 3626 | 716.jpg,uTzO 3627 | 414.jpg,sGAB 3628 | 4077.jpg,sUXi 3629 | 900.jpg,Hx5K 3630 | 2667.jpg,0SzJ 3631 | 1181.jpg,Ueft 3632 | 1552.jpg,dOmL 3633 | 367.jpg,SMTM 3634 | 479.jpg,dEgh 3635 | 3747.jpg,6I5W 3636 | 3040.jpg,Abt2 3637 | 2167.jpg,YmQB 3638 | 4226.jpg,91Z1 3639 | 3454.jpg,rmej 3640 | 159.jpg,KMV8 3641 | 2301.jpg,C7NZ 3642 | 4724.jpg,HidL 3643 | 1400.jpg,NkzH 3644 | 344.jpg,QdDb 3645 | 719.jpg,JBv3 3646 | 2059.jpg,uifH 3647 | 3589.jpg,F6JJ 3648 | 299.jpg,saFT 3649 | 4926.jpg,hiqp 3650 | 4149.jpg,hHCX 3651 | 1199.jpg,65w3 3652 | 4650.jpg,8VFO 3653 | 2166.jpg,V0vQ 3654 | 4829.jpg,HQDM 3655 | 2375.jpg,nk5Y 3656 | 3499.jpg,jYOi 3657 | 4805.jpg,x2a2 3658 | 3569.jpg,mv8B 3659 | 2077.jpg,VDAr 3660 | 2575.jpg,PzbI 3661 | 4365.jpg,LFIW 3662 | 3948.jpg,LT6t 3663 | 4690.jpg,9qdI 3664 | 1825.jpg,N8ln 3665 | 3348.jpg,dr5I 3666 | 3487.jpg,qHRN 3667 | 3826.jpg,zJRv 3668 | 1299.jpg,Kfo3 3669 | 1540.jpg,CNmI 3670 | 2283.jpg,3LlR 3671 | 4346.jpg,8nRT 3672 | 140.jpg,4kbY 3673 | 4059.jpg,UBmj 3674 | 3854.jpg,XCfY 3675 | 4773.jpg,SYuR 3676 | 3949.jpg,FPbR 3677 | 4766.jpg,aFJL 3678 | 805.jpg,7tun 3679 | 2250.jpg,Wdtc 3680 | 2154.jpg,7swc 3681 | 128.jpg,B36o 3682 | 486.jpg,qxs6 3683 | 1602.jpg,qfBC 3684 | 4373.jpg,MEFW 3685 | 2282.jpg,im91 3686 | 2304.jpg,ZHzV 3687 | 110.jpg,GPJm 3688 | 383.jpg,5qlu 3689 | 832.jpg,A2yh 3690 | 3041.jpg,EyG1 3691 | 2017.jpg,vSo1 3692 | 4180.jpg,eBzn 3693 | 2848.jpg,e2rz 3694 | 685.jpg,xvBL 3695 | 636.jpg,3J3m 3696 | 1793.jpg,QwoI 3697 | 1849.jpg,xZ2g 3698 | 3811.jpg,hhd7 3699 | 1924.jpg,hZmf 3700 | 2061.jpg,8r8J 3701 | 2381.jpg,FMzZ 3702 | 2727.jpg,YO9H 3703 | 428.jpg,Pb0I 3704 | 870.jpg,vS4P 3705 | 4554.jpg,Nrlv 3706 | 1050.jpg,te61 3707 | 4653.jpg,o02I 3708 | 1625.jpg,zzi8 3709 | 1305.jpg,6VT0 3710 | 4157.jpg,X6Pv 3711 | 811.jpg,8DrA 3712 | 814.jpg,y8G2 3713 | 4135.jpg,3HJG 3714 | 435.jpg,UTOr 3715 | 4005.jpg,llNo 3716 | 964.jpg,kx57 3717 | 2534.jpg,KW57 3718 | 19.jpg,dSyJ 3719 | 3727.jpg,msOE 3720 | 857.jpg,8iZR 3721 | 3822.jpg,WfGg 3722 | 3466.jpg,UjgA 3723 | 1434.jpg,1wvd 3724 | 4468.jpg,Ia5p 3725 | 2811.jpg,y6WK 3726 | 3327.jpg,p2vI 3727 | 3683.jpg,6ENq 3728 | 4136.jpg,Hnmq 3729 | 2899.jpg,1phs 3730 | 1808.jpg,R5kx 3731 | 969.jpg,wnui 3732 | 786.jpg,Dk0d 3733 | 1971.jpg,er7H 3734 | 2225.jpg,3xAq 3735 | 4533.jpg,o6aX 3736 | 3426.jpg,SjcR 3737 | 2281.jpg,ISbD 3738 | 2883.jpg,cteD 3739 | 1078.jpg,UQYj 3740 | 4723.jpg,lxTv 3741 | 3064.jpg,O4Ff 3742 | 974.jpg,9N6D 3743 | 956.jpg,Re08 3744 | 2243.jpg,SxJD 3745 | 1760.jpg,r0IW 3746 | 3648.jpg,NTfw 3747 | 1241.jpg,Y7CT 3748 | 2675.jpg,GPJW 3749 | 1048.jpg,MwMI 3750 | 2021.jpg,GLrG 3751 | 2710.jpg,WY5l 3752 | 4463.jpg,hDXb 3753 | 6.jpg,zAhH 3754 | 4519.jpg,D4xU 3755 | 1892.jpg,KApb 3756 | 3065.jpg,37B6 3757 | 3403.jpg,XdK0 3758 | 1117.jpg,uSQk 3759 | 2200.jpg,Fhmg 3760 | 2787.jpg,efZX 3761 | 469.jpg,SUND 3762 | 4296.jpg,kFsD 3763 | 4730.jpg,T48Z 3764 | 1773.jpg,u5b7 3765 | 3156.jpg,NsMD 3766 | 1467.jpg,pqYl 3767 | 3368.jpg,ep3o 3768 | 3223.jpg,zDEC 3769 | 2337.jpg,Qtih 3770 | 4356.jpg,tAHj 3771 | 2690.jpg,yeeU 3772 | 33.jpg,wgKF 3773 | 4295.jpg,pjn3 3774 | 883.jpg,ZTM9 3775 | 1087.jpg,FQQk 3776 | 365.jpg,nx34 3777 | 2378.jpg,OAh9 3778 | 3815.jpg,uI8a 3779 | 4889.jpg,TB9M 3780 | 1624.jpg,B3pU 3781 | 2598.jpg,VBIF 3782 | 1178.jpg,VOJ2 3783 | 4950.jpg,1FXE 3784 | 378.jpg,4ltB 3785 | 1093.jpg,cJDj 3786 | 3539.jpg,bM5D 3787 | 4235.jpg,fc0X 3788 | 3159.jpg,OtAU 3789 | 798.jpg,n0IY 3790 | 4541.jpg,9tjO 3791 | 2985.jpg,8CrJ 3792 | 2797.jpg,Jc6J 3793 | 375.jpg,GMXH 3794 | 3813.jpg,vHml 3795 | 3553.jpg,l5fA 3796 | 2728.jpg,bq4k 3797 | 4431.jpg,7lYS 3798 | 1981.jpg,4Dph 3799 | 4478.jpg,DxLN 3800 | 4448.jpg,7psu 3801 | 628.jpg,tZZW 3802 | 3662.jpg,2rlz 3803 | 1683.jpg,w4iA 3804 | 2720.jpg,MU42 3805 | 3024.jpg,Yy8O 3806 | 876.jpg,K5lO 3807 | 500.jpg,1krs 3808 | 1745.jpg,qlXA 3809 | 4540.jpg,HHNr 3810 | 4472.jpg,pmP1 3811 | 2429.jpg,efZ6 3812 | 3117.jpg,vzXi 3813 | 4285.jpg,xxER 3814 | 2898.jpg,Q8n2 3815 | 523.jpg,XWx3 3816 | 2648.jpg,v58W 3817 | 2745.jpg,vOO4 3818 | 1372.jpg,Fdny 3819 | 4419.jpg,C1u1 3820 | 840.jpg,x0Uq 3821 | 813.jpg,iInY 3822 | 4503.jpg,hpGH 3823 | 4637.jpg,W1pn 3824 | 775.jpg,CYsQ 3825 | 596.jpg,UCFA 3826 | 1913.jpg,Mzsm 3827 | 3210.jpg,C3JF 3828 | 117.jpg,tnXd 3829 | 2193.jpg,h6ct 3830 | 4258.jpg,HVkK 3831 | 1588.jpg,DLG2 3832 | 1373.jpg,wOS9 3833 | 1758.jpg,mDSB 3834 | 2466.jpg,AEY7 3835 | 2512.jpg,YrkY 3836 | 3170.jpg,FjyN 3837 | 4996.jpg,x1mi 3838 | 3229.jpg,552a 3839 | 1333.jpg,4VBx 3840 | 423.jpg,MZFi 3841 | 2153.jpg,5TXN 3842 | 4130.jpg,RRCI 3843 | 2994.jpg,shFu 3844 | 201.jpg,gHJf 3845 | 3211.jpg,GEc4 3846 | 2463.jpg,Bezw 3847 | 1951.jpg,tFYe 3848 | 3230.jpg,DA3Z 3849 | 2115.jpg,QkKQ 3850 | 2428.jpg,YA3W 3851 | 1354.jpg,NyTs 3852 | 4983.jpg,nVdz 3853 | 3319.jpg,AMQV 3854 | 234.jpg,RtAJ 3855 | 3910.jpg,aruE 3856 | 3038.jpg,YjOb 3857 | 4515.jpg,DHH4 3858 | 829.jpg,xwvR 3859 | 1077.jpg,bcBb 3860 | 2567.jpg,ILT7 3861 | 1329.jpg,e4Gq 3862 | 1918.jpg,5YsC 3863 | 68.jpg,LhIy 3864 | 3101.jpg,aKTM 3865 | 1053.jpg,lsYW 3866 | 2498.jpg,GrGP 3867 | 3061.jpg,alyB 3868 | 3865.jpg,fgDQ 3869 | 3992.jpg,Aq2l 3870 | 4517.jpg,uLPP 3871 | 1105.jpg,e4Fm 3872 | 3280.jpg,L1Cz 3873 | 2234.jpg,6ehl 3874 | 4428.jpg,Iv2e 3875 | 3940.jpg,2V7P 3876 | 443.jpg,4FR8 3877 | 742.jpg,sDnt 3878 | 4539.jpg,HWIR 3879 | 1700.jpg,n6BF 3880 | 27.jpg,1Ars 3881 | 2287.jpg,0CqH 3882 | 3493.jpg,Wx07 3883 | 4361.jpg,j6q5 3884 | 1244.jpg,wmSx 3885 | 2877.jpg,ArcY 3886 | 4253.jpg,GaZy 3887 | 866.jpg,dlk6 3888 | 5.jpg,xPrE 3889 | 3531.jpg,bwOv 3890 | 3825.jpg,KJe0 3891 | 4867.jpg,LDsd 3892 | 2336.jpg,jlKG 3893 | 285.jpg,qqZq 3894 | 2173.jpg,LeYC 3895 | 2473.jpg,K1MB 3896 | 4705.jpg,09Yu 3897 | 81.jpg,Gtyq 3898 | 1840.jpg,dkvl 3899 | 3216.jpg,8h39 3900 | 2522.jpg,NuLi 3901 | 4562.jpg,mOkv 3902 | 4740.jpg,GXx1 3903 | 3209.jpg,tFGU 3904 | 3385.jpg,e863 3905 | 1617.jpg,ngjG 3906 | 2825.jpg,dKJC 3907 | 2546.jpg,X7ez 3908 | 4198.jpg,XYUi 3909 | 2638.jpg,dacp 3910 | 3577.jpg,M8ai 3911 | 3784.jpg,U07O 3912 | 2455.jpg,ooxH 3913 | 271.jpg,l3pG 3914 | 780.jpg,Y5Br 3915 | 3365.jpg,Rk37 3916 | 984.jpg,1yBv 3917 | 690.jpg,Nb4l 3918 | 4599.jpg,cnve 3919 | 422.jpg,Hx7R 3920 | 1568.jpg,niX8 3921 | 1039.jpg,U74x 3922 | 3143.jpg,3SgQ 3923 | 4405.jpg,bfkE 3924 | 3548.jpg,QJUC 3925 | 1084.jpg,7vEi 3926 | 141.jpg,VzFC 3927 | 3452.jpg,oFz0 3928 | 1942.jpg,aahV 3929 | 1957.jpg,c64D 3930 | 1104.jpg,Uwh2 3931 | 1229.jpg,xBVF 3932 | 4056.jpg,EyMA 3933 | 3181.jpg,dQjc 3934 | 490.jpg,aRWW 3935 | 3676.jpg,8iql 3936 | 2162.jpg,wXza 3937 | 2470.jpg,vy3y 3938 | 1538.jpg,r60t 3939 | 315.jpg,9mPA 3940 | 2322.jpg,bnTS 3941 | 4591.jpg,Hive 3942 | 1143.jpg,7K2l 3943 | 3685.jpg,tzbh 3944 | 400.jpg,y0gS 3945 | 3833.jpg,8O2l 3946 | 3082.jpg,D4RY 3947 | 2743.jpg,6EaO 3948 | 1905.jpg,AYwE 3949 | 3039.jpg,Zijx 3950 | 1616.jpg,vU6G 3951 | 724.jpg,XPR8 3952 | 1279.jpg,zrGZ 3953 | 4100.jpg,YLRg 3954 | 787.jpg,unma 3955 | 1283.jpg,pWRH 3956 | 2197.jpg,evoD 3957 | 1846.jpg,qZj8 3958 | 2578.jpg,w6kE 3959 | 4756.jpg,B8sD 3960 | 4585.jpg,1JBt 3961 | 4984.jpg,yTYM 3962 | 1831.jpg,txPh 3963 | 1040.jpg,LVNw 3964 | 853.jpg,n0dH 3965 | 1514.jpg,HgIh 3966 | 743.jpg,5R8h 3967 | 550.jpg,c4Ss 3968 | 3031.jpg,LXBU 3969 | 3756.jpg,dpzp 3970 | 2045.jpg,EJZ3 3971 | 4932.jpg,78qx 3972 | 3970.jpg,qEik 3973 | 3561.jpg,TV70 3974 | 239.jpg,hAPX 3975 | 4255.jpg,9SDJ 3976 | 3866.jpg,7cWk 3977 | 3659.jpg,rz1b 3978 | 2939.jpg,ueel 3979 | 420.jpg,MGFB 3980 | 2957.jpg,bYUc 3981 | 4972.jpg,JsTO 3982 | 827.jpg,YR3z 3983 | 3316.jpg,aT57 3984 | 2603.jpg,knMi 3985 | 3769.jpg,rL9V 3986 | 4408.jpg,UegE 3987 | 3856.jpg,Wp9g 3988 | 1873.jpg,wEne 3989 | 2741.jpg,JF1K 3990 | 4944.jpg,LEn1 3991 | 373.jpg,mVMZ 3992 | 2866.jpg,k7AK 3993 | 2960.jpg,0mYn 3994 | 4682.jpg,lQCE 3995 | 3389.jpg,FMkY 3996 | 3305.jpg,12Lw 3997 | 3085.jpg,t3e9 3998 | 4744.jpg,LtFl 3999 | 3605.jpg,o1dp 4000 | 1908.jpg,D9NJ 4001 | 4881.jpg,64ea 4002 | 3336.jpg,pP2d 4003 | 4048.jpg,mA6M 4004 | 2609.jpg,aKOG 4005 | 4340.jpg,Jvkv 4006 | 4790.jpg,dRGL 4007 | 3568.jpg,wVaO 4008 | 3785.jpg,5efz 4009 | 966.jpg,84NT 4010 | 2803.jpg,HWzN 4011 | 3066.jpg,jtX1 4012 | 2718.jpg,Hjs1 4013 | 4521.jpg,LR8B 4014 | 1494.jpg,QQ9l 4015 | 3372.jpg,cSjE 4016 | 2432.jpg,1wjv 4017 | 3131.jpg,BONs 4018 | 2078.jpg,U3YC 4019 | 4326.jpg,jjJo 4020 | 2313.jpg,BmU6 4021 | 2285.jpg,ZVFV 4022 | 4783.jpg,zz0d 4023 | 2684.jpg,NHdi 4024 | 3716.jpg,pWyq 4025 | 2220.jpg,M5BC 4026 | 3753.jpg,1GqM 4027 | 3985.jpg,h6UG 4028 | 4861.jpg,kHAB 4029 | 2993.jpg,ESuJ 4030 | 3773.jpg,dokK 4031 | 1529.jpg,O5nA 4032 | 942.jpg,XSuB 4033 | 555.jpg,9FVd 4034 | 3955.jpg,lYn9 4035 | 2155.jpg,J6SW 4036 | 202.jpg,Tv5P 4037 | 2476.jpg,WbzX 4038 | 2606.jpg,0RA5 4039 | 3728.jpg,HhFy 4040 | 921.jpg,DyOF 4041 | 2826.jpg,5D1y 4042 | 4202.jpg,O7bi 4043 | 3544.jpg,gcyv 4044 | 3588.jpg,R6Nd 4045 | 3750.jpg,rP1Q 4046 | 1513.jpg,4GBs 4047 | 2607.jpg,Ltbj 4048 | 1835.jpg,H0Ax 4049 | 1381.jpg,Cp47 4050 | 352.jpg,VRQQ 4051 | 4482.jpg,YbAY 4052 | 3123.jpg,neuS 4053 | 1125.jpg,EsVj 4054 | 1884.jpg,6NNw 4055 | 2962.jpg,5z7J 4056 | 3444.jpg,ipT0 4057 | 2699.jpg,yIKI 4058 | 2659.jpg,sMJT 4059 | 4072.jpg,FjNo 4060 | 3388.jpg,pDjp 4061 | 7.jpg,myRH 4062 | 1459.jpg,4hVw 4063 | 4757.jpg,4Ipw 4064 | 2621.jpg,yhkl 4065 | 2171.jpg,mpLa 4066 | 2460.jpg,irH4 4067 | 3506.jpg,LrQw 4068 | 2655.jpg,9ylf 4069 | 358.jpg,c5Iv 4070 | 3194.jpg,0z0M 4071 | 4531.jpg,ojIZ 4072 | 610.jpg,JGE8 4073 | 2252.jpg,lTSZ 4074 | 2040.jpg,bkF5 4075 | 3954.jpg,M25l 4076 | 3125.jpg,TMW6 4077 | 3646.jpg,TaNE 4078 | 1433.jpg,NNeU 4079 | 4776.jpg,4Dbp 4080 | 2709.jpg,DZ1l 4081 | 4841.jpg,IA2A 4082 | 3178.jpg,Io3n 4083 | 2458.jpg,GvmC 4084 | 2963.jpg,3Dj8 4085 | 4648.jpg,f6La 4086 | 2636.jpg,UwuN 4087 | 4453.jpg,xLbe 4088 | 1111.jpg,Ukkc 4089 | 1182.jpg,yjId 4090 | 4508.jpg,13a5 4091 | 3545.jpg,suFe 4092 | 3283.jpg,tJnf 4093 | 3527.jpg,CtAX 4094 | 1428.jpg,mJe2 4095 | 3807.jpg,58yw 4096 | 1131.jpg,vvuw 4097 | 1387.jpg,ElYS 4098 | 3266.jpg,lDyz 4099 | 3079.jpg,QFyG 4100 | 2846.jpg,x828 4101 | 2624.jpg,6aLZ 4102 | 2953.jpg,dyfB 4103 | 1152.jpg,k3Ua 4104 | 1115.jpg,rrEv 4105 | 3619.jpg,kb2f 4106 | 210.jpg,NMxY 4107 | 2123.jpg,ExE2 4108 | 3523.jpg,KGW2 4109 | 2091.jpg,000Q 4110 | 561.jpg,yTa6 4111 | 4445.jpg,wCEg 4112 | 334.jpg,6P74 4113 | 211.jpg,G2bc 4114 | 2837.jpg,LzNR 4115 | 854.jpg,0fnp 4116 | 756.jpg,DGvV 4117 | 1871.jpg,uZG6 4118 | 2744.jpg,1Gzy 4119 | 3986.jpg,LSJw 4120 | 3086.jpg,6icF 4121 | 4632.jpg,VlRi 4122 | 4305.jpg,OshI 4123 | 4159.jpg,tV3L 4124 | 1823.jpg,t9tz 4125 | 1102.jpg,OGwn 4126 | 1508.jpg,kiiA 4127 | 2351.jpg,rLmY 4128 | 4770.jpg,Vuhh 4129 | 1642.jpg,UJSI 4130 | 1841.jpg,Pmnh 4131 | 4189.jpg,5kAx 4132 | 4614.jpg,XLaa 4133 | 4624.jpg,ij7C 4134 | 2134.jpg,YQqJ 4135 | 3620.jpg,NCFH 4136 | 1967.jpg,94Vd 4137 | 823.jpg,q6Is 4138 | 1870.jpg,mI0E 4139 | 1003.jpg,oryN 4140 | 3546.jpg,tdvo 4141 | 540.jpg,rIDM 4142 | 2241.jpg,6X8L 4143 | 2688.jpg,M7qy 4144 | 4213.jpg,p7fk 4145 | 3573.jpg,ABYb 4146 | 4029.jpg,hMOy 4147 | 733.jpg,YYQK 4148 | 1644.jpg,DDFU 4149 | 2074.jpg,lMpk 4150 | 205.jpg,Mwqs 4151 | 4337.jpg,Hkdd 4152 | 70.jpg,1KRT 4153 | 2946.jpg,MZN9 4154 | 2892.jpg,VfuL 4155 | 343.jpg,kKuP 4156 | 1572.jpg,kFcD 4157 | 2947.jpg,wSPa 4158 | 4486.jpg,E6XH 4159 | 1116.jpg,hTcK 4160 | 4430.jpg,kyFB 4161 | 2323.jpg,CqCd 4162 | 2289.jpg,Mrru 4163 | 1029.jpg,wbhU 4164 | 4462.jpg,74Xp 4165 | 2944.jpg,t5V8 4166 | 3386.jpg,OkJK 4167 | 304.jpg,Gpcr 4168 | 303.jpg,pLs0 4169 | 3484.jpg,yjdd 4170 | 4897.jpg,sjeO 4171 | 4563.jpg,nc7g 4172 | 3413.jpg,IpHi 4173 | 2503.jpg,L0kq 4174 | 1258.jpg,dQ1H 4175 | 2446.jpg,X4p0 4176 | 4190.jpg,2RTV 4177 | 4965.jpg,5TQz 4178 | 2434.jpg,He0h 4179 | 3476.jpg,b1MU 4180 | 3639.jpg,ehtW 4181 | 2457.jpg,57ZV 4182 | 4268.jpg,ZTIb 4183 | 3360.jpg,DWbh 4184 | 1302.jpg,zb6b 4185 | 1109.jpg,PljZ 4186 | 1570.jpg,gcPN 4187 | 2342.jpg,n9Wh 4188 | 1478.jpg,Rn4K 4189 | 2014.jpg,b3aE 4190 | 3950.jpg,XONu 4191 | 3334.jpg,mAAS 4192 | 3182.jpg,6fRP 4193 | 3842.jpg,WtO9 4194 | 4779.jpg,xXmk 4195 | 2350.jpg,dyhA 4196 | 688.jpg,RYt3 4197 | 2634.jpg,cfKq 4198 | 1906.jpg,iX2y 4199 | 4990.jpg,yuiK 4200 | 79.jpg,PXXa 4201 | 331.jpg,dacj 4202 | 3410.jpg,G0A9 4203 | 4265.jpg,rfoz 4204 | 1682.jpg,V73X 4205 | 1819.jpg,adei 4206 | 2373.jpg,nQu4 4207 | 4873.jpg,bQfc 4208 | 342.jpg,UOOY 4209 | 2251.jpg,0kb8 4210 | 1068.jpg,VOqf 4211 | 1165.jpg,rrOM 4212 | 3166.jpg,8olh 4213 | 2050.jpg,g3yg 4214 | 3295.jpg,StlX 4215 | 3373.jpg,eHOR 4216 | 3172.jpg,P8xU 4217 | 67.jpg,OckF 4218 | 267.jpg,FAfx 4219 | 1639.jpg,Apfe 4220 | 3025.jpg,dPGY 4221 | 525.jpg,pTJg 4222 | 1671.jpg,6HVr 4223 | 1503.jpg,bvOC 4224 | 3994.jpg,wR5e 4225 | 290.jpg,4eJh 4226 | 3265.jpg,LC54 4227 | 2487.jpg,ZEcz 4228 | 2058.jpg,XyJl 4229 | 1515.jpg,xsue 4230 | 802.jpg,JXkh 4231 | 3102.jpg,KO60 4232 | 3641.jpg,bQ1g 4233 | 4659.jpg,dvYF 4234 | 3122.jpg,r7ZY 4235 | 3177.jpg,nqFg 4236 | 1676.jpg,IKJ5 4237 | 3222.jpg,8cne 4238 | 1534.jpg,nMlm 4239 | 1670.jpg,V4yF 4240 | 4234.jpg,sUDO 4241 | 4150.jpg,deYY 4242 | 3782.jpg,9RDy 4243 | 498.jpg,fOPf 4244 | 232.jpg,j68m 4245 | 1599.jpg,USPX 4246 | 3237.jpg,pyfs 4247 | 132.jpg,AqVV 4248 | 4831.jpg,vlCS 4249 | 2987.jpg,pbSj 4250 | 1146.jpg,vvs9 4251 | 995.jpg,KBfM 4252 | 4368.jpg,0A0I 4253 | 4943.jpg,WycV 4254 | 2359.jpg,d384 4255 | 1270.jpg,YkBp 4256 | 2198.jpg,19RH 4257 | 1968.jpg,Dafh 4258 | 2071.jpg,6WWr 4259 | 4377.jpg,stYk 4260 | 2144.jpg,2cs4 4261 | 207.jpg,4WBX 4262 | 3931.jpg,rnpe 4263 | 1396.jpg,ayKg 4264 | 1180.jpg,oegO 4265 | 2685.jpg,bKgK 4266 | 1717.jpg,sI2j 4267 | 2495.jpg,Tl1I 4268 | 533.jpg,f30g 4269 | 3291.jpg,V45P 4270 | 3845.jpg,Mm5V 4271 | 1874.jpg,IgNu 4272 | 1878.jpg,JWO0 4273 | 3445.jpg,NoFM 4274 | 961.jpg,d9t7 4275 | 1990.jpg,HP4U 4276 | 723.jpg,lVpf 4277 | 3799.jpg,GRpj 4278 | 4335.jpg,YTJn 4279 | 3726.jpg,AthQ 4280 | 3090.jpg,vH4B 4281 | 395.jpg,bzID 4282 | 2656.jpg,3Cw0 4283 | 2441.jpg,4ziL 4284 | 2407.jpg,vclX 4285 | 1476.jpg,XwsI 4286 | 4798.jpg,Vgy3 4287 | 4910.jpg,OG5f 4288 | 4604.jpg,2YQC 4289 | 2933.jpg,KObH 4290 | 4371.jpg,lBPh 4291 | 3993.jpg,fEDc 4292 | 4172.jpg,CMIu 4293 | 3062.jpg,Meip 4294 | 1755.jpg,okrl 4295 | 3171.jpg,wqs7 4296 | 2949.jpg,f5Uq 4297 | 2184.jpg,ybTv 4298 | 408.jpg,SZ28 4299 | 3556.jpg,cbiY 4300 | 1736.jpg,lhOX 4301 | 1789.jpg,Selh 4302 | 265.jpg,5Lwu 4303 | 2247.jpg,jeMz 4304 | 943.jpg,at9X 4305 | 3277.jpg,BBHr 4306 | 1114.jpg,Dns2 4307 | 1573.jpg,x1ON 4308 | 2952.jpg,N7Ys 4309 | 3067.jpg,qlkG 4310 | 4115.jpg,Co1b 4311 | 4902.jpg,6KpW 4312 | 1810.jpg,qswb 4313 | 1546.jpg,elVO 4314 | 4775.jpg,iWY2 4315 | 1127.jpg,Kf95 4316 | 3832.jpg,93J5 4317 | 4754.jpg,36b2 4318 | 2619.jpg,egfB 4319 | 3935.jpg,pKI9 4320 | 2844.jpg,9dLw 4321 | 4516.jpg,Vzim 4322 | 72.jpg,FYAW 4323 | 4303.jpg,bYdw 4324 | 1011.jpg,JA0z 4325 | 4209.jpg,UAtD 4326 | 2010.jpg,BATI 4327 | 3565.jpg,M0vo 4328 | 133.jpg,dDJs 4329 | 2438.jpg,5Eka 4330 | 692.jpg,8N4v 4331 | 1495.jpg,Xcda 4332 | 4623.jpg,aM4u 4333 | 527.jpg,GyLw 4334 | 4917.jpg,YWr0 4335 | 2894.jpg,S29m 4336 | 3228.jpg,dKMp 4337 | 2615.jpg,iZt2 4338 | 3219.jpg,KoP5 4339 | 2076.jpg,fTYK 4340 | 836.jpg,dMdk 4341 | 3176.jpg,sdBY 4342 | 4992.jpg,mxpj 4343 | 4959.jpg,QHY8 4344 | 3702.jpg,znjW 4345 | 3789.jpg,M6dZ 4346 | 968.jpg,rIyw 4347 | 2514.jpg,0sRM 4348 | 1559.jpg,U6ol 4349 | 2983.jpg,CM9E 4350 | 1423.jpg,VPxT 4351 | 4493.jpg,EOSb 4352 | 4678.jpg,bcJa 4353 | 2051.jpg,8b0J 4354 | 1775.jpg,VylL 4355 | 3362.jpg,D6fh 4356 | 2214.jpg,l4Vf 4357 | 197.jpg,rNFp 4358 | 4939.jpg,g4Mi 4359 | 3227.jpg,Y0Yo 4360 | 2871.jpg,zW3H 4361 | 1072.jpg,1ELn 4362 | 2093.jpg,yPPP 4363 | 755.jpg,eScM 4364 | 1147.jpg,9IDH 4365 | 4715.jpg,o7h8 4366 | 1994.jpg,mZCL 4367 | 951.jpg,sdZv 4368 | 1996.jpg,SUNS 4369 | 4616.jpg,slFz 4370 | 2402.jpg,1HTQ 4371 | 4279.jpg,m5lz 4372 | 2464.jpg,imQ0 4373 | 3428.jpg,zQVN 4374 | 2125.jpg,XjpF 4375 | 643.jpg,98HS 4376 | 2253.jpg,g9FS 4377 | 4079.jpg,lb6s 4378 | 1142.jpg,P6PA 4379 | 3824.jpg,PxXi 4380 | 2372.jpg,EHBK 4381 | 2756.jpg,ZFX7 4382 | 1245.jpg,TUNT 4383 | 3772.jpg,XkSv 4384 | 1798.jpg,fekN 4385 | 2233.jpg,IKpf 4386 | 4860.jpg,VVEC 4387 | 4304.jpg,WyNI 4388 | 4108.jpg,FwOR 4389 | 1774.jpg,5ZMv 4390 | 1694.jpg,maFv 4391 | 2172.jpg,1HhS 4392 | 4054.jpg,MgGM 4393 | 283.jpg,CjZ0 4394 | 965.jpg,PnGw 4395 | 4844.jpg,ilVu 4396 | 3017.jpg,H3Y3 4397 | 241.jpg,HL9U 4398 | 437.jpg,lxrJ 4399 | 701.jpg,Q9PV 4400 | 2526.jpg,aq3g 4401 | 113.jpg,3ayf 4402 | 4028.jpg,8E4Y 4403 | 3943.jpg,uGyZ 4404 | 3460.jpg,gska 4405 | 2132.jpg,ZJg5 4406 | 104.jpg,u6pf 4407 | 3496.jpg,4Er6 4408 | 2327.jpg,ZfIl 4409 | 2367.jpg,wYov 4410 | 1964.jpg,7nbC 4411 | 3074.jpg,Hvoo 4412 | 370.jpg,F1pk 4413 | 119.jpg,RiuW 4414 | 4477.jpg,QH50 4415 | 2951.jpg,eGN6 4416 | 4615.jpg,qlzF 4417 | 1021.jpg,tRYs 4418 | 1037.jpg,XbiK 4419 | 752.jpg,Exxa 4420 | 4087.jpg,YQqM 4421 | 2403.jpg,zz1Z 4422 | 495.jpg,4JKW 4423 | 2190.jpg,mBdo 4424 | 1984.jpg,cXM0 4425 | 3483.jpg,ksmm 4426 | 2691.jpg,3dIZ 4427 | 1754.jpg,rOuu 4428 | 1565.jpg,bYxf 4429 | 3920.jpg,R5wm 4430 | 2120.jpg,Y6qF 4431 | 590.jpg,7muo 4432 | 260.jpg,Bbep 4433 | 528.jpg,96Ev 4434 | 2867.jpg,tbEW 4435 | 1067.jpg,4Bme 4436 | 2257.jpg,O3t1 4437 | 4988.jpg,bYxV 4438 | 230.jpg,frCK 4439 | 1286.jpg,2LwA 4440 | 2558.jpg,rjFV 4441 | 4132.jpg,itnT 4442 | 4978.jpg,IZIE 4443 | 4833.jpg,Kamj 4444 | 4099.jpg,Paea 4445 | 2353.jpg,fa1p 4446 | 2158.jpg,rbQZ 4447 | 3380.jpg,AJZv 4448 | 3401.jpg,HzVv 4449 | 2980.jpg,k0xt 4450 | 985.jpg,bYUq 4451 | 948.jpg,orwc 4452 | 1954.jpg,WOBj 4453 | 3781.jpg,zHqb 4454 | 1761.jpg,SzIL 4455 | 120.jpg,bUhR 4456 | 2782.jpg,RuVs 4457 | 1239.jpg,pXjm 4458 | 4120.jpg,mTp5 4459 | 2049.jpg,c8UD 4460 | 3830.jpg,MxrA 4461 | 1390.jpg,IEFZ 4462 | 3005.jpg,5DGS 4463 | 4397.jpg,EEYB 4464 | 2506.jpg,vrBQ 4465 | 1056.jpg,pkUj 4466 | 3776.jpg,cfLN 4467 | 3450.jpg,pqQX 4468 | 549.jpg,niW5 4469 | 2483.jpg,tjCz 4470 | 2365.jpg,LOAZ 4471 | 1257.jpg,T6xr 4472 | 2989.jpg,cqEt 4473 | 175.jpg,4XpO 4474 | 348.jpg,QC0V 4475 | 1211.jpg,rpcb 4476 | 1909.jpg,PeXE 4477 | 3205.jpg,B6Z3 4478 | 103.jpg,GSwh 4479 | 1069.jpg,Uy9s 4480 | 4559.jpg,vxDR 4481 | 2950.jpg,ka6r 4482 | 483.jpg,ELhl 4483 | 1089.jpg,j3vH 4484 | 1282.jpg,exSB 4485 | 2966.jpg,hPeo 4486 | 2075.jpg,QZX6 4487 | 1317.jpg,mdLQ 4488 | 3116.jpg,RGdJ 4489 | 3933.jpg,xEWH 4490 | 544.jpg,VXhm 4491 | 3798.jpg,TSSV 4492 | 4327.jpg,evPO 4493 | 305.jpg,MzUm 4494 | 3987.jpg,RBZV 4495 | 4.jpg,TzMg 4496 | 3273.jpg,8pH1 4497 | 4317.jpg,zdhK 4498 | 4945.jpg,lmCd 4499 | 2112.jpg,WbGb 4500 | 3730.jpg,CkC5 4501 | 465.jpg,AEHl 4502 | 109.jpg,Tm5s 4503 | 3442.jpg,9ziL 4504 | 4176.jpg,78Ry 4505 | 164.jpg,so0x 4506 | 410.jpg,pXmd 4507 | 154.jpg,zIzW 4508 | 2990.jpg,8bTk 4509 | 632.jpg,AxXL 4510 | 2698.jpg,zHfn 4511 | 512.jpg,O0IO 4512 | 2570.jpg,faPv 4513 | 3168.jpg,La4x 4514 | 3656.jpg,nSvB 4515 | 1802.jpg,wdqh 4516 | 323.jpg,znXd 4517 | 3819.jpg,H3LP 4518 | 3735.jpg,1iCD 4519 | 4062.jpg,Zh9x 4520 | 274.jpg,QrNu 4521 | 1360.jpg,XSJU 4522 | 4400.jpg,WiLI 4523 | 4271.jpg,0fXo 4524 | 3585.jpg,khHN 4525 | 310.jpg,4seO 4526 | 3592.jpg,t67Q 4527 | 3864.jpg,hbUG 4528 | 3770.jpg,Tmf4 4529 | 4986.jpg,rApB 4530 | 3332.jpg,YLKb 4531 | 715.jpg,RR5h 4532 | 4452.jpg,qYA3 4533 | 4222.jpg,Fjhw 4534 | 3292.jpg,TQAA 4535 | 2113.jpg,wN1u 4536 | 3290.jpg,04Nw 4537 | 2331.jpg,3zfp 4538 | 754.jpg,YfVI 4539 | 4104.jpg,V0tN 4540 | 4032.jpg,GA5H 4541 | 2411.jpg,DAes 4542 | 863.jpg,Ie4s 4543 | 464.jpg,gOGy 4544 | 191.jpg,r1xH 4545 | 2566.jpg,Gtri 4546 | 2092.jpg,GsEj 4547 | 3684.jpg,Cq4J 4548 | 426.jpg,aRzc 4549 | 4879.jpg,X7AW 4550 | 1346.jpg,LhjM 4551 | 2612.jpg,XVOJ 4552 | 3206.jpg,RRXr 4553 | 4893.jpg,4Pim 4554 | 2215.jpg,DUjq 4555 | 4849.jpg,X4xC 4556 | 2055.jpg,ve5M 4557 | 1355.jpg,hSsp 4558 | 2922.jpg,diHB 4559 | 3419.jpg,SzvN 4560 | 4407.jpg,1ouQ 4561 | 392.jpg,om52 4562 | 2333.jpg,q5zU 4563 | 1348.jpg,nxCU 4564 | 1100.jpg,Uwfs 4565 | 2509.jpg,lIae 4566 | 4156.jpg,SNJQ 4567 | 3279.jpg,mDtJ 4568 | 3049.jpg,WjyU 4569 | 4195.jpg,PGZD 4570 | 989.jpg,wfHM 4571 | 1206.jpg,bMVb 4572 | 468.jpg,pExq 4573 | 3032.jpg,eQRA 4574 | 2954.jpg,4G1b 4575 | 214.jpg,qY3L 4576 | 2312.jpg,6bVz 4577 | 772.jpg,sFxC 4578 | 2909.jpg,xbAC 4579 | 3269.jpg,sGTm 4580 | 503.jpg,HPQy 4581 | 143.jpg,R3jE 4582 | 1079.jpg,fQhP 4583 | 101.jpg,Q9k3 4584 | 2875.jpg,LJBE 4585 | 146.jpg,NZ3n 4586 | 3281.jpg,tjFe 4587 | 2697.jpg,kbTs 4588 | 3415.jpg,x7Z9 4589 | 3849.jpg,EOoO 4590 | 4038.jpg,Q7Ct 4591 | 600.jpg,jFLo 4592 | 2623.jpg,h8MU 4593 | 3713.jpg,sUNj 4594 | 1523.jpg,9WX6 4595 | 2449.jpg,TDpZ 4596 | 1135.jpg,1zhI 4597 | 670.jpg,PuBf 4598 | 842.jpg,HkFY 4599 | 3127.jpg,YJkl 4600 | 90.jpg,yjr0 4601 | 4406.jpg,1gay 4602 | 1553.jpg,lJQO 4603 | 2574.jpg,Wmw9 4604 | 124.jpg,A07c 4605 | 2974.jpg,sFea 4606 | 3576.jpg,gO9U 4607 | 2822.jpg,mcow 4608 | 1545.jpg,hoB4 4609 | 3071.jpg,h3D3 4610 | 2003.jpg,fjAN 4611 | 1826.jpg,SWiD 4612 | 1533.jpg,pGij 4613 | 4526.jpg,EkBo 4614 | 2633.jpg,1JC7 4615 | 213.jpg,nULa 4616 | 1784.jpg,jsbr 4617 | 872.jpg,iSWf 4618 | 229.jpg,DjmQ 4619 | 1059.jpg,uBP0 4620 | 1191.jpg,fHF3 4621 | 3021.jpg,C1PB 4622 | 1255.jpg,qOCC 4623 | 850.jpg,vUgu 4624 | 1465.jpg,RBIA 4625 | 4251.jpg,9Mqx 4626 | 2034.jpg,1mf3 4627 | 924.jpg,Os3e 4628 | 3351.jpg,DAy6 4629 | 1799.jpg,7W4b 4630 | 3322.jpg,drW5 4631 | 308.jpg,lmO7 4632 | 3114.jpg,7Q33 4633 | 1506.jpg,NsMD 4634 | 4729.jpg,RNds 4635 | 1154.jpg,EVWc 4636 | 635.jpg,YGUg 4637 | 3761.jpg,92Zn 4638 | 1141.jpg,mAk9 4639 | 1238.jpg,wsN3 4640 | 4058.jpg,MVg5 4641 | 1566.jpg,tuDy 4642 | 3317.jpg,bjyL 4643 | 4299.jpg,zV5z 4644 | 3013.jpg,USao 4645 | 788.jpg,KdVe 4646 | 4642.jpg,jl4N 4647 | 4223.jpg,CnYt 4648 | 3941.jpg,lzWr 4649 | 4847.jpg,bgYS 4650 | 2328.jpg,V8UF 4651 | 1323.jpg,G3E1 4652 | 2207.jpg,8ZKD 4653 | 1058.jpg,XEES 4654 | 3595.jpg,clwp 4655 | 151.jpg,SpAo 4656 | 1585.jpg,bAai 4657 | 4466.jpg,ilJI 4658 | 612.jpg,NsTw 4659 | 4293.jpg,cBHx 4660 | 1062.jpg,STs4 4661 | 2847.jpg,LMBr 4662 | 2259.jpg,FSTJ 4663 | 142.jpg,7Bq9 4664 | 4421.jpg,UXxM 4665 | 2693.jpg,2veF 4666 | 221.jpg,AhAE 4667 | 4068.jpg,cVam 4668 | 4895.jpg,CKzA 4669 | 1869.jpg,eaKT 4670 | 96.jpg,ksxs 4671 | 884.jpg,VNOF 4672 | 2991.jpg,5Q64 4673 | 807.jpg,6sHS 4674 | 2176.jpg,noi3 4675 | 4360.jpg,Ctxx 4676 | 4839.jpg,1bOq 4677 | 881.jpg,ue7M 4678 | 3528.jpg,Sbfc 4679 | 3033.jpg,CAWu 4680 | 77.jpg,Gveg 4681 | 1822.jpg,TziR 4682 | 2357.jpg,Ttnf 4683 | 376.jpg,Zuve 4684 | 691.jpg,J2aP 4685 | 3607.jpg,MXSV 4686 | 227.jpg,7GOo 4687 | 297.jpg,YCfm 4688 | 1748.jpg,I7FC 4689 | 739.jpg,XtKi 4690 | 2396.jpg,rHeA 4691 | 3007.jpg,Vfzj 4692 | 3259.jpg,j34u 4693 | 4707.jpg,ck9S 4694 | 3591.jpg,vsE5 4695 | 2549.jpg,YvQF 4696 | 2369.jpg,dqcM 4697 | 3302.jpg,XBxZ 4698 | 1988.jpg,xcCW 4699 | 1197.jpg,7OJa 4700 | 3270.jpg,OsSx 4701 | 2642.jpg,s59b 4702 | 2195.jpg,2O3v 4703 | 3234.jpg,Tn3O 4704 | 3142.jpg,Qici 4705 | 4954.jpg,crRl 4706 | 4465.jpg,1qON 4707 | 182.jpg,E0aB 4708 | 682.jpg,yL3P 4709 | 2454.jpg,qdaw 4710 | 3689.jpg,T9If 4711 | 3479.jpg,immD 4712 | 4184.jpg,Lh2d 4713 | 2044.jpg,fW5c 4714 | 136.jpg,B3yu 4715 | 1106.jpg,Q5VZ 4716 | 4418.jpg,wjTQ 4717 | 4513.jpg,03YU 4718 | 3113.jpg,B6FB 4719 | 1995.jpg,K5L8 4720 | 1151.jpg,CQPr 4721 | 4673.jpg,Q54C 4722 | 1861.jpg,g2Qq 4723 | 407.jpg,qr37 4724 | 2736.jpg,Hi6X 4725 | 4605.jpg,2WyH 4726 | 3887.jpg,mBxG 4727 | 4947.jpg,lh2r 4728 | 3154.jpg,LVyK 4729 | 4414.jpg,0AJ6 4730 | 4759.jpg,BekP 4731 | 4281.jpg,AmFa 4732 | 4227.jpg,bBgi 4733 | 1658.jpg,NcsD 4734 | 2152.jpg,hyQK 4735 | 2923.jpg,Suq8 4736 | 4338.jpg,vwQy 4737 | 858.jpg,Qugk 4738 | 138.jpg,dsLa 4739 | 1891.jpg,Nks5 4740 | 1879.jpg,nH6b 4741 | 2635.jpg,vKbK 4742 | 3739.jpg,7iti 4743 | 1349.jpg,FkQd 4744 | 436.jpg,Hw8d 4745 | 1998.jpg,628m 4746 | 1777.jpg,HLQl 4747 | 2545.jpg,W9zv 4748 | 445.jpg,lhwE 4749 | 1684.jpg,1ENl 4750 | 2524.jpg,i9WY 4751 | 3633.jpg,lh1U 4752 | 1659.jpg,prDe 4753 | 791.jpg,VHWs 4754 | 3173.jpg,laWD 4755 | 3840.jpg,xJUP 4756 | 203.jpg,ScR5 4757 | 4328.jpg,Usu5 4758 | 3323.jpg,e3qM 4759 | 2555.jpg,oecp 4760 | 1339.jpg,qYLx 4761 | 4278.jpg,34Uu 4762 | 1301.jpg,r8WK 4763 | 2210.jpg,DZhg 4764 | 1209.jpg,18fe 4765 | 4270.jpg,ZKfd 4766 | 49.jpg,KBVn 4767 | 4050.jpg,tCJV 4768 | 4930.jpg,WFu7 4769 | 1368.jpg,RINX 4770 | 4098.jpg,gFrz 4771 | 3398.jpg,eKmg 4772 | 1663.jpg,Var7 4773 | 360.jpg,hJLn 4774 | 3700.jpg,QYf6 4775 | 1315.jpg,9uu2 4776 | 1860.jpg,YgMR 4777 | 708.jpg,SJrV 4778 | 1543.jpg,740y 4779 | 2237.jpg,QCpy 4780 | 4911.jpg,9C4Z 4781 | 399.jpg,Scw3 4782 | 2208.jpg,C8Ou 4783 | 746.jpg,crIs 4784 | 3806.jpg,koaI 4785 | 1544.jpg,pquw 4786 | 2918.jpg,iQxi 4787 | 3714.jpg,UrOO 4788 | 3661.jpg,2sRy 4789 | 1150.jpg,QLwb 4790 | 2882.jpg,PaOT 4791 | 3601.jpg,Iy5P 4792 | 959.jpg,B0zB 4793 | 1247.jpg,sXyl 4794 | 3677.jpg,QX04 4795 | 4956.jpg,Iocc 4796 | 3366.jpg,quH5 4797 | 2706.jpg,kkiO 4798 | 1119.jpg,idaT 4799 | 4885.jpg,39qD 4800 | 2262.jpg,mr8C 4801 | 3529.jpg,4V65 4802 | 362.jpg,m91h 4803 | 2456.jpg,Y8iD 4804 | 4037.jpg,uMxa 4805 | 2305.jpg,ja1q 4806 | 3908.jpg,O51C 4807 | 1184.jpg,XtZJ 4808 | 4751.jpg,tvBP 4809 | 1369.jpg,maFg 4810 | 1110.jpg,vtIy 4811 | 973.jpg,aJKW 4812 | 2240.jpg,35kZ 4813 | 799.jpg,Ut6K 4814 | 3333.jpg,r5Mt 4815 | 516.jpg,686c 4816 | 63.jpg,3b4Q 4817 | 2887.jpg,PyRE 4818 | 1427.jpg,TTNI 4819 | 4848.jpg,g6gf 4820 | 2576.jpg,iNDF 4821 | 2535.jpg,Wnlm 4822 | 1949.jpg,qigJ 4823 | 3524.jpg,1jTK 4824 | 450.jpg,wXBa 4825 | 493.jpg,ecxK 4826 | 1359.jpg,sKmb 4827 | 2382.jpg,oF57 4828 | 3868.jpg,ONif 4829 | 893.jpg,tspK 4830 | 3300.jpg,vThw 4831 | 657.jpg,o4M6 4832 | 4689.jpg,FF8w 4833 | 2280.jpg,T9Wd 4834 | 2116.jpg,uSY5 4835 | 4321.jpg,8TjL 4836 | 1713.jpg,cAA0 4837 | 3871.jpg,DIjR 4838 | 4012.jpg,MBx2 4839 | 4049.jpg,b05i 4840 | 4073.jpg,ws6W 4841 | 273.jpg,JgZj 4842 | 259.jpg,GXIu 4843 | 2530.jpg,t8PE 4844 | 2056.jpg,7TE8 4845 | 721.jpg,VyGR 4846 | 2481.jpg,OoyZ 4847 | 1959.jpg,DQIV 4848 | 3708.jpg,4Oyo 4849 | 4536.jpg,xknP 4850 | 177.jpg,OS6s 4851 | 4026.jpg,VGDh 4852 | 2395.jpg,fQvu 4853 | 4780.jpg,mz8J 4854 | 100.jpg,g16l 4855 | 2886.jpg,5qpH 4856 | 3187.jpg,JpXe 4857 | 125.jpg,msQB 4858 | 20.jpg,EydQ 4859 | 2016.jpg,1s7G 4860 | 4063.jpg,GPm0 4861 | 4671.jpg,BazL 4862 | 3626.jpg,3T5V 4863 | 114.jpg,9T57 4864 | 4260.jpg,weOE 4865 | 2627.jpg,eoWg 4866 | 195.jpg,O8zT 4867 | 4262.jpg,Qw3F 4868 | 2552.jpg,ZBk4 4869 | 4401.jpg,Ma7V 4870 | 3650.jpg,Cj36 4871 | 1601.jpg,AWZS 4872 | 1118.jpg,W2Tb 4873 | 1740.jpg,P7Gc 4874 | 147.jpg,tVmK 4875 | 529.jpg,51wm 4876 | 1519.jpg,1Bdl 4877 | 4423.jpg,swh9 4878 | 3416.jpg,KTQu 4879 | 621.jpg,Ig8B 4880 | 432.jpg,hNDD 4881 | 3904.jpg,zJ84 4882 | 2493.jpg,QYC4 4883 | 1200.jpg,0uj0 4884 | 4458.jpg,oEfC 4885 | 1166.jpg,vwZ2 4886 | 871.jpg,X6cp 4887 | 270.jpg,5xFr 4888 | 3615.jpg,Mku5 4889 | 4030.jpg,uhAB 4890 | 664.jpg,9eSo 4891 | 1896.jpg,L222 4892 | 3034.jpg,yv03 4893 | 10.jpg,8bud 4894 | 531.jpg,EpJq 4895 | 1922.jpg,jWAB 4896 | 2998.jpg,eTu6 4897 | 2150.jpg,hbSd 4898 | 1192.jpg,yETc 4899 | 4247.jpg,z3m7 4900 | 3019.jpg,E3sy 4901 | 4480.jpg,Xgjw 4902 | 3075.jpg,ROYQ 4903 | 4211.jpg,R6oe 4904 | 4587.jpg,l6b6 4905 | 1099.jpg,oQ2Z 4906 | 1480.jpg,EvEF 4907 | 1866.jpg,lo6K 4908 | 3858.jpg,jLZr 4909 | 1462.jpg,g8bE 4910 | 2261.jpg,YtOS 4911 | 1997.jpg,ppAJ 4912 | 4093.jpg,iNXz 4913 | 1606.jpg,qXRm 4914 | 2725.jpg,gubp 4915 | 3167.jpg,9fdO 4916 | 3614.jpg,b6EX 4917 | 3538.jpg,en7f 4918 | 336.jpg,Gzow 4919 | 4550.jpg,8Nsn 4920 | 1829.jpg,IHr8 4921 | 3407.jpg,w81V 4922 | 2084.jpg,OPGo 4923 | 2647.jpg,G1T5 4924 | 403.jpg,UJpQ 4925 | 2828.jpg,mqNH 4926 | 4680.jpg,n9vn 4927 | 2590.jpg,vSS0 4928 | 2891.jpg,LUaH 4929 | 2439.jpg,rlDs 4930 | 651.jpg,c4I9 4931 | 3036.jpg,7TT9 4932 | 2029.jpg,6i6I 4933 | 2170.jpg,rQe5 4934 | 454.jpg,Zx87 4935 | 661.jpg,OJGI 4936 | 1.jpg,s1O2 4937 | 2874.jpg,RyWA 4938 | 835.jpg,L7rV 4939 | 644.jpg,C1a1 4940 | 4066.jpg,AY6y 4941 | 2926.jpg,1O7J 4942 | 2564.jpg,X8JX 4943 | 987.jpg,pPPF 4944 | 28.jpg,oPVJ 4945 | 3274.jpg,0YJd 4946 | 385.jpg,UjyO 4947 | 1326.jpg,FMhX 4948 | 2419.jpg,SJAQ 4949 | 3188.jpg,zGZ0 4950 | 1882.jpg,7n0b 4951 | 74.jpg,tAZD 4952 | 1030.jpg,3Hwr 4953 | 2194.jpg,FaR8 4954 | 2679.jpg,P9wz 4955 | 572.jpg,lExv 4956 | 2236.jpg,b2Ub 4957 | 2740.jpg,6Zdk 4958 | 4738.jpg,incT 4959 | 3881.jpg,SIGQ 4960 | 1442.jpg,FXtM 4961 | 2881.jpg,8aAR 4962 | 3884.jpg,N21U 4963 | 868.jpg,8CZz 4964 | 1251.jpg,srAl 4965 | 78.jpg,nYxr 4966 | 3473.jpg,ljuP 4967 | 1277.jpg,vdYT 4968 | 4674.jpg,XBx9 4969 | 2834.jpg,6XNn 4970 | 4518.jpg,ZKC7 4971 | 3867.jpg,WxIA 4972 | 318.jpg,W6dN 4973 | 2908.jpg,XA0g 4974 | 3140.jpg,V8zE 4975 | 1485.jpg,jAHX 4976 | 2601.jpg,gBfR 4977 | 327.jpg,3h4l 4978 | 4800.jpg,K888 4979 | 1168.jpg,SEUs 4980 | 2212.jpg,xrqR 4981 | 268.jpg,8vGR 4982 | 2657.jpg,pGnw 4983 | 1410.jpg,0d7S 4984 | 3195.jpg,99ra 4985 | 3091.jpg,BVL5 4986 | 4311.jpg,mNda 4987 | 1132.jpg,mK01 4988 | 2364.jpg,hT2j 4989 | 4727.jpg,Ih8S 4990 | 587.jpg,Erq5 4991 | 371.jpg,SmY8 4992 | 1738.jpg,qIZn 4993 | 2485.jpg,jLfB 4994 | 2921.jpg,XSw6 4995 | 4830.jpg,br0g 4996 | 2550.jpg,nQwL 4997 | 4137.jpg,bL29 4998 | 2057.jpg,NBYg 4999 | 2444.jpg,ivv5 5000 | 3197.jpg,0ZlG 5001 | 1052.jpg,BIFC 5002 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import csv 4 | import os 5 | 6 | import numpy as np 7 | import pandas as pd 8 | import torch as t 9 | import torch.nn.functional as F 10 | from PIL import Image 11 | from torch import nn 12 | from torch.utils import data 13 | from torchvision import transforms as T 14 | 15 | from config.parameters import * 16 | from lib.dataset import * 17 | from model.BNNeck import bnneck 18 | from model.dense import dense121 19 | from model.dualpooling import DualResNet 20 | from model.model import * 21 | from model.res18 import res18 22 | from model.senet import senet 23 | from predict import Dataset4Captcha, predict, predict_all 24 | from train import * 25 | 26 | if __name__ == "__main__": 27 | 28 | #################### 不可修改区域开始 ###################### 29 | # testpath = '/home/data/' #测试集路径。包含验证码图片文件 30 | # result_folder_path = '/code/result/submission.csv' #结果输出文件路径 31 | testpath = "./test" 32 | result_folder_path = "./submissionaaa.csv" 33 | #################### 不可修改区域结束 ###################### 34 | # testpath = './test/' #测试集路径。包含验证码图片文件 35 | # result_folder_path = './result/submission.csv' #结果输出文件路径 36 | print("reading start!") 37 | # pic_names = [str(x) + ".jpg" for x in range(1, 5001)] 38 | # pics = [imageio.imread(testpath + pic_name) for pic_name in pic_names] 39 | print("reading end!") 40 | ### 调用自己的工程文件,并这里生成结果文件(dataframe) 41 | # result = testmodel.model(testpath) 42 | # print(result) 43 | # # 注意路径不能更改,index需要设置为None 44 | # result.to_csv(result_folder_path, index=None) 45 | # ### 参考代码结束:输出标准结果文件 46 | weight_path = r"./resNet_new.pth" 47 | model = ResNet(ResidualBlock) 48 | model.eval() 49 | model.load_model(weight_path) 50 | 51 | if t.cuda.is_available(): 52 | model = model.cuda() 53 | 54 | tdataset = Dataset4Captcha(testpath, train=False) 55 | tdataloader = DataLoader(tdataset, batch_size=1, num_workers=1, shuffle=False) 56 | predict(model, tdataloader, csv_file=result_folder_path) 57 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | from model.model import * 2 | from lib.dataset import * 3 | from train import * 4 | from model.res18 import res18 5 | 6 | def Test(model, dataLoader): 7 | totalNum = 0 8 | rightNum = 0 9 | badlist = [] 10 | for circle, input in enumerate(dataLoader, 0): 11 | totalNum += 1 12 | x, label = input 13 | if t.cuda.is_available(): 14 | x = x.cuda() 15 | label = label.cuda() 16 | realLabel = LabeltoStr([label[0][0], label[0][1], label[0][2], label[0][3]]) 17 | # print(label,realLabel) 18 | y1, y2, y3, y4 = model(x) 19 | y1, y2, y3, y4 = y1.topk(1, dim=1)[1].view(1, 1), y2.topk(1, dim=1)[1].view(1, 1), \ 20 | y3.topk(1, dim=1)[1].view(1, 1), y4.topk(1, dim=1)[1].view(1, 1) 21 | y = t.cat((y1, y2, y3, y4), dim=1) 22 | # print(x,label,y) 23 | decLabel = LabeltoStr([y[0][0], y[0][1], y[0][2], y[0][3]]) 24 | print("real: %s -> %s , %s" % (realLabel, decLabel, str(realLabel == decLabel))) 25 | if realLabel == decLabel: 26 | rightNum += 1 27 | else: 28 | badlist.append([realLabel,decLabel]) 29 | 30 | for itm in badlist: 31 | print("False: ", itm[0], "=>", itm[1]) 32 | print("\n total %s, right %s, wrong %s." % (totalNum, rightNum, totalNum-rightNum)) 33 | 34 | if __name__ == '__main__': 35 | import argparse 36 | parser = argparse.ArgumentParser(description="weight path") 37 | parser.add_argument('--weight_path', type=str,default="./weights/res18_new.pth") 38 | parser.add_argument('--test_path', type=str, default="./data/test") 39 | args = parser.parse_args() 40 | 41 | 42 | model = res18()#ResNet(ResidualBlock) 43 | model.eval() 44 | model.load_model(args.weight_path) 45 | if t.cuda.is_available(): 46 | model = model.cuda() 47 | userTestDataset = Captcha(args.test_path, train=True) 48 | userTestDataLoader = DataLoader(userTestDataset, batch_size=1, 49 | shuffle=True, num_workers=1) 50 | Test(model, userTestDataLoader) 51 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | from config.parameters import * 2 | import torch as t 3 | import torch 4 | from torch import optim 5 | from torch import nn 6 | import torch.optim as optim 7 | from lib.dataset import * 8 | from torch.utils.data import DataLoader 9 | import tqdm 10 | from utils.Visdom import * 11 | from torchnet import meter 12 | from model.model import * 13 | from lib.optimizer import RAdam, AdamW 14 | import os 15 | from model.dense import dense121 16 | from model.senet import senet 17 | from model.res18 import res18 18 | from model.dualpooling import DualResNet 19 | from model.BNNeck import bnneck 20 | from lib.center_loss import CenterLoss 21 | from model.IBN import res_ibn 22 | from lib.scheduler import GradualWarmupScheduler 23 | 24 | torch.manual_seed(42) 25 | # import adabound 26 | 27 | augTrainDataset = augCaptcha(augedTrainPath, train=True) 28 | trainDataset = Captcha(trainPath, train=True) 29 | testDataset = Captcha(testPath, train=False) 30 | augTrainDataLoader = DataLoader(augTrainDataset, 31 | batch_size=batchSize, 32 | shuffle=True, 33 | num_workers=4) 34 | trainDataLoader = DataLoader(trainDataset, 35 | batch_size=batchSize, 36 | shuffle=True, 37 | num_workers=4) 38 | testDataLoader = DataLoader(testDataset, 39 | batch_size=1, 40 | shuffle=True, 41 | num_workers=1) 42 | 43 | os.environ["CUDA_VISIBLE_DEVICES"] = "0" 44 | 45 | ratio_c = 1 46 | ratio_x = 1 47 | 48 | 49 | def train_with_center(model): 50 | model.train() 51 | if torch.cuda.is_available(): 52 | model = model.cuda() 53 | 54 | criterion_xent = nn.CrossEntropyLoss() 55 | criterion_cent = CenterLoss(num_classes=62, feat_dim=62) 56 | optimizer_centloss = optim.SGD(criterion_cent.parameters(), lr=0.005) 57 | # params = list(criterion_cent.parameters())+list(model.parameters()) 58 | optimizer_model = optim.Adam(model.parameters(), lr=3e-4) 59 | # optimizer = RAdam(model.parameters(), lr=learningRate, 60 | # betas=(0.9, 0.999), weight_decay=6.5e-4) 61 | # optimizer = optim.Adam(model.parameters(), lr=learningRate) 62 | # scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5, eta_min=1e-6) # Cosine需要的初始lr比较大1e-2,1e-3都可以 63 | # scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=4) 64 | # scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.5) 65 | # milestone_list = [10 * k for k in range(1, totalEpoch//10)] 66 | # scheduler = optim.lr_scheduler.MultiStepLR( # lr 3e-3 best 67 | # optimizer_model, milestones=milestone_list, gamma=0.5) 68 | scheduler = optim.lr_scheduler.StepLR( # best lr 1e-3 69 | optimizer_model, step_size=20, gamma=0.5) 70 | 71 | vis = Visualizer(env="centerloss") 72 | loss_meter = meter.AverageValueMeter() 73 | avgLoss = 0.0 74 | loss_x_meter = meter.AverageValueMeter() 75 | loss_c_meter = meter.AverageValueMeter() 76 | 77 | best_acc = -1. 78 | for epoch in range(totalEpoch): 79 | loss_meter.reset() 80 | loss_x_meter.reset() 81 | loss_c_meter.reset() 82 | record_circle = 0 83 | for circle, input in enumerate(trainDataLoader, 0): 84 | record_circle = circle 85 | x, label = input 86 | if torch.cuda.is_available(): 87 | x = x.cuda() 88 | label = label.cuda() 89 | label = label.long() 90 | label1, label2, label3, label4 = label[:, 91 | 0], label[:, 92 | 1], label[:, 93 | 2], label[:, 94 | 3] 95 | y1, y2, y3, y4 = model(x) 96 | #################################################################### 97 | loss_x1, loss_x2 = criterion_xent(y1, label1), criterion_xent( 98 | y2, label2) 99 | loss_x3, loss_x4 = criterion_xent(y3, label3), criterion_xent( 100 | y4, label4) 101 | loss_x = loss_x1 + loss_x2 + loss_x3 + loss_x4 102 | #################################################################### 103 | loss_c1, loss_c2 = criterion_cent(y1, label1), criterion_cent( 104 | y2, label2) 105 | loss_c3, loss_c4 = criterion_cent(y3, label3), criterion_cent( 106 | y4, label4) 107 | loss_c = loss_c1 + loss_c2 + loss_c3 + loss_c4 108 | #################################################################### 109 | loss = ratio_c * loss_c + ratio_x * loss_x 110 | #################################################################### 111 | loss_c_meter.add(loss_c.item()) 112 | loss_x_meter.add(loss_x.item()) 113 | loss_meter.add(loss.item()) 114 | optimizer_centloss.zero_grad() 115 | optimizer_model.zero_grad() 116 | #################################################################### 117 | loss.backward() 118 | optimizer_model.step() 119 | #################################################################### 120 | for param in criterion_cent.parameters(): 121 | param.grad.data *= (1. / ratio_c) 122 | optimizer_centloss.step() 123 | #################################################################### 124 | if circle % printCircle == 0: 125 | print( 126 | "epoch:%02d step: %03d train loss:%.5f model loss:%.2f center loss:%.2f" 127 | % (epoch, circle, loss_meter.value()[0], 128 | loss_x_meter.value()[0], loss_c_meter.value()[0])) 129 | # writeFile("step %d , Train loss is %.5f" % (circle, avgLoss / printCircle)) 130 | vis.plot_many_stack({ 131 | "train_loss": loss_meter.value()[0], 132 | "model loss": loss_x_meter.value()[0], 133 | "center loss": loss_c_meter.value()[0] 134 | }) 135 | loss_meter.reset() 136 | loss_c_meter.reset() 137 | loss_x_meter.reset() 138 | 139 | for circle, input in enumerate(augTrainDataLoader, record_circle): 140 | x, label = input 141 | if torch.cuda.is_available(): 142 | x = x.cuda() 143 | label = label.cuda() 144 | label = label.long() 145 | label1, label2 = label[:, 0], label[:, 1] 146 | label3, label4 = label[:, 2], label[:, 3] 147 | y1, y2, y3, y4 = model(x) 148 | #################################################################### 149 | loss_x1, loss_x2 = criterion_xent(y1, label1), criterion_xent( 150 | y2, label2) 151 | loss_x3, loss_x4 = criterion_xent(y3, label3), criterion_xent( 152 | y4, label4) 153 | loss_x = loss_x1 + loss_x2 + loss_x3 + loss_x4 154 | #################################################################### 155 | loss_c1, loss_c2 = criterion_cent(y1, label1), criterion_cent( 156 | y2, label2) 157 | loss_c3, loss_c4 = criterion_cent(y3, label3), criterion_cent( 158 | y4, label4) 159 | loss_c = loss_c1 + loss_c2 + loss_c3 + loss_c4 160 | #################################################################### 161 | loss = ratio_c * loss_c + ratio_x * loss_x 162 | #################################################################### 163 | optimizer_centloss.zero_grad() 164 | optimizer_model.zero_grad() 165 | #################################################################### 166 | loss_c_meter.add(loss_c.item()) 167 | loss_x_meter.add(loss_x.item()) 168 | loss_meter.add(loss.item()) 169 | avgLoss += loss.item() 170 | loss.backward() 171 | optimizer_model.step() 172 | #################################################################### 173 | for param in criterion_cent.parameters(): 174 | param.grad.data *= (1. / ratio_c) 175 | optimizer_centloss.step() 176 | #################################################################### 177 | if circle % printCircle == 0: 178 | print( 179 | "epoch:%02d step: %03d train loss:%.5f model loss:%.2f center loss:%.2f" 180 | % (epoch, circle, loss_meter.value()[0], 181 | loss_x_meter.value()[0], loss_c_meter.value()[0])) 182 | vis.plot_many_stack({ 183 | "train_loss": loss_meter.value()[0], 184 | "model loss": loss_x_meter.value()[0], 185 | "center loss": loss_c_meter.value()[0] 186 | }) 187 | loss_meter.reset() 188 | loss_x_meter.reset() 189 | loss_c_meter.reset() 190 | if True: 191 | # one epoch once 192 | scheduler.step() 193 | accuracy = test(model, testDataLoader) 194 | print("Learning rate: %.10f" % (scheduler.get_lr()[0])) 195 | print("epoch: %03d, accuracy: %.3f" % (epoch, accuracy)) 196 | vis.plot_many_stack({"test_acc": accuracy}) 197 | if best_acc < accuracy: 198 | best_acc = accuracy 199 | if best_acc < accuracy or best_acc - accuracy < 0.01: 200 | model.save(str(epoch) + "_" + str(int(accuracy * 1000))) 201 | 202 | 203 | def train_original(model): 204 | vis = Visualizer(env="old one") 205 | model.train() 206 | avgLoss = 0.0 207 | if torch.cuda.is_available(): 208 | model = model.cuda() 209 | criterion = nn.CrossEntropyLoss() 210 | #optimizer = adabound.AdaBound(model.parameters(), lr=learningRate, final_lr=1e-5, gamma=1e-4) 211 | # RAdam 212 | optimizer = RAdam(model.parameters(), 213 | lr=learningRate, 214 | betas=(0.9, 0.999), 215 | weight_decay=6.5e-4) 216 | # optimizer = optim.Adam(model.parameters(), lr=learningRate) 217 | # scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=5, eta_min=1e-6) # Cosine需要的初始lr比较大1e-2,1e-3都可以 218 | # scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=4) 219 | scheduler_after = optim.lr_scheduler.StepLR(optimizer, 220 | step_size=20, 221 | gamma=0.5) 222 | scheduler = GradualWarmupScheduler(optimizer, 223 | 8, 224 | 10, 225 | after_scheduler=scheduler_after) 226 | # milestone_list = [10 * k for k in range(1, totalEpoch//10)] 227 | # scheduler = optim.lr_scheduler.MultiStepLR( # lr 3e-3 best 228 | # optimizer, milestones=milestone_list, gamma=0.5) 229 | 230 | loss_meter = meter.AverageValueMeter() 231 | best_acc = -1. 232 | for epoch in range(totalEpoch): 233 | record_circle = 0 234 | for circle, input in enumerate(trainDataLoader, 0): 235 | record_circle = circle 236 | x, label = input 237 | # print('-'*5, x.size(), label.size()) 238 | if torch.cuda.is_available(): 239 | x = x.cuda() 240 | label = label.cuda() 241 | label = label.long() 242 | label1, label2 = label[:, 0], label[:, 1] 243 | label3, label4 = label[:, 2], label[:, 3] 244 | optimizer.zero_grad() 245 | y1, y2, y3, y4 = model(x) 246 | # print(label1.size(),label2.size(),label3.size(),label4.size()) 247 | # print(y1.shape, y2.shape, y3.shape, y4.shape) 248 | loss1, loss2, loss3, loss4 = criterion(y1, label1), criterion( 249 | y2, label2), criterion(y3, label3), criterion(y4, label4) 250 | loss = loss1 + loss2 + loss3 + loss4 251 | loss_meter.add(loss.item()) 252 | # print(loss) 253 | avgLoss += loss.item() 254 | loss.backward() 255 | optimizer.step() 256 | if circle % printCircle == 0: 257 | print("epoch:%02d | step: %03d | Train loss is %.5f" % 258 | (epoch, circle, avgLoss / printCircle)) 259 | vis.plot_many_stack({"train_loss": avgLoss}) 260 | avgLoss = 0 261 | 262 | # print("="*13, "aug epoch", "="*13) 263 | for circle, input in enumerate(augTrainDataLoader, record_circle): 264 | x, label = input 265 | # print('-'*5, x.size(), label.size()) 266 | if torch.cuda.is_available(): 267 | x = x.cuda() 268 | label = label.cuda() 269 | label = label.long() 270 | label1, label2 = label[:, 0], label[:, 1] 271 | label3, label4 = label[:, 2], label[:, 3] 272 | optimizer.zero_grad() 273 | y1, y2, y3, y4 = model(x) 274 | # print(label1.size(),label2.size(),label3.size(),label4.size()) 275 | # print(y1.shape, y2.shape, y3.shape, y4.shape) 276 | loss1, loss2, loss3, loss4 = criterion(y1, label1), criterion( 277 | y2, label2), criterion(y3, label3), criterion(y4, label4) 278 | loss = loss1 + loss2 + loss3 + loss4 279 | loss_meter.add(loss.item()) 280 | # print(loss) 281 | avgLoss += loss.item() 282 | loss.backward() 283 | optimizer.step() 284 | if circle % printCircle == 0: 285 | print("epoch:%02d | step: %03d | Train loss is %.5f" % 286 | (epoch, circle, avgLoss / printCircle)) 287 | vis.plot_many_stack({"train_loss": avgLoss}) 288 | avgLoss = 0 289 | if True: 290 | # one epoch once 291 | scheduler.step() 292 | accuracy = test(model, testDataLoader) 293 | print("Learning rate: %.10f" % (scheduler.get_lr()[0])) 294 | print("epoch: %03d, accuracy: %.3f" % (epoch, accuracy)) 295 | vis.plot_many_stack({"test_acc": accuracy}) 296 | if best_acc < accuracy: 297 | best_acc = accuracy 298 | if best_acc < accuracy or best_acc - accuracy < 0.01: 299 | model.save(str(epoch) + "_" + str(int(accuracy * 1000))) 300 | 301 | 302 | def test(model, testDataLoader): 303 | model.eval() 304 | totalNum = len(os.listdir('./data/test')) 305 | rightNum = 0 306 | sum_loss = 0 307 | criterion = nn.CrossEntropyLoss() 308 | for circle, (x, label) in enumerate(testDataLoader, 0): 309 | label = label.long() 310 | if torch.cuda.is_available(): 311 | x = x.cuda() 312 | label = label.cuda() 313 | y1, y2, y3, y4 = model(x) 314 | label1, label2 = label[:, 0], label[:, 1] 315 | label3, label4 = label[:, 2], label[:, 3] 316 | loss1, loss2, loss3, loss4 = criterion(y1, label1), criterion( 317 | y2, label2), criterion(y3, label3), criterion(y4, label4) 318 | loss = loss1 + loss2 + loss3 + loss4 319 | 320 | small_bs = x.size()[0] # get the first channel 321 | y1, y2, y3, y4 = y1.topk(1, dim=1)[1].view(small_bs, 1), \ 322 | y2.topk(1, dim=1)[1].view(small_bs, 1), \ 323 | y3.topk(1, dim=1)[1].view(small_bs, 1), \ 324 | y4.topk(1, dim=1)[1].view(small_bs, 1) 325 | y = torch.cat((y1, y2, y3, y4), dim=1) 326 | diff = (y != label) 327 | diff = diff.sum(1) 328 | diff = (diff != 0) 329 | res = diff.sum(0).item() 330 | rightNum += (small_bs - res) 331 | # sum_loss += loss 332 | print(rightNum, totalNum) 333 | print("test acc: %s" % (float(rightNum) / float(totalNum))) 334 | # , sum_loss / float(len(testDataLoader.dataset)) 335 | return float(rightNum) / float(totalNum) 336 | 337 | 338 | if __name__ == '__main__': 339 | # net = RES50() 340 | # net = CaptchaNet() 341 | net = ResNet(ResidualBlock) 342 | # net = dense121() 343 | # net = senet() 344 | # net = res18() 345 | # net = DualResNet(ResidualBlock) 346 | # net = bnneck() 347 | # net = res_ibn() # ibn block do not improve 348 | # net.load_model("./weights/senet_new.pth") 349 | # net.load_model("./model/net99_738.pth") 350 | # train(net) 351 | # train_with_center(net) 352 | train_original(net) 353 | -------------------------------------------------------------------------------- /utils/Visdom.py: -------------------------------------------------------------------------------- 1 | import visdom 2 | import time 3 | import numpy as np 4 | 5 | 6 | class Visualizer(object): 7 | def __init__(self, env='default', **kwargs): 8 | self.vis = visdom.Visdom(env=env, **kwargs) 9 | self.index = {} 10 | 11 | def plot_many_stack(self, d): 12 | ''' 13 | self.plot('loss',1.00) 14 | ''' 15 | name = list(d.keys()) 16 | name_total = " ".join(name) 17 | x = self.index.get(name_total, 0) 18 | val = list(d.values()) 19 | if len(val) == 1: 20 | y = np.array(val) 21 | else: 22 | y = np.array(val).reshape(-1, len(val)) 23 | # print(x) 24 | self.vis.line(Y=y, X=np.ones(y.shape) * x, 25 | win=str(name_total), # unicode 26 | opts=dict(legend=name, 27 | title=name_total), 28 | update=None if x == 0 else 'append' 29 | ) 30 | self.index[name_total] = x + 1 -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pprp/captcha.Pytorch/7b4f502e2c34aa78f4858f846282cbc6bfb8a84c/utils/__init__.py -------------------------------------------------------------------------------- /utils/cutoff.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import numpy as np 3 | class Cutout(object): 4 | """Randomly mask out one or more patches from an image. 5 | Args:n_holes (int): 6 | Number of patches to cut out of each image. 7 | length (int): The length (in pixels) of each square patch. 8 | """ 9 | def __init__(self, n_holes, length): 10 | self.n_holes = n_holes self.length = length 11 | 12 | def __call__(self, img): 13 | """ Args:img (Tensor): 14 | Tensor image of size (C, H, W). 15 | Returns: 16 | Tensor: Image with n_holes of dimension length x length cut out of it. 17 | """ 18 | h = img.size(1) w = img.size(2) 19 | mask = np.ones((h, w), np.float32) 20 | for n in range(self.n_holes): 21 | y = np.random.randint(h) 22 | x = np.random.randint(w) 23 | y1 = np.clip(y - self.length // 2, 0, h) 24 | y2 = np.clip(y + self.length // 2, 0, h) 25 | x1 = np.clip(x - self.length // 2, 0, w) 26 | x2 = np.clip(x + self.length // 2, 0, w) 27 | mask[y1: y2, x1: x2] = 0. 28 | 29 | mask = torch.from_numpy(mask) 30 | mask = mask.expand_as(img) 31 | img = img * mask 32 | return img 33 | 34 | 35 | ## mixup 36 | for (images, labels) in train_loader: 37 | l = np.random.beta(mixup_alpha, mixup_alpha) 38 | index = torch.randperm(images.size(0)) 39 | images_a, images_b = images, images[index] 40 | labels_a, labels_b = labels, labels[index] 41 | mixed_images = l * images_a + (1 - l) * images_b 42 | outputs = model(mixed_images) 43 | loss = l * criterion(outputs, labels_a) + (1 - l) * criterion(outputs, labels_b) 44 | acc = l * accuracy(outputs, labels_a)[0] + (1 - l) * accuracy(outputs, labels_b)[0] 45 | -------------------------------------------------------------------------------- /utils/dataAug.py: -------------------------------------------------------------------------------- 1 | import Augmentor 2 | import os 3 | from PIL import Image 4 | from torch.utils import data 5 | import numpy as np 6 | from torchvision import transforms as T 7 | from parameters import * 8 | import torch as t 9 | 10 | import re 11 | from dataset import * 12 | from torch.utils.data import DataLoader 13 | 14 | def get_distortion_pipline(path, num): 15 | p = Augmentor.Pipeline(path) 16 | p.zoom(probability=0.5, min_factor=1.05, max_factor=1.05) 17 | p.random_distortion(probability=1, grid_width=6, grid_height=2, magnitude=3) 18 | p.sample(num) 19 | return p 20 | 21 | def get_skew_tilt_pipline(path, num): 22 | p = Augmentor.Pipeline(path) 23 | # p.zoom(probability=0.5, min_factor=1.05, max_factor=1.05) 24 | # p.random_distortion(probability=1, grid_width=6, grid_height=2, magnitude=3) 25 | p.skew_tilt(probability=0.5,magnitude=0.02) 26 | p.skew_left_right(probability=0.5,magnitude=0.02) 27 | p.skew_top_bottom(probability=0.5, magnitude=0.02) 28 | p.skew_corner(probability=0.5, magnitude=0.02) 29 | p.sample(num) 30 | return p 31 | 32 | def get_rotate_pipline(path, num): 33 | p = Augmentor.Pipeline(path) 34 | # p.zoom(probability=0.5, min_factor=1.05, max_factor=1.05) 35 | # p.random_distortion(probability=1, grid_width=6, grid_height=2, magnitude=3) 36 | p.rotate(probability=1,max_left_rotation=1,max_right_rotation=1) 37 | p.sample(num) 38 | return p 39 | 40 | if __name__ == "__main__": 41 | times = 2 42 | path = r"C:\Users\pprp\Desktop\验证码\dataset5\train" 43 | num = len(os.listdir(path)) * times 44 | p = get_distortion_pipline(path, num) 45 | # p = get_rotate_pipline(path, num) 46 | # p.process() 47 | # augTrainDataset = augCaptcha("./data/auged_train", train=True) 48 | # trainDataset = Captcha("./data/train/", train=True) 49 | # testDataset = Captcha("./data/test/", train=False) 50 | # augTrainDataLoader = DataLoader(augTrainDataset, batch_size=1, 51 | # shuffle=True, num_workers=4) 52 | # trainDataLoader = DataLoader(trainDataset, batch_size=1, 53 | # shuffle=True, num_workers=4) 54 | # testDataLoader = DataLoader(testDataset, batch_size=1, 55 | # shuffle=True, num_workers=4) 56 | 57 | # for data, label, data1, label1 in augTrainDataLoader,trainDataLoader: 58 | # print(data.size(), label, data1.size(), label1) -------------------------------------------------------------------------------- /utils/randomCropPatch.py: -------------------------------------------------------------------------------- 1 | beta = 0.3 2 | 3 | for (images, targets) in data_loader: 4 | # get image size 5 | I_x, I_y = images.size()[2:] 6 | # draw a boundary position w,h 7 | # draw a boundry position (w, h) 8 | w = int(np.round(I_x * np.random.beta(beta, beta))) 9 | h = int(np.round(I_y * np.random.beta(beta, beta))) 10 | w_ = [w, I_x - w, w, I_x - w] 11 | h_ = [h, h, I_y - h, I_y - h] 12 | # select and crop four images 13 | cropped_images = {} 14 | c_ = {} 15 | W_ = {} 16 | for k in range(4): 17 | index = torch.randperm(images.size(0)) 18 | x_k = np.random.randint(0, I_x - w_[k] + 1) 19 | y_k = np.random.randint(0, I_y - h_[k] + 1) 20 | cropped_images[k] = images[index][:, :, 21 | x_k:x_k + w_[k], y_k:y_k + h_[k]] 22 | c_[k] = target[index].cuda() 23 | W_[k] = w_[k] * h_[k] / (I_x * I_y) 24 | # patch cropped images 25 | patched_images = torch.cat( 26 | (torch.cat((cropped_images[0], cropped_images[1]), 2), 27 | torch.cat((cropped_images[2], cropped_images[3]), 2)), 3) 28 | patched_images = patched_images.cuda() 29 | # get output 30 | output = model(patched_images) 31 | # calculate loss and accuracy 32 | loss = sum([W_[k] * criterion(output, c_[k]) for k in range(4)]) 33 | acc = sum([W_[k] * accuracy(output, c_[k])[0] for k in range(4)]) 34 | -------------------------------------------------------------------------------- /utils/randomSelect.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import glob 4 | 5 | train_path = r"./datasets/train" 6 | val_path = r"./datasets/test" 7 | test_path = r"./datasets/val" 8 | 9 | # for cnt, name in enumerate(glob.glob(train_path+"/*")): 10 | # print(cnt, name) 11 | 12 | for cnt, name in enumerate(os.listdir(val_path)): 13 | print(cnt) 14 | if cnt % 2 == 0: 15 | shutil.move(os.path.join(val_path, name), os.path.join(test_path, name)) --------------------------------------------------------------------------------