├── .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 | 
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 | 
127 |
128 |
129 |
130 | 模型分析:分析四个模型,python predict.py 观察预测出错的结果,评判模型好坏,最终选择了0号模型。
131 |
132 | 
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 | |  |  |  |
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))
--------------------------------------------------------------------------------