diff --git a/.gitignore b/.gitignore index 04aa02d..3e718ff 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,15 @@ dmypy.json checkpoints/ logs/ +DeepLab-V2-PyTorch/data/ +DeepLab-V2-PyTorch/__pycache__/ +DeepLab-V2-PyTorch/libs/__pycache__/ + + +DeepLabV3Plus-Pytorch/checkpoints +DeepLabV3Plus-Pytorch/__pycache__ +DeepLabV3Plus-Pytorch/datasets/__pycache__ +DeepLabV3Plus-Pytorch/metrics/__pycache__ +DeepLabV3Plus-Pytorch/network/__pycache__ +DeepLabV3Plus-Pytorch/utils/__pycache__ + diff --git a/DeepLab-V2-PyTorch/eval.sh b/DeepLab-V2-PyTorch/eval.sh index 684ad17..ac78407 100755 --- a/DeepLab-V2-PyTorch/eval.sh +++ b/DeepLab-V2-PyTorch/eval.sh @@ -3,12 +3,12 @@ DATASET=voc12 LOG_DIR=Deeplabv2_pseudo_segmentation_labels_2gpu -CUDA_VISIBLE_DEVICES=0 python main.py test \ +CUDA_VISIBLE_DEVICES=1 python main.py test \ -c configs/${DATASET}.yaml \ -m data/models/${LOG_DIR}/deeplabv2_resnet101_msc/*/checkpoint_final.pth \ --log_dir=${LOG_DIR} # evaluate the model with CRF post-processing -CUDA_VISIBLE_DEVICES=0 python main.py crf \ +CUDA_VISIBLE_DEVICES=1 python main.py crf \ -c configs/${DATASET}.yaml \ --log_dir=${LOG_DIR} diff --git a/DeepLab-V2-PyTorch/libs/utils/stream_metrics.py b/DeepLab-V2-PyTorch/libs/utils/stream_metrics.py new file mode 100644 index 0000000..3bc801c --- /dev/null +++ b/DeepLab-V2-PyTorch/libs/utils/stream_metrics.py @@ -0,0 +1,101 @@ +import numpy as np +from sklearn.metrics import confusion_matrix + +class _StreamMetrics(object): + def __init__(self): + """ Overridden by subclasses """ + raise NotImplementedError() + + def update(self, gt, pred): + """ Overridden by subclasses """ + raise NotImplementedError() + + def get_results(self): + """ Overridden by subclasses """ + raise NotImplementedError() + + def to_str(self, metrics): + """ Overridden by subclasses """ + raise NotImplementedError() + + def reset(self): + """ Overridden by subclasses """ + raise NotImplementedError() + +class StreamSegMetrics(_StreamMetrics): + """ + Stream Metrics for Semantic Segmentation Task + """ + def __init__(self, n_classes): + self.n_classes = n_classes + self.confusion_matrix = np.zeros((n_classes, n_classes)) + + def update(self, label_trues, label_preds): + for lt, lp in zip(label_trues, label_preds): + self.confusion_matrix += self._fast_hist( lt.flatten(), lp.flatten() ) + + @staticmethod + def to_str(results): + string = "\n" + for k, v in results.items(): + if k!="Class IoU": + string += "%s: %f\n"%(k, v) + + #string+='Class IoU:\n' + #for k, v in results['Class IoU'].items(): + # string += "\tclass %d: %f\n"%(k, v) + return string + + def _fast_hist(self, label_true, label_pred): + mask = (label_true >= 0) & (label_true < self.n_classes) + hist = np.bincount( + self.n_classes * label_true[mask].astype(int) + label_pred[mask], + minlength=self.n_classes ** 2, + ).reshape(self.n_classes, self.n_classes) + return hist + + def get_results(self): + """Returns accuracy score evaluation result. + - overall accuracy + - mean accuracy + - mean IU + - fwavacc + """ + hist = self.confusion_matrix + acc = np.diag(hist).sum() / hist.sum() + acc_cls = np.diag(hist) / hist.sum(axis=1) + acc_cls = np.nanmean(acc_cls) + iu = np.diag(hist) / (hist.sum(axis=1) + hist.sum(axis=0) - np.diag(hist)) + mean_iu = np.nanmean(iu) + freq = hist.sum(axis=1) / hist.sum() + fwavacc = (freq[freq > 0] * iu[freq > 0]).sum() + cls_iu = dict(zip(range(self.n_classes), iu)) + + return { + "Overall Acc": acc, + "Mean Acc": acc_cls, + "FreqW Acc": fwavacc, + "Mean IoU": mean_iu, + "Class IoU": cls_iu, + } + + def reset(self): + self.confusion_matrix = np.zeros((self.n_classes, self.n_classes)) + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + diff --git a/DeepLab-V2-PyTorch/main_v2.py b/DeepLab-V2-PyTorch/main_v2.py new file mode 100755 index 0000000..806e413 --- /dev/null +++ b/DeepLab-V2-PyTorch/main_v2.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python +# coding: utf-8 +# +# Author: Kazuto Nakashima +# URL: https://kazuto1011.github.io +# Date: 07 January 2019 + +from __future__ import absolute_import, division, print_function + +import random +import os +import argparse +import cv2 +import time + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import yaml +from addict import Dict +from PIL import Image + +from libs.datasets import get_dataset +from libs.models import * +from libs.utils import PolynomialLR +from libs.utils.stream_metrics import StreamSegMetrics, AverageMeter + + +def get_argparser(): + parser = argparse.ArgumentParser() + + # Datset Options + parser.add_argument("--config_path", type=str, help="config file path") + parser.add_argument("--gt_path", type=str, help="gt label path") + parser.add_argument("--log_dir", type=str, help="training log path") + parser.add_argument("--cuda", type=bool, default=True, help="GPU") + parser.add_argument("--random_seed", type=int, default=1, help="random seed (default: 1)") + parser.add_argument("--amp", action='store_true', default=False) + parser.add_argument("--val_interval", type=int, default=100, help="val_interval") + + return parser + + +def makedirs(dirs): + if not os.path.exists(dirs): + os.makedirs(dirs) + + +def get_device(cuda): + cuda = cuda and torch.cuda.is_available() + device = torch.device("cuda" if cuda else "cpu") + if cuda: + print("Device:") + for i in range(torch.cuda.device_count()): + print(" {}:".format(i), torch.cuda.get_device_name(i)) + else: + print("Device: CPU") + return device + + +def get_params(model, key): + # For Dilated FCN + if key == "1x": + for m in model.named_modules(): + if "layer" in m[0]: + if isinstance(m[1], nn.Conv2d): + for p in m[1].parameters(): + yield p + # For conv weight in the ASPP module + if key == "10x": + for m in model.named_modules(): + if "aspp" in m[0]: + if isinstance(m[1], nn.Conv2d): + yield m[1].weight + # For conv bias in the ASPP module + if key == "20x": + for m in model.named_modules(): + if "aspp" in m[0]: + if isinstance(m[1], nn.Conv2d): + yield m[1].bias + + +def resize_labels(labels, size): + """ + Downsample labels for 0.5x and 0.75x logits by nearest interpolation. + Other nearest methods result in misaligned labels. + -> F.interpolate(labels, shape, mode='nearest') + -> cv2.resize(labels, shape, interpolation=cv2.INTER_NEAREST) + """ + new_labels = [] + for label in labels: + label = label.float().numpy() + label = Image.fromarray(label).resize(size, resample=Image.NEAREST) + new_labels.append(np.asarray(label)) + new_labels = torch.LongTensor(new_labels) + return new_labels + + +def main(): + opts = get_argparser().parse_args() + print(opts) + + # Setup random seed + torch.manual_seed(opts.random_seed) + np.random.seed(opts.random_seed) + random.seed(opts.random_seed) + + """ + Training DeepLab by v2 protocol + """ + # Configuration + + with open(opts.config_path) as f: + CONFIG = Dict(yaml.load(f)) + + device = get_device(opts.cuda) + torch.backends.cudnn.benchmark = True + + # Dataset + train_dataset = get_dataset(CONFIG.DATASET.NAME)( + root=CONFIG.DATASET.ROOT, + split=CONFIG.DATASET.SPLIT.TRAIN, + ignore_label=CONFIG.DATASET.IGNORE_LABEL, + mean_bgr=(CONFIG.IMAGE.MEAN.B, CONFIG.IMAGE.MEAN.G, CONFIG.IMAGE.MEAN.R), + augment=True, + base_size=CONFIG.IMAGE.SIZE.BASE, + crop_size=CONFIG.IMAGE.SIZE.TRAIN, + scales=CONFIG.DATASET.SCALES, + flip=True, + gt_path=opts.gt_path, + ) + print(train_dataset) + print() + + valid_dataset = get_dataset(CONFIG.DATASET.NAME)( + root=CONFIG.DATASET.ROOT, + split=CONFIG.DATASET.SPLIT.VAL, + ignore_label=CONFIG.DATASET.IGNORE_LABEL, + mean_bgr=(CONFIG.IMAGE.MEAN.B, CONFIG.IMAGE.MEAN.G, CONFIG.IMAGE.MEAN.R), + augment=False, + gt_path="SegmentationClassAug", + ) + print(valid_dataset) + + # DataLoader + train_loader = torch.utils.data.DataLoader( + dataset=train_dataset, + batch_size=CONFIG.SOLVER.BATCH_SIZE.TRAIN, + num_workers=CONFIG.DATALOADER.NUM_WORKERS, + shuffle=True, + ) + valid_loader = torch.utils.data.DataLoader( + dataset=valid_dataset, + batch_size=CONFIG.SOLVER.BATCH_SIZE.TEST, + num_workers=CONFIG.DATALOADER.NUM_WORKERS, + shuffle=False, + ) + + # Model check + print("Model:", CONFIG.MODEL.NAME) + assert ( + CONFIG.MODEL.NAME == "DeepLabV2_ResNet101_MSC" + ), 'Currently support only "DeepLabV2_ResNet101_MSC"' + + # Model setup + model = eval(CONFIG.MODEL.NAME)(n_classes=CONFIG.DATASET.N_CLASSES) + print(" Init:", CONFIG.MODEL.INIT_MODEL) + state_dict = torch.load(CONFIG.MODEL.INIT_MODEL, map_location='cpu') + + for m in model.base.state_dict().keys(): + if m not in state_dict.keys(): + print(" Skip init:", m) + + model.base.load_state_dict(state_dict, strict=False) # to skip ASPP + model = nn.DataParallel(model) + model.to(device) + + # Loss definition + criterion = nn.CrossEntropyLoss(ignore_index=CONFIG.DATASET.IGNORE_LABEL) + criterion.to(device) + + # Optimizer + optimizer = torch.optim.SGD( + # cf lr_mult and decay_mult in train.prototxt + params=[ + { + "params": get_params(model.module, key="1x"), + "lr": CONFIG.SOLVER.LR, + "weight_decay": CONFIG.SOLVER.WEIGHT_DECAY, + }, + { + "params": get_params(model.module, key="10x"), + "lr": 10 * CONFIG.SOLVER.LR, + "weight_decay": CONFIG.SOLVER.WEIGHT_DECAY, + }, + { + "params": get_params(model.module, key="20x"), + "lr": 20 * CONFIG.SOLVER.LR, + "weight_decay": 0.0, + }, + ], + momentum=CONFIG.SOLVER.MOMENTUM, + ) + + # Learning rate scheduler + scheduler = PolynomialLR( + optimizer=optimizer, + step_size=CONFIG.SOLVER.LR_DECAY, + iter_max=CONFIG.SOLVER.ITER_MAX, + power=CONFIG.SOLVER.POLY_POWER, + ) + + # Path to save models + checkpoint_dir = os.path.join( + CONFIG.EXP.OUTPUT_DIR, + "models", + opts.log_dir, + CONFIG.MODEL.NAME.lower(), + CONFIG.DATASET.SPLIT.TRAIN, + ) + makedirs(checkpoint_dir) + print("Checkpoint dst:", checkpoint_dir) + + model.train() + + metrics = StreamSegMetrics(CONFIG.DATASET.N_CLASSES) + + scaler = torch.cuda.amp.GradScaler(enabled=opts.amp) + avg_loss = AverageMeter() + avg_time = AverageMeter() + + curr_iter = 0 + best_score = 0 + end_time = time.time() + + while True: + for _, images, labels, cls_labels in train_loader: + curr_iter += 1 + loss = 0 + + optimizer.zero_grad() + + with torch.cuda.amp.autocast(enabled=opts.amp): + # Propagate forward + logits = model(images.to(device)) + + # Loss + for logit in logits: + # Resize labels for {100%, 75%, 50%, Max} logits + _, _, H, W = logit.shape + labels_ = resize_labels(labels, size=(H, W)) + + pseudo_labels = logit.detach() * cls_labels[:, :, None, None].to(device) + pseudo_labels = pseudo_labels.argmax(dim=1) + + _loss = criterion(logit, labels_.to(device)) + criterion(logit, pseudo_labels) + + loss += _loss + + # Propagate backward (just compute gradients wrt the loss) + loss = (loss / len(logits)) + + scaler.scale(loss).backward() + scaler.step(optimizer) + scaler.update() + + # Update learning rate + scheduler.step() + avg_loss.update(loss.item()) + avg_time.update(time.time() - end_time) + end_time = time.time() + + # TensorBoard + if curr_iter % 10 == 0: + print(" Itrs %d/%d, Loss=%6f, Time=%.2f , LR=%.8f" % + (curr_iter, CONFIG.SOLVER.ITER_MAX, + avg_loss.avg, avg_time.avg*1000, optimizer.param_groups[0]['lr'])) + + # validation + if curr_iter % opts.val_interval == 0: + print("... validation") + metrics.reset() + with torch.no_grad(): + for _, images, labels, _ in valid_loader: + images = images.to(device) + + # Forward propagation + logits = model(images) + + # Pixel-wise labeling + _, H, W = labels.shape + logits = F.interpolate(logits, size=(H, W), + mode="bilinear", align_corners=False) + preds = torch.argmax(logits, dim=1).cpu().numpy() + targets = labels.cpu().numpy() + + metrics.update(targets, preds) + + score = metrics.get_results() + print(metrics.to_str(score)) + + if score['Mean IoU'] > best_score: # save best model + best_score = score['Mean IoU'] + torch.save( + model.module.state_dict(), os.path.join(checkpoint_dir, "checkpoint_best.pth") + ) + + if curr_iter > CONFIG.SOLVER.ITER_MAX: + return + + +if __name__ == "__main__": + + main() diff --git a/DeepLab-V2-PyTorch/train.sh b/DeepLab-V2-PyTorch/train.sh index c4241f0..802af93 100755 --- a/DeepLab-V2-PyTorch/train.sh +++ b/DeepLab-V2-PyTorch/train.sh @@ -1,13 +1,20 @@ # Training DeepLab-V2 using pseudo segmentation labels -DATASET=voc12_2gpu -LOG_DIR=Deeplabv2_pseudo_segmentation_labels_2gpu -GT_DIR=refined_pseudo_segmentation_labels -CUDA_VISIBLE_DEVICES=0,1 python main.py train -c configs/${DATASET}.yaml --gt_path=${GT_DIR} --log_dir=${LOG_DIR} +#DATASET=voc12_2gpu +#LOG_DIR=Deeplabv2_pseudo_segmentation_labels_2gpu +#GT_DIR=refined_pseudo_segmentation_labels +#CUDA_VISIBLE_DEVICES=1,2 python main.py train -c configs/${DATASET}.yaml --gt_path=${GT_DIR} --log_dir=${LOG_DIR} #--------------------------------------------------------------------------------------------------------------------- -DATASET=voc12_4gpu -LOG_DIR=Deeplabv2_pseudo_segmentation_labels_4gpu +#DATASET=voc12_4gpu +#LOG_DIR=Deeplabv2_pseudo_segmentation_labels_4gpu +#GT_DIR=refined_pseudo_segmentation_labels +#CUDA_VISIBLE_DEVICES=0,1,2,3 python main.py train -c configs/${DATASET}.yaml --gt_path=${GT_DIR} --log_dir=${LOG_DIR} + + +CONFIG=configs/voc12_2gpu.yaml +LOG_DIR=Deeplabv2_new GT_DIR=refined_pseudo_segmentation_labels -CUDA_VISIBLE_DEVICES=0,1,2,3 python main.py train -c configs/${DATASET}.yaml --gt_path=${GT_DIR} --log_dir=${LOG_DIR} \ No newline at end of file + +CUDA_VISIBLE_DEVICES=0 python main_v2.py --config_path ${CONFIG} --gt_path ${GT_DIR} --log_dir ${LOG_DIR} diff --git a/DeepLabV3Plus-Pytorch/LICENSE b/DeepLabV3Plus-Pytorch/LICENSE new file mode 100644 index 0000000..f3a59ca --- /dev/null +++ b/DeepLabV3Plus-Pytorch/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Gongfan Fang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/DeepLabV3Plus-Pytorch/datasets/__init__.py b/DeepLabV3Plus-Pytorch/datasets/__init__.py new file mode 100644 index 0000000..a693df6 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/__init__.py @@ -0,0 +1,2 @@ +from .voc import VOCSegmentation +from .cityscapes import Cityscapes \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/datasets/cityscapes.py b/DeepLabV3Plus-Pytorch/datasets/cityscapes.py new file mode 100644 index 0000000..f51ee58 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/cityscapes.py @@ -0,0 +1,147 @@ +import json +import os +from collections import namedtuple + +import torch +import torch.utils.data as data +from PIL import Image +import numpy as np + + +class Cityscapes(data.Dataset): + """Cityscapes Dataset. + + **Parameters:** + - **root** (string): Root directory of dataset where directory 'leftImg8bit' and 'gtFine' or 'gtCoarse' are located. + - **split** (string, optional): The image split to use, 'train', 'test' or 'val' if mode="gtFine" otherwise 'train', 'train_extra' or 'val' + - **mode** (string, optional): The quality mode to use, 'gtFine' or 'gtCoarse' or 'color'. Can also be a list to output a tuple with all specified target types. + - **transform** (callable, optional): A function/transform that takes in a PIL image and returns a transformed version. E.g, ``transforms.RandomCrop`` + - **target_transform** (callable, optional): A function/transform that takes in the target and transforms it. + """ + + # Based on https://github.com/mcordts/cityscapesScripts + CityscapesClass = namedtuple('CityscapesClass', ['name', 'id', 'train_id', 'category', 'category_id', + 'has_instances', 'ignore_in_eval', 'color']) + classes = [ + CityscapesClass('unlabeled', 0, 255, 'void', 0, False, True, (0, 0, 0)), + CityscapesClass('ego vehicle', 1, 255, 'void', 0, False, True, (0, 0, 0)), + CityscapesClass('rectification border', 2, 255, 'void', 0, False, True, (0, 0, 0)), + CityscapesClass('out of roi', 3, 255, 'void', 0, False, True, (0, 0, 0)), + CityscapesClass('static', 4, 255, 'void', 0, False, True, (0, 0, 0)), + CityscapesClass('dynamic', 5, 255, 'void', 0, False, True, (111, 74, 0)), + CityscapesClass('ground', 6, 255, 'void', 0, False, True, (81, 0, 81)), + CityscapesClass('road', 7, 0, 'flat', 1, False, False, (128, 64, 128)), + CityscapesClass('sidewalk', 8, 1, 'flat', 1, False, False, (244, 35, 232)), + CityscapesClass('parking', 9, 255, 'flat', 1, False, True, (250, 170, 160)), + CityscapesClass('rail track', 10, 255, 'flat', 1, False, True, (230, 150, 140)), + CityscapesClass('building', 11, 2, 'construction', 2, False, False, (70, 70, 70)), + CityscapesClass('wall', 12, 3, 'construction', 2, False, False, (102, 102, 156)), + CityscapesClass('fence', 13, 4, 'construction', 2, False, False, (190, 153, 153)), + CityscapesClass('guard rail', 14, 255, 'construction', 2, False, True, (180, 165, 180)), + CityscapesClass('bridge', 15, 255, 'construction', 2, False, True, (150, 100, 100)), + CityscapesClass('tunnel', 16, 255, 'construction', 2, False, True, (150, 120, 90)), + CityscapesClass('pole', 17, 5, 'object', 3, False, False, (153, 153, 153)), + CityscapesClass('polegroup', 18, 255, 'object', 3, False, True, (153, 153, 153)), + CityscapesClass('traffic light', 19, 6, 'object', 3, False, False, (250, 170, 30)), + CityscapesClass('traffic sign', 20, 7, 'object', 3, False, False, (220, 220, 0)), + CityscapesClass('vegetation', 21, 8, 'nature', 4, False, False, (107, 142, 35)), + CityscapesClass('terrain', 22, 9, 'nature', 4, False, False, (152, 251, 152)), + CityscapesClass('sky', 23, 10, 'sky', 5, False, False, (70, 130, 180)), + CityscapesClass('person', 24, 11, 'human', 6, True, False, (220, 20, 60)), + CityscapesClass('rider', 25, 12, 'human', 6, True, False, (255, 0, 0)), + CityscapesClass('car', 26, 13, 'vehicle', 7, True, False, (0, 0, 142)), + CityscapesClass('truck', 27, 14, 'vehicle', 7, True, False, (0, 0, 70)), + CityscapesClass('bus', 28, 15, 'vehicle', 7, True, False, (0, 60, 100)), + CityscapesClass('caravan', 29, 255, 'vehicle', 7, True, True, (0, 0, 90)), + CityscapesClass('trailer', 30, 255, 'vehicle', 7, True, True, (0, 0, 110)), + CityscapesClass('train', 31, 16, 'vehicle', 7, True, False, (0, 80, 100)), + CityscapesClass('motorcycle', 32, 17, 'vehicle', 7, True, False, (0, 0, 230)), + CityscapesClass('bicycle', 33, 18, 'vehicle', 7, True, False, (119, 11, 32)), + CityscapesClass('license plate', -1, 255, 'vehicle', 7, False, True, (0, 0, 142)), + ] + + train_id_to_color = [c.color for c in classes if (c.train_id != -1 and c.train_id != 255)] + train_id_to_color.append([0, 0, 0]) + train_id_to_color = np.array(train_id_to_color) + id_to_train_id = np.array([c.train_id for c in classes]) + + #train_id_to_color = [(0, 0, 0), (128, 64, 128), (70, 70, 70), (153, 153, 153), (107, 142, 35), + # (70, 130, 180), (220, 20, 60), (0, 0, 142)] + #train_id_to_color = np.array(train_id_to_color) + #id_to_train_id = np.array([c.category_id for c in classes], dtype='uint8') - 1 + + def __init__(self, root, split='train', mode='fine', target_type='semantic', transform=None): + self.root = os.path.expanduser(root) + self.mode = 'gtFine' + self.target_type = target_type + self.images_dir = os.path.join(self.root, 'leftImg8bit', split) + + self.targets_dir = os.path.join(self.root, self.mode, split) + self.transform = transform + + self.split = split + self.images = [] + self.targets = [] + + if split not in ['train', 'test', 'val']: + raise ValueError('Invalid split for mode! Please use split="train", split="test"' + ' or split="val"') + + if not os.path.isdir(self.images_dir) or not os.path.isdir(self.targets_dir): + raise RuntimeError('Dataset not found or incomplete. Please make sure all required folders for the' + ' specified "split" and "mode" are inside the "root" directory') + + for city in os.listdir(self.images_dir): + img_dir = os.path.join(self.images_dir, city) + target_dir = os.path.join(self.targets_dir, city) + + for file_name in os.listdir(img_dir): + self.images.append(os.path.join(img_dir, file_name)) + target_name = '{}_{}'.format(file_name.split('_leftImg8bit')[0], + self._get_target_suffix(self.mode, self.target_type)) + self.targets.append(os.path.join(target_dir, target_name)) + + @classmethod + def encode_target(cls, target): + return cls.id_to_train_id[np.array(target)] + + @classmethod + def decode_target(cls, target): + target[target == 255] = 19 + #target = target.astype('uint8') + 1 + return cls.train_id_to_color[target] + + def __getitem__(self, index): + """ + Args: + index (int): Index + Returns: + tuple: (image, target) where target is a tuple of all target types if target_type is a list with more + than one item. Otherwise target is a json object if target_type="polygon", else the image segmentation. + """ + image = Image.open(self.images[index]).convert('RGB') + target = Image.open(self.targets[index]) + if self.transform: + image, target = self.transform(image, target) + target = self.encode_target(target) + return image, target + + def __len__(self): + return len(self.images) + + def _load_json(self, path): + with open(path, 'r') as file: + data = json.load(file) + return data + + def _get_target_suffix(self, mode, target_type): + if target_type == 'instance': + return '{}_instanceIds.png'.format(mode) + elif target_type == 'semantic': + return '{}_labelIds.png'.format(mode) + elif target_type == 'color': + return '{}_color.png'.format(mode) + elif target_type == 'polygon': + return '{}_polygons.json'.format(mode) + elif target_type == 'depth': + return '{}_disparity.png'.format(mode) \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/datasets/data/cityscapes b/DeepLabV3Plus-Pytorch/datasets/data/cityscapes new file mode 120000 index 0000000..5e3c692 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/data/cityscapes @@ -0,0 +1 @@ +/disk3/fgf//Datasets/cityscapes \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/datasets/data/train_aug.txt b/DeepLabV3Plus-Pytorch/datasets/data/train_aug.txt new file mode 100644 index 0000000..48a784f --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/data/train_aug.txt @@ -0,0 +1,10582 @@ +2011_003276 +2011_003275 +2011_003274 +2011_003269 +2011_003262 +2011_003261 +2011_003260 +2011_003259 +2011_003255 +2011_003254 +2011_003253 +2011_003247 +2011_003246 +2011_003244 +2011_003242 +2011_003238 +2011_003236 +2011_003232 +2011_003230 +2011_003228 +2011_003223 +2011_003220 +2011_003216 +2011_003213 +2011_003212 +2011_003211 +2011_003201 +2011_003194 +2011_003192 +2011_003188 +2011_003187 +2011_003185 +2011_003184 +2011_003183 +2011_003177 +2011_003176 +2011_003171 +2011_003169 +2011_003168 +2011_003167 +2011_003166 +2011_003163 +2011_003162 +2011_003159 +2011_003158 +2011_003154 +2011_003152 +2011_003151 +2011_003150 +2011_003149 +2011_003148 +2011_003141 +2011_003138 +2011_003134 +2011_003132 +2011_003124 +2011_003121 +2011_003115 +2011_003111 +2011_003109 +2011_003097 +2011_003091 +2011_003089 +2011_003086 +2011_003081 +2011_003079 +2011_003078 +2011_003076 +2011_003074 +2011_003073 +2011_003066 +2011_003065 +2011_003063 +2011_003059 +2011_003057 +2011_003054 +2011_003050 +2011_003049 +2011_003048 +2011_003047 +2011_003044 +2011_003043 +2011_003041 +2011_003039 +2011_003038 +2011_003034 +2011_003029 +2011_003028 +2011_003027 +2011_003025 +2011_003023 +2011_003020 +2011_003016 +2011_003013 +2011_003012 +2011_003010 +2011_003005 +2011_003002 +2011_002999 +2011_002994 +2011_002992 +2011_002988 +2011_002987 +2011_002985 +2011_002983 +2011_002979 +2011_002978 +2011_002974 +2011_002971 +2011_002970 +2011_002969 +2011_002967 +2011_002966 +2011_002965 +2011_002962 +2011_002958 +2011_002956 +2011_002953 +2011_002949 +2011_002947 +2011_002944 +2011_002943 +2011_002942 +2011_002940 +2011_002937 +2011_002935 +2011_002933 +2011_002932 +2011_002930 +2011_002927 +2011_002925 +2011_002924 +2011_002921 +2011_002920 +2011_002917 +2011_002916 +2011_002913 +2011_002912 +2011_002911 +2011_002908 +2011_002900 +2011_002897 +2011_002890 +2011_002889 +2011_002887 +2011_002884 +2011_002883 +2011_002881 +2011_002880 +2011_002873 +2011_002872 +2011_002871 +2011_002870 +2011_002868 +2011_002867 +2011_002864 +2011_002854 +2011_002852 +2011_002851 +2011_002842 +2011_002841 +2011_002838 +2011_002834 +2011_002833 +2011_002831 +2011_002830 +2011_002826 +2011_002823 +2011_002821 +2011_002818 +2011_002817 +2011_002814 +2011_002811 +2011_002810 +2011_002808 +2011_002805 +2011_002803 +2011_002802 +2011_002798 +2011_002796 +2011_002795 +2011_002790 +2011_002786 +2011_002784 +2011_002782 +2011_002780 +2011_002779 +2011_002776 +2011_002775 +2011_002772 +2011_002770 +2011_002767 +2011_002765 +2011_002760 +2011_002756 +2011_002752 +2011_002751 +2011_002750 +2011_002748 +2011_002742 +2011_002740 +2011_002738 +2011_002726 +2011_002725 +2011_002724 +2011_002719 +2011_002717 +2011_002715 +2011_002714 +2011_002709 +2011_002706 +2011_002699 +2011_002697 +2011_002694 +2011_002687 +2011_002678 +2011_002677 +2011_002676 +2011_002674 +2011_002673 +2011_002664 +2011_002661 +2011_002658 +2011_002657 +2011_002656 +2011_002652 +2011_002650 +2011_002649 +2011_002640 +2011_002639 +2011_002638 +2011_002636 +2011_002631 +2011_002629 +2011_002624 +2011_002620 +2011_002618 +2011_002617 +2011_002616 +2011_002614 +2011_002612 +2011_002610 +2011_002609 +2011_002606 +2011_002605 +2011_002598 +2011_002594 +2011_002590 +2011_002588 +2011_002585 +2011_002584 +2011_002583 +2011_002582 +2011_002579 +2011_002571 +2011_002568 +2011_002567 +2011_002566 +2011_002561 +2011_002560 +2011_002559 +2011_002558 +2011_002556 +2011_002555 +2011_002554 +2011_002553 +2011_002552 +2011_002551 +2011_002543 +2011_002542 +2011_002536 +2011_002533 +2011_002531 +2011_002528 +2011_002526 +2011_002520 +2011_002519 +2011_002516 +2011_002514 +2011_002511 +2011_002507 +2011_002505 +2011_002504 +2011_002503 +2011_002495 +2011_002494 +2011_002492 +2011_002491 +2011_002490 +2011_002488 +2011_002484 +2011_002482 +2011_002479 +2011_002476 +2011_002474 +2011_002470 +2011_002464 +2011_002463 +2011_002462 +2011_002461 +2011_002460 +2011_002459 +2011_002458 +2011_002457 +2011_002455 +2011_002448 +2011_002447 +2011_002443 +2011_002436 +2011_002435 +2011_002433 +2011_002429 +2011_002422 +2011_002421 +2011_002420 +2011_002418 +2011_002414 +2011_002413 +2011_002410 +2011_002409 +2011_002407 +2011_002406 +2011_002402 +2011_002398 +2011_002397 +2011_002396 +2011_002395 +2011_002394 +2011_002393 +2011_002389 +2011_002388 +2011_002387 +2011_002386 +2011_002385 +2011_002384 +2011_002381 +2011_002380 +2011_002366 +2011_002365 +2011_002359 +2011_002357 +2011_002350 +2011_002348 +2011_002347 +2011_002346 +2011_002341 +2011_002335 +2011_002330 +2011_002325 +2011_002324 +2011_002318 +2011_002312 +2011_002303 +2011_002301 +2011_002300 +2011_002294 +2011_002292 +2011_002291 +2011_002284 +2011_002281 +2011_002280 +2011_002278 +2011_002276 +2011_002273 +2011_002272 +2011_002270 +2011_002269 +2011_002268 +2011_002265 +2011_002260 +2011_002253 +2011_002252 +2011_002251 +2011_002248 +2011_002246 +2011_002245 +2011_002241 +2011_002239 +2011_002237 +2011_002236 +2011_002234 +2011_002230 +2011_002228 +2011_002227 +2011_002224 +2011_002222 +2011_002221 +2011_002218 +2011_002215 +2011_002211 +2011_002193 +2011_002192 +2011_002189 +2011_002186 +2011_002185 +2011_002184 +2011_002179 +2011_002177 +2011_002174 +2011_002173 +2011_002169 +2011_002167 +2011_002163 +2011_002160 +2011_002159 +2011_002158 +2011_002154 +2011_002149 +2011_002148 +2011_002147 +2011_002144 +2011_002143 +2011_002142 +2011_002137 +2011_002135 +2011_002134 +2011_002132 +2011_002131 +2011_002128 +2011_002119 +2011_002116 +2011_002114 +2011_002113 +2011_002111 +2011_002109 +2011_002108 +2011_002107 +2011_002106 +2011_002105 +2011_002102 +2011_002100 +2011_002097 +2011_002096 +2011_002093 +2011_002091 +2011_002088 +2011_002085 +2011_002079 +2011_002074 +2011_002073 +2011_002063 +2011_002062 +2011_002055 +2011_002053 +2011_002050 +2011_002049 +2011_002047 +2011_002046 +2011_002045 +2011_002044 +2011_002042 +2011_002039 +2011_002038 +2011_002036 +2011_002034 +2011_002033 +2011_002031 +2011_002027 +2011_002022 +2011_002021 +2011_002019 +2011_002018 +2011_002016 +2011_002012 +2011_002006 +2011_002005 +2011_002004 +2011_002003 +2011_001991 +2011_001989 +2011_001987 +2011_001986 +2011_001982 +2011_001980 +2011_001977 +2011_001975 +2011_001974 +2011_001972 +2011_001971 +2011_001967 +2011_001966 +2011_001964 +2011_001962 +2011_001961 +2011_001959 +2011_001956 +2011_001952 +2011_001951 +2011_001950 +2011_001949 +2011_001946 +2011_001945 +2011_001944 +2011_001942 +2011_001941 +2011_001938 +2011_001937 +2011_001932 +2011_001930 +2011_001929 +2011_001928 +2011_001927 +2011_001926 +2011_001924 +2011_001922 +2011_001920 +2011_001919 +2011_001914 +2011_001911 +2011_001906 +2011_001904 +2011_001902 +2011_001901 +2011_001900 +2011_001896 +2011_001895 +2011_001893 +2011_001891 +2011_001889 +2011_001886 +2011_001885 +2011_001884 +2011_001877 +2011_001876 +2011_001875 +2011_001873 +2011_001872 +2011_001871 +2011_001870 +2011_001866 +2011_001858 +2011_001856 +2011_001855 +2011_001854 +2011_001847 +2011_001845 +2011_001842 +2011_001841 +2011_001840 +2011_001837 +2011_001834 +2011_001833 +2011_001827 +2011_001826 +2011_001825 +2011_001824 +2011_001822 +2011_001820 +2011_001819 +2011_001815 +2011_001811 +2011_001810 +2011_001806 +2011_001805 +2011_001801 +2011_001800 +2011_001799 +2011_001796 +2011_001791 +2011_001790 +2011_001789 +2011_001785 +2011_001779 +2011_001776 +2011_001771 +2011_001769 +2011_001766 +2011_001765 +2011_001764 +2011_001757 +2011_001755 +2011_001754 +2011_001753 +2011_001751 +2011_001747 +2011_001741 +2011_001740 +2011_001739 +2011_001733 +2011_001732 +2011_001730 +2011_001727 +2011_001720 +2011_001719 +2011_001716 +2011_001715 +2011_001712 +2011_001710 +2011_001707 +2011_001705 +2011_001700 +2011_001699 +2011_001698 +2011_001695 +2011_001694 +2011_001693 +2011_001691 +2011_001689 +2011_001679 +2011_001678 +2011_001673 +2011_001671 +2011_001666 +2011_001663 +2011_001662 +2011_001656 +2011_001655 +2011_001653 +2011_001652 +2011_001650 +2011_001649 +2011_001647 +2011_001643 +2011_001641 +2011_001632 +2011_001629 +2011_001628 +2011_001625 +2011_001622 +2011_001621 +2011_001620 +2011_001618 +2011_001616 +2011_001612 +2011_001611 +2011_001608 +2011_001606 +2011_001605 +2011_001602 +2011_001600 +2011_001599 +2011_001596 +2011_001592 +2011_001591 +2011_001586 +2011_001582 +2011_001573 +2011_001572 +2011_001571 +2011_001568 +2011_001566 +2011_001560 +2011_001558 +2011_001557 +2011_001549 +2011_001547 +2011_001544 +2011_001542 +2011_001541 +2011_001538 +2011_001537 +2011_001536 +2011_001535 +2011_001531 +2011_001526 +2011_001525 +2011_001524 +2011_001521 +2011_001519 +2011_001518 +2011_001514 +2011_001510 +2011_001508 +2011_001507 +2011_001505 +2011_001503 +2011_001501 +2011_001498 +2011_001480 +2011_001479 +2011_001476 +2011_001475 +2011_001471 +2011_001467 +2011_001466 +2011_001464 +2011_001463 +2011_001456 +2011_001455 +2011_001451 +2011_001449 +2011_001441 +2011_001440 +2011_001432 +2011_001424 +2011_001422 +2011_001414 +2011_001412 +2011_001411 +2011_001406 +2011_001404 +2011_001402 +2011_001400 +2011_001399 +2011_001394 +2011_001390 +2011_001389 +2011_001388 +2011_001387 +2011_001384 +2011_001382 +2011_001381 +2011_001375 +2011_001373 +2011_001370 +2011_001369 +2011_001366 +2011_001360 +2011_001357 +2011_001355 +2011_001354 +2011_001337 +2011_001336 +2011_001335 +2011_001333 +2011_001330 +2011_001329 +2011_001327 +2011_001326 +2011_001323 +2011_001320 +2011_001319 +2011_001318 +2011_001315 +2011_001311 +2011_001310 +2011_001305 +2011_001304 +2011_001302 +2011_001295 +2011_001290 +2011_001288 +2011_001286 +2011_001285 +2011_001284 +2011_001283 +2011_001282 +2011_001277 +2011_001272 +2011_001271 +2011_001270 +2011_001266 +2011_001264 +2011_001261 +2011_001260 +2011_001259 +2011_001257 +2011_001255 +2011_001254 +2011_001253 +2011_001252 +2011_001251 +2011_001246 +2011_001245 +2011_001240 +2011_001238 +2011_001229 +2011_001227 +2011_001226 +2011_001223 +2011_001221 +2011_001220 +2011_001217 +2011_001216 +2011_001215 +2011_001213 +2011_001211 +2011_001208 +2011_001203 +2011_001201 +2011_001198 +2011_001193 +2011_001192 +2011_001189 +2011_001188 +2011_001176 +2011_001175 +2011_001173 +2011_001169 +2011_001168 +2011_001167 +2011_001166 +2011_001163 +2011_001160 +2011_001158 +2011_001153 +2011_001152 +2011_001150 +2011_001149 +2011_001146 +2011_001144 +2011_001139 +2011_001138 +2011_001137 +2011_001136 +2011_001135 +2011_001134 +2011_001133 +2011_001128 +2011_001127 +2011_001126 +2011_001124 +2011_001123 +2011_001117 +2011_001116 +2011_001111 +2011_001107 +2011_001106 +2011_001105 +2011_001100 +2011_001097 +2011_001093 +2011_001091 +2011_001086 +2011_001084 +2011_001081 +2011_001080 +2011_001079 +2011_001073 +2011_001066 +2011_001062 +2011_001058 +2011_001056 +2011_001055 +2011_001054 +2011_001052 +2011_001044 +2011_001040 +2011_001036 +2011_001034 +2011_001033 +2011_001032 +2011_001031 +2011_001030 +2011_001029 +2011_001028 +2011_001027 +2011_001025 +2011_001023 +2011_001022 +2011_001019 +2011_001016 +2011_001015 +2011_001011 +2011_001010 +2011_001009 +2011_001008 +2011_001004 +2011_001001 +2011_000999 +2011_000997 +2011_000996 +2011_000991 +2011_000990 +2011_000987 +2011_000986 +2011_000983 +2011_000982 +2011_000981 +2011_000979 +2011_000977 +2011_000975 +2011_000973 +2011_000965 +2011_000961 +2011_000957 +2011_000954 +2011_000951 +2011_000950 +2011_000947 +2011_000944 +2011_000940 +2011_000934 +2011_000933 +2011_000932 +2011_000930 +2011_000927 +2011_000922 +2011_000920 +2011_000919 +2011_000917 +2011_000909 +2011_000908 +2011_000901 +2011_000899 +2011_000898 +2011_000897 +2011_000895 +2011_000893 +2011_000887 +2011_000885 +2011_000882 +2011_000875 +2011_000872 +2011_000859 +2011_000858 +2011_000855 +2011_000853 +2011_000851 +2011_000850 +2011_000848 +2011_000847 +2011_000845 +2011_000840 +2011_000839 +2011_000837 +2011_000834 +2011_000831 +2011_000829 +2011_000828 +2011_000827 +2011_000824 +2011_000823 +2011_000820 +2011_000819 +2011_000815 +2011_000806 +2011_000804 +2011_000800 +2011_000793 +2011_000791 +2011_000790 +2011_000788 +2011_000785 +2011_000784 +2011_000778 +2011_000774 +2011_000772 +2011_000771 +2011_000770 +2011_000769 +2011_000768 +2011_000767 +2011_000765 +2011_000763 +2011_000759 +2011_000758 +2011_000755 +2011_000753 +2011_000749 +2011_000748 +2011_000745 +2011_000744 +2011_000743 +2011_000734 +2011_000731 +2011_000725 +2011_000724 +2011_000718 +2011_000713 +2011_000711 +2011_000709 +2011_000704 +2011_000703 +2011_000701 +2011_000698 +2011_000692 +2011_000690 +2011_000689 +2011_000688 +2011_000685 +2011_000684 +2011_000683 +2011_000682 +2011_000679 +2011_000675 +2011_000673 +2011_000666 +2011_000657 +2011_000656 +2011_000655 +2011_000652 +2011_000651 +2011_000646 +2011_000642 +2011_000641 +2011_000637 +2011_000634 +2011_000631 +2011_000630 +2011_000629 +2011_000628 +2011_000627 +2011_000622 +2011_000612 +2011_000609 +2011_000608 +2011_000600 +2011_000596 +2011_000594 +2011_000592 +2011_000589 +2011_000586 +2011_000579 +2011_000578 +2011_000577 +2011_000575 +2011_000573 +2011_000572 +2011_000569 +2011_000567 +2011_000565 +2011_000560 +2011_000559 +2011_000558 +2011_000557 +2011_000556 +2011_000554 +2011_000551 +2011_000550 +2011_000542 +2011_000541 +2011_000538 +2011_000534 +2011_000531 +2011_000530 +2011_000520 +2011_000519 +2011_000518 +2011_000514 +2011_000513 +2011_000511 +2011_000509 +2011_000505 +2011_000502 +2011_000499 +2011_000498 +2011_000496 +2011_000494 +2011_000492 +2011_000491 +2011_000487 +2011_000485 +2011_000477 +2011_000475 +2011_000474 +2011_000471 +2011_000469 +2011_000468 +2011_000465 +2011_000457 +2011_000454 +2011_000453 +2011_000450 +2011_000449 +2011_000445 +2011_000444 +2011_000442 +2011_000434 +2011_000432 +2011_000428 +2011_000427 +2011_000426 +2011_000420 +2011_000418 +2011_000416 +2011_000413 +2011_000408 +2011_000404 +2011_000400 +2011_000399 +2011_000398 +2011_000397 +2011_000392 +2011_000391 +2011_000388 +2011_000386 +2011_000383 +2011_000382 +2011_000379 +2011_000376 +2011_000375 +2011_000374 +2011_000370 +2011_000369 +2011_000364 +2011_000362 +2011_000361 +2011_000359 +2011_000347 +2011_000346 +2011_000345 +2011_000344 +2011_000343 +2011_000342 +2011_000332 +2011_000329 +2011_000324 +2011_000322 +2011_000321 +2011_000320 +2011_000319 +2011_000317 +2011_000315 +2011_000314 +2011_000309 +2011_000307 +2011_000305 +2011_000304 +2011_000299 +2011_000297 +2011_000293 +2011_000290 +2011_000288 +2011_000286 +2011_000285 +2011_000282 +2011_000278 +2011_000277 +2011_000276 +2011_000273 +2011_000269 +2011_000268 +2011_000267 +2011_000258 +2011_000257 +2011_000253 +2011_000252 +2011_000250 +2011_000249 +2011_000246 +2011_000243 +2011_000241 +2011_000233 +2011_000232 +2011_000229 +2011_000228 +2011_000224 +2011_000222 +2011_000221 +2011_000220 +2011_000219 +2011_000216 +2011_000214 +2011_000213 +2011_000210 +2011_000208 +2011_000206 +2011_000202 +2011_000197 +2011_000196 +2011_000195 +2011_000194 +2011_000192 +2011_000182 +2011_000181 +2011_000180 +2011_000176 +2011_000166 +2011_000165 +2011_000163 +2011_000162 +2011_000161 +2011_000152 +2011_000149 +2011_000147 +2011_000146 +2011_000145 +2011_000142 +2011_000138 +2011_000137 +2011_000130 +2011_000129 +2011_000128 +2011_000124 +2011_000122 +2011_000116 +2011_000114 +2011_000109 +2011_000108 +2011_000105 +2011_000103 +2011_000102 +2011_000098 +2011_000096 +2011_000095 +2011_000094 +2011_000090 +2011_000087 +2011_000086 +2011_000084 +2011_000083 +2011_000082 +2011_000077 +2011_000076 +2011_000072 +2011_000071 +2011_000069 +2011_000068 +2011_000065 +2011_000061 +2011_000060 +2011_000058 +2011_000057 +2011_000053 +2011_000052 +2011_000048 +2011_000044 +2011_000043 +2011_000041 +2011_000038 +2011_000037 +2011_000036 +2011_000034 +2011_000030 +2011_000027 +2011_000025 +2011_000022 +2011_000017 +2011_000016 +2011_000012 +2011_000010 +2011_000009 +2011_000007 +2011_000006 +2011_000003 +2011_000002 +2010_006086 +2010_006084 +2010_006082 +2010_006079 +2010_006078 +2010_006076 +2010_006073 +2010_006067 +2010_006066 +2010_006063 +2010_006062 +2010_006061 +2010_006058 +2010_006057 +2010_006056 +2010_006051 +2010_006050 +2010_006042 +2010_006041 +2010_006040 +2010_006037 +2010_006035 +2010_006033 +2010_006032 +2010_006031 +2010_006028 +2010_006025 +2010_006023 +2010_006021 +2010_006015 +2010_006012 +2010_006011 +2010_006010 +2010_006009 +2010_006004 +2010_006000 +2010_005998 +2010_005997 +2010_005996 +2010_005995 +2010_005993 +2010_005987 +2010_005986 +2010_005985 +2010_005984 +2010_005982 +2010_005981 +2010_005980 +2010_005978 +2010_005976 +2010_005975 +2010_005974 +2010_005973 +2010_005972 +2010_005968 +2010_005967 +2010_005960 +2010_005959 +2010_005958 +2010_005954 +2010_005953 +2010_005952 +2010_005951 +2010_005949 +2010_005948 +2010_005943 +2010_005942 +2010_005938 +2010_005937 +2010_005936 +2010_005935 +2010_005934 +2010_005932 +2010_005930 +2010_005929 +2010_005928 +2010_005927 +2010_005921 +2010_005919 +2010_005914 +2010_005909 +2010_005907 +2010_005906 +2010_005904 +2010_005903 +2010_005901 +2010_005898 +2010_005897 +2010_005896 +2010_005894 +2010_005892 +2010_005891 +2010_005886 +2010_005885 +2010_005884 +2010_005883 +2010_005882 +2010_005876 +2010_005875 +2010_005874 +2010_005870 +2010_005868 +2010_005867 +2010_005865 +2010_005855 +2010_005853 +2010_005849 +2010_005848 +2010_005847 +2010_005845 +2010_005843 +2010_005841 +2010_005840 +2010_005838 +2010_005837 +2010_005836 +2010_005835 +2010_005833 +2010_005830 +2010_005827 +2010_005826 +2010_005825 +2010_005824 +2010_005823 +2010_005821 +2010_005820 +2010_005817 +2010_005816 +2010_005815 +2010_005810 +2010_005807 +2010_005806 +2010_005805 +2010_005804 +2010_005800 +2010_005796 +2010_005794 +2010_005791 +2010_005785 +2010_005784 +2010_005782 +2010_005780 +2010_005777 +2010_005776 +2010_005775 +2010_005770 +2010_005768 +2010_005767 +2010_005764 +2010_005763 +2010_005761 +2010_005758 +2010_005756 +2010_005755 +2010_005753 +2010_005752 +2010_005750 +2010_005748 +2010_005747 +2010_005746 +2010_005744 +2010_005740 +2010_005738 +2010_005736 +2010_005735 +2010_005734 +2010_005733 +2010_005732 +2010_005731 +2010_005725 +2010_005723 +2010_005721 +2010_005716 +2010_005715 +2010_005712 +2010_005700 +2010_005697 +2010_005696 +2010_005692 +2010_005688 +2010_005684 +2010_005683 +2010_005681 +2010_005678 +2010_005676 +2010_005672 +2010_005671 +2010_005670 +2010_005669 +2010_005668 +2010_005666 +2010_005665 +2010_005663 +2010_005658 +2010_005657 +2010_005654 +2010_005652 +2010_005651 +2010_005647 +2010_005646 +2010_005643 +2010_005640 +2010_005637 +2010_005636 +2010_005635 +2010_005632 +2010_005629 +2010_005628 +2010_005627 +2010_005625 +2010_005620 +2010_005619 +2010_005615 +2010_005614 +2010_005612 +2010_005610 +2010_005608 +2010_005604 +2010_005603 +2010_005601 +2010_005597 +2010_005596 +2010_005595 +2010_005594 +2010_005593 +2010_005592 +2010_005591 +2010_005588 +2010_005587 +2010_005586 +2010_005585 +2010_005584 +2010_005578 +2010_005576 +2010_005573 +2010_005572 +2010_005571 +2010_005570 +2010_005567 +2010_005566 +2010_005565 +2010_005562 +2010_005561 +2010_005559 +2010_005557 +2010_005556 +2010_005551 +2010_005548 +2010_005546 +2010_005543 +2010_005542 +2010_005540 +2010_005538 +2010_005536 +2010_005535 +2010_005532 +2010_005527 +2010_005522 +2010_005519 +2010_005518 +2010_005516 +2010_005515 +2010_005514 +2010_005513 +2010_005512 +2010_005511 +2010_005506 +2010_005505 +2010_005502 +2010_005500 +2010_005498 +2010_005497 +2010_005494 +2010_005493 +2010_005492 +2010_005491 +2010_005489 +2010_005484 +2010_005483 +2010_005482 +2010_005480 +2010_005475 +2010_005474 +2010_005472 +2010_005471 +2010_005468 +2010_005467 +2010_005466 +2010_005463 +2010_005462 +2010_005458 +2010_005457 +2010_005456 +2010_005455 +2010_005452 +2010_005450 +2010_005442 +2010_005441 +2010_005437 +2010_005434 +2010_005429 +2010_005426 +2010_005425 +2010_005424 +2010_005419 +2010_005417 +2010_005416 +2010_005415 +2010_005414 +2010_005410 +2010_005409 +2010_005408 +2010_005406 +2010_005405 +2010_005403 +2010_005398 +2010_005394 +2010_005393 +2010_005391 +2010_005389 +2010_005388 +2010_005386 +2010_005385 +2010_005384 +2010_005382 +2010_005379 +2010_005377 +2010_005376 +2010_005375 +2010_005374 +2010_005372 +2010_005371 +2010_005369 +2010_005365 +2010_005364 +2010_005361 +2010_005359 +2010_005352 +2010_005350 +2010_005349 +2010_005346 +2010_005345 +2010_005340 +2010_005338 +2010_005332 +2010_005331 +2010_005330 +2010_005327 +2010_005323 +2010_005320 +2010_005318 +2010_005317 +2010_005314 +2010_005312 +2010_005310 +2010_005309 +2010_005308 +2010_005306 +2010_005303 +2010_005301 +2010_005299 +2010_005297 +2010_005293 +2010_005292 +2010_005287 +2010_005285 +2010_005279 +2010_005277 +2010_005276 +2010_005275 +2010_005274 +2010_005273 +2010_005272 +2010_005270 +2010_005268 +2010_005266 +2010_005264 +2010_005261 +2010_005260 +2010_005258 +2010_005257 +2010_005253 +2010_005250 +2010_005246 +2010_005243 +2010_005242 +2010_005239 +2010_005238 +2010_005236 +2010_005232 +2010_005230 +2010_005229 +2010_005226 +2010_005224 +2010_005223 +2010_005222 +2010_005217 +2010_005216 +2010_005215 +2010_005213 +2010_005211 +2010_005208 +2010_005202 +2010_005201 +2010_005199 +2010_005198 +2010_005193 +2010_005192 +2010_005190 +2010_005188 +2010_005185 +2010_005184 +2010_005183 +2010_005182 +2010_005170 +2010_005169 +2010_005167 +2010_005164 +2010_005161 +2010_005158 +2010_005155 +2010_005152 +2010_005149 +2010_005148 +2010_005147 +2010_005143 +2010_005141 +2010_005138 +2010_005136 +2010_005134 +2010_005133 +2010_005130 +2010_005129 +2010_005128 +2010_005127 +2010_005123 +2010_005120 +2010_005119 +2010_005116 +2010_005115 +2010_005111 +2010_005110 +2010_005109 +2010_005107 +2010_005106 +2010_005101 +2010_005100 +2010_005099 +2010_005098 +2010_005096 +2010_005094 +2010_005093 +2010_005090 +2010_005087 +2010_005083 +2010_005082 +2010_005080 +2010_005079 +2010_005075 +2010_005072 +2010_005071 +2010_005068 +2010_005066 +2010_005064 +2010_005062 +2010_005061 +2010_005060 +2010_005059 +2010_005055 +2010_005054 +2010_005053 +2010_005052 +2010_005049 +2010_005048 +2010_005044 +2010_005042 +2010_005041 +2010_005035 +2010_005033 +2010_005031 +2010_005028 +2010_005026 +2010_005023 +2010_005022 +2010_005019 +2010_005018 +2010_005017 +2010_005016 +2010_005011 +2010_005008 +2010_005006 +2010_005005 +2010_005002 +2010_005000 +2010_004998 +2010_004997 +2010_004995 +2010_004992 +2010_004991 +2010_004989 +2010_004987 +2010_004983 +2010_004982 +2010_004974 +2010_004973 +2010_004971 +2010_004970 +2010_004968 +2010_004967 +2010_004966 +2010_004963 +2010_004962 +2010_004960 +2010_004959 +2010_004957 +2010_004954 +2010_004953 +2010_004952 +2010_004950 +2010_004948 +2010_004945 +2010_004944 +2010_004943 +2010_004942 +2010_004938 +2010_004937 +2010_004933 +2010_004931 +2010_004930 +2010_004928 +2010_004922 +2010_004921 +2010_004919 +2010_004918 +2010_004917 +2010_004916 +2010_004913 +2010_004910 +2010_004909 +2010_004908 +2010_004906 +2010_004903 +2010_004901 +2010_004900 +2010_004896 +2010_004894 +2010_004891 +2010_004890 +2010_004889 +2010_004888 +2010_004879 +2010_004878 +2010_004877 +2010_004874 +2010_004871 +2010_004868 +2010_004866 +2010_004865 +2010_004855 +2010_004854 +2010_004852 +2010_004849 +2010_004848 +2010_004847 +2010_004844 +2010_004841 +2010_004838 +2010_004836 +2010_004832 +2010_004830 +2010_004829 +2010_004826 +2010_004824 +2010_004822 +2010_004821 +2010_004817 +2010_004816 +2010_004813 +2010_004812 +2010_004809 +2010_004808 +2010_004807 +2010_004806 +2010_004805 +2010_004804 +2010_004797 +2010_004793 +2010_004792 +2010_004791 +2010_004786 +2010_004785 +2010_004782 +2010_004779 +2010_004778 +2010_004777 +2010_004775 +2010_004773 +2010_004770 +2010_004768 +2010_004766 +2010_004765 +2010_004760 +2010_004756 +2010_004753 +2010_004751 +2010_004750 +2010_004749 +2010_004748 +2010_004747 +2010_004743 +2010_004741 +2010_004738 +2010_004735 +2010_004733 +2010_004730 +2010_004729 +2010_004728 +2010_004726 +2010_004722 +2010_004721 +2010_004717 +2010_004714 +2010_004712 +2010_004710 +2010_004708 +2010_004704 +2010_004703 +2010_004698 +2010_004696 +2010_004694 +2010_004692 +2010_004691 +2010_004690 +2010_004686 +2010_004683 +2010_004681 +2010_004680 +2010_004679 +2010_004677 +2010_004676 +2010_004672 +2010_004669 +2010_004667 +2010_004666 +2010_004665 +2010_004661 +2010_004660 +2010_004659 +2010_004657 +2010_004656 +2010_004655 +2010_004654 +2010_004646 +2010_004642 +2010_004638 +2010_004637 +2010_004634 +2010_004631 +2010_004629 +2010_004627 +2010_004625 +2010_004624 +2010_004621 +2010_004620 +2010_004618 +2010_004616 +2010_004609 +2010_004604 +2010_004601 +2010_004598 +2010_004597 +2010_004596 +2010_004594 +2010_004592 +2010_004591 +2010_004588 +2010_004586 +2010_004585 +2010_004584 +2010_004581 +2010_004577 +2010_004576 +2010_004575 +2010_004573 +2010_004570 +2010_004569 +2010_004567 +2010_004561 +2010_004560 +2010_004558 +2010_004557 +2010_004554 +2010_004553 +2010_004546 +2010_004545 +2010_004542 +2010_004540 +2010_004537 +2010_004536 +2010_004533 +2010_004523 +2010_004521 +2010_004518 +2010_004517 +2010_004515 +2010_004514 +2010_004511 +2010_004509 +2010_004506 +2010_004505 +2010_004503 +2010_004501 +2010_004499 +2010_004493 +2010_004492 +2010_004491 +2010_004488 +2010_004486 +2010_004484 +2010_004483 +2010_004481 +2010_004478 +2010_004477 +2010_004476 +2010_004475 +2010_004469 +2010_004467 +2010_004466 +2010_004461 +2010_004460 +2010_004459 +2010_004457 +2010_004456 +2010_004455 +2010_004451 +2010_004450 +2010_004448 +2010_004447 +2010_004445 +2010_004441 +2010_004439 +2010_004436 +2010_004431 +2010_004429 +2010_004428 +2010_004425 +2010_004422 +2010_004420 +2010_004417 +2010_004415 +2010_004412 +2010_004409 +2010_004404 +2010_004402 +2010_004400 +2010_004391 +2010_004390 +2010_004387 +2010_004385 +2010_004380 +2010_004374 +2010_004373 +2010_004371 +2010_004370 +2010_004368 +2010_004367 +2010_004366 +2010_004365 +2010_004363 +2010_004362 +2010_004361 +2010_004360 +2010_004358 +2010_004357 +2010_004352 +2010_004351 +2010_004350 +2010_004349 +2010_004346 +2010_004345 +2010_004344 +2010_004341 +2010_004339 +2010_004336 +2010_004335 +2010_004333 +2010_004332 +2010_004327 +2010_004325 +2010_004318 +2010_004313 +2010_004312 +2010_004311 +2010_004307 +2010_004306 +2010_004304 +2010_004301 +2010_004297 +2010_004296 +2010_004295 +2010_004291 +2010_004290 +2010_004289 +2010_004288 +2010_004286 +2010_004283 +2010_004282 +2010_004280 +2010_004279 +2010_004278 +2010_004276 +2010_004275 +2010_004271 +2010_004264 +2010_004263 +2010_004259 +2010_004258 +2010_004257 +2010_004256 +2010_004254 +2010_004253 +2010_004252 +2010_004249 +2010_004248 +2010_004247 +2010_004244 +2010_004242 +2010_004239 +2010_004238 +2010_004231 +2010_004230 +2010_004229 +2010_004228 +2010_004227 +2010_004225 +2010_004224 +2010_004223 +2010_004222 +2010_004216 +2010_004211 +2010_004210 +2010_004209 +2010_004207 +2010_004204 +2010_004201 +2010_004198 +2010_004197 +2010_004193 +2010_004191 +2010_004188 +2010_004187 +2010_004186 +2010_004184 +2010_004182 +2010_004180 +2010_004179 +2010_004178 +2010_004175 +2010_004173 +2010_004172 +2010_004171 +2010_004168 +2010_004163 +2010_004162 +2010_004161 +2010_004160 +2010_004157 +2010_004154 +2010_004148 +2010_004145 +2010_004144 +2010_004143 +2010_004141 +2010_004140 +2010_004139 +2010_004138 +2010_004137 +2010_004133 +2010_004130 +2010_004129 +2010_004125 +2010_004124 +2010_004123 +2010_004121 +2010_004119 +2010_004118 +2010_004116 +2010_004111 +2010_004109 +2010_004108 +2010_004107 +2010_004105 +2010_004102 +2010_004096 +2010_004095 +2010_004094 +2010_004092 +2010_004089 +2010_004088 +2010_004084 +2010_004081 +2010_004075 +2010_004074 +2010_004073 +2010_004072 +2010_004071 +2010_004069 +2010_004067 +2010_004066 +2010_004065 +2010_004064 +2010_004062 +2010_004061 +2010_004060 +2010_004059 +2010_004054 +2010_004053 +2010_004052 +2010_004050 +2010_004048 +2010_004045 +2010_004043 +2010_004037 +2010_004036 +2010_004033 +2010_004031 +2010_004030 +2010_004029 +2010_004028 +2010_004027 +2010_004026 +2010_004025 +2010_004023 +2010_004021 +2010_004017 +2010_004014 +2010_004009 +2010_004008 +2010_004007 +2010_004006 +2010_004005 +2010_004002 +2010_003999 +2010_003996 +2010_003995 +2010_003994 +2010_003988 +2010_003987 +2010_003983 +2010_003982 +2010_003981 +2010_003980 +2010_003976 +2010_003974 +2010_003970 +2010_003966 +2010_003961 +2010_003958 +2010_003957 +2010_003955 +2010_003954 +2010_003950 +2010_003949 +2010_003945 +2010_003944 +2010_003943 +2010_003942 +2010_003939 +2010_003938 +2010_003937 +2010_003936 +2010_003933 +2010_003931 +2010_003929 +2010_003928 +2010_003925 +2010_003920 +2010_003919 +2010_003914 +2010_003911 +2010_003910 +2010_003906 +2010_003900 +2010_003899 +2010_003898 +2010_003897 +2010_003894 +2010_003893 +2010_003892 +2010_003891 +2010_003890 +2010_003887 +2010_003884 +2010_003879 +2010_003878 +2010_003877 +2010_003875 +2010_003874 +2010_003871 +2010_003865 +2010_003864 +2010_003863 +2010_003861 +2010_003860 +2010_003859 +2010_003857 +2010_003856 +2010_003855 +2010_003852 +2010_003848 +2010_003847 +2010_003845 +2010_003844 +2010_003837 +2010_003828 +2010_003826 +2010_003825 +2010_003823 +2010_003822 +2010_003821 +2010_003818 +2010_003816 +2010_003815 +2010_003811 +2010_003807 +2010_003806 +2010_003805 +2010_003804 +2010_003801 +2010_003800 +2010_003799 +2010_003798 +2010_003792 +2010_003791 +2010_003789 +2010_003788 +2010_003784 +2010_003779 +2010_003774 +2010_003773 +2010_003770 +2010_003762 +2010_003761 +2010_003757 +2010_003755 +2010_003754 +2010_003752 +2010_003747 +2010_003745 +2010_003744 +2010_003743 +2010_003742 +2010_003737 +2010_003736 +2010_003735 +2010_003734 +2010_003731 +2010_003730 +2010_003729 +2010_003728 +2010_003725 +2010_003724 +2010_003723 +2010_003721 +2010_003719 +2010_003717 +2010_003714 +2010_003709 +2010_003703 +2010_003701 +2010_003696 +2010_003695 +2010_003690 +2010_003689 +2010_003688 +2010_003687 +2010_003686 +2010_003680 +2010_003679 +2010_003677 +2010_003674 +2010_003673 +2010_003672 +2010_003671 +2010_003670 +2010_003667 +2010_003665 +2010_003664 +2010_003659 +2010_003656 +2010_003655 +2010_003653 +2010_003651 +2010_003649 +2010_003648 +2010_003645 +2010_003644 +2010_003643 +2010_003641 +2010_003640 +2010_003635 +2010_003634 +2010_003632 +2010_003630 +2010_003629 +2010_003628 +2010_003625 +2010_003618 +2010_003613 +2010_003612 +2010_003610 +2010_003609 +2010_003608 +2010_003605 +2010_003604 +2010_003603 +2010_003601 +2010_003599 +2010_003598 +2010_003594 +2010_003592 +2010_003588 +2010_003585 +2010_003582 +2010_003579 +2010_003576 +2010_003574 +2010_003573 +2010_003569 +2010_003568 +2010_003567 +2010_003563 +2010_003562 +2010_003561 +2010_003560 +2010_003559 +2010_003556 +2010_003554 +2010_003551 +2010_003549 +2010_003546 +2010_003540 +2010_003539 +2010_003538 +2010_003537 +2010_003535 +2010_003534 +2010_003529 +2010_003527 +2010_003526 +2010_003522 +2010_003520 +2010_003513 +2010_003512 +2010_003509 +2010_003508 +2010_003507 +2010_003503 +2010_003497 +2010_003496 +2010_003493 +2010_003491 +2010_003490 +2010_003488 +2010_003483 +2010_003482 +2010_003481 +2010_003479 +2010_003478 +2010_003477 +2010_003474 +2010_003470 +2010_003469 +2010_003467 +2010_003465 +2010_003461 +2010_003458 +2010_003451 +2010_003450 +2010_003439 +2010_003437 +2010_003436 +2010_003435 +2010_003432 +2010_003429 +2010_003427 +2010_003421 +2010_003419 +2010_003415 +2010_003411 +2010_003406 +2010_003405 +2010_003401 +2010_003400 +2010_003398 +2010_003397 +2010_003395 +2010_003391 +2010_003390 +2010_003385 +2010_003384 +2010_003383 +2010_003380 +2010_003379 +2010_003376 +2010_003375 +2010_003374 +2010_003372 +2010_003371 +2010_003370 +2010_003368 +2010_003367 +2010_003366 +2010_003361 +2010_003358 +2010_003355 +2010_003353 +2010_003351 +2010_003350 +2010_003345 +2010_003344 +2010_003343 +2010_003342 +2010_003341 +2010_003337 +2010_003335 +2010_003333 +2010_003332 +2010_003331 +2010_003329 +2010_003326 +2010_003321 +2010_003316 +2010_003314 +2010_003309 +2010_003305 +2010_003304 +2010_003303 +2010_003301 +2010_003300 +2010_003299 +2010_003297 +2010_003291 +2010_003290 +2010_003287 +2010_003285 +2010_003283 +2010_003280 +2010_003279 +2010_003278 +2010_003274 +2010_003270 +2010_003269 +2010_003264 +2010_003263 +2010_003260 +2010_003259 +2010_003257 +2010_003256 +2010_003255 +2010_003253 +2010_003252 +2010_003251 +2010_003250 +2010_003249 +2010_003248 +2010_003244 +2010_003241 +2010_003240 +2010_003238 +2010_003236 +2010_003233 +2010_003232 +2010_003230 +2010_003227 +2010_003223 +2010_003222 +2010_003220 +2010_003219 +2010_003218 +2010_003214 +2010_003212 +2010_003206 +2010_003204 +2010_003203 +2010_003201 +2010_003200 +2010_003199 +2010_003197 +2010_003192 +2010_003191 +2010_003190 +2010_003186 +2010_003185 +2010_003179 +2010_003176 +2010_003174 +2010_003173 +2010_003170 +2010_003169 +2010_003162 +2010_003160 +2010_003159 +2010_003157 +2010_003156 +2010_003154 +2010_003153 +2010_003151 +2010_003149 +2010_003148 +2010_003147 +2010_003146 +2010_003143 +2010_003139 +2010_003138 +2010_003137 +2010_003135 +2010_003133 +2010_003129 +2010_003122 +2010_003120 +2010_003119 +2010_003117 +2010_003115 +2010_003114 +2010_003112 +2010_003108 +2010_003107 +2010_003106 +2010_003103 +2010_003102 +2010_003101 +2010_003098 +2010_003097 +2010_003094 +2010_003093 +2010_003092 +2010_003091 +2010_003088 +2010_003086 +2010_003084 +2010_003082 +2010_003081 +2010_003078 +2010_003077 +2010_003074 +2010_003072 +2010_003071 +2010_003067 +2010_003062 +2010_003057 +2010_003056 +2010_003055 +2010_003054 +2010_003053 +2010_003051 +2010_003050 +2010_003047 +2010_003044 +2010_003043 +2010_003040 +2010_003037 +2010_003035 +2010_003034 +2010_003032 +2010_003028 +2010_003027 +2010_003025 +2010_003024 +2010_003019 +2010_003017 +2010_003016 +2010_003015 +2010_003013 +2010_003011 +2010_003010 +2010_003007 +2010_003003 +2010_003002 +2010_002995 +2010_002993 +2010_002991 +2010_002990 +2010_002987 +2010_002985 +2010_002982 +2010_002980 +2010_002979 +2010_002978 +2010_002976 +2010_002973 +2010_002972 +2010_002965 +2010_002962 +2010_002960 +2010_002958 +2010_002956 +2010_002955 +2010_002954 +2010_002948 +2010_002947 +2010_002946 +2010_002941 +2010_002940 +2010_002938 +2010_002937 +2010_002935 +2010_002931 +2010_002930 +2010_002927 +2010_002924 +2010_002917 +2010_002915 +2010_002914 +2010_002909 +2010_002907 +2010_002905 +2010_002903 +2010_002901 +2010_002899 +2010_002896 +2010_002892 +2010_002891 +2010_002887 +2010_002884 +2010_002881 +2010_002880 +2010_002879 +2010_002877 +2010_002876 +2010_002873 +2010_002871 +2010_002870 +2010_002865 +2010_002864 +2010_002860 +2010_002858 +2010_002857 +2010_002856 +2010_002855 +2010_002854 +2010_002853 +2010_002851 +2010_002845 +2010_002844 +2010_002843 +2010_002841 +2010_002840 +2010_002839 +2010_002838 +2010_002834 +2010_002831 +2010_002830 +2010_002827 +2010_002824 +2010_002822 +2010_002821 +2010_002820 +2010_002817 +2010_002816 +2010_002815 +2010_002814 +2010_002813 +2010_002811 +2010_002808 +2010_002807 +2010_002805 +2010_002803 +2010_002801 +2010_002797 +2010_002794 +2010_002793 +2010_002791 +2010_002790 +2010_002789 +2010_002786 +2010_002783 +2010_002781 +2010_002780 +2010_002779 +2010_002778 +2010_002775 +2010_002774 +2010_002772 +2010_002771 +2010_002770 +2010_002767 +2010_002760 +2010_002759 +2010_002758 +2010_002754 +2010_002752 +2010_002750 +2010_002747 +2010_002746 +2010_002742 +2010_002741 +2010_002740 +2010_002737 +2010_002736 +2010_002734 +2010_002733 +2010_002729 +2010_002728 +2010_002725 +2010_002723 +2010_002722 +2010_002721 +2010_002720 +2010_002716 +2010_002714 +2010_002713 +2010_002710 +2010_002708 +2010_002705 +2010_002704 +2010_002702 +2010_002697 +2010_002696 +2010_002695 +2010_002692 +2010_002688 +2010_002686 +2010_002684 +2010_002679 +2010_002678 +2010_002676 +2010_002675 +2010_002674 +2010_002668 +2010_002667 +2010_002666 +2010_002665 +2010_002662 +2010_002661 +2010_002660 +2010_002659 +2010_002656 +2010_002654 +2010_002653 +2010_002652 +2010_002647 +2010_002645 +2010_002644 +2010_002642 +2010_002639 +2010_002638 +2010_002632 +2010_002631 +2010_002629 +2010_002628 +2010_002626 +2010_002625 +2010_002624 +2010_002621 +2010_002620 +2010_002618 +2010_002616 +2010_002615 +2010_002614 +2010_002605 +2010_002603 +2010_002602 +2010_002601 +2010_002598 +2010_002597 +2010_002594 +2010_002592 +2010_002589 +2010_002587 +2010_002586 +2010_002583 +2010_002582 +2010_002580 +2010_002579 +2010_002578 +2010_002577 +2010_002575 +2010_002573 +2010_002570 +2010_002569 +2010_002567 +2010_002565 +2010_002562 +2010_002561 +2010_002556 +2010_002553 +2010_002552 +2010_002551 +2010_002547 +2010_002543 +2010_002542 +2010_002539 +2010_002537 +2010_002534 +2010_002533 +2010_002532 +2010_002529 +2010_002527 +2010_002526 +2010_002520 +2010_002518 +2010_002516 +2010_002513 +2010_002510 +2010_002509 +2010_002507 +2010_002504 +2010_002501 +2010_002499 +2010_002498 +2010_002497 +2010_002496 +2010_002492 +2010_002487 +2010_002485 +2010_002484 +2010_002482 +2010_002479 +2010_002475 +2010_002472 +2010_002469 +2010_002468 +2010_002462 +2010_002461 +2010_002460 +2010_002459 +2010_002458 +2010_002457 +2010_002456 +2010_002455 +2010_002452 +2010_002449 +2010_002448 +2010_002446 +2010_002445 +2010_002440 +2010_002439 +2010_002438 +2010_002436 +2010_002435 +2010_002431 +2010_002429 +2010_002427 +2010_002425 +2010_002424 +2010_002420 +2010_002418 +2010_002413 +2010_002410 +2010_002409 +2010_002408 +2010_002406 +2010_002405 +2010_002402 +2010_002400 +2010_002399 +2010_002398 +2010_002393 +2010_002392 +2010_002391 +2010_002388 +2010_002387 +2010_002383 +2010_002382 +2010_002379 +2010_002378 +2010_002374 +2010_002373 +2010_002371 +2010_002370 +2010_002369 +2010_002368 +2010_002366 +2010_002365 +2010_002364 +2010_002363 +2010_002357 +2010_002356 +2010_002354 +2010_002353 +2010_002349 +2010_002346 +2010_002340 +2010_002338 +2010_002337 +2010_002333 +2010_002332 +2010_002327 +2010_002326 +2010_002321 +2010_002320 +2010_002319 +2010_002318 +2010_002316 +2010_002315 +2010_002313 +2010_002312 +2010_002309 +2010_002307 +2010_002303 +2010_002301 +2010_002299 +2010_002295 +2010_002294 +2010_002289 +2010_002287 +2010_002286 +2010_002283 +2010_002279 +2010_002278 +2010_002276 +2010_002274 +2010_002269 +2010_002263 +2010_002261 +2010_002255 +2010_002254 +2010_002248 +2010_002247 +2010_002245 +2010_002244 +2010_002243 +2010_002242 +2010_002236 +2010_002229 +2010_002227 +2010_002226 +2010_002224 +2010_002223 +2010_002221 +2010_002220 +2010_002219 +2010_002218 +2010_002216 +2010_002215 +2010_002213 +2010_002211 +2010_002208 +2010_002207 +2010_002204 +2010_002203 +2010_002199 +2010_002195 +2010_002194 +2010_002193 +2010_002192 +2010_002191 +2010_002187 +2010_002185 +2010_002183 +2010_002182 +2010_002181 +2010_002180 +2010_002179 +2010_002177 +2010_002176 +2010_002175 +2010_002172 +2010_002168 +2010_002167 +2010_002166 +2010_002154 +2010_002152 +2010_002149 +2010_002143 +2010_002139 +2010_002138 +2010_002136 +2010_002133 +2010_002132 +2010_002130 +2010_002129 +2010_002128 +2010_002127 +2010_002124 +2010_002121 +2010_002118 +2010_002117 +2010_002113 +2010_002107 +2010_002105 +2010_002104 +2010_002102 +2010_002100 +2010_002098 +2010_002097 +2010_002096 +2010_002095 +2010_002094 +2010_002089 +2010_002086 +2010_002085 +2010_002080 +2010_002073 +2010_002070 +2010_002068 +2010_002067 +2010_002065 +2010_002060 +2010_002058 +2010_002057 +2010_002055 +2010_002054 +2010_002050 +2010_002048 +2010_002047 +2010_002046 +2010_002045 +2010_002044 +2010_002042 +2010_002041 +2010_002040 +2010_002039 +2010_002037 +2010_002032 +2010_002029 +2010_002026 +2010_002023 +2010_002022 +2010_002020 +2010_002019 +2010_002018 +2010_002015 +2010_002006 +2010_002005 +2010_002002 +2010_002000 +2010_001998 +2010_001994 +2010_001993 +2010_001992 +2010_001988 +2010_001987 +2010_001986 +2010_001982 +2010_001981 +2010_001980 +2010_001979 +2010_001978 +2010_001976 +2010_001974 +2010_001973 +2010_001970 +2010_001968 +2010_001967 +2010_001960 +2010_001957 +2010_001954 +2010_001950 +2010_001948 +2010_001944 +2010_001941 +2010_001940 +2010_001939 +2010_001938 +2010_001937 +2010_001934 +2010_001933 +2010_001931 +2010_001929 +2010_001927 +2010_001924 +2010_001923 +2010_001922 +2010_001921 +2010_001919 +2010_001918 +2010_001916 +2010_001911 +2010_001907 +2010_001904 +2010_001899 +2010_001896 +2010_001893 +2010_001892 +2010_001891 +2010_001885 +2010_001884 +2010_001881 +2010_001877 +2010_001870 +2010_001869 +2010_001868 +2010_001864 +2010_001863 +2010_001860 +2010_001858 +2010_001857 +2010_001856 +2010_001853 +2010_001852 +2010_001850 +2010_001849 +2010_001846 +2010_001845 +2010_001843 +2010_001842 +2010_001841 +2010_001838 +2010_001837 +2010_001829 +2010_001828 +2010_001827 +2010_001823 +2010_001821 +2010_001819 +2010_001817 +2010_001814 +2010_001810 +2010_001808 +2010_001807 +2010_001806 +2010_001803 +2010_001801 +2010_001797 +2010_001796 +2010_001795 +2010_001794 +2010_001788 +2010_001787 +2010_001785 +2010_001784 +2010_001783 +2010_001780 +2010_001777 +2010_001776 +2010_001771 +2010_001763 +2010_001762 +2010_001760 +2010_001759 +2010_001757 +2010_001756 +2010_001754 +2010_001753 +2010_001749 +2010_001748 +2010_001747 +2010_001746 +2010_001744 +2010_001743 +2010_001739 +2010_001737 +2010_001732 +2010_001731 +2010_001729 +2010_001726 +2010_001720 +2010_001719 +2010_001718 +2010_001717 +2010_001715 +2010_001712 +2010_001710 +2010_001709 +2010_001706 +2010_001705 +2010_001700 +2010_001698 +2010_001697 +2010_001694 +2010_001690 +2010_001689 +2010_001687 +2010_001685 +2010_001682 +2010_001680 +2010_001679 +2010_001676 +2010_001675 +2010_001674 +2010_001671 +2010_001669 +2010_001668 +2010_001665 +2010_001660 +2010_001659 +2010_001652 +2010_001650 +2010_001649 +2010_001647 +2010_001645 +2010_001644 +2010_001640 +2010_001638 +2010_001637 +2010_001636 +2010_001635 +2010_001633 +2010_001630 +2010_001626 +2010_001625 +2010_001619 +2010_001618 +2010_001614 +2010_001608 +2010_001607 +2010_001606 +2010_001603 +2010_001602 +2010_001601 +2010_001599 +2010_001596 +2010_001595 +2010_001594 +2010_001592 +2010_001590 +2010_001587 +2010_001586 +2010_001584 +2010_001583 +2010_001580 +2010_001576 +2010_001574 +2010_001572 +2010_001571 +2010_001569 +2010_001562 +2010_001561 +2010_001560 +2010_001555 +2010_001552 +2010_001551 +2010_001550 +2010_001548 +2010_001547 +2010_001544 +2010_001543 +2010_001540 +2010_001539 +2010_001537 +2010_001536 +2010_001535 +2010_001533 +2010_001529 +2010_001528 +2010_001525 +2010_001520 +2010_001518 +2010_001516 +2010_001515 +2010_001514 +2010_001511 +2010_001505 +2010_001503 +2010_001502 +2010_001501 +2010_001499 +2010_001497 +2010_001487 +2010_001486 +2010_001481 +2010_001480 +2010_001479 +2010_001478 +2010_001473 +2010_001472 +2010_001468 +2010_001465 +2010_001464 +2010_001463 +2010_001461 +2010_001458 +2010_001457 +2010_001456 +2010_001455 +2010_001453 +2010_001452 +2010_001450 +2010_001449 +2010_001441 +2010_001435 +2010_001434 +2010_001433 +2010_001432 +2010_001431 +2010_001430 +2010_001426 +2010_001425 +2010_001422 +2010_001421 +2010_001418 +2010_001417 +2010_001413 +2010_001412 +2010_001411 +2010_001410 +2010_001408 +2010_001407 +2010_001406 +2010_001405 +2010_001402 +2010_001401 +2010_001399 +2010_001397 +2010_001395 +2010_001394 +2010_001390 +2010_001386 +2010_001385 +2010_001383 +2010_001382 +2010_001374 +2010_001372 +2010_001370 +2010_001366 +2010_001364 +2010_001363 +2010_001361 +2010_001360 +2010_001357 +2010_001356 +2010_001355 +2010_001347 +2010_001344 +2010_001343 +2010_001339 +2010_001338 +2010_001337 +2010_001333 +2010_001329 +2010_001328 +2010_001326 +2010_001325 +2010_001321 +2010_001320 +2010_001317 +2010_001315 +2010_001312 +2010_001311 +2010_001310 +2010_001305 +2010_001301 +2010_001294 +2010_001293 +2010_001291 +2010_001289 +2010_001288 +2010_001287 +2010_001286 +2010_001282 +2010_001279 +2010_001277 +2010_001275 +2010_001274 +2010_001273 +2010_001272 +2010_001271 +2010_001270 +2010_001263 +2010_001261 +2010_001257 +2010_001254 +2010_001253 +2010_001250 +2010_001247 +2010_001245 +2010_001242 +2010_001241 +2010_001240 +2010_001237 +2010_001234 +2010_001229 +2010_001225 +2010_001224 +2010_001220 +2010_001219 +2010_001218 +2010_001216 +2010_001215 +2010_001214 +2010_001212 +2010_001211 +2010_001210 +2010_001205 +2010_001204 +2010_001201 +2010_001199 +2010_001195 +2010_001193 +2010_001192 +2010_001189 +2010_001188 +2010_001185 +2010_001184 +2010_001183 +2010_001181 +2010_001179 +2010_001177 +2010_001175 +2010_001172 +2010_001164 +2010_001163 +2010_001160 +2010_001159 +2010_001158 +2010_001154 +2010_001152 +2010_001148 +2010_001143 +2010_001142 +2010_001140 +2010_001139 +2010_001134 +2010_001131 +2010_001130 +2010_001127 +2010_001126 +2010_001125 +2010_001123 +2010_001121 +2010_001120 +2010_001119 +2010_001118 +2010_001117 +2010_001113 +2010_001112 +2010_001111 +2010_001110 +2010_001109 +2010_001107 +2010_001106 +2010_001105 +2010_001103 +2010_001100 +2010_001099 +2010_001098 +2010_001094 +2010_001092 +2010_001089 +2010_001087 +2010_001085 +2010_001082 +2010_001080 +2010_001077 +2010_001076 +2010_001074 +2010_001066 +2010_001063 +2010_001057 +2010_001054 +2010_001052 +2010_001051 +2010_001049 +2010_001044 +2010_001043 +2010_001042 +2010_001039 +2010_001032 +2010_001030 +2010_001025 +2010_001023 +2010_001021 +2010_001013 +2010_001012 +2010_001009 +2010_001008 +2010_001006 +2010_001002 +2010_000996 +2010_000995 +2010_000994 +2010_000993 +2010_000991 +2010_000989 +2010_000986 +2010_000984 +2010_000983 +2010_000981 +2010_000979 +2010_000978 +2010_000975 +2010_000974 +2010_000973 +2010_000971 +2010_000970 +2010_000968 +2010_000959 +2010_000956 +2010_000955 +2010_000954 +2010_000948 +2010_000947 +2010_000945 +2010_000944 +2010_000942 +2010_000938 +2010_000931 +2010_000928 +2010_000927 +2010_000926 +2010_000923 +2010_000922 +2010_000920 +2010_000915 +2010_000914 +2010_000912 +2010_000910 +2010_000908 +2010_000899 +2010_000898 +2010_000897 +2010_000893 +2010_000891 +2010_000889 +2010_000887 +2010_000885 +2010_000883 +2010_000879 +2010_000876 +2010_000875 +2010_000872 +2010_000871 +2010_000870 +2010_000866 +2010_000865 +2010_000863 +2010_000862 +2010_000860 +2010_000855 +2010_000849 +2010_000847 +2010_000846 +2010_000842 +2010_000838 +2010_000837 +2010_000831 +2010_000830 +2010_000829 +2010_000828 +2010_000822 +2010_000821 +2010_000815 +2010_000811 +2010_000810 +2010_000808 +2010_000807 +2010_000806 +2010_000805 +2010_000803 +2010_000802 +2010_000800 +2010_000799 +2010_000797 +2010_000792 +2010_000791 +2010_000787 +2010_000786 +2010_000785 +2010_000782 +2010_000778 +2010_000773 +2010_000772 +2010_000771 +2010_000770 +2010_000769 +2010_000765 +2010_000761 +2010_000760 +2010_000759 +2010_000754 +2010_000749 +2010_000748 +2010_000747 +2010_000746 +2010_000744 +2010_000743 +2010_000740 +2010_000739 +2010_000737 +2010_000735 +2010_000731 +2010_000729 +2010_000727 +2010_000726 +2010_000723 +2010_000722 +2010_000721 +2010_000717 +2010_000716 +2010_000715 +2010_000712 +2010_000711 +2010_000710 +2010_000707 +2010_000705 +2010_000702 +2010_000697 +2010_000695 +2010_000694 +2010_000692 +2010_000691 +2010_000689 +2010_000688 +2010_000687 +2010_000685 +2010_000681 +2010_000678 +2010_000675 +2010_000674 +2010_000671 +2010_000669 +2010_000667 +2010_000665 +2010_000664 +2010_000661 +2010_000658 +2010_000655 +2010_000651 +2010_000648 +2010_000647 +2010_000646 +2010_000645 +2010_000644 +2010_000641 +2010_000635 +2010_000633 +2010_000632 +2010_000630 +2010_000626 +2010_000624 +2010_000621 +2010_000617 +2010_000616 +2010_000613 +2010_000608 +2010_000604 +2010_000603 +2010_000602 +2010_000601 +2010_000591 +2010_000590 +2010_000588 +2010_000586 +2010_000583 +2010_000582 +2010_000581 +2010_000578 +2010_000577 +2010_000576 +2010_000574 +2010_000571 +2010_000568 +2010_000567 +2010_000564 +2010_000562 +2010_000561 +2010_000557 +2010_000556 +2010_000553 +2010_000549 +2010_000548 +2010_000547 +2010_000545 +2010_000541 +2010_000538 +2010_000537 +2010_000536 +2010_000534 +2010_000527 +2010_000526 +2010_000524 +2010_000522 +2010_000519 +2010_000515 +2010_000513 +2010_000511 +2010_000510 +2010_000508 +2010_000506 +2010_000503 +2010_000500 +2010_000498 +2010_000497 +2010_000495 +2010_000493 +2010_000492 +2010_000490 +2010_000488 +2010_000485 +2010_000484 +2010_000483 +2010_000480 +2010_000477 +2010_000475 +2010_000474 +2010_000473 +2010_000470 +2010_000469 +2010_000468 +2010_000466 +2010_000465 +2010_000463 +2010_000462 +2010_000461 +2010_000459 +2010_000458 +2010_000456 +2010_000453 +2010_000449 +2010_000448 +2010_000447 +2010_000446 +2010_000444 +2010_000442 +2010_000439 +2010_000437 +2010_000436 +2010_000435 +2010_000433 +2010_000432 +2010_000431 +2010_000420 +2010_000419 +2010_000418 +2010_000415 +2010_000413 +2010_000409 +2010_000406 +2010_000404 +2010_000401 +2010_000399 +2010_000395 +2010_000394 +2010_000393 +2010_000392 +2010_000390 +2010_000389 +2010_000388 +2010_000386 +2010_000384 +2010_000382 +2010_000381 +2010_000379 +2010_000377 +2010_000376 +2010_000375 +2010_000374 +2010_000371 +2010_000370 +2010_000362 +2010_000361 +2010_000358 +2010_000356 +2010_000352 +2010_000347 +2010_000344 +2010_000337 +2010_000336 +2010_000329 +2010_000327 +2010_000325 +2010_000324 +2010_000323 +2010_000321 +2010_000320 +2010_000317 +2010_000313 +2010_000312 +2010_000310 +2010_000308 +2010_000307 +2010_000303 +2010_000302 +2010_000299 +2010_000296 +2010_000295 +2010_000293 +2010_000291 +2010_000286 +2010_000285 +2010_000283 +2010_000279 +2010_000276 +2010_000273 +2010_000270 +2010_000269 +2010_000266 +2010_000264 +2010_000263 +2010_000262 +2010_000261 +2010_000260 +2010_000255 +2010_000254 +2010_000250 +2010_000249 +2010_000248 +2010_000247 +2010_000246 +2010_000245 +2010_000244 +2010_000234 +2010_000233 +2010_000229 +2010_000227 +2010_000224 +2010_000222 +2010_000218 +2010_000213 +2010_000211 +2010_000209 +2010_000204 +2010_000203 +2010_000202 +2010_000199 +2010_000198 +2010_000197 +2010_000196 +2010_000195 +2010_000194 +2010_000190 +2010_000189 +2010_000187 +2010_000184 +2010_000183 +2010_000182 +2010_000178 +2010_000177 +2010_000175 +2010_000172 +2010_000170 +2010_000169 +2010_000165 +2010_000162 +2010_000157 +2010_000152 +2010_000151 +2010_000148 +2010_000145 +2010_000141 +2010_000140 +2010_000139 +2010_000138 +2010_000137 +2010_000136 +2010_000133 +2010_000132 +2010_000131 +2010_000127 +2010_000124 +2010_000120 +2010_000118 +2010_000117 +2010_000114 +2010_000113 +2010_000111 +2010_000109 +2010_000103 +2010_000099 +2010_000098 +2010_000097 +2010_000095 +2010_000091 +2010_000090 +2010_000089 +2010_000088 +2010_000085 +2010_000082 +2010_000080 +2010_000079 +2010_000076 +2010_000075 +2010_000074 +2010_000073 +2010_000072 +2010_000071 +2010_000069 +2010_000067 +2010_000063 +2010_000061 +2010_000056 +2010_000055 +2010_000054 +2010_000053 +2010_000052 +2010_000050 +2010_000048 +2010_000045 +2010_000043 +2010_000036 +2010_000035 +2010_000033 +2010_000031 +2010_000027 +2010_000026 +2010_000024 +2010_000023 +2010_000018 +2010_000015 +2010_000014 +2010_000009 +2010_000002 +2010_000001 +2009_005311 +2009_005310 +2009_005309 +2009_005308 +2009_005307 +2009_005303 +2009_005300 +2009_005299 +2009_005294 +2009_005293 +2009_005292 +2009_005288 +2009_005287 +2009_005286 +2009_005282 +2009_005279 +2009_005278 +2009_005272 +2009_005269 +2009_005268 +2009_005267 +2009_005265 +2009_005263 +2009_005257 +2009_005256 +2009_005251 +2009_005247 +2009_005246 +2009_005242 +2009_005240 +2009_005239 +2009_005236 +2009_005234 +2009_005232 +2009_005229 +2009_005225 +2009_005222 +2009_005221 +2009_005218 +2009_005216 +2009_005215 +2009_005211 +2009_005210 +2009_005205 +2009_005204 +2009_005203 +2009_005202 +2009_005201 +2009_005198 +2009_005194 +2009_005193 +2009_005191 +2009_005185 +2009_005183 +2009_005181 +2009_005178 +2009_005177 +2009_005172 +2009_005171 +2009_005170 +2009_005168 +2009_005165 +2009_005163 +2009_005162 +2009_005161 +2009_005160 +2009_005155 +2009_005154 +2009_005153 +2009_005152 +2009_005150 +2009_005149 +2009_005147 +2009_005145 +2009_005144 +2009_005142 +2009_005141 +2009_005140 +2009_005133 +2009_005131 +2009_005130 +2009_005128 +2009_005127 +2009_005126 +2009_005120 +2009_005119 +2009_005118 +2009_005114 +2009_005111 +2009_005107 +2009_005104 +2009_005103 +2009_005102 +2009_005098 +2009_005095 +2009_005094 +2009_005086 +2009_005085 +2009_005084 +2009_005083 +2009_005082 +2009_005081 +2009_005080 +2009_005076 +2009_005075 +2009_005073 +2009_005070 +2009_005069 +2009_005068 +2009_005064 +2009_005062 +2009_005061 +2009_005060 +2009_005057 +2009_005056 +2009_005055 +2009_005051 +2009_005045 +2009_005044 +2009_005042 +2009_005040 +2009_005037 +2009_005036 +2009_005035 +2009_005033 +2009_005031 +2009_005030 +2009_005025 +2009_005024 +2009_005019 +2009_005016 +2009_005015 +2009_005008 +2009_005006 +2009_005005 +2009_005001 +2009_005000 +2009_004999 +2009_004996 +2009_004990 +2009_004988 +2009_004986 +2009_004984 +2009_004983 +2009_004982 +2009_004980 +2009_004979 +2009_004977 +2009_004975 +2009_004974 +2009_004971 +2009_004965 +2009_004962 +2009_004961 +2009_004959 +2009_004958 +2009_004956 +2009_004953 +2009_004947 +2009_004946 +2009_004945 +2009_004944 +2009_004943 +2009_004940 +2009_004939 +2009_004934 +2009_004933 +2009_004930 +2009_004929 +2009_004926 +2009_004922 +2009_004921 +2009_004919 +2009_004917 +2009_004914 +2009_004913 +2009_004907 +2009_004905 +2009_004904 +2009_004903 +2009_004902 +2009_004901 +2009_004899 +2009_004898 +2009_004897 +2009_004890 +2009_004889 +2009_004888 +2009_004887 +2009_004885 +2009_004880 +2009_004877 +2009_004876 +2009_004874 +2009_004872 +2009_004871 +2009_004869 +2009_004868 +2009_004865 +2009_004858 +2009_004857 +2009_004856 +2009_004855 +2009_004849 +2009_004847 +2009_004846 +2009_004845 +2009_004841 +2009_004839 +2009_004836 +2009_004834 +2009_004831 +2009_004830 +2009_004829 +2009_004828 +2009_004824 +2009_004823 +2009_004822 +2009_004817 +2009_004815 +2009_004813 +2009_004812 +2009_004806 +2009_004805 +2009_004804 +2009_004798 +2009_004797 +2009_004796 +2009_004794 +2009_004790 +2009_004787 +2009_004786 +2009_004784 +2009_004782 +2009_004781 +2009_004780 +2009_004779 +2009_004772 +2009_004771 +2009_004769 +2009_004768 +2009_004766 +2009_004765 +2009_004764 +2009_004763 +2009_004761 +2009_004760 +2009_004759 +2009_004758 +2009_004756 +2009_004754 +2009_004749 +2009_004746 +2009_004745 +2009_004744 +2009_004737 +2009_004734 +2009_004731 +2009_004728 +2009_004723 +2009_004720 +2009_004719 +2009_004718 +2009_004716 +2009_004713 +2009_004710 +2009_004709 +2009_004708 +2009_004706 +2009_004705 +2009_004701 +2009_004697 +2009_004694 +2009_004688 +2009_004686 +2009_004684 +2009_004683 +2009_004681 +2009_004679 +2009_004677 +2009_004674 +2009_004671 +2009_004670 +2009_004669 +2009_004667 +2009_004664 +2009_004662 +2009_004661 +2009_004656 +2009_004655 +2009_004652 +2009_004651 +2009_004648 +2009_004647 +2009_004645 +2009_004643 +2009_004642 +2009_004639 +2009_004634 +2009_004631 +2009_004630 +2009_004629 +2009_004628 +2009_004626 +2009_004625 +2009_004624 +2009_004623 +2009_004620 +2009_004619 +2009_004616 +2009_004614 +2009_004607 +2009_004606 +2009_004601 +2009_004598 +2009_004593 +2009_004588 +2009_004587 +2009_004582 +2009_004580 +2009_004572 +2009_004571 +2009_004570 +2009_004567 +2009_004565 +2009_004562 +2009_004561 +2009_004560 +2009_004559 +2009_004557 +2009_004556 +2009_004554 +2009_004552 +2009_004551 +2009_004548 +2009_004547 +2009_004545 +2009_004543 +2009_004542 +2009_004539 +2009_004537 +2009_004536 +2009_004535 +2009_004532 +2009_004530 +2009_004529 +2009_004527 +2009_004525 +2009_004524 +2009_004519 +2009_004518 +2009_004514 +2009_004513 +2009_004511 +2009_004508 +2009_004503 +2009_004502 +2009_004501 +2009_004499 +2009_004492 +2009_004486 +2009_004483 +2009_004479 +2009_004478 +2009_004477 +2009_004475 +2009_004471 +2009_004468 +2009_004465 +2009_004464 +2009_004457 +2009_004456 +2009_004454 +2009_004453 +2009_004452 +2009_004451 +2009_004449 +2009_004448 +2009_004446 +2009_004445 +2009_004444 +2009_004442 +2009_004440 +2009_004438 +2009_004436 +2009_004435 +2009_004434 +2009_004432 +2009_004429 +2009_004426 +2009_004425 +2009_004424 +2009_004419 +2009_004417 +2009_004414 +2009_004411 +2009_004410 +2009_004409 +2009_004406 +2009_004404 +2009_004403 +2009_004399 +2009_004397 +2009_004394 +2009_004392 +2009_004390 +2009_004383 +2009_004382 +2009_004377 +2009_004375 +2009_004374 +2009_004371 +2009_004370 +2009_004369 +2009_004368 +2009_004366 +2009_004364 +2009_004361 +2009_004359 +2009_004358 +2009_004357 +2009_004351 +2009_004350 +2009_004347 +2009_004346 +2009_004341 +2009_004340 +2009_004338 +2009_004336 +2009_004334 +2009_004332 +2009_004329 +2009_004328 +2009_004327 +2009_004323 +2009_004322 +2009_004319 +2009_004317 +2009_004316 +2009_004315 +2009_004312 +2009_004309 +2009_004308 +2009_004307 +2009_004303 +2009_004301 +2009_004300 +2009_004295 +2009_004291 +2009_004290 +2009_004289 +2009_004285 +2009_004284 +2009_004283 +2009_004279 +2009_004278 +2009_004277 +2009_004276 +2009_004274 +2009_004273 +2009_004272 +2009_004271 +2009_004264 +2009_004263 +2009_004262 +2009_004261 +2009_004258 +2009_004249 +2009_004244 +2009_004243 +2009_004241 +2009_004234 +2009_004233 +2009_004232 +2009_004231 +2009_004229 +2009_004228 +2009_004227 +2009_004225 +2009_004224 +2009_004222 +2009_004218 +2009_004213 +2009_004212 +2009_004211 +2009_004210 +2009_004207 +2009_004205 +2009_004203 +2009_004202 +2009_004201 +2009_004200 +2009_004199 +2009_004197 +2009_004193 +2009_004191 +2009_004188 +2009_004187 +2009_004186 +2009_004183 +2009_004181 +2009_004180 +2009_004179 +2009_004178 +2009_004177 +2009_004176 +2009_004175 +2009_004174 +2009_004171 +2009_004170 +2009_004169 +2009_004168 +2009_004166 +2009_004165 +2009_004164 +2009_004163 +2009_004162 +2009_004161 +2009_004159 +2009_004157 +2009_004154 +2009_004152 +2009_004150 +2009_004148 +2009_004142 +2009_004141 +2009_004139 +2009_004138 +2009_004134 +2009_004133 +2009_004131 +2009_004129 +2009_004128 +2009_004126 +2009_004124 +2009_004122 +2009_004121 +2009_004118 +2009_004117 +2009_004113 +2009_004112 +2009_004111 +2009_004109 +2009_004108 +2009_004105 +2009_004103 +2009_004102 +2009_004100 +2009_004096 +2009_004095 +2009_004094 +2009_004093 +2009_004092 +2009_004091 +2009_004088 +2009_004085 +2009_004083 +2009_004082 +2009_004078 +2009_004076 +2009_004075 +2009_004074 +2009_004073 +2009_004069 +2009_004062 +2009_004058 +2009_004055 +2009_004052 +2009_004051 +2009_004050 +2009_004044 +2009_004042 +2009_004040 +2009_004038 +2009_004037 +2009_004034 +2009_004032 +2009_004031 +2009_004025 +2009_004023 +2009_004022 +2009_004020 +2009_004019 +2009_004018 +2009_004016 +2009_004012 +2009_004007 +2009_004005 +2009_004004 +2009_004002 +2009_004001 +2009_003995 +2009_003994 +2009_003993 +2009_003992 +2009_003986 +2009_003985 +2009_003982 +2009_003977 +2009_003976 +2009_003975 +2009_003974 +2009_003973 +2009_003969 +2009_003966 +2009_003965 +2009_003962 +2009_003961 +2009_003958 +2009_003956 +2009_003955 +2009_003951 +2009_003950 +2009_003947 +2009_003944 +2009_003942 +2009_003936 +2009_003933 +2009_003929 +2009_003922 +2009_003921 +2009_003920 +2009_003916 +2009_003914 +2009_003913 +2009_003912 +2009_003911 +2009_003908 +2009_003905 +2009_003902 +2009_003901 +2009_003900 +2009_003899 +2009_003897 +2009_003896 +2009_003892 +2009_003888 +2009_003884 +2009_003883 +2009_003879 +2009_003874 +2009_003873 +2009_003870 +2009_003867 +2009_003865 +2009_003863 +2009_003860 +2009_003855 +2009_003852 +2009_003848 +2009_003847 +2009_003846 +2009_003843 +2009_003840 +2009_003838 +2009_003837 +2009_003836 +2009_003835 +2009_003832 +2009_003829 +2009_003827 +2009_003825 +2009_003822 +2009_003821 +2009_003820 +2009_003819 +2009_003818 +2009_003816 +2009_003815 +2009_003814 +2009_003813 +2009_003808 +2009_003802 +2009_003801 +2009_003800 +2009_003799 +2009_003795 +2009_003793 +2009_003790 +2009_003786 +2009_003785 +2009_003784 +2009_003783 +2009_003781 +2009_003776 +2009_003775 +2009_003768 +2009_003765 +2009_003760 +2009_003759 +2009_003758 +2009_003757 +2009_003753 +2009_003752 +2009_003751 +2009_003747 +2009_003743 +2009_003739 +2009_003738 +2009_003736 +2009_003735 +2009_003734 +2009_003732 +2009_003725 +2009_003722 +2009_003720 +2009_003718 +2009_003717 +2009_003714 +2009_003713 +2009_003711 +2009_003710 +2009_003709 +2009_003708 +2009_003705 +2009_003704 +2009_003702 +2009_003698 +2009_003697 +2009_003695 +2009_003694 +2009_003690 +2009_003689 +2009_003688 +2009_003686 +2009_003685 +2009_003683 +2009_003679 +2009_003677 +2009_003671 +2009_003669 +2009_003668 +2009_003667 +2009_003664 +2009_003663 +2009_003660 +2009_003657 +2009_003656 +2009_003655 +2009_003654 +2009_003652 +2009_003650 +2009_003647 +2009_003646 +2009_003644 +2009_003642 +2009_003639 +2009_003638 +2009_003636 +2009_003635 +2009_003634 +2009_003633 +2009_003629 +2009_003627 +2009_003626 +2009_003624 +2009_003618 +2009_003614 +2009_003613 +2009_003612 +2009_003609 +2009_003608 +2009_003606 +2009_003605 +2009_003601 +2009_003600 +2009_003598 +2009_003594 +2009_003592 +2009_003588 +2009_003583 +2009_003581 +2009_003577 +2009_003572 +2009_003571 +2009_003566 +2009_003565 +2009_003563 +2009_003562 +2009_003560 +2009_003555 +2009_003554 +2009_003546 +2009_003545 +2009_003544 +2009_003543 +2009_003541 +2009_003540 +2009_003539 +2009_003538 +2009_003537 +2009_003534 +2009_003533 +2009_003531 +2009_003530 +2009_003528 +2009_003524 +2009_003522 +2009_003521 +2009_003520 +2009_003519 +2009_003513 +2009_003511 +2009_003510 +2009_003509 +2009_003508 +2009_003500 +2009_003499 +2009_003497 +2009_003492 +2009_003491 +2009_003490 +2009_003489 +2009_003488 +2009_003487 +2009_003482 +2009_003476 +2009_003469 +2009_003468 +2009_003467 +2009_003462 +2009_003461 +2009_003460 +2009_003459 +2009_003458 +2009_003457 +2009_003456 +2009_003455 +2009_003454 +2009_003453 +2009_003447 +2009_003446 +2009_003445 +2009_003443 +2009_003441 +2009_003440 +2009_003436 +2009_003431 +2009_003430 +2009_003425 +2009_003422 +2009_003419 +2009_003417 +2009_003416 +2009_003415 +2009_003411 +2009_003409 +2009_003407 +2009_003402 +2009_003400 +2009_003399 +2009_003396 +2009_003395 +2009_003394 +2009_003386 +2009_003385 +2009_003384 +2009_003383 +2009_003381 +2009_003380 +2009_003379 +2009_003377 +2009_003376 +2009_003375 +2009_003373 +2009_003372 +2009_003369 +2009_003367 +2009_003365 +2009_003363 +2009_003361 +2009_003360 +2009_003353 +2009_003352 +2009_003351 +2009_003350 +2009_003349 +2009_003348 +2009_003347 +2009_003346 +2009_003345 +2009_003340 +2009_003338 +2009_003333 +2009_003326 +2009_003320 +2009_003317 +2009_003316 +2009_003315 +2009_003312 +2009_003310 +2009_003309 +2009_003305 +2009_003301 +2009_003300 +2009_003297 +2009_003294 +2009_003290 +2009_003288 +2009_003285 +2009_003284 +2009_003282 +2009_003278 +2009_003277 +2009_003276 +2009_003272 +2009_003271 +2009_003267 +2009_003266 +2009_003265 +2009_003262 +2009_003261 +2009_003259 +2009_003257 +2009_003255 +2009_003254 +2009_003253 +2009_003251 +2009_003249 +2009_003247 +2009_003238 +2009_003234 +2009_003233 +2009_003232 +2009_003230 +2009_003229 +2009_003225 +2009_003222 +2009_003219 +2009_003218 +2009_003214 +2009_003212 +2009_003209 +2009_003208 +2009_003204 +2009_003201 +2009_003200 +2009_003199 +2009_003198 +2009_003194 +2009_003191 +2009_003189 +2009_003187 +2009_003185 +2009_003183 +2009_003175 +2009_003173 +2009_003172 +2009_003168 +2009_003166 +2009_003165 +2009_003164 +2009_003157 +2009_003156 +2009_003155 +2009_003154 +2009_003153 +2009_003151 +2009_003150 +2009_003147 +2009_003146 +2009_003144 +2009_003143 +2009_003142 +2009_003140 +2009_003138 +2009_003136 +2009_003132 +2009_003130 +2009_003129 +2009_003128 +2009_003127 +2009_003126 +2009_003125 +2009_003122 +2009_003118 +2009_003116 +2009_003115 +2009_003114 +2009_003110 +2009_003109 +2009_003108 +2009_003107 +2009_003098 +2009_003097 +2009_003095 +2009_003093 +2009_003091 +2009_003090 +2009_003089 +2009_003088 +2009_003087 +2009_003083 +2009_003082 +2009_003078 +2009_003077 +2009_003076 +2009_003075 +2009_003074 +2009_003070 +2009_003068 +2009_003067 +2009_003066 +2009_003064 +2009_003058 +2009_003056 +2009_003054 +2009_003053 +2009_003052 +2009_003044 +2009_003042 +2009_003039 +2009_003035 +2009_003034 +2009_003033 +2009_003032 +2009_003031 +2009_003023 +2009_003022 +2009_003020 +2009_003019 +2009_003018 +2009_003013 +2009_003012 +2009_003010 +2009_003007 +2009_003006 +2009_003002 +2009_003000 +2009_002999 +2009_002998 +2009_002995 +2009_002993 +2009_002988 +2009_002986 +2009_002985 +2009_002984 +2009_002983 +2009_002980 +2009_002978 +2009_002977 +2009_002976 +2009_002972 +2009_002971 +2009_002970 +2009_002967 +2009_002962 +2009_002961 +2009_002960 +2009_002958 +2009_002957 +2009_002955 +2009_002954 +2009_002952 +2009_002947 +2009_002946 +2009_002941 +2009_002940 +2009_002938 +2009_002937 +2009_002935 +2009_002933 +2009_002932 +2009_002925 +2009_002921 +2009_002920 +2009_002918 +2009_002917 +2009_002914 +2009_002912 +2009_002910 +2009_002908 +2009_002902 +2009_002901 +2009_002898 +2009_002897 +2009_002894 +2009_002893 +2009_002890 +2009_002885 +2009_002883 +2009_002882 +2009_002879 +2009_002877 +2009_002876 +2009_002872 +2009_002869 +2009_002867 +2009_002865 +2009_002862 +2009_002855 +2009_002853 +2009_002851 +2009_002850 +2009_002849 +2009_002847 +2009_002845 +2009_002844 +2009_002843 +2009_002842 +2009_002841 +2009_002838 +2009_002837 +2009_002836 +2009_002835 +2009_002833 +2009_002831 +2009_002830 +2009_002827 +2009_002824 +2009_002820 +2009_002817 +2009_002816 +2009_002814 +2009_002813 +2009_002809 +2009_002807 +2009_002806 +2009_002803 +2009_002800 +2009_002799 +2009_002798 +2009_002792 +2009_002791 +2009_002790 +2009_002789 +2009_002785 +2009_002784 +2009_002780 +2009_002779 +2009_002778 +2009_002777 +2009_002774 +2009_002772 +2009_002770 +2009_002765 +2009_002764 +2009_002763 +2009_002762 +2009_002759 +2009_002758 +2009_002755 +2009_002754 +2009_002752 +2009_002750 +2009_002746 +2009_002744 +2009_002743 +2009_002741 +2009_002739 +2009_002734 +2009_002733 +2009_002728 +2009_002725 +2009_002719 +2009_002717 +2009_002715 +2009_002714 +2009_002713 +2009_002712 +2009_002711 +2009_002710 +2009_002708 +2009_002705 +2009_002704 +2009_002703 +2009_002698 +2009_002697 +2009_002695 +2009_002689 +2009_002688 +2009_002687 +2009_002685 +2009_002684 +2009_002683 +2009_002681 +2009_002676 +2009_002675 +2009_002674 +2009_002673 +2009_002672 +2009_002671 +2009_002670 +2009_002669 +2009_002668 +2009_002667 +2009_002665 +2009_002663 +2009_002662 +2009_002652 +2009_002648 +2009_002645 +2009_002634 +2009_002632 +2009_002629 +2009_002628 +2009_002626 +2009_002625 +2009_002624 +2009_002621 +2009_002620 +2009_002616 +2009_002615 +2009_002614 +2009_002613 +2009_002612 +2009_002611 +2009_002609 +2009_002608 +2009_002607 +2009_002605 +2009_002599 +2009_002597 +2009_002595 +2009_002592 +2009_002588 +2009_002586 +2009_002585 +2009_002580 +2009_002579 +2009_002577 +2009_002570 +2009_002569 +2009_002567 +2009_002566 +2009_002565 +2009_002563 +2009_002561 +2009_002559 +2009_002558 +2009_002557 +2009_002556 +2009_002553 +2009_002552 +2009_002546 +2009_002543 +2009_002542 +2009_002537 +2009_002536 +2009_002532 +2009_002531 +2009_002530 +2009_002525 +2009_002524 +2009_002523 +2009_002522 +2009_002519 +2009_002518 +2009_002517 +2009_002515 +2009_002514 +2009_002512 +2009_002510 +2009_002506 +2009_002505 +2009_002504 +2009_002500 +2009_002499 +2009_002488 +2009_002477 +2009_002476 +2009_002475 +2009_002474 +2009_002472 +2009_002471 +2009_002470 +2009_002465 +2009_002464 +2009_002460 +2009_002457 +2009_002456 +2009_002453 +2009_002452 +2009_002449 +2009_002448 +2009_002444 +2009_002443 +2009_002441 +2009_002439 +2009_002438 +2009_002436 +2009_002434 +2009_002433 +2009_002432 +2009_002431 +2009_002429 +2009_002425 +2009_002424 +2009_002423 +2009_002422 +2009_002420 +2009_002419 +2009_002416 +2009_002414 +2009_002409 +2009_002408 +2009_002407 +2009_002406 +2009_002404 +2009_002401 +2009_002400 +2009_002399 +2009_002398 +2009_002397 +2009_002393 +2009_002391 +2009_002388 +2009_002387 +2009_002386 +2009_002381 +2009_002380 +2009_002377 +2009_002376 +2009_002374 +2009_002373 +2009_002371 +2009_002370 +2009_002363 +2009_002362 +2009_002360 +2009_002358 +2009_002352 +2009_002350 +2009_002349 +2009_002348 +2009_002343 +2009_002339 +2009_002338 +2009_002335 +2009_002333 +2009_002331 +2009_002328 +2009_002326 +2009_002325 +2009_002324 +2009_002319 +2009_002314 +2009_002312 +2009_002311 +2009_002308 +2009_002306 +2009_002305 +2009_002302 +2009_002301 +2009_002299 +2009_002298 +2009_002297 +2009_002289 +2009_002286 +2009_002285 +2009_002282 +2009_002281 +2009_002274 +2009_002273 +2009_002272 +2009_002271 +2009_002267 +2009_002264 +2009_002262 +2009_002259 +2009_002258 +2009_002257 +2009_002256 +2009_002254 +2009_002253 +2009_002252 +2009_002245 +2009_002242 +2009_002240 +2009_002236 +2009_002235 +2009_002232 +2009_002231 +2009_002230 +2009_002229 +2009_002228 +2009_002226 +2009_002225 +2009_002222 +2009_002219 +2009_002216 +2009_002215 +2009_002214 +2009_002212 +2009_002211 +2009_002208 +2009_002205 +2009_002204 +2009_002203 +2009_002199 +2009_002198 +2009_002197 +2009_002194 +2009_002193 +2009_002192 +2009_002191 +2009_002182 +2009_002180 +2009_002177 +2009_002176 +2009_002175 +2009_002173 +2009_002169 +2009_002153 +2009_002152 +2009_002151 +2009_002149 +2009_002147 +2009_002146 +2009_002145 +2009_002144 +2009_002141 +2009_002139 +2009_002137 +2009_002136 +2009_002133 +2009_002131 +2009_002129 +2009_002128 +2009_002127 +2009_002126 +2009_002123 +2009_002120 +2009_002119 +2009_002118 +2009_002117 +2009_002116 +2009_002112 +2009_002111 +2009_002110 +2009_002107 +2009_002105 +2009_002104 +2009_002103 +2009_002099 +2009_002098 +2009_002096 +2009_002093 +2009_002089 +2009_002088 +2009_002087 +2009_002086 +2009_002083 +2009_002078 +2009_002077 +2009_002073 +2009_002072 +2009_002066 +2009_002064 +2009_002061 +2009_002060 +2009_002058 +2009_002057 +2009_002056 +2009_002055 +2009_002054 +2009_002053 +2009_002052 +2009_002046 +2009_002044 +2009_002040 +2009_002039 +2009_002037 +2009_002031 +2009_002024 +2009_002019 +2009_002011 +2009_002010 +2009_002009 +2009_002008 +2009_002003 +2009_002002 +2009_002001 +2009_002000 +2009_001999 +2009_001997 +2009_001994 +2009_001990 +2009_001988 +2009_001984 +2009_001980 +2009_001979 +2009_001977 +2009_001976 +2009_001975 +2009_001973 +2009_001972 +2009_001971 +2009_001967 +2009_001965 +2009_001964 +2009_001962 +2009_001961 +2009_001960 +2009_001959 +2009_001952 +2009_001949 +2009_001948 +2009_001945 +2009_001940 +2009_001937 +2009_001934 +2009_001933 +2009_001931 +2009_001929 +2009_001927 +2009_001926 +2009_001922 +2009_001917 +2009_001916 +2009_001911 +2009_001910 +2009_001909 +2009_001908 +2009_001907 +2009_001906 +2009_001905 +2009_001904 +2009_001902 +2009_001898 +2009_001897 +2009_001894 +2009_001890 +2009_001888 +2009_001885 +2009_001884 +2009_001881 +2009_001875 +2009_001874 +2009_001873 +2009_001871 +2009_001869 +2009_001868 +2009_001867 +2009_001865 +2009_001864 +2009_001861 +2009_001858 +2009_001856 +2009_001853 +2009_001852 +2009_001848 +2009_001847 +2009_001846 +2009_001840 +2009_001839 +2009_001837 +2009_001835 +2009_001833 +2009_001831 +2009_001830 +2009_001828 +2009_001827 +2009_001826 +2009_001825 +2009_001823 +2009_001822 +2009_001820 +2009_001817 +2009_001812 +2009_001811 +2009_001810 +2009_001809 +2009_001807 +2009_001806 +2009_001805 +2009_001802 +2009_001801 +2009_001800 +2009_001799 +2009_001798 +2009_001794 +2009_001792 +2009_001784 +2009_001783 +2009_001782 +2009_001781 +2009_001780 +2009_001779 +2009_001778 +2009_001774 +2009_001770 +2009_001767 +2009_001764 +2009_001759 +2009_001758 +2009_001755 +2009_001754 +2009_001752 +2009_001751 +2009_001750 +2009_001749 +2009_001747 +2009_001746 +2009_001744 +2009_001743 +2009_001741 +2009_001740 +2009_001738 +2009_001735 +2009_001734 +2009_001733 +2009_001732 +2009_001724 +2009_001723 +2009_001720 +2009_001719 +2009_001715 +2009_001713 +2009_001709 +2009_001707 +2009_001706 +2009_001705 +2009_001704 +2009_001699 +2009_001696 +2009_001695 +2009_001693 +2009_001690 +2009_001689 +2009_001682 +2009_001678 +2009_001677 +2009_001676 +2009_001675 +2009_001674 +2009_001673 +2009_001671 +2009_001670 +2009_001667 +2009_001664 +2009_001660 +2009_001657 +2009_001653 +2009_001651 +2009_001648 +2009_001646 +2009_001645 +2009_001643 +2009_001642 +2009_001640 +2009_001638 +2009_001636 +2009_001635 +2009_001633 +2009_001631 +2009_001627 +2009_001625 +2009_001623 +2009_001621 +2009_001618 +2009_001617 +2009_001615 +2009_001614 +2009_001612 +2009_001611 +2009_001608 +2009_001606 +2009_001605 +2009_001602 +2009_001598 +2009_001595 +2009_001594 +2009_001593 +2009_001591 +2009_001590 +2009_001589 +2009_001587 +2009_001585 +2009_001581 +2009_001577 +2009_001575 +2009_001570 +2009_001568 +2009_001567 +2009_001566 +2009_001562 +2009_001558 +2009_001555 +2009_001554 +2009_001553 +2009_001550 +2009_001549 +2009_001546 +2009_001544 +2009_001542 +2009_001541 +2009_001539 +2009_001538 +2009_001537 +2009_001534 +2009_001526 +2009_001522 +2009_001521 +2009_001519 +2009_001518 +2009_001517 +2009_001516 +2009_001514 +2009_001509 +2009_001508 +2009_001507 +2009_001502 +2009_001501 +2009_001500 +2009_001498 +2009_001494 +2009_001493 +2009_001490 +2009_001484 +2009_001481 +2009_001480 +2009_001479 +2009_001476 +2009_001475 +2009_001474 +2009_001472 +2009_001470 +2009_001468 +2009_001466 +2009_001463 +2009_001462 +2009_001457 +2009_001456 +2009_001453 +2009_001452 +2009_001450 +2009_001449 +2009_001448 +2009_001447 +2009_001446 +2009_001444 +2009_001443 +2009_001440 +2009_001437 +2009_001435 +2009_001434 +2009_001431 +2009_001427 +2009_001426 +2009_001424 +2009_001422 +2009_001419 +2009_001417 +2009_001414 +2009_001413 +2009_001412 +2009_001409 +2009_001407 +2009_001406 +2009_001403 +2009_001398 +2009_001397 +2009_001395 +2009_001393 +2009_001390 +2009_001389 +2009_001388 +2009_001387 +2009_001385 +2009_001384 +2009_001376 +2009_001375 +2009_001374 +2009_001372 +2009_001371 +2009_001370 +2009_001369 +2009_001368 +2009_001367 +2009_001366 +2009_001364 +2009_001361 +2009_001360 +2009_001359 +2009_001357 +2009_001355 +2009_001354 +2009_001350 +2009_001349 +2009_001348 +2009_001345 +2009_001344 +2009_001343 +2009_001339 +2009_001329 +2009_001328 +2009_001327 +2009_001326 +2009_001323 +2009_001322 +2009_001321 +2009_001320 +2009_001319 +2009_001316 +2009_001313 +2009_001312 +2009_001311 +2009_001309 +2009_001308 +2009_001306 +2009_001305 +2009_001303 +2009_001301 +2009_001291 +2009_001289 +2009_001288 +2009_001286 +2009_001285 +2009_001283 +2009_001282 +2009_001279 +2009_001271 +2009_001270 +2009_001268 +2009_001266 +2009_001264 +2009_001263 +2009_001260 +2009_001259 +2009_001257 +2009_001254 +2009_001253 +2009_001252 +2009_001251 +2009_001249 +2009_001245 +2009_001243 +2009_001242 +2009_001241 +2009_001238 +2009_001237 +2009_001236 +2009_001230 +2009_001229 +2009_001227 +2009_001225 +2009_001224 +2009_001221 +2009_001217 +2009_001216 +2009_001212 +2009_001208 +2009_001207 +2009_001206 +2009_001205 +2009_001203 +2009_001201 +2009_001199 +2009_001198 +2009_001197 +2009_001196 +2009_001195 +2009_001192 +2009_001190 +2009_001188 +2009_001184 +2009_001181 +2009_001180 +2009_001177 +2009_001172 +2009_001166 +2009_001164 +2009_001163 +2009_001159 +2009_001155 +2009_001154 +2009_001153 +2009_001152 +2009_001151 +2009_001148 +2009_001147 +2009_001146 +2009_001145 +2009_001140 +2009_001139 +2009_001138 +2009_001137 +2009_001135 +2009_001134 +2009_001133 +2009_001129 +2009_001128 +2009_001126 +2009_001124 +2009_001121 +2009_001120 +2009_001118 +2009_001117 +2009_001113 +2009_001111 +2009_001110 +2009_001107 +2009_001106 +2009_001105 +2009_001104 +2009_001103 +2009_001102 +2009_001100 +2009_001098 +2009_001097 +2009_001096 +2009_001095 +2009_001094 +2009_001091 +2009_001090 +2009_001085 +2009_001084 +2009_001083 +2009_001081 +2009_001079 +2009_001078 +2009_001075 +2009_001070 +2009_001069 +2009_001061 +2009_001059 +2009_001057 +2009_001056 +2009_001055 +2009_001054 +2009_001052 +2009_001044 +2009_001042 +2009_001040 +2009_001038 +2009_001037 +2009_001036 +2009_001030 +2009_001028 +2009_001027 +2009_001026 +2009_001024 +2009_001021 +2009_001019 +2009_001016 +2009_001013 +2009_001012 +2009_001011 +2009_001009 +2009_001007 +2009_001006 +2009_001002 +2009_001000 +2009_000996 +2009_000995 +2009_000992 +2009_000990 +2009_000987 +2009_000985 +2009_000981 +2009_000980 +2009_000979 +2009_000975 +2009_000974 +2009_000973 +2009_000971 +2009_000970 +2009_000969 +2009_000967 +2009_000966 +2009_000962 +2009_000961 +2009_000960 +2009_000958 +2009_000955 +2009_000954 +2009_000953 +2009_000948 +2009_000945 +2009_000939 +2009_000938 +2009_000937 +2009_000934 +2009_000932 +2009_000930 +2009_000928 +2009_000927 +2009_000926 +2009_000925 +2009_000923 +2009_000920 +2009_000915 +2009_000910 +2009_000909 +2009_000906 +2009_000904 +2009_000902 +2009_000901 +2009_000899 +2009_000898 +2009_000897 +2009_000896 +2009_000895 +2009_000894 +2009_000890 +2009_000889 +2009_000887 +2009_000886 +2009_000882 +2009_000874 +2009_000871 +2009_000869 +2009_000867 +2009_000865 +2009_000862 +2009_000858 +2009_000856 +2009_000854 +2009_000852 +2009_000851 +2009_000849 +2009_000848 +2009_000846 +2009_000843 +2009_000837 +2009_000834 +2009_000833 +2009_000831 +2009_000830 +2009_000829 +2009_000824 +2009_000823 +2009_000821 +2009_000820 +2009_000817 +2009_000816 +2009_000815 +2009_000812 +2009_000811 +2009_000805 +2009_000804 +2009_000801 +2009_000797 +2009_000796 +2009_000794 +2009_000793 +2009_000791 +2009_000790 +2009_000789 +2009_000783 +2009_000782 +2009_000779 +2009_000778 +2009_000777 +2009_000774 +2009_000770 +2009_000768 +2009_000763 +2009_000762 +2009_000760 +2009_000759 +2009_000758 +2009_000757 +2009_000756 +2009_000755 +2009_000752 +2009_000750 +2009_000748 +2009_000746 +2009_000745 +2009_000744 +2009_000742 +2009_000741 +2009_000737 +2009_000734 +2009_000726 +2009_000725 +2009_000724 +2009_000722 +2009_000720 +2009_000719 +2009_000718 +2009_000709 +2009_000708 +2009_000702 +2009_000696 +2009_000695 +2009_000694 +2009_000692 +2009_000691 +2009_000690 +2009_000689 +2009_000686 +2009_000684 +2009_000683 +2009_000681 +2009_000679 +2009_000677 +2009_000676 +2009_000674 +2009_000672 +2009_000670 +2009_000663 +2009_000662 +2009_000661 +2009_000658 +2009_000655 +2009_000653 +2009_000651 +2009_000648 +2009_000647 +2009_000642 +2009_000638 +2009_000637 +2009_000636 +2009_000635 +2009_000634 +2009_000632 +2009_000631 +2009_000629 +2009_000626 +2009_000625 +2009_000624 +2009_000617 +2009_000615 +2009_000614 +2009_000611 +2009_000606 +2009_000604 +2009_000603 +2009_000602 +2009_000600 +2009_000599 +2009_000597 +2009_000595 +2009_000593 +2009_000592 +2009_000591 +2009_000590 +2009_000586 +2009_000585 +2009_000579 +2009_000577 +2009_000576 +2009_000575 +2009_000574 +2009_000568 +2009_000567 +2009_000566 +2009_000565 +2009_000563 +2009_000562 +2009_000560 +2009_000559 +2009_000558 +2009_000557 +2009_000553 +2009_000552 +2009_000550 +2009_000549 +2009_000547 +2009_000546 +2009_000545 +2009_000544 +2009_000542 +2009_000539 +2009_000536 +2009_000535 +2009_000532 +2009_000529 +2009_000527 +2009_000526 +2009_000525 +2009_000522 +2009_000519 +2009_000516 +2009_000515 +2009_000513 +2009_000512 +2009_000511 +2009_000505 +2009_000504 +2009_000503 +2009_000502 +2009_000501 +2009_000500 +2009_000499 +2009_000496 +2009_000494 +2009_000493 +2009_000491 +2009_000486 +2009_000483 +2009_000477 +2009_000476 +2009_000474 +2009_000472 +2009_000471 +2009_000466 +2009_000464 +2009_000463 +2009_000461 +2009_000456 +2009_000454 +2009_000453 +2009_000452 +2009_000449 +2009_000445 +2009_000444 +2009_000443 +2009_000439 +2009_000438 +2009_000435 +2009_000430 +2009_000422 +2009_000420 +2009_000419 +2009_000417 +2009_000416 +2009_000414 +2009_000411 +2009_000410 +2009_000409 +2009_000408 +2009_000405 +2009_000402 +2009_000400 +2009_000399 +2009_000398 +2009_000397 +2009_000393 +2009_000390 +2009_000389 +2009_000385 +2009_000379 +2009_000378 +2009_000377 +2009_000375 +2009_000370 +2009_000367 +2009_000366 +2009_000356 +2009_000350 +2009_000347 +2009_000344 +2009_000343 +2009_000342 +2009_000341 +2009_000340 +2009_000339 +2009_000337 +2009_000336 +2009_000330 +2009_000328 +2009_000327 +2009_000322 +2009_000321 +2009_000320 +2009_000317 +2009_000316 +2009_000312 +2009_000308 +2009_000305 +2009_000304 +2009_000303 +2009_000300 +2009_000298 +2009_000297 +2009_000293 +2009_000291 +2009_000290 +2009_000289 +2009_000288 +2009_000287 +2009_000286 +2009_000285 +2009_000284 +2009_000283 +2009_000282 +2009_000280 +2009_000277 +2009_000276 +2009_000268 +2009_000260 +2009_000257 +2009_000254 +2009_000253 +2009_000251 +2009_000250 +2009_000249 +2009_000248 +2009_000247 +2009_000244 +2009_000239 +2009_000237 +2009_000233 +2009_000232 +2009_000229 +2009_000227 +2009_000225 +2009_000223 +2009_000218 +2009_000217 +2009_000216 +2009_000214 +2009_000212 +2009_000209 +2009_000206 +2009_000203 +2009_000199 +2009_000198 +2009_000197 +2009_000195 +2009_000192 +2009_000189 +2009_000188 +2009_000184 +2009_000183 +2009_000182 +2009_000181 +2009_000177 +2009_000176 +2009_000171 +2009_000169 +2009_000168 +2009_000165 +2009_000164 +2009_000161 +2009_000160 +2009_000159 +2009_000158 +2009_000157 +2009_000151 +2009_000150 +2009_000146 +2009_000145 +2009_000142 +2009_000141 +2009_000140 +2009_000137 +2009_000135 +2009_000133 +2009_000132 +2009_000131 +2009_000130 +2009_000128 +2009_000124 +2009_000122 +2009_000120 +2009_000119 +2009_000109 +2009_000105 +2009_000104 +2009_000103 +2009_000102 +2009_000100 +2009_000097 +2009_000093 +2009_000091 +2009_000090 +2009_000089 +2009_000088 +2009_000085 +2009_000084 +2009_000082 +2009_000078 +2009_000073 +2009_000072 +2009_000068 +2009_000067 +2009_000066 +2009_000063 +2009_000060 +2009_000059 +2009_000058 +2009_000056 +2009_000055 +2009_000054 +2009_000052 +2009_000051 +2009_000045 +2009_000042 +2009_000041 +2009_000040 +2009_000035 +2009_000030 +2009_000029 +2009_000028 +2009_000027 +2009_000026 +2009_000021 +2009_000017 +2009_000016 +2009_000015 +2009_000014 +2009_000011 +2009_000010 +2009_000009 +2009_000006 +2009_000002 +2009_000001 +2008_008773 +2008_008772 +2008_008770 +2008_008767 +2008_008765 +2008_008757 +2008_008755 +2008_008753 +2008_008751 +2008_008749 +2008_008748 +2008_008745 +2008_008744 +2008_008739 +2008_008735 +2008_008732 +2008_008726 +2008_008725 +2008_008724 +2008_008719 +2008_008718 +2008_008717 +2008_008714 +2008_008713 +2008_008708 +2008_008707 +2008_008706 +2008_008705 +2008_008701 +2008_008700 +2008_008697 +2008_008696 +2008_008695 +2008_008694 +2008_008691 +2008_008690 +2008_008689 +2008_008685 +2008_008684 +2008_008683 +2008_008681 +2008_008679 +2008_008676 +2008_008675 +2008_008674 +2008_008673 +2008_008671 +2008_008668 +2008_008666 +2008_008665 +2008_008662 +2008_008659 +2008_008658 +2008_008654 +2008_008652 +2008_008649 +2008_008642 +2008_008641 +2008_008637 +2008_008636 +2008_008635 +2008_008632 +2008_008628 +2008_008624 +2008_008623 +2008_008622 +2008_008621 +2008_008619 +2008_008618 +2008_008617 +2008_008616 +2008_008615 +2008_008613 +2008_008611 +2008_008608 +2008_008607 +2008_008606 +2008_008601 +2008_008600 +2008_008598 +2008_008595 +2008_008593 +2008_008591 +2008_008590 +2008_008589 +2008_008588 +2008_008585 +2008_008583 +2008_008579 +2008_008578 +2008_008574 +2008_008572 +2008_008570 +2008_008567 +2008_008564 +2008_008560 +2008_008554 +2008_008552 +2008_008550 +2008_008549 +2008_008547 +2008_008546 +2008_008545 +2008_008544 +2008_008541 +2008_008538 +2008_008537 +2008_008536 +2008_008533 +2008_008531 +2008_008530 +2008_008528 +2008_008527 +2008_008526 +2008_008525 +2008_008524 +2008_008522 +2008_008521 +2008_008519 +2008_008517 +2008_008512 +2008_008511 +2008_008508 +2008_008507 +2008_008506 +2008_008501 +2008_008500 +2008_008497 +2008_008496 +2008_008490 +2008_008488 +2008_008487 +2008_008482 +2008_008480 +2008_008479 +2008_008476 +2008_008474 +2008_008470 +2008_008467 +2008_008466 +2008_008464 +2008_008462 +2008_008461 +2008_008455 +2008_008453 +2008_008450 +2008_008447 +2008_008446 +2008_008444 +2008_008443 +2008_008440 +2008_008439 +2008_008437 +2008_008435 +2008_008433 +2008_008432 +2008_008431 +2008_008429 +2008_008428 +2008_008423 +2008_008416 +2008_008411 +2008_008410 +2008_008406 +2008_008404 +2008_008403 +2008_008402 +2008_008395 +2008_008388 +2008_008387 +2008_008384 +2008_008382 +2008_008380 +2008_008379 +2008_008377 +2008_008376 +2008_008373 +2008_008370 +2008_008368 +2008_008366 +2008_008365 +2008_008364 +2008_008363 +2008_008359 +2008_008357 +2008_008356 +2008_008354 +2008_008347 +2008_008346 +2008_008345 +2008_008344 +2008_008343 +2008_008342 +2008_008341 +2008_008338 +2008_008337 +2008_008336 +2008_008331 +2008_008330 +2008_008325 +2008_008324 +2008_008323 +2008_008322 +2008_008321 +2008_008320 +2008_008319 +2008_008318 +2008_008315 +2008_008314 +2008_008313 +2008_008310 +2008_008309 +2008_008307 +2008_008302 +2008_008300 +2008_008297 +2008_008294 +2008_008292 +2008_008288 +2008_008287 +2008_008284 +2008_008281 +2008_008279 +2008_008276 +2008_008275 +2008_008274 +2008_008272 +2008_008271 +2008_008269 +2008_008266 +2008_008263 +2008_008262 +2008_008257 +2008_008254 +2008_008246 +2008_008242 +2008_008241 +2008_008237 +2008_008235 +2008_008234 +2008_008233 +2008_008232 +2008_008231 +2008_008229 +2008_008227 +2008_008224 +2008_008223 +2008_008220 +2008_008218 +2008_008217 +2008_008215 +2008_008212 +2008_008211 +2008_008210 +2008_008208 +2008_008206 +2008_008203 +2008_008200 +2008_008199 +2008_008197 +2008_008194 +2008_008193 +2008_008192 +2008_008191 +2008_008190 +2008_008185 +2008_008184 +2008_008180 +2008_008179 +2008_008177 +2008_008176 +2008_008175 +2008_008170 +2008_008169 +2008_008166 +2008_008162 +2008_008155 +2008_008154 +2008_008152 +2008_008150 +2008_008148 +2008_008147 +2008_008146 +2008_008145 +2008_008141 +2008_008134 +2008_008132 +2008_008130 +2008_008125 +2008_008123 +2008_008122 +2008_008121 +2008_008120 +2008_008116 +2008_008115 +2008_008113 +2008_008112 +2008_008109 +2008_008106 +2008_008105 +2008_008098 +2008_008097 +2008_008096 +2008_008095 +2008_008093 +2008_008091 +2008_008086 +2008_008084 +2008_008083 +2008_008080 +2008_008075 +2008_008074 +2008_008073 +2008_008072 +2008_008070 +2008_008069 +2008_008066 +2008_008064 +2008_008058 +2008_008057 +2008_008055 +2008_008052 +2008_008048 +2008_008044 +2008_008043 +2008_008040 +2008_008037 +2008_008034 +2008_008031 +2008_008029 +2008_008028 +2008_008025 +2008_008024 +2008_008022 +2008_008021 +2008_008020 +2008_008018 +2008_008012 +2008_008011 +2008_008007 +2008_008004 +2008_008002 +2008_008001 +2008_007999 +2008_007998 +2008_007997 +2008_007993 +2008_007990 +2008_007989 +2008_007988 +2008_007987 +2008_007986 +2008_007985 +2008_007981 +2008_007977 +2008_007975 +2008_007973 +2008_007970 +2008_007969 +2008_007966 +2008_007964 +2008_007962 +2008_007955 +2008_007954 +2008_007953 +2008_007950 +2008_007949 +2008_007948 +2008_007947 +2008_007942 +2008_007941 +2008_007940 +2008_007938 +2008_007937 +2008_007936 +2008_007935 +2008_007933 +2008_007932 +2008_007931 +2008_007928 +2008_007923 +2008_007922 +2008_007918 +2008_007917 +2008_007916 +2008_007915 +2008_007914 +2008_007913 +2008_007912 +2008_007909 +2008_007907 +2008_007904 +2008_007902 +2008_007897 +2008_007895 +2008_007893 +2008_007891 +2008_007890 +2008_007888 +2008_007887 +2008_007884 +2008_007883 +2008_007882 +2008_007879 +2008_007877 +2008_007875 +2008_007873 +2008_007872 +2008_007871 +2008_007870 +2008_007869 +2008_007864 +2008_007861 +2008_007858 +2008_007855 +2008_007854 +2008_007853 +2008_007852 +2008_007850 +2008_007848 +2008_007843 +2008_007842 +2008_007841 +2008_007840 +2008_007839 +2008_007837 +2008_007835 +2008_007833 +2008_007831 +2008_007829 +2008_007827 +2008_007825 +2008_007823 +2008_007819 +2008_007817 +2008_007816 +2008_007812 +2008_007806 +2008_007805 +2008_007798 +2008_007794 +2008_007793 +2008_007791 +2008_007789 +2008_007788 +2008_007787 +2008_007786 +2008_007781 +2008_007780 +2008_007779 +2008_007777 +2008_007770 +2008_007768 +2008_007766 +2008_007764 +2008_007761 +2008_007760 +2008_007759 +2008_007758 +2008_007757 +2008_007755 +2008_007752 +2008_007750 +2008_007749 +2008_007748 +2008_007746 +2008_007745 +2008_007742 +2008_007741 +2008_007739 +2008_007736 +2008_007735 +2008_007733 +2008_007730 +2008_007729 +2008_007726 +2008_007724 +2008_007719 +2008_007717 +2008_007716 +2008_007714 +2008_007710 +2008_007709 +2008_007706 +2008_007704 +2008_007702 +2008_007701 +2008_007698 +2008_007697 +2008_007696 +2008_007694 +2008_007693 +2008_007692 +2008_007691 +2008_007690 +2008_007688 +2008_007685 +2008_007683 +2008_007682 +2008_007676 +2008_007673 +2008_007669 +2008_007668 +2008_007666 +2008_007665 +2008_007664 +2008_007662 +2008_007661 +2008_007660 +2008_007656 +2008_007653 +2008_007649 +2008_007648 +2008_007646 +2008_007643 +2008_007641 +2008_007640 +2008_007635 +2008_007632 +2008_007630 +2008_007629 +2008_007625 +2008_007623 +2008_007621 +2008_007618 +2008_007617 +2008_007613 +2008_007612 +2008_007611 +2008_007610 +2008_007608 +2008_007604 +2008_007599 +2008_007597 +2008_007595 +2008_007594 +2008_007593 +2008_007591 +2008_007589 +2008_007588 +2008_007587 +2008_007586 +2008_007585 +2008_007584 +2008_007583 +2008_007581 +2008_007579 +2008_007576 +2008_007574 +2008_007573 +2008_007567 +2008_007565 +2008_007561 +2008_007559 +2008_007558 +2008_007556 +2008_007546 +2008_007544 +2008_007538 +2008_007537 +2008_007536 +2008_007534 +2008_007533 +2008_007531 +2008_007529 +2008_007528 +2008_007525 +2008_007524 +2008_007521 +2008_007519 +2008_007515 +2008_007514 +2008_007511 +2008_007510 +2008_007509 +2008_007504 +2008_007501 +2008_007500 +2008_007496 +2008_007494 +2008_007491 +2008_007488 +2008_007486 +2008_007485 +2008_007480 +2008_007478 +2008_007477 +2008_007476 +2008_007473 +2008_007472 +2008_007471 +2008_007470 +2008_007469 +2008_007466 +2008_007465 +2008_007461 +2008_007459 +2008_007458 +2008_007456 +2008_007455 +2008_007452 +2008_007448 +2008_007446 +2008_007444 +2008_007443 +2008_007442 +2008_007441 +2008_007438 +2008_007435 +2008_007434 +2008_007433 +2008_007432 +2008_007431 +2008_007430 +2008_007428 +2008_007425 +2008_007424 +2008_007423 +2008_007421 +2008_007417 +2008_007415 +2008_007410 +2008_007409 +2008_007404 +2008_007403 +2008_007398 +2008_007397 +2008_007394 +2008_007393 +2008_007390 +2008_007389 +2008_007388 +2008_007384 +2008_007383 +2008_007382 +2008_007375 +2008_007374 +2008_007364 +2008_007363 +2008_007361 +2008_007358 +2008_007357 +2008_007356 +2008_007355 +2008_007353 +2008_007352 +2008_007348 +2008_007346 +2008_007344 +2008_007339 +2008_007336 +2008_007335 +2008_007334 +2008_007332 +2008_007327 +2008_007325 +2008_007324 +2008_007323 +2008_007321 +2008_007320 +2008_007319 +2008_007317 +2008_007314 +2008_007313 +2008_007312 +2008_007311 +2008_007307 +2008_007305 +2008_007298 +2008_007295 +2008_007293 +2008_007291 +2008_007289 +2008_007287 +2008_007286 +2008_007285 +2008_007282 +2008_007281 +2008_007280 +2008_007279 +2008_007277 +2008_007274 +2008_007266 +2008_007265 +2008_007264 +2008_007261 +2008_007260 +2008_007256 +2008_007254 +2008_007252 +2008_007250 +2008_007247 +2008_007246 +2008_007245 +2008_007242 +2008_007241 +2008_007239 +2008_007237 +2008_007236 +2008_007231 +2008_007229 +2008_007227 +2008_007226 +2008_007225 +2008_007223 +2008_007222 +2008_007221 +2008_007218 +2008_007217 +2008_007216 +2008_007214 +2008_007211 +2008_007208 +2008_007207 +2008_007205 +2008_007201 +2008_007197 +2008_007196 +2008_007195 +2008_007190 +2008_007189 +2008_007188 +2008_007187 +2008_007185 +2008_007184 +2008_007182 +2008_007181 +2008_007179 +2008_007176 +2008_007171 +2008_007169 +2008_007168 +2008_007167 +2008_007166 +2008_007165 +2008_007164 +2008_007163 +2008_007161 +2008_007156 +2008_007151 +2008_007147 +2008_007146 +2008_007145 +2008_007142 +2008_007138 +2008_007134 +2008_007133 +2008_007131 +2008_007130 +2008_007129 +2008_007124 +2008_007119 +2008_007118 +2008_007115 +2008_007114 +2008_007112 +2008_007108 +2008_007106 +2008_007105 +2008_007103 +2008_007101 +2008_007098 +2008_007097 +2008_007095 +2008_007091 +2008_007090 +2008_007086 +2008_007085 +2008_007084 +2008_007082 +2008_007081 +2008_007076 +2008_007075 +2008_007073 +2008_007070 +2008_007069 +2008_007067 +2008_007064 +2008_007061 +2008_007060 +2008_007059 +2008_007058 +2008_007057 +2008_007056 +2008_007054 +2008_007050 +2008_007045 +2008_007043 +2008_007042 +2008_007039 +2008_007038 +2008_007034 +2008_007032 +2008_007030 +2008_007028 +2008_007026 +2008_007022 +2008_007021 +2008_007019 +2008_007014 +2008_007012 +2008_007011 +2008_007010 +2008_007009 +2008_007006 +2008_007004 +2008_007003 +2008_006999 +2008_006998 +2008_006997 +2008_006992 +2008_006991 +2008_006989 +2008_006987 +2008_006980 +2008_006979 +2008_006973 +2008_006969 +2008_006968 +2008_006967 +2008_006965 +2008_006962 +2008_006961 +2008_006960 +2008_006959 +2008_006956 +2008_006954 +2008_006953 +2008_006952 +2008_006951 +2008_006950 +2008_006949 +2008_006948 +2008_006946 +2008_006944 +2008_006941 +2008_006939 +2008_006936 +2008_006933 +2008_006926 +2008_006925 +2008_006924 +2008_006923 +2008_006921 +2008_006920 +2008_006919 +2008_006912 +2008_006910 +2008_006909 +2008_006908 +2008_006907 +2008_006904 +2008_006903 +2008_006902 +2008_006900 +2008_006898 +2008_006896 +2008_006892 +2008_006890 +2008_006889 +2008_006885 +2008_006882 +2008_006881 +2008_006880 +2008_006879 +2008_006877 +2008_006873 +2008_006872 +2008_006870 +2008_006868 +2008_006865 +2008_006864 +2008_006863 +2008_006857 +2008_006855 +2008_006849 +2008_006847 +2008_006844 +2008_006843 +2008_006841 +2008_006839 +2008_006837 +2008_006834 +2008_006833 +2008_006832 +2008_006831 +2008_006828 +2008_006827 +2008_006825 +2008_006824 +2008_006820 +2008_006819 +2008_006818 +2008_006817 +2008_006816 +2008_006815 +2008_006813 +2008_006811 +2008_006810 +2008_006808 +2008_006807 +2008_006802 +2008_006800 +2008_006798 +2008_006797 +2008_006796 +2008_006793 +2008_006792 +2008_006785 +2008_006781 +2008_006779 +2008_006778 +2008_006777 +2008_006776 +2008_006774 +2008_006773 +2008_006767 +2008_006765 +2008_006764 +2008_006762 +2008_006761 +2008_006758 +2008_006753 +2008_006751 +2008_006750 +2008_006748 +2008_006747 +2008_006746 +2008_006743 +2008_006737 +2008_006733 +2008_006732 +2008_006731 +2008_006730 +2008_006728 +2008_006724 +2008_006719 +2008_006718 +2008_006717 +2008_006716 +2008_006715 +2008_006714 +2008_006712 +2008_006710 +2008_006708 +2008_006705 +2008_006701 +2008_006696 +2008_006694 +2008_006692 +2008_006691 +2008_006690 +2008_006686 +2008_006684 +2008_006682 +2008_006677 +2008_006671 +2008_006668 +2008_006667 +2008_006665 +2008_006663 +2008_006662 +2008_006660 +2008_006657 +2008_006656 +2008_006655 +2008_006654 +2008_006650 +2008_006649 +2008_006646 +2008_006645 +2008_006642 +2008_006641 +2008_006638 +2008_006637 +2008_006635 +2008_006634 +2008_006631 +2008_006629 +2008_006626 +2008_006625 +2008_006624 +2008_006623 +2008_006621 +2008_006619 +2008_006617 +2008_006616 +2008_006614 +2008_006613 +2008_006611 +2008_006610 +2008_006609 +2008_006606 +2008_006605 +2008_006604 +2008_006602 +2008_006600 +2008_006599 +2008_006598 +2008_006591 +2008_006588 +2008_006587 +2008_006586 +2008_006585 +2008_006579 +2008_006578 +2008_006576 +2008_006570 +2008_006568 +2008_006567 +2008_006566 +2008_006564 +2008_006562 +2008_006561 +2008_006558 +2008_006549 +2008_006548 +2008_006547 +2008_006546 +2008_006543 +2008_006538 +2008_006534 +2008_006530 +2008_006524 +2008_006522 +2008_006520 +2008_006519 +2008_006517 +2008_006512 +2008_006511 +2008_006509 +2008_006503 +2008_006502 +2008_006500 +2008_006497 +2008_006496 +2008_006491 +2008_006490 +2008_006489 +2008_006488 +2008_006487 +2008_006483 +2008_006482 +2008_006481 +2008_006477 +2008_006475 +2008_006474 +2008_006470 +2008_006467 +2008_006463 +2008_006462 +2008_006461 +2008_006458 +2008_006452 +2008_006449 +2008_006448 +2008_006447 +2008_006441 +2008_006438 +2008_006436 +2008_006434 +2008_006433 +2008_006432 +2008_006430 +2008_006429 +2008_006427 +2008_006425 +2008_006424 +2008_006421 +2008_006419 +2008_006417 +2008_006416 +2008_006410 +2008_006409 +2008_006407 +2008_006404 +2008_006403 +2008_006401 +2008_006400 +2008_006397 +2008_006394 +2008_006392 +2008_006390 +2008_006389 +2008_006387 +2008_006386 +2008_006384 +2008_006382 +2008_006377 +2008_006376 +2008_006373 +2008_006370 +2008_006369 +2008_006368 +2008_006366 +2008_006365 +2008_006364 +2008_006362 +2008_006361 +2008_006359 +2008_006356 +2008_006355 +2008_006353 +2008_006351 +2008_006350 +2008_006349 +2008_006347 +2008_006345 +2008_006339 +2008_006337 +2008_006336 +2008_006335 +2008_006331 +2008_006330 +2008_006329 +2008_006323 +2008_006320 +2008_006317 +2008_006316 +2008_006315 +2008_006311 +2008_006310 +2008_006307 +2008_006303 +2008_006300 +2008_006298 +2008_006295 +2008_006294 +2008_006290 +2008_006289 +2008_006288 +2008_006285 +2008_006282 +2008_006281 +2008_006280 +2008_006276 +2008_006273 +2008_006272 +2008_006271 +2008_006269 +2008_006267 +2008_006265 +2008_006262 +2008_006258 +2008_006257 +2008_006256 +2008_006253 +2008_006250 +2008_006249 +2008_006244 +2008_006242 +2008_006240 +2008_006239 +2008_006235 +2008_006234 +2008_006233 +2008_006232 +2008_006227 +2008_006225 +2008_006224 +2008_006222 +2008_006221 +2008_006220 +2008_006218 +2008_006215 +2008_006213 +2008_006211 +2008_006210 +2008_006207 +2008_006205 +2008_006203 +2008_006200 +2008_006195 +2008_006194 +2008_006192 +2008_006190 +2008_006188 +2008_006186 +2008_006185 +2008_006182 +2008_006181 +2008_006179 +2008_006178 +2008_006175 +2008_006170 +2008_006169 +2008_006166 +2008_006164 +2008_006163 +2008_006158 +2008_006154 +2008_006152 +2008_006151 +2008_006148 +2008_006147 +2008_006145 +2008_006144 +2008_006140 +2008_006136 +2008_006135 +2008_006133 +2008_006129 +2008_006128 +2008_006124 +2008_006121 +2008_006120 +2008_006119 +2008_006117 +2008_006113 +2008_006112 +2008_006111 +2008_006109 +2008_006104 +2008_006102 +2008_006100 +2008_006099 +2008_006096 +2008_006094 +2008_006092 +2008_006090 +2008_006088 +2008_006087 +2008_006085 +2008_006082 +2008_006081 +2008_006078 +2008_006076 +2008_006074 +2008_006072 +2008_006071 +2008_006070 +2008_006068 +2008_006067 +2008_006065 +2008_006064 +2008_006062 +2008_006059 +2008_006058 +2008_006052 +2008_006050 +2008_006049 +2008_006047 +2008_006046 +2008_006045 +2008_006042 +2008_006041 +2008_006039 +2008_006038 +2008_006037 +2008_006032 +2008_006031 +2008_006028 +2008_006027 +2008_006024 +2008_006021 +2008_006020 +2008_006017 +2008_006014 +2008_006010 +2008_006007 +2008_006004 +2008_006002 +2008_006000 +2008_005997 +2008_005991 +2008_005989 +2008_005987 +2008_005984 +2008_005982 +2008_005980 +2008_005979 +2008_005978 +2008_005977 +2008_005976 +2008_005975 +2008_005972 +2008_005970 +2008_005968 +2008_005967 +2008_005964 +2008_005962 +2008_005960 +2008_005959 +2008_005957 +2008_005956 +2008_005954 +2008_005953 +2008_005945 +2008_005943 +2008_005939 +2008_005938 +2008_005937 +2008_005936 +2008_005935 +2008_005934 +2008_005933 +2008_005929 +2008_005928 +2008_005926 +2008_005924 +2008_005923 +2008_005921 +2008_005918 +2008_005916 +2008_005914 +2008_005907 +2008_005903 +2008_005902 +2008_005898 +2008_005897 +2008_005893 +2008_005891 +2008_005890 +2008_005889 +2008_005884 +2008_005883 +2008_005882 +2008_005881 +2008_005878 +2008_005877 +2008_005875 +2008_005874 +2008_005873 +2008_005871 +2008_005869 +2008_005867 +2008_005865 +2008_005863 +2008_005860 +2008_005857 +2008_005856 +2008_005855 +2008_005853 +2008_005850 +2008_005848 +2008_005847 +2008_005846 +2008_005845 +2008_005843 +2008_005839 +2008_005838 +2008_005834 +2008_005832 +2008_005831 +2008_005825 +2008_005823 +2008_005822 +2008_005821 +2008_005818 +2008_005817 +2008_005816 +2008_005810 +2008_005808 +2008_005805 +2008_005803 +2008_005801 +2008_005800 +2008_005798 +2008_005796 +2008_005794 +2008_005792 +2008_005791 +2008_005790 +2008_005788 +2008_005780 +2008_005779 +2008_005777 +2008_005774 +2008_005770 +2008_005768 +2008_005767 +2008_005764 +2008_005763 +2008_005761 +2008_005758 +2008_005757 +2008_005752 +2008_005750 +2008_005748 +2008_005747 +2008_005742 +2008_005739 +2008_005737 +2008_005736 +2008_005735 +2008_005734 +2008_005732 +2008_005728 +2008_005726 +2008_005724 +2008_005721 +2008_005720 +2008_005719 +2008_005716 +2008_005714 +2008_005713 +2008_005707 +2008_005706 +2008_005705 +2008_005703 +2008_005702 +2008_005701 +2008_005699 +2008_005698 +2008_005695 +2008_005687 +2008_005686 +2008_005685 +2008_005683 +2008_005682 +2008_005681 +2008_005679 +2008_005678 +2008_005677 +2008_005675 +2008_005673 +2008_005668 +2008_005664 +2008_005663 +2008_005660 +2008_005657 +2008_005656 +2008_005653 +2008_005652 +2008_005650 +2008_005649 +2008_005646 +2008_005643 +2008_005641 +2008_005639 +2008_005638 +2008_005636 +2008_005635 +2008_005634 +2008_005631 +2008_005627 +2008_005626 +2008_005625 +2008_005623 +2008_005618 +2008_005616 +2008_005614 +2008_005612 +2008_005611 +2008_005610 +2008_005609 +2008_005608 +2008_005603 +2008_005601 +2008_005600 +2008_005599 +2008_005593 +2008_005591 +2008_005589 +2008_005588 +2008_005584 +2008_005582 +2008_005574 +2008_005573 +2008_005572 +2008_005570 +2008_005569 +2008_005567 +2008_005566 +2008_005564 +2008_005563 +2008_005561 +2008_005560 +2008_005558 +2008_005553 +2008_005552 +2008_005550 +2008_005549 +2008_005548 +2008_005541 +2008_005538 +2008_005536 +2008_005534 +2008_005531 +2008_005530 +2008_005527 +2008_005526 +2008_005523 +2008_005522 +2008_005521 +2008_005519 +2008_005517 +2008_005514 +2008_005512 +2008_005511 +2008_005510 +2008_005507 +2008_005505 +2008_005504 +2008_005502 +2008_005501 +2008_005500 +2008_005498 +2008_005496 +2008_005494 +2008_005491 +2008_005490 +2008_005485 +2008_005484 +2008_005480 +2008_005477 +2008_005473 +2008_005472 +2008_005469 +2008_005467 +2008_005465 +2008_005463 +2008_005460 +2008_005456 +2008_005455 +2008_005451 +2008_005449 +2008_005447 +2008_005446 +2008_005444 +2008_005443 +2008_005436 +2008_005431 +2008_005429 +2008_005427 +2008_005423 +2008_005421 +2008_005417 +2008_005415 +2008_005414 +2008_005412 +2008_005408 +2008_005406 +2008_005405 +2008_005404 +2008_005400 +2008_005396 +2008_005395 +2008_005393 +2008_005386 +2008_005382 +2008_005380 +2008_005379 +2008_005378 +2008_005376 +2008_005375 +2008_005374 +2008_005373 +2008_005369 +2008_005367 +2008_005365 +2008_005363 +2008_005362 +2008_005361 +2008_005360 +2008_005359 +2008_005357 +2008_005356 +2008_005354 +2008_005350 +2008_005349 +2008_005348 +2008_005347 +2008_005346 +2008_005345 +2008_005342 +2008_005337 +2008_005336 +2008_005335 +2008_005333 +2008_005331 +2008_005329 +2008_005327 +2008_005325 +2008_005324 +2008_005323 +2008_005321 +2008_005319 +2008_005316 +2008_005315 +2008_005313 +2008_005310 +2008_005309 +2008_005304 +2008_005303 +2008_005300 +2008_005297 +2008_005296 +2008_005295 +2008_005294 +2008_005288 +2008_005283 +2008_005282 +2008_005281 +2008_005279 +2008_005277 +2008_005276 +2008_005272 +2008_005271 +2008_005270 +2008_005269 +2008_005266 +2008_005261 +2008_005260 +2008_005257 +2008_005255 +2008_005253 +2008_005252 +2008_005251 +2008_005250 +2008_005248 +2008_005247 +2008_005244 +2008_005243 +2008_005240 +2008_005236 +2008_005235 +2008_005234 +2008_005233 +2008_005231 +2008_005221 +2008_005220 +2008_005218 +2008_005216 +2008_005215 +2008_005214 +2008_005213 +2008_005209 +2008_005208 +2008_005205 +2008_005204 +2008_005201 +2008_005196 +2008_005194 +2008_005193 +2008_005191 +2008_005190 +2008_005186 +2008_005185 +2008_005182 +2008_005181 +2008_005178 +2008_005174 +2008_005171 +2008_005168 +2008_005167 +2008_005166 +2008_005160 +2008_005159 +2008_005156 +2008_005151 +2008_005150 +2008_005147 +2008_005146 +2008_005140 +2008_005139 +2008_005137 +2008_005136 +2008_005134 +2008_005133 +2008_005132 +2008_005127 +2008_005123 +2008_005117 +2008_005115 +2008_005114 +2008_005111 +2008_005110 +2008_005109 +2008_005108 +2008_005107 +2008_005101 +2008_005098 +2008_005096 +2008_005094 +2008_005092 +2008_005090 +2008_005088 +2008_005085 +2008_005084 +2008_005082 +2008_005081 +2008_005080 +2008_005078 +2008_005074 +2008_005072 +2008_005071 +2008_005070 +2008_005068 +2008_005066 +2008_005065 +2008_005064 +2008_005063 +2008_005061 +2008_005057 +2008_005055 +2008_005054 +2008_005051 +2008_005046 +2008_005045 +2008_005043 +2008_005042 +2008_005040 +2008_005037 +2008_005036 +2008_005035 +2008_005033 +2008_005032 +2008_005023 +2008_005016 +2008_005015 +2008_005013 +2008_005010 +2008_005008 +2008_005006 +2008_005003 +2008_005001 +2008_005000 +2008_004998 +2008_004991 +2008_004990 +2008_004985 +2008_004984 +2008_004983 +2008_004982 +2008_004981 +2008_004979 +2008_004977 +2008_004976 +2008_004975 +2008_004974 +2008_004973 +2008_004970 +2008_004969 +2008_004968 +2008_004967 +2008_004966 +2008_004964 +2008_004961 +2008_004955 +2008_004950 +2008_004948 +2008_004946 +2008_004945 +2008_004942 +2008_004940 +2008_004938 +2008_004937 +2008_004935 +2008_004934 +2008_004933 +2008_004931 +2008_004930 +2008_004926 +2008_004923 +2008_004921 +2008_004920 +2008_004917 +2008_004914 +2008_004911 +2008_004908 +2008_004907 +2008_004904 +2008_004900 +2008_004899 +2008_004898 +2008_004896 +2008_004894 +2008_004893 +2008_004892 +2008_004887 +2008_004885 +2008_004881 +2008_004876 +2008_004875 +2008_004874 +2008_004873 +2008_004872 +2008_004869 +2008_004868 +2008_004866 +2008_004862 +2008_004858 +2008_004856 +2008_004852 +2008_004851 +2008_004850 +2008_004849 +2008_004847 +2008_004845 +2008_004844 +2008_004841 +2008_004838 +2008_004837 +2008_004834 +2008_004833 +2008_004832 +2008_004827 +2008_004825 +2008_004822 +2008_004821 +2008_004819 +2008_004814 +2008_004812 +2008_004808 +2008_004807 +2008_004805 +2008_004804 +2008_004802 +2008_004797 +2008_004795 +2008_004794 +2008_004786 +2008_004784 +2008_004783 +2008_004781 +2008_004778 +2008_004777 +2008_004776 +2008_004774 +2008_004771 +2008_004770 +2008_004768 +2008_004767 +2008_004766 +2008_004764 +2008_004763 +2008_004760 +2008_004756 +2008_004752 +2008_004750 +2008_004749 +2008_004745 +2008_004742 +2008_004740 +2008_004739 +2008_004736 +2008_004732 +2008_004730 +2008_004729 +2008_004726 +2008_004725 +2008_004722 +2008_004720 +2008_004719 +2008_004718 +2008_004713 +2008_004711 +2008_004707 +2008_004706 +2008_004703 +2008_004702 +2008_004697 +2008_004696 +2008_004695 +2008_004692 +2008_004690 +2008_004689 +2008_004688 +2008_004684 +2008_004679 +2008_004678 +2008_004677 +2008_004672 +2008_004671 +2008_004670 +2008_004668 +2008_004667 +2008_004666 +2008_004665 +2008_004663 +2008_004662 +2008_004661 +2008_004653 +2008_004649 +2008_004648 +2008_004647 +2008_004646 +2008_004640 +2008_004636 +2008_004635 +2008_004634 +2008_004633 +2008_004632 +2008_004631 +2008_004630 +2008_004629 +2008_004620 +2008_004619 +2008_004617 +2008_004616 +2008_004615 +2008_004614 +2008_004613 +2008_004611 +2008_004607 +2008_004606 +2008_004605 +2008_004603 +2008_004602 +2008_004599 +2008_004593 +2008_004592 +2008_004590 +2008_004589 +2008_004588 +2008_004585 +2008_004584 +2008_004583 +2008_004581 +2008_004579 +2008_004574 +2008_004570 +2008_004568 +2008_004567 +2008_004564 +2008_004559 +2008_004554 +2008_004553 +2008_004551 +2008_004550 +2008_004549 +2008_004547 +2008_004546 +2008_004545 +2008_004544 +2008_004541 +2008_004540 +2008_004539 +2008_004538 +2008_004534 +2008_004533 +2008_004532 +2008_004528 +2008_004526 +2008_004525 +2008_004522 +2008_004520 +2008_004519 +2008_004515 +2008_004513 +2008_004512 +2008_004510 +2008_004506 +2008_004505 +2008_004504 +2008_004502 +2008_004501 +2008_004499 +2008_004498 +2008_004497 +2008_004493 +2008_004492 +2008_004490 +2008_004488 +2008_004487 +2008_004482 +2008_004480 +2008_004479 +2008_004478 +2008_004476 +2008_004471 +2008_004470 +2008_004469 +2008_004464 +2008_004462 +2008_004460 +2008_004459 +2008_004458 +2008_004457 +2008_004455 +2008_004452 +2008_004450 +2008_004445 +2008_004443 +2008_004441 +2008_004439 +2008_004438 +2008_004436 +2008_004435 +2008_004431 +2008_004430 +2008_004428 +2008_004427 +2008_004426 +2008_004425 +2008_004422 +2008_004419 +2008_004418 +2008_004417 +2008_004416 +2008_004414 +2008_004412 +2008_004411 +2008_004410 +2008_004408 +2008_004406 +2008_004403 +2008_004402 +2008_004398 +2008_004394 +2008_004391 +2008_004389 +2008_004387 +2008_004385 +2008_004384 +2008_004380 +2008_004378 +2008_004374 +2008_004372 +2008_004371 +2008_004365 +2008_004362 +2008_004361 +2008_004358 +2008_004357 +2008_004354 +2008_004353 +2008_004348 +2008_004347 +2008_004344 +2008_004342 +2008_004333 +2008_004330 +2008_004328 +2008_004327 +2008_004326 +2008_004325 +2008_004324 +2008_004321 +2008_004319 +2008_004318 +2008_004317 +2008_004314 +2008_004313 +2008_004312 +2008_004308 +2008_004307 +2008_004306 +2008_004303 +2008_004301 +2008_004297 +2008_004296 +2008_004293 +2008_004292 +2008_004291 +2008_004290 +2008_004289 +2008_004288 +2008_004287 +2008_004284 +2008_004280 +2008_004278 +2008_004276 +2008_004274 +2008_004273 +2008_004271 +2008_004270 +2008_004269 +2008_004265 +2008_004263 +2008_004259 +2008_004258 +2008_004257 +2008_004251 +2008_004247 +2008_004246 +2008_004245 +2008_004243 +2008_004242 +2008_004239 +2008_004235 +2008_004234 +2008_004232 +2008_004231 +2008_004230 +2008_004224 +2008_004221 +2008_004218 +2008_004217 +2008_004216 +2008_004214 +2008_004213 +2008_004208 +2008_004205 +2008_004203 +2008_004201 +2008_004198 +2008_004196 +2008_004195 +2008_004190 +2008_004189 +2008_004188 +2008_004182 +2008_004178 +2008_004176 +2008_004174 +2008_004171 +2008_004166 +2008_004165 +2008_004163 +2008_004161 +2008_004155 +2008_004148 +2008_004147 +2008_004145 +2008_004142 +2008_004138 +2008_004137 +2008_004135 +2008_004134 +2008_004130 +2008_004127 +2008_004126 +2008_004125 +2008_004124 +2008_004123 +2008_004122 +2008_004121 +2008_004120 +2008_004119 +2008_004113 +2008_004112 +2008_004110 +2008_004106 +2008_004105 +2008_004103 +2008_004102 +2008_004100 +2008_004097 +2008_004093 +2008_004092 +2008_004090 +2008_004088 +2008_004087 +2008_004084 +2008_004081 +2008_004080 +2008_004077 +2008_004076 +2008_004075 +2008_004074 +2008_004071 +2008_004066 +2008_004064 +2008_004058 +2008_004056 +2008_004055 +2008_004054 +2008_004053 +2008_004048 +2008_004046 +2008_004045 +2008_004044 +2008_004042 +2008_004040 +2008_004037 +2008_004036 +2008_004030 +2008_004027 +2008_004026 +2008_004024 +2008_004022 +2008_004021 +2008_004020 +2008_004018 +2008_004017 +2008_004016 +2008_004015 +2008_004014 +2008_004008 +2008_004007 +2008_004006 +2008_004004 +2008_004003 +2008_004002 +2008_003998 +2008_003997 +2008_003996 +2008_003995 +2008_003992 +2008_003988 +2008_003986 +2008_003985 +2008_003984 +2008_003983 +2008_003978 +2008_003975 +2008_003974 +2008_003971 +2008_003970 +2008_003969 +2008_003967 +2008_003965 +2008_003962 +2008_003958 +2008_003956 +2008_003951 +2008_003948 +2008_003947 +2008_003945 +2008_003944 +2008_003943 +2008_003942 +2008_003941 +2008_003940 +2008_003939 +2008_003933 +2008_003932 +2008_003929 +2008_003925 +2008_003924 +2008_003922 +2008_003921 +2008_003920 +2008_003916 +2008_003915 +2008_003914 +2008_003913 +2008_003908 +2008_003905 +2008_003904 +2008_003894 +2008_003892 +2008_003891 +2008_003888 +2008_003884 +2008_003883 +2008_003882 +2008_003881 +2008_003873 +2008_003871 +2008_003870 +2008_003868 +2008_003866 +2008_003864 +2008_003860 +2008_003854 +2008_003852 +2008_003849 +2008_003847 +2008_003844 +2008_003843 +2008_003841 +2008_003840 +2008_003838 +2008_003835 +2008_003831 +2008_003830 +2008_003829 +2008_003827 +2008_003826 +2008_003825 +2008_003820 +2008_003819 +2008_003815 +2008_003814 +2008_003813 +2008_003812 +2008_003811 +2008_003805 +2008_003802 +2008_003801 +2008_003800 +2008_003799 +2008_003796 +2008_003794 +2008_003793 +2008_003791 +2008_003789 +2008_003788 +2008_003781 +2008_003780 +2008_003779 +2008_003776 +2008_003775 +2008_003774 +2008_003773 +2008_003772 +2008_003769 +2008_003768 +2008_003767 +2008_003766 +2008_003764 +2008_003763 +2008_003762 +2008_003761 +2008_003756 +2008_003755 +2008_003754 +2008_003753 +2008_003749 +2008_003748 +2008_003746 +2008_003745 +2008_003744 +2008_003743 +2008_003737 +2008_003732 +2008_003729 +2008_003726 +2008_003722 +2008_003721 +2008_003720 +2008_003719 +2008_003718 +2008_003712 +2008_003707 +2008_003706 +2008_003704 +2008_003703 +2008_003701 +2008_003697 +2008_003694 +2008_003691 +2008_003689 +2008_003688 +2008_003685 +2008_003684 +2008_003683 +2008_003682 +2008_003681 +2008_003680 +2008_003677 +2008_003675 +2008_003674 +2008_003673 +2008_003672 +2008_003671 +2008_003667 +2008_003665 +2008_003662 +2008_003659 +2008_003658 +2008_003655 +2008_003653 +2008_003652 +2008_003650 +2008_003647 +2008_003645 +2008_003638 +2008_003637 +2008_003636 +2008_003635 +2008_003629 +2008_003626 +2008_003624 +2008_003622 +2008_003619 +2008_003618 +2008_003617 +2008_003613 +2008_003611 +2008_003610 +2008_003609 +2008_003608 +2008_003607 +2008_003604 +2008_003598 +2008_003596 +2008_003593 +2008_003592 +2008_003591 +2008_003590 +2008_003589 +2008_003587 +2008_003585 +2008_003582 +2008_003580 +2008_003579 +2008_003578 +2008_003575 +2008_003572 +2008_003571 +2008_003565 +2008_003562 +2008_003560 +2008_003559 +2008_003557 +2008_003552 +2008_003547 +2008_003545 +2008_003544 +2008_003542 +2008_003534 +2008_003533 +2008_003531 +2008_003526 +2008_003524 +2008_003523 +2008_003522 +2008_003521 +2008_003520 +2008_003519 +2008_003515 +2008_003514 +2008_003510 +2008_003507 +2008_003504 +2008_003501 +2008_003500 +2008_003498 +2008_003497 +2008_003496 +2008_003493 +2008_003489 +2008_003488 +2008_003485 +2008_003484 +2008_003483 +2008_003482 +2008_003480 +2008_003479 +2008_003478 +2008_003475 +2008_003472 +2008_003469 +2008_003467 +2008_003466 +2008_003464 +2008_003463 +2008_003462 +2008_003458 +2008_003453 +2008_003452 +2008_003449 +2008_003448 +2008_003447 +2008_003443 +2008_003442 +2008_003439 +2008_003437 +2008_003435 +2008_003434 +2008_003433 +2008_003432 +2008_003430 +2008_003429 +2008_003426 +2008_003424 +2008_003423 +2008_003420 +2008_003418 +2008_003417 +2008_003415 +2008_003414 +2008_003409 +2008_003407 +2008_003406 +2008_003405 +2008_003402 +2008_003395 +2008_003394 +2008_003393 +2008_003386 +2008_003384 +2008_003382 +2008_003381 +2008_003380 +2008_003378 +2008_003374 +2008_003373 +2008_003362 +2008_003361 +2008_003360 +2008_003359 +2008_003351 +2008_003350 +2008_003348 +2008_003347 +2008_003344 +2008_003343 +2008_003342 +2008_003338 +2008_003336 +2008_003335 +2008_003334 +2008_003331 +2008_003329 +2008_003326 +2008_003323 +2008_003321 +2008_003320 +2008_003318 +2008_003316 +2008_003313 +2008_003311 +2008_003305 +2008_003304 +2008_003303 +2008_003302 +2008_003300 +2008_003297 +2008_003295 +2008_003291 +2008_003290 +2008_003289 +2008_003288 +2008_003287 +2008_003286 +2008_003283 +2008_003280 +2008_003278 +2008_003277 +2008_003276 +2008_003275 +2008_003272 +2008_003271 +2008_003269 +2008_003266 +2008_003265 +2008_003264 +2008_003263 +2008_003261 +2008_003256 +2008_003255 +2008_003252 +2008_003251 +2008_003249 +2008_003248 +2008_003245 +2008_003244 +2008_003242 +2008_003239 +2008_003232 +2008_003231 +2008_003228 +2008_003225 +2008_003224 +2008_003222 +2008_003220 +2008_003213 +2008_003211 +2008_003209 +2008_003208 +2008_003205 +2008_003203 +2008_003202 +2008_003200 +2008_003196 +2008_003193 +2008_003191 +2008_003189 +2008_003187 +2008_003186 +2008_003182 +2008_003181 +2008_003180 +2008_003178 +2008_003170 +2008_003168 +2008_003167 +2008_003161 +2008_003160 +2008_003157 +2008_003154 +2008_003152 +2008_003151 +2008_003147 +2008_003146 +2008_003144 +2008_003143 +2008_003140 +2008_003136 +2008_003134 +2008_003133 +2008_003132 +2008_003128 +2008_003127 +2008_003122 +2008_003120 +2008_003114 +2008_003112 +2008_003107 +2008_003106 +2008_003104 +2008_003101 +2008_003100 +2008_003099 +2008_003095 +2008_003094 +2008_003093 +2008_003090 +2008_003089 +2008_003088 +2008_003087 +2008_003083 +2008_003082 +2008_003081 +2008_003079 +2008_003075 +2008_003073 +2008_003072 +2008_003068 +2008_003067 +2008_003065 +2008_003063 +2008_003062 +2008_003061 +2008_003060 +2008_003059 +2008_003057 +2008_003056 +2008_003055 +2008_003053 +2008_003052 +2008_003051 +2008_003049 +2008_003048 +2008_003045 +2008_003043 +2008_003041 +2008_003039 +2008_003030 +2008_003025 +2008_003023 +2008_003022 +2008_003021 +2008_003020 +2008_003018 +2008_003017 +2008_003015 +2008_003013 +2008_003008 +2008_003005 +2008_003001 +2008_002999 +2008_002997 +2008_002993 +2008_002992 +2008_002988 +2008_002985 +2008_002984 +2008_002983 +2008_002977 +2008_002973 +2008_002972 +2008_002971 +2008_002970 +2008_002968 +2008_002966 +2008_002965 +2008_002961 +2008_002960 +2008_002957 +2008_002956 +2008_002955 +2008_002954 +2008_002951 +2008_002948 +2008_002947 +2008_002946 +2008_002943 +2008_002932 +2008_002931 +2008_002930 +2008_002926 +2008_002922 +2008_002920 +2008_002917 +2008_002916 +2008_002913 +2008_002910 +2008_002909 +2008_002908 +2008_002906 +2008_002903 +2008_002899 +2008_002897 +2008_002894 +2008_002892 +2008_002891 +2008_002890 +2008_002887 +2008_002885 +2008_002883 +2008_002882 +2008_002880 +2008_002879 +2008_002876 +2008_002875 +2008_002873 +2008_002872 +2008_002870 +2008_002869 +2008_002868 +2008_002866 +2008_002860 +2008_002857 +2008_002856 +2008_002854 +2008_002852 +2008_002850 +2008_002848 +2008_002847 +2008_002845 +2008_002843 +2008_002842 +2008_002838 +2008_002834 +2008_002831 +2008_002830 +2008_002829 +2008_002826 +2008_002823 +2008_002820 +2008_002817 +2008_002814 +2008_002813 +2008_002811 +2008_002809 +2008_002808 +2008_002806 +2008_002804 +2008_002801 +2008_002795 +2008_002794 +2008_002793 +2008_002792 +2008_002791 +2008_002789 +2008_002787 +2008_002784 +2008_002783 +2008_002776 +2008_002774 +2008_002773 +2008_002772 +2008_002768 +2008_002767 +2008_002766 +2008_002762 +2008_002760 +2008_002758 +2008_002756 +2008_002753 +2008_002752 +2008_002751 +2008_002750 +2008_002749 +2008_002746 +2008_002741 +2008_002738 +2008_002736 +2008_002735 +2008_002733 +2008_002732 +2008_002730 +2008_002728 +2008_002725 +2008_002720 +2008_002719 +2008_002718 +2008_002716 +2008_002715 +2008_002714 +2008_002712 +2008_002710 +2008_002709 +2008_002705 +2008_002704 +2008_002701 +2008_002700 +2008_002698 +2008_002697 +2008_002696 +2008_002687 +2008_002686 +2008_002684 +2008_002682 +2008_002679 +2008_002678 +2008_002677 +2008_002676 +2008_002675 +2008_002674 +2008_002673 +2008_002672 +2008_002670 +2008_002668 +2008_002666 +2008_002665 +2008_002662 +2008_002653 +2008_002652 +2008_002650 +2008_002649 +2008_002647 +2008_002645 +2008_002643 +2008_002641 +2008_002640 +2008_002639 +2008_002638 +2008_002634 +2008_002631 +2008_002625 +2008_002624 +2008_002622 +2008_002621 +2008_002616 +2008_002613 +2008_002612 +2008_002610 +2008_002606 +2008_002603 +2008_002601 +2008_002599 +2008_002598 +2008_002597 +2008_002590 +2008_002589 +2008_002584 +2008_002583 +2008_002579 +2008_002578 +2008_002576 +2008_002575 +2008_002574 +2008_002568 +2008_002567 +2008_002566 +2008_002564 +2008_002562 +2008_002558 +2008_002555 +2008_002551 +2008_002549 +2008_002547 +2008_002543 +2008_002542 +2008_002541 +2008_002540 +2008_002533 +2008_002527 +2008_002526 +2008_002524 +2008_002523 +2008_002515 +2008_002514 +2008_002512 +2008_002510 +2008_002509 +2008_002508 +2008_002506 +2008_002502 +2008_002501 +2008_002499 +2008_002494 +2008_002491 +2008_002487 +2008_002485 +2008_002484 +2008_002483 +2008_002482 +2008_002481 +2008_002477 +2008_002473 +2008_002471 +2008_002470 +2008_002466 +2008_002465 +2008_002461 +2008_002459 +2008_002458 +2008_002457 +2008_002456 +2008_002454 +2008_002452 +2008_002451 +2008_002448 +2008_002446 +2008_002445 +2008_002444 +2008_002442 +2008_002441 +2008_002439 +2008_002438 +2008_002437 +2008_002436 +2008_002434 +2008_002430 +2008_002428 +2008_002425 +2008_002424 +2008_002422 +2008_002419 +2008_002418 +2008_002414 +2008_002412 +2008_002411 +2008_002410 +2008_002408 +2008_002405 +2008_002404 +2008_002403 +2008_002401 +2008_002399 +2008_002395 +2008_002389 +2008_002384 +2008_002378 +2008_002377 +2008_002374 +2008_002372 +2008_002370 +2008_002369 +2008_002368 +2008_002366 +2008_002365 +2008_002362 +2008_002361 +2008_002359 +2008_002357 +2008_002356 +2008_002350 +2008_002349 +2008_002347 +2008_002344 +2008_002343 +2008_002340 +2008_002338 +2008_002335 +2008_002331 +2008_002330 +2008_002329 +2008_002328 +2008_002327 +2008_002325 +2008_002324 +2008_002322 +2008_002321 +2008_002317 +2008_002314 +2008_002312 +2008_002311 +2008_002307 +2008_002305 +2008_002304 +2008_002299 +2008_002298 +2008_002296 +2008_002294 +2008_002293 +2008_002292 +2008_002288 +2008_002283 +2008_002281 +2008_002280 +2008_002279 +2008_002278 +2008_002272 +2008_002270 +2008_002267 +2008_002262 +2008_002259 +2008_002258 +2008_002255 +2008_002251 +2008_002250 +2008_002248 +2008_002247 +2008_002244 +2008_002243 +2008_002236 +2008_002234 +2008_002231 +2008_002229 +2008_002227 +2008_002225 +2008_002223 +2008_002222 +2008_002221 +2008_002220 +2008_002218 +2008_002215 +2008_002210 +2008_002209 +2008_002208 +2008_002207 +2008_002206 +2008_002204 +2008_002202 +2008_002201 +2008_002200 +2008_002199 +2008_002198 +2008_002197 +2008_002195 +2008_002194 +2008_002193 +2008_002191 +2008_002185 +2008_002182 +2008_002181 +2008_002179 +2008_002177 +2008_002176 +2008_002175 +2008_002172 +2008_002169 +2008_002167 +2008_002162 +2008_002160 +2008_002158 +2008_002156 +2008_002155 +2008_002153 +2008_002151 +2008_002150 +2008_002148 +2008_002146 +2008_002145 +2008_002144 +2008_002140 +2008_002138 +2008_002132 +2008_002131 +2008_002129 +2008_002124 +2008_002123 +2008_002119 +2008_002118 +2008_002117 +2008_002116 +2008_002115 +2008_002114 +2008_002113 +2008_002112 +2008_002107 +2008_002103 +2008_002099 +2008_002098 +2008_002096 +2008_002094 +2008_002093 +2008_002092 +2008_002088 +2008_002086 +2008_002084 +2008_002082 +2008_002080 +2008_002079 +2008_002073 +2008_002071 +2008_002069 +2008_002067 +2008_002066 +2008_002064 +2008_002062 +2008_002061 +2008_002058 +2008_002056 +2008_002052 +2008_002047 +2008_002046 +2008_002045 +2008_002042 +2008_002039 +2008_002037 +2008_002036 +2008_002035 +2008_002033 +2008_002032 +2008_002031 +2008_002026 +2008_002023 +2008_002021 +2008_002017 +2008_002013 +2008_002011 +2008_002009 +2008_002007 +2008_002005 +2008_002004 +2008_002003 +2008_002002 +2008_002001 +2008_002000 +2008_001998 +2008_001997 +2008_001989 +2008_001987 +2008_001986 +2008_001985 +2008_001982 +2008_001980 +2008_001979 +2008_001978 +2008_001977 +2008_001970 +2008_001969 +2008_001967 +2008_001965 +2008_001961 +2008_001958 +2008_001957 +2008_001956 +2008_001955 +2008_001951 +2008_001947 +2008_001946 +2008_001945 +2008_001941 +2008_001937 +2008_001934 +2008_001932 +2008_001930 +2008_001929 +2008_001928 +2008_001926 +2008_001921 +2008_001920 +2008_001919 +2008_001914 +2008_001911 +2008_001910 +2008_001909 +2008_001908 +2008_001907 +2008_001905 +2008_001903 +2008_001899 +2008_001896 +2008_001894 +2008_001888 +2008_001882 +2008_001881 +2008_001880 +2008_001876 +2008_001872 +2008_001871 +2008_001869 +2008_001867 +2008_001866 +2008_001865 +2008_001863 +2008_001862 +2008_001860 +2008_001858 +2008_001856 +2008_001854 +2008_001852 +2008_001850 +2008_001849 +2008_001845 +2008_001843 +2008_001842 +2008_001841 +2008_001838 +2008_001837 +2008_001836 +2008_001834 +2008_001832 +2008_001830 +2008_001829 +2008_001825 +2008_001823 +2008_001820 +2008_001816 +2008_001815 +2008_001814 +2008_001813 +2008_001812 +2008_001811 +2008_001810 +2008_001809 +2008_001808 +2008_001806 +2008_001805 +2008_001802 +2008_001801 +2008_001797 +2008_001792 +2008_001791 +2008_001789 +2008_001787 +2008_001784 +2008_001783 +2008_001782 +2008_001781 +2008_001775 +2008_001774 +2008_001773 +2008_001772 +2008_001770 +2008_001769 +2008_001765 +2008_001764 +2008_001763 +2008_001761 +2008_001758 +2008_001757 +2008_001751 +2008_001750 +2008_001746 +2008_001745 +2008_001744 +2008_001742 +2008_001741 +2008_001737 +2008_001736 +2008_001735 +2008_001731 +2008_001730 +2008_001729 +2008_001727 +2008_001724 +2008_001723 +2008_001722 +2008_001719 +2008_001717 +2008_001716 +2008_001712 +2008_001710 +2008_001709 +2008_001708 +2008_001706 +2008_001704 +2008_001702 +2008_001699 +2008_001697 +2008_001694 +2008_001692 +2008_001691 +2008_001690 +2008_001681 +2008_001680 +2008_001679 +2008_001676 +2008_001673 +2008_001670 +2008_001669 +2008_001668 +2008_001667 +2008_001666 +2008_001663 +2008_001661 +2008_001660 +2008_001659 +2008_001655 +2008_001653 +2008_001652 +2008_001649 +2008_001648 +2008_001645 +2008_001643 +2008_001641 +2008_001638 +2008_001636 +2008_001632 +2008_001631 +2008_001626 +2008_001625 +2008_001624 +2008_001622 +2008_001620 +2008_001619 +2008_001617 +2008_001615 +2008_001613 +2008_001610 +2008_001609 +2008_001607 +2008_001605 +2008_001602 +2008_001601 +2008_001598 +2008_001596 +2008_001594 +2008_001593 +2008_001592 +2008_001591 +2008_001590 +2008_001589 +2008_001586 +2008_001582 +2008_001577 +2008_001576 +2008_001575 +2008_001574 +2008_001566 +2008_001564 +2008_001563 +2008_001553 +2008_001551 +2008_001550 +2008_001549 +2008_001544 +2008_001543 +2008_001542 +2008_001541 +2008_001540 +2008_001539 +2008_001538 +2008_001536 +2008_001534 +2008_001533 +2008_001529 +2008_001527 +2008_001525 +2008_001523 +2008_001522 +2008_001520 +2008_001516 +2008_001510 +2008_001503 +2008_001501 +2008_001500 +2008_001498 +2008_001495 +2008_001494 +2008_001493 +2008_001488 +2008_001486 +2008_001482 +2008_001481 +2008_001479 +2008_001475 +2008_001470 +2008_001468 +2008_001467 +2008_001466 +2008_001464 +2008_001462 +2008_001461 +2008_001460 +2008_001456 +2008_001455 +2008_001454 +2008_001451 +2008_001448 +2008_001446 +2008_001445 +2008_001444 +2008_001440 +2008_001437 +2008_001436 +2008_001434 +2008_001432 +2008_001431 +2008_001430 +2008_001429 +2008_001428 +2008_001427 +2008_001420 +2008_001419 +2008_001415 +2008_001414 +2008_001413 +2008_001410 +2008_001408 +2008_001406 +2008_001405 +2008_001402 +2008_001401 +2008_001399 +2008_001395 +2008_001391 +2008_001390 +2008_001389 +2008_001388 +2008_001387 +2008_001385 +2008_001383 +2008_001382 +2008_001380 +2008_001376 +2008_001375 +2008_001374 +2008_001373 +2008_001369 +2008_001367 +2008_001366 +2008_001359 +2008_001358 +2008_001357 +2008_001356 +2008_001353 +2008_001351 +2008_001350 +2008_001349 +2008_001346 +2008_001344 +2008_001340 +2008_001338 +2008_001336 +2008_001335 +2008_001334 +2008_001333 +2008_001329 +2008_001325 +2008_001322 +2008_001320 +2008_001318 +2008_001314 +2008_001312 +2008_001310 +2008_001307 +2008_001306 +2008_001304 +2008_001302 +2008_001301 +2008_001299 +2008_001296 +2008_001294 +2008_001290 +2008_001285 +2008_001284 +2008_001278 +2008_001275 +2008_001274 +2008_001272 +2008_001271 +2008_001267 +2008_001264 +2008_001263 +2008_001262 +2008_001257 +2008_001255 +2008_001248 +2008_001245 +2008_001241 +2008_001238 +2008_001236 +2008_001235 +2008_001230 +2008_001227 +2008_001226 +2008_001225 +2008_001223 +2008_001221 +2008_001220 +2008_001219 +2008_001218 +2008_001215 +2008_001210 +2008_001208 +2008_001206 +2008_001205 +2008_001203 +2008_001202 +2008_001199 +2008_001196 +2008_001194 +2008_001192 +2008_001190 +2008_001189 +2008_001188 +2008_001185 +2008_001183 +2008_001182 +2008_001177 +2008_001171 +2008_001169 +2008_001168 +2008_001167 +2008_001166 +2008_001164 +2008_001161 +2008_001160 +2008_001159 +2008_001158 +2008_001155 +2008_001154 +2008_001147 +2008_001143 +2008_001142 +2008_001140 +2008_001139 +2008_001137 +2008_001136 +2008_001134 +2008_001133 +2008_001130 +2008_001122 +2008_001121 +2008_001120 +2008_001119 +2008_001118 +2008_001115 +2008_001114 +2008_001113 +2008_001112 +2008_001111 +2008_001106 +2008_001105 +2008_001104 +2008_001099 +2008_001098 +2008_001092 +2008_001090 +2008_001089 +2008_001083 +2008_001081 +2008_001080 +2008_001077 +2008_001075 +2008_001073 +2008_001071 +2008_001068 +2008_001066 +2008_001063 +2008_001062 +2008_001060 +2008_001057 +2008_001056 +2008_001055 +2008_001054 +2008_001052 +2008_001048 +2008_001047 +2008_001046 +2008_001042 +2008_001041 +2008_001039 +2008_001036 +2008_001035 +2008_001034 +2008_001031 +2008_001030 +2008_001026 +2008_001024 +2008_001023 +2008_001022 +2008_001021 +2008_001020 +2008_001018 +2008_001012 +2008_001009 +2008_001007 +2008_001004 +2008_000999 +2008_000993 +2008_000987 +2008_000985 +2008_000984 +2008_000982 +2008_000981 +2008_000979 +2008_000976 +2008_000973 +2008_000972 +2008_000971 +2008_000970 +2008_000965 +2008_000964 +2008_000960 +2008_000959 +2008_000957 +2008_000956 +2008_000953 +2008_000952 +2008_000950 +2008_000944 +2008_000942 +2008_000941 +2008_000940 +2008_000939 +2008_000936 +2008_000934 +2008_000931 +2008_000928 +2008_000924 +2008_000923 +2008_000922 +2008_000917 +2008_000916 +2008_000915 +2008_000914 +2008_000912 +2008_000910 +2008_000908 +2008_000905 +2008_000904 +2008_000902 +2008_000901 +2008_000899 +2008_000897 +2008_000887 +2008_000885 +2008_000884 +2008_000883 +2008_000881 +2008_000880 +2008_000878 +2008_000876 +2008_000875 +2008_000873 +2008_000870 +2008_000868 +2008_000867 +2008_000864 +2008_000861 +2008_000860 +2008_000858 +2008_000857 +2008_000854 +2008_000851 +2008_000847 +2008_000844 +2008_000842 +2008_000841 +2008_000839 +2008_000837 +2008_000835 +2008_000834 +2008_000833 +2008_000832 +2008_000829 +2008_000828 +2008_000825 +2008_000824 +2008_000817 +2008_000815 +2008_000814 +2008_000808 +2008_000806 +2008_000804 +2008_000803 +2008_000801 +2008_000798 +2008_000796 +2008_000793 +2008_000792 +2008_000790 +2008_000788 +2008_000787 +2008_000785 +2008_000783 +2008_000780 +2008_000778 +2008_000777 +2008_000776 +2008_000775 +2008_000769 +2008_000764 +2008_000761 +2008_000760 +2008_000758 +2008_000756 +2008_000753 +2008_000748 +2008_000745 +2008_000742 +2008_000740 +2008_000737 +2008_000734 +2008_000733 +2008_000732 +2008_000729 +2008_000727 +2008_000726 +2008_000724 +2008_000723 +2008_000721 +2008_000719 +2008_000716 +2008_000714 +2008_000711 +2008_000706 +2008_000705 +2008_000704 +2008_000703 +2008_000699 +2008_000697 +2008_000696 +2008_000695 +2008_000694 +2008_000691 +2008_000690 +2008_000689 +2008_000683 +2008_000678 +2008_000677 +2008_000676 +2008_000674 +2008_000672 +2008_000670 +2008_000669 +2008_000660 +2008_000659 +2008_000656 +2008_000655 +2008_000652 +2008_000650 +2008_000648 +2008_000647 +2008_000646 +2008_000645 +2008_000641 +2008_000640 +2008_000636 +2008_000634 +2008_000629 +2008_000628 +2008_000626 +2008_000623 +2008_000622 +2008_000620 +2008_000619 +2008_000615 +2008_000614 +2008_000613 +2008_000609 +2008_000607 +2008_000605 +2008_000599 +2008_000595 +2008_000588 +2008_000585 +2008_000584 +2008_000583 +2008_000581 +2008_000579 +2008_000578 +2008_000572 +2008_000569 +2008_000568 +2008_000567 +2008_000566 +2008_000564 +2008_000563 +2008_000562 +2008_000561 +2008_000559 +2008_000558 +2008_000553 +2008_000552 +2008_000548 +2008_000547 +2008_000545 +2008_000544 +2008_000541 +2008_000540 +2008_000536 +2008_000535 +2008_000532 +2008_000531 +2008_000527 +2008_000522 +2008_000516 +2008_000515 +2008_000514 +2008_000512 +2008_000511 +2008_000505 +2008_000502 +2008_000499 +2008_000498 +2008_000496 +2008_000495 +2008_000493 +2008_000492 +2008_000491 +2008_000489 +2008_000488 +2008_000481 +2008_000480 +2008_000475 +2008_000473 +2008_000472 +2008_000471 +2008_000470 +2008_000465 +2008_000461 +2008_000457 +2008_000455 +2008_000452 +2008_000448 +2008_000447 +2008_000446 +2008_000445 +2008_000443 +2008_000442 +2008_000437 +2008_000436 +2008_000435 +2008_000432 +2008_000428 +2008_000426 +2008_000424 +2008_000423 +2008_000422 +2008_000421 +2008_000419 +2008_000418 +2008_000416 +2008_000415 +2008_000414 +2008_000413 +2008_000408 +2008_000407 +2008_000406 +2008_000405 +2008_000403 +2008_000400 +2008_000399 +2008_000398 +2008_000397 +2008_000393 +2008_000392 +2008_000383 +2008_000382 +2008_000381 +2008_000380 +2008_000378 +2008_000376 +2008_000373 +2008_000371 +2008_000367 +2008_000365 +2008_000364 +2008_000361 +2008_000358 +2008_000356 +2008_000354 +2008_000350 +2008_000348 +2008_000346 +2008_000343 +2008_000342 +2008_000340 +2008_000339 +2008_000338 +2008_000336 +2008_000335 +2008_000330 +2008_000328 +2008_000321 +2008_000318 +2008_000316 +2008_000315 +2008_000313 +2008_000311 +2008_000309 +2008_000307 +2008_000306 +2008_000305 +2008_000304 +2008_000298 +2008_000297 +2008_000291 +2008_000290 +2008_000289 +2008_000287 +2008_000284 +2008_000283 +2008_000281 +2008_000278 +2008_000277 +2008_000275 +2008_000274 +2008_000273 +2008_000272 +2008_000268 +2008_000266 +2008_000264 +2008_000262 +2008_000261 +2008_000260 +2008_000259 +2008_000257 +2008_000255 +2008_000253 +2008_000252 +2008_000251 +2008_000246 +2008_000244 +2008_000243 +2008_000238 +2008_000237 +2008_000236 +2008_000235 +2008_000227 +2008_000226 +2008_000222 +2008_000219 +2008_000217 +2008_000207 +2008_000204 +2008_000203 +2008_000202 +2008_000199 +2008_000197 +2008_000196 +2008_000195 +2008_000194 +2008_000192 +2008_000191 +2008_000190 +2008_000189 +2008_000188 +2008_000187 +2008_000185 +2008_000183 +2008_000181 +2008_000177 +2008_000176 +2008_000174 +2008_000163 +2008_000162 +2008_000154 +2008_000148 +2008_000145 +2008_000144 +2008_000143 +2008_000142 +2008_000141 +2008_000140 +2008_000138 +2008_000134 +2008_000133 +2008_000132 +2008_000131 +2008_000128 +2008_000119 +2008_000116 +2008_000115 +2008_000112 +2008_000109 +2008_000105 +2008_000103 +2008_000099 +2008_000097 +2008_000096 +2008_000095 +2008_000093 +2008_000090 +2008_000089 +2008_000085 +2008_000084 +2008_000082 +2008_000078 +2008_000076 +2008_000074 +2008_000070 +2008_000067 +2008_000066 +2008_000064 +2008_000062 +2008_000060 +2008_000059 +2008_000056 +2008_000054 +2008_000053 +2008_000052 +2008_000051 +2008_000050 +2008_000045 +2008_000043 +2008_000042 +2008_000041 +2008_000036 +2008_000034 +2008_000033 +2008_000032 +2008_000028 +2008_000027 +2008_000026 +2008_000023 +2008_000019 +2008_000015 +2008_000008 +2008_000007 +2008_000003 +2008_000002 +2007_009950 +2007_009947 +2007_009901 +2007_009899 +2007_009889 +2007_009832 +2007_009807 +2007_009788 +2007_009779 +2007_009759 +2007_009724 +2007_009709 +2007_009665 +2007_009649 +2007_009630 +2007_009618 +2007_009607 +2007_009605 +2007_009597 +2007_009594 +2007_009580 +2007_009554 +2007_009550 +2007_009533 +2007_009527 +2007_009464 +2007_009436 +2007_009435 +2007_009422 +2007_009348 +2007_009327 +2007_009322 +2007_009295 +2007_009216 +2007_009209 +2007_009139 +2007_009082 +2007_009052 +2007_009030 +2007_008994 +2007_008948 +2007_008945 +2007_008932 +2007_008927 +2007_008821 +2007_008801 +2007_008778 +2007_008764 +2007_008714 +2007_008575 +2007_008571 +2007_008526 +2007_008468 +2007_008407 +2007_008403 +2007_008307 +2007_008219 +2007_008218 +2007_008203 +2007_008142 +2007_008140 +2007_008085 +2007_008072 +2007_008043 +2007_007948 +2007_007947 +2007_007930 +2007_007908 +2007_007902 +2007_007891 +2007_007890 +2007_007878 +2007_007783 +2007_007773 +2007_007772 +2007_007726 +2007_007698 +2007_007649 +2007_007621 +2007_007591 +2007_007585 +2007_007530 +2007_007523 +2007_007481 +2007_007480 +2007_007447 +2007_007432 +2007_007415 +2007_007398 +2007_007387 +2007_007355 +2007_007250 +2007_007230 +2007_007154 +2007_007098 +2007_007048 +2007_007021 +2007_007003 +2007_006944 +2007_006900 +2007_006899 +2007_006865 +2007_006832 +2007_006803 +2007_006704 +2007_006699 +2007_006673 +2007_006661 +2007_006660 +2007_006641 +2007_006615 +2007_006605 +2007_006585 +2007_006581 +2007_006530 +2007_006490 +2007_006483 +2007_006477 +2007_006445 +2007_006409 +2007_006400 +2007_006317 +2007_006303 +2007_006281 +2007_006254 +2007_006232 +2007_006212 +2007_006151 +2007_006136 +2007_006134 +2007_006066 +2007_006004 +2007_005989 +2007_005988 +2007_005951 +2007_005902 +2007_005878 +2007_005859 +2007_005797 +2007_005790 +2007_005702 +2007_005688 +2007_005647 +2007_005430 +2007_005368 +2007_005360 +2007_005314 +2007_005273 +2007_005266 +2007_005264 +2007_005262 +2007_005248 +2007_005227 +2007_005212 +2007_005210 +2007_005144 +2007_005130 +2007_005124 +2007_005086 +2007_005064 +2007_005043 +2007_004998 +2007_004988 +2007_004951 +2007_004948 +2007_004841 +2007_004830 +2007_004810 +2007_004769 +2007_004768 +2007_004707 +2007_004705 +2007_004663 +2007_004627 +2007_004537 +2007_004500 +2007_004481 +2007_004476 +2007_004459 +2007_004423 +2007_004328 +2007_004291 +2007_004289 +2007_004166 +2007_004081 +2007_004065 +2007_004009 +2007_004003 +2007_003910 +2007_003889 +2007_003876 +2007_003815 +2007_003788 +2007_003778 +2007_003715 +2007_003668 +2007_003604 +2007_003593 +2007_003580 +2007_003565 +2007_003541 +2007_003529 +2007_003525 +2007_003451 +2007_003431 +2007_003330 +2007_003286 +2007_003267 +2007_003251 +2007_003207 +2007_003205 +2007_003191 +2007_003190 +2007_003189 +2007_003178 +2007_003118 +2007_003000 +2007_002967 +2007_002954 +2007_002953 +2007_002914 +2007_002896 +2007_002895 +2007_002845 +2007_002789 +2007_002760 +2007_002669 +2007_002668 +2007_002639 +2007_002611 +2007_002545 +2007_002488 +2007_002462 +2007_002403 +2007_002370 +2007_002368 +2007_002361 +2007_002293 +2007_002281 +2007_002273 +2007_002234 +2007_002227 +2007_002216 +2007_002212 +2007_002198 +2007_002142 +2007_002120 +2007_002107 +2007_002105 +2007_002099 +2007_002088 +2007_002055 +2007_002024 +2007_001960 +2007_001917 +2007_001901 +2007_001872 +2007_001857 +2007_001834 +2007_001825 +2007_001764 +2007_001724 +2007_001709 +2007_001704 +2007_001698 +2007_001609 +2007_001602 +2007_001595 +2007_001487 +2007_001439 +2007_001420 +2007_001416 +2007_001397 +2007_001340 +2007_001225 +2007_001185 +2007_001149 +2007_001073 +2007_001027 +2007_000904 +2007_000876 +2007_000836 +2007_000822 +2007_000793 +2007_000768 +2007_000738 +2007_000733 +2007_000720 +2007_000713 +2007_000648 +2007_000645 +2007_000584 +2007_000549 +2007_000528 +2007_000515 +2007_000504 +2007_000480 +2007_000392 +2007_000364 +2007_000363 +2007_000333 +2007_000256 +2007_000250 +2007_000243 +2007_000241 +2007_000170 +2007_000121 +2007_000068 +2007_000063 +2007_000039 +2007_000032 diff --git a/DeepLabV3Plus-Pytorch/datasets/utils.py b/DeepLabV3Plus-Pytorch/datasets/utils.py new file mode 100644 index 0000000..6d41011 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/utils.py @@ -0,0 +1,126 @@ +import os +import os.path +import hashlib +import errno +from tqdm import tqdm + + +def gen_bar_updater(pbar): + def bar_update(count, block_size, total_size): + if pbar.total is None and total_size: + pbar.total = total_size + progress_bytes = count * block_size + pbar.update(progress_bytes - pbar.n) + + return bar_update + + +def check_integrity(fpath, md5=None): + if md5 is None: + return True + if not os.path.isfile(fpath): + return False + md5o = hashlib.md5() + with open(fpath, 'rb') as f: + # read in 1MB chunks + for chunk in iter(lambda: f.read(1024 * 1024), b''): + md5o.update(chunk) + md5c = md5o.hexdigest() + if md5c != md5: + return False + return True + + +def makedir_exist_ok(dirpath): + """ + Python2 support for os.makedirs(.., exist_ok=True) + """ + try: + os.makedirs(dirpath) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise + + +def download_url(url, root, filename=None, md5=None): + """Download a file from a url and place it in root. + Args: + url (str): URL to download file from + root (str): Directory to place downloaded file in + filename (str): Name to save the file under. If None, use the basename of the URL + md5 (str): MD5 checksum of the download. If None, do not check + """ + from six.moves import urllib + + root = os.path.expanduser(root) + if not filename: + filename = os.path.basename(url) + fpath = os.path.join(root, filename) + + makedir_exist_ok(root) + + # downloads file + if os.path.isfile(fpath) and check_integrity(fpath, md5): + print('Using downloaded and verified file: ' + fpath) + else: + try: + print('Downloading ' + url + ' to ' + fpath) + urllib.request.urlretrieve( + url, fpath, + reporthook=gen_bar_updater(tqdm(unit='B', unit_scale=True)) + ) + except OSError: + if url[:5] == 'https': + url = url.replace('https:', 'http:') + print('Failed download. Trying https -> http instead.' + ' Downloading ' + url + ' to ' + fpath) + urllib.request.urlretrieve( + url, fpath, + reporthook=gen_bar_updater(tqdm(unit='B', unit_scale=True)) + ) + + +def list_dir(root, prefix=False): + """List all directories at a given root + Args: + root (str): Path to directory whose folders need to be listed + prefix (bool, optional): If true, prepends the path to each result, otherwise + only returns the name of the directories found + """ + root = os.path.expanduser(root) + directories = list( + filter( + lambda p: os.path.isdir(os.path.join(root, p)), + os.listdir(root) + ) + ) + + if prefix is True: + directories = [os.path.join(root, d) for d in directories] + + return directories + + +def list_files(root, suffix, prefix=False): + """List all files ending with a suffix at a given root + Args: + root (str): Path to directory whose folders need to be listed + suffix (str or tuple): Suffix of the files to match, e.g. '.png' or ('.jpg', '.png'). + It uses the Python "str.endswith" method and is passed directly + prefix (bool, optional): If true, prepends the path to each result, otherwise + only returns the name of the files found + """ + root = os.path.expanduser(root) + files = list( + filter( + lambda p: os.path.isfile(os.path.join(root, p)) and p.endswith(suffix), + os.listdir(root) + ) + ) + + if prefix is True: + files = [os.path.join(root, d) for d in files] + + return files \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/datasets/voc.py b/DeepLabV3Plus-Pytorch/datasets/voc.py new file mode 100644 index 0000000..c2a2668 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/datasets/voc.py @@ -0,0 +1,167 @@ +import os +import sys +import tarfile +import collections +import torch.utils.data as data +import shutil +import numpy as np + +from PIL import Image +from torchvision.datasets.utils import download_url, check_integrity + +DATASET_YEAR_DICT = { + '2012': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar', + 'filename': 'VOCtrainval_11-May-2012.tar', + 'md5': '6cd6e144f989b92b3379bac3b3de84fd', + 'base_dir': 'VOCdevkit/VOC2012' + }, + '2011': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2011/VOCtrainval_25-May-2011.tar', + 'filename': 'VOCtrainval_25-May-2011.tar', + 'md5': '6c3384ef61512963050cb5d687e5bf1e', + 'base_dir': 'TrainVal/VOCdevkit/VOC2011' + }, + '2010': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar', + 'filename': 'VOCtrainval_03-May-2010.tar', + 'md5': 'da459979d0c395079b5c75ee67908abb', + 'base_dir': 'VOCdevkit/VOC2010' + }, + '2009': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2009/VOCtrainval_11-May-2009.tar', + 'filename': 'VOCtrainval_11-May-2009.tar', + 'md5': '59065e4b188729180974ef6572f6a212', + 'base_dir': 'VOCdevkit/VOC2009' + }, + '2008': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2008/VOCtrainval_14-Jul-2008.tar', + 'filename': 'VOCtrainval_11-May-2012.tar', + 'md5': '2629fa636546599198acfcfbfcf1904a', + 'base_dir': 'VOCdevkit/VOC2008' + }, + '2007': { + 'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar', + 'filename': 'VOCtrainval_06-Nov-2007.tar', + 'md5': 'c52e279531787c972589f7e41ab4ae64', + 'base_dir': 'VOCdevkit/VOC2007' + } +} + + +def voc_cmap(N=256, normalized=False): + def bitget(byteval, idx): + return ((byteval & (1 << idx)) != 0) + + dtype = 'float32' if normalized else 'uint8' + cmap = np.zeros((N, 3), dtype=dtype) + for i in range(N): + r = g = b = 0 + c = i + for j in range(8): + r = r | (bitget(c, 0) << 7-j) + g = g | (bitget(c, 1) << 7-j) + b = b | (bitget(c, 2) << 7-j) + c = c >> 3 + + cmap[i] = np.array([r, g, b]) + + cmap = cmap/255 if normalized else cmap + return cmap + +class VOCSegmentation(data.Dataset): + """`Pascal VOC `_ Segmentation Dataset. + Args: + root (string): Root directory of the VOC Dataset. + year (string, optional): The dataset year, supports years 2007 to 2012. + image_set (string, optional): Select the image_set to use, ``train``, ``trainval`` or ``val`` + download (bool, optional): If true, downloads the dataset from the internet and + puts it in root directory. If dataset is already downloaded, it is not + downloaded again. + transform (callable, optional): A function/transform that takes in an PIL image + and returns a transformed version. E.g, ``transforms.RandomCrop`` + """ + cmap = voc_cmap() + def __init__(self, + root, + year='2012', + image_set='train', + download=False, + transform=None, + ret_fname=False): + + year = '2012' + self.root = os.path.expanduser(root) + self.year = year + self.url = DATASET_YEAR_DICT[year]['url'] + self.filename = DATASET_YEAR_DICT[year]['filename'] + self.md5 = DATASET_YEAR_DICT[year]['md5'] + self.transform = transform + self.ret_fname = ret_fname + + self.image_set = image_set + #base_dir = DATASET_YEAR_DICT[year]['base_dir'] + #voc_root = os.path.join(self.root, base_dir) + voc_root = self.root + image_dir = os.path.join(voc_root, 'JPEGImages') + + if download: + download_extract(self.url, self.root, self.filename, self.md5) + + if not os.path.isdir(voc_root): + raise RuntimeError('Dataset not found or corrupted.' + + ' You can use download=True to download it') + + if image_set=='train': + mask_dir = os.path.join(voc_root, 'refined_pseudo_segmentation_labels') + assert os.path.exists(mask_dir), "refined_pseudo_segmentation_labels not found, please refer to README.md and prepare it manually" + split_f = './datasets/data/train_aug.txt' + else: + mask_dir = os.path.join(voc_root, 'SegmentationClass') + splits_dir = os.path.join(voc_root, 'ImageSets/Segmentation') + split_f = os.path.join(splits_dir, image_set.rstrip('\n') + '.txt') + + print("split_f : ", split_f, os.path.exists(split_f)) + if not os.path.exists(split_f): + raise ValueError( + 'Wrong image_set entered! Please use image_set="train" ' + 'or image_set="trainval" or image_set="val"') + + with open(os.path.join(split_f), "r") as f: + self.file_names = [x.strip() for x in f.readlines()] + + self.images = [os.path.join(image_dir, x + ".jpg") for x in self.file_names] + self.masks = [os.path.join(mask_dir, x + ".png") for x in self.file_names] + assert (len(self.images) == len(self.masks)) + + + def __getitem__(self, index): + """ + Args: + index (int): Index + Returns: + tuple: (image, target) where target is the image segmentation. + """ + img = Image.open(self.images[index]).convert('RGB') + target = Image.open(self.masks[index]) + if self.transform is not None: + img, target = self.transform(img, target) + + if self.ret_fname: + return img, target, self.file_names[index] + + return img, target + + + def __len__(self): + return len(self.images) + + @classmethod + def decode_target(cls, mask): + """decode semantic mask to RGB image""" + return cls.cmap[mask] + +def download_extract(url, root, filename, md5): + download_url(url, root, filename, md5) + with tarfile.open(os.path.join(root, filename), "r") as tar: + tar.extractall(path=root) \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/eval.py b/DeepLabV3Plus-Pytorch/eval.py new file mode 100644 index 0000000..c8380a4 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/eval.py @@ -0,0 +1,242 @@ +from tqdm import tqdm +import network +import utils +import os +import random +import argparse +import numpy as np +import time +import joblib +import multiprocessing + +from torch.utils import data +from datasets import VOCSegmentation, Cityscapes +from utils import ext_transforms as et +from metrics import StreamSegMetrics + +import torch +import torch.nn as nn +import torch.nn.functional as F +from utils.visualizer import Visualizer +from utils.utils import AverageMeter + +from PIL import Image +import matplotlib +import matplotlib.pyplot as plt +from utils.crf import DenseCRF + +torch.backends.cudnn.benchmark = True + +def get_argparser(): + parser = argparse.ArgumentParser() + + # Datset Options + parser.add_argument("--data_root", type=str, default='./datasets/data', + help="path to Dataset") + parser.add_argument("--num_classes", type=int, default=21, + help="num classes 21 for VOC") + + # Deeplab Options + parser.add_argument("--model", type=str, default='deeplabv3plus_mobilenet', + choices=['deeplabv3_resnet50', 'deeplabv3plus_resnet50', + 'deeplabv3_resnet101', 'deeplabv3plus_resnet101', + 'deeplabv3_mobilenet', 'deeplabv3plus_mobilenet'], help='model name') + parser.add_argument("--separable_conv", action='store_true', default=False, + help="apply separable conv to decoder and aspp") + parser.add_argument("--output_stride", type=int, default=16, choices=[8, 16]) + + # Train Options + parser.add_argument("--crop_val", action='store_true', default=False, + help='crop validation (default: False)') + parser.add_argument("--crop_size", type=int, default=513) + parser.add_argument("--val_batch_size", type=int, default=4, + help='batch size for validation (default: 4)') + parser.add_argument("--ckpt", default=None, type=str, + help="restore from checkpoint") + + parser.add_argument("--gpu_id", type=str, default='0', + help="GPU ID") + parser.add_argument("--random_seed", type=int, default=2, + help="random seed (default: 2)") + # PASCAL VOC Options + parser.add_argument("--year", type=str, default='2012_aug', + choices=['2012_aug', '2012', '2011', '2009', '2008', '2007'], help='year of VOC') + + # Visdom options + parser.add_argument("--logit_dir", type=str, default='./logits') + + return parser + + +def get_dataset(opts): + """ Dataset And Augmentation + """ + if opts.crop_val: + val_transform = et.ExtCompose([ + et.ExtResize(opts.crop_size), + et.ExtCenterCrop(opts.crop_size), + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + else: + val_transform = et.ExtCompose([ + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + + val_dst = VOCSegmentation(root=opts.data_root, year=opts.year, + image_set='val', download=False, + transform=val_transform, ret_fname=True) + + return val_dst + + +def validate(opts, model, loader, device, metrics): + """Do validation and return specified samples""" + metrics.reset() + + with torch.no_grad(): + for i, (images, labels, fnames) in enumerate(loader): + print("[%04d/%04d] " % (i, len(loader)), end="\r") + images = images.to(device, dtype=torch.float32) + labels = labels.to(device, dtype=torch.long) + + outputs = model(images) + preds = outputs.detach().max(dim=1)[1].cpu().numpy() + targets = labels.cpu().numpy() + + metrics.update(targets, preds) + + for b in range(outputs.size(0)): + fname = fnames[b] + np.save(os.path.join(opts.logit_dir, fname + ".npy"), outputs[b].detach().cpu().numpy().astype(np.float16)) + + score = metrics.get_results() + + return score + + +def crf_inference(opts, dataset, metrics): + metrics.reset() + + mean = [0.485, 0.456, 0.406] + std = [0.229, 0.224, 0.225] + + postprocessor = DenseCRF( + iter_max=10, + pos_xy_std=1, + pos_w=3, + bi_xy_std=67, + bi_rgb_std=3, + bi_w=4, + ) + + def process(i): + image, gt_label, fname = dataset.__getitem__(i) + + filename = os.path.join(opts.logit_dir, fname + ".npy") + logit = np.load(filename) + + _, H, W = image.shape + logit = torch.FloatTensor(logit)[None, ...] + logit = F.interpolate(logit, size=(H, W), mode="bilinear", align_corners=False) + prob = F.softmax(logit, dim=1)[0].numpy() + gt_label = gt_label.cpu().numpy() + + image = image.permute(1, 2, 0).cpu().numpy() + image *= std + image += mean + image *= 255 + image = image.astype(np.uint8) + prob = postprocessor(image, prob) + pred_label = np.argmax(prob, axis=0) + + return pred_label, gt_label + + # CRF in multi-process + results = joblib.Parallel(n_jobs=multiprocessing.cpu_count(), verbose=10, pre_dispatch="all")( + [joblib.delayed(process)(i) for i in range(len(dataset))] + ) + + preds, gts = zip(*results) + + for pred, gt in zip(preds, gts): + metrics.update(gt, pred) + + score = metrics.get_results() + + return score + + + +def main(): + opts = get_argparser().parse_args() + os.environ['CUDA_VISIBLE_DEVICES'] = opts.gpu_id + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + print("Device: %s" % device) + + # Setup random seed + torch.manual_seed(opts.random_seed) + np.random.seed(opts.random_seed) + random.seed(opts.random_seed) + + os.makedirs(opts.logit_dir, exist_ok=True) + + # Setup dataloader + if not opts.crop_val: + opts.val_batch_size = 1 + + val_dst = get_dataset(opts) + val_loader = data.DataLoader( + val_dst, batch_size=opts.val_batch_size, shuffle=False, num_workers=4) + + print("Dataset: voc, Val set: %d" % + ( len(val_dst)) ) + + # Set up model + model_map = { + 'deeplabv3_resnet50': network.deeplabv3_resnet50, + 'deeplabv3plus_resnet50': network.deeplabv3plus_resnet50, + 'deeplabv3_resnet101': network.deeplabv3_resnet101, + 'deeplabv3plus_resnet101': network.deeplabv3plus_resnet101, + 'deeplabv3_mobilenet': network.deeplabv3_mobilenet, + 'deeplabv3plus_mobilenet': network.deeplabv3plus_mobilenet + } + + model = model_map[opts.model](num_classes=opts.num_classes, output_stride=opts.output_stride) + if opts.separable_conv and 'plus' in opts.model: + network.convert_to_separable_conv(model.classifier) + utils.set_bn_momentum(model.backbone, momentum=0.01) + + # Set up metrics + metrics = StreamSegMetrics(opts.num_classes) + + # Restore + if opts.ckpt is not None and os.path.isfile(opts.ckpt): + # https://github.com/VainF/DeepLabV3Plus-Pytorch/issues/8#issuecomment-605601402, @PytaichukBohdan + checkpoint = torch.load(opts.ckpt, map_location=torch.device('cpu')) + model.load_state_dict(checkpoint["model_state"]) + model = nn.DataParallel(model) + model.to(device) + print("Model restored from %s" % opts.ckpt) + del checkpoint # free memory + else: + assert "no checkpoint" + + #========== Eval ==========# + model.eval() + val_score = validate( + opts=opts, model=model, loader=val_loader, device=device, metrics=metrics) + print(metrics.to_str(val_score)) + + print("\n\n----------- crf -------------") + crf_score = crf_inference(opts, val_dst, metrics) + print(metrics.to_str(crf_score)) + + os.system(f"rm -rf {opts.logit_dir}") + + +if __name__ == '__main__': + main() diff --git a/DeepLabV3Plus-Pytorch/main.py b/DeepLabV3Plus-Pytorch/main.py new file mode 100644 index 0000000..2e99282 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/main.py @@ -0,0 +1,406 @@ +from tqdm import tqdm +import network +import utils +import os +import random +import argparse +import numpy as np +import time + +from torch.utils import data +from datasets import VOCSegmentation, Cityscapes +from utils import ext_transforms as et +from metrics import StreamSegMetrics + +import torch +import torch.nn as nn +from utils.visualizer import Visualizer +from utils.utils import AverageMeter + +from PIL import Image +import matplotlib +import matplotlib.pyplot as plt + +torch.backends.cudnn.benchmark = True + +def get_argparser(): + parser = argparse.ArgumentParser() + + # Datset Options + parser.add_argument("--data_root", type=str, default='./datasets/data', + help="path to Dataset") + parser.add_argument("--dataset", type=str, default='voc', + choices=['voc', 'cityscapes'], help='Name of dataset') + parser.add_argument("--num_classes", type=int, default=None, + help="num classes (default: None)") + + # Deeplab Options + parser.add_argument("--model", type=str, default='deeplabv3plus_mobilenet', + choices=['deeplabv3_resnet50', 'deeplabv3plus_resnet50', + 'deeplabv3_resnet101', 'deeplabv3plus_resnet101', + 'deeplabv3_mobilenet', 'deeplabv3plus_mobilenet'], help='model name') + parser.add_argument("--separable_conv", action='store_true', default=False, + help="apply separable conv to decoder and aspp") + parser.add_argument("--output_stride", type=int, default=16, choices=[8, 16]) + + # Train Options + parser.add_argument("--amp", action='store_true', default=False) + parser.add_argument("--test_only", action='store_true', default=False) + parser.add_argument("--save_val_results", action='store_true', default=False, + help="save segmentation results to \"./results\"") + parser.add_argument("--total_itrs", type=int, default=30e3, + help="epoch number (default: 30k)") + parser.add_argument("--lr", type=float, default=0.01, + help="learning rate (default: 0.01)") + parser.add_argument("--lr_policy", type=str, default='poly', choices=['poly', 'step'], + help="learning rate scheduler policy") + parser.add_argument("--step_size", type=int, default=10000) + parser.add_argument("--crop_val", action='store_true', default=False, + help='crop validation (default: False)') + parser.add_argument("--batch_size", type=int, default=16, + help='batch size (default: 16)') + parser.add_argument("--val_batch_size", type=int, default=4, + help='batch size for validation (default: 4)') + parser.add_argument("--crop_size", type=int, default=513) + + parser.add_argument("--ckpt", default=None, type=str, + help="restore from checkpoint") + parser.add_argument("--continue_training", action='store_true', default=False) + + parser.add_argument("--loss_type", type=str, default='cross_entropy', + choices=['cross_entropy', 'focal_loss'], help="loss type (default: False)") + parser.add_argument("--gpu_id", type=str, default='0', + help="GPU ID") + parser.add_argument("--weight_decay", type=float, default=1e-4, + help='weight decay (default: 1e-4)') + parser.add_argument("--random_seed", type=int, default=2, + help="random seed (default: 2)") + parser.add_argument("--print_interval", type=int, default=10, + help="print interval of loss (default: 10)") + parser.add_argument("--val_interval", type=int, default=100, + help="epoch interval for eval (default: 100)") + parser.add_argument("--download", action='store_true', default=False, + help="download datasets") + + # PASCAL VOC Options + parser.add_argument("--year", type=str, default='2012_aug', + choices=['2012_aug', '2012', '2011', '2009', '2008', '2007'], help='year of VOC') + + # Visdom options + parser.add_argument("--enable_vis", action='store_true', default=False, + help="use visdom for visualization") + parser.add_argument("--vis_port", type=str, default='13570', + help='port for visdom') + parser.add_argument("--vis_env", type=str, default='main', + help='env for visdom') + parser.add_argument("--vis_num_samples", type=int, default=8, + help='number of samples for visualization (default: 8)') + return parser + + +def get_dataset(opts): + """ Dataset And Augmentation + """ + if opts.dataset == 'voc': + train_transform = et.ExtCompose([ + #et.ExtResize(size=opts.crop_size), + et.ExtRandomScale((0.5, 2.0)), + et.ExtRandomCrop(size=(opts.crop_size, opts.crop_size), pad_if_needed=True), + et.ExtRandomHorizontalFlip(), + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + if opts.crop_val: + val_transform = et.ExtCompose([ + et.ExtResize(opts.crop_size), + et.ExtCenterCrop(opts.crop_size), + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + else: + val_transform = et.ExtCompose([ + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + train_dst = VOCSegmentation(root=opts.data_root, year=opts.year, + image_set='train', download=opts.download, transform=train_transform) + val_dst = VOCSegmentation(root=opts.data_root, year=opts.year, + image_set='val', download=False, transform=val_transform) + + if opts.dataset == 'cityscapes': + train_transform = et.ExtCompose([ + #et.ExtResize( 512 ), + et.ExtRandomCrop(size=(opts.crop_size, opts.crop_size)), + et.ExtColorJitter( brightness=0.5, contrast=0.5, saturation=0.5 ), + et.ExtRandomHorizontalFlip(), + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + + val_transform = et.ExtCompose([ + #et.ExtResize( 512 ), + et.ExtToTensor(), + et.ExtNormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]), + ]) + + train_dst = Cityscapes(root=opts.data_root, + split='train', transform=train_transform) + val_dst = Cityscapes(root=opts.data_root, + split='val', transform=val_transform) + return train_dst, val_dst + + +def validate(opts, model, loader, device, metrics, ret_samples_ids=None): + """Do validation and return specified samples""" + metrics.reset() + ret_samples = [] + if opts.save_val_results: + if not os.path.exists('results'): + os.mkdir('results') + denorm = utils.Denormalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + img_id = 0 + + with torch.no_grad(): + for i, (images, labels) in tqdm(enumerate(loader)): + + images = images.to(device, dtype=torch.float32) + labels = labels.to(device, dtype=torch.long) + + outputs = model(images) + preds = outputs.detach().max(dim=1)[1].cpu().numpy() + targets = labels.cpu().numpy() + + metrics.update(targets, preds) + if ret_samples_ids is not None and i in ret_samples_ids: # get vis samples + ret_samples.append( + (images[0].detach().cpu().numpy(), targets[0], preds[0])) + + if opts.save_val_results: + for i in range(len(images)): + image = images[i].detach().cpu().numpy() + target = targets[i] + pred = preds[i] + + image = (denorm(image) * 255).transpose(1, 2, 0).astype(np.uint8) + target = loader.dataset.decode_target(target).astype(np.uint8) + pred = loader.dataset.decode_target(pred).astype(np.uint8) + + Image.fromarray(image).save('results/%d_image.png' % img_id) + Image.fromarray(target).save('results/%d_target.png' % img_id) + Image.fromarray(pred).save('results/%d_pred.png' % img_id) + + fig = plt.figure() + plt.imshow(image) + plt.axis('off') + plt.imshow(pred, alpha=0.7) + ax = plt.gca() + ax.xaxis.set_major_locator(matplotlib.ticker.NullLocator()) + ax.yaxis.set_major_locator(matplotlib.ticker.NullLocator()) + plt.savefig('results/%d_overlay.png' % img_id, bbox_inches='tight', pad_inches=0) + plt.close() + img_id += 1 + + score = metrics.get_results() + return score, ret_samples + + +def main(): + opts = get_argparser().parse_args() + if opts.dataset.lower() == 'voc': + opts.num_classes = 21 + elif opts.dataset.lower() == 'cityscapes': + opts.num_classes = 19 + + # Setup visualization + vis = Visualizer(port=opts.vis_port, + env=opts.vis_env) if opts.enable_vis else None + if vis is not None: # display options + vis.vis_table("Options", vars(opts)) + + os.environ['CUDA_VISIBLE_DEVICES'] = opts.gpu_id + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + print("Device: %s" % device) + + # Setup random seed + torch.manual_seed(opts.random_seed) + np.random.seed(opts.random_seed) + random.seed(opts.random_seed) + + # Setup dataloader + if opts.dataset=='voc' and not opts.crop_val: + opts.val_batch_size = 1 + + train_dst, val_dst = get_dataset(opts) + train_loader = data.DataLoader( + train_dst, batch_size=opts.batch_size, shuffle=True, num_workers=2) + val_loader = data.DataLoader( + val_dst, batch_size=opts.val_batch_size, shuffle=True, num_workers=2) + print("Dataset: %s, Train set: %d, Val set: %d" % + (opts.dataset, len(train_dst), len(val_dst))) + + # Set up model + model_map = { + 'deeplabv3_resnet50': network.deeplabv3_resnet50, + 'deeplabv3plus_resnet50': network.deeplabv3plus_resnet50, + 'deeplabv3_resnet101': network.deeplabv3_resnet101, + 'deeplabv3plus_resnet101': network.deeplabv3plus_resnet101, + 'deeplabv3_mobilenet': network.deeplabv3_mobilenet, + 'deeplabv3plus_mobilenet': network.deeplabv3plus_mobilenet + } + + model = model_map[opts.model](num_classes=opts.num_classes, output_stride=opts.output_stride) + if opts.separable_conv and 'plus' in opts.model: + network.convert_to_separable_conv(model.classifier) + utils.set_bn_momentum(model.backbone, momentum=0.01) + + # Set up metrics + metrics = StreamSegMetrics(opts.num_classes) + + # Set up optimizer + optimizer = torch.optim.SGD(params=[ + {'params': model.backbone.parameters(), 'lr': 0.1*opts.lr}, + {'params': model.classifier.parameters(), 'lr': opts.lr}, + ], lr=opts.lr, momentum=0.9, weight_decay=opts.weight_decay) + #optimizer = torch.optim.SGD(params=model.parameters(), lr=opts.lr, momentum=0.9, weight_decay=opts.weight_decay) + #torch.optim.lr_scheduler.StepLR(optimizer, step_size=opts.lr_decay_step, gamma=opts.lr_decay_factor) + if opts.lr_policy=='poly': + scheduler = utils.PolyLR(optimizer, opts.total_itrs, power=0.9) + elif opts.lr_policy=='step': + scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=opts.step_size, gamma=0.1) + + # Set up criterion + #criterion = utils.get_loss(opts.loss_type) + if opts.loss_type == 'focal_loss': + criterion = utils.FocalLoss(ignore_index=255, size_average=True) + elif opts.loss_type == 'cross_entropy': + criterion = nn.CrossEntropyLoss(ignore_index=255, reduction='mean') + + def save_ckpt(path): + """ save current model + """ + torch.save({ + "cur_itrs": cur_itrs, + "model_state": model.module.state_dict(), + "optimizer_state": optimizer.state_dict(), + "scheduler_state": scheduler.state_dict(), + "best_score": best_score, + }, path) + print("Model saved as %s" % path) + + utils.mkdir('checkpoints') + # Restore + best_score = 0.0 + cur_itrs = 0 + cur_epochs = 0 + if opts.ckpt is not None and os.path.isfile(opts.ckpt): + # https://github.com/VainF/DeepLabV3Plus-Pytorch/issues/8#issuecomment-605601402, @PytaichukBohdan + checkpoint = torch.load(opts.ckpt, map_location=torch.device('cpu')) + model.load_state_dict(checkpoint["model_state"]) + model = nn.DataParallel(model) + model.to(device) + if opts.continue_training: + optimizer.load_state_dict(checkpoint["optimizer_state"]) + scheduler.load_state_dict(checkpoint["scheduler_state"]) + cur_itrs = checkpoint["cur_itrs"] + best_score = checkpoint['best_score'] + print("Training state restored from %s" % opts.ckpt) + print("Model restored from %s" % opts.ckpt) + del checkpoint # free memory + else: + print("[!] Retrain") + model = nn.DataParallel(model) + model.to(device) + + #========== Train Loop ==========# + vis_sample_id = np.random.randint(0, len(val_loader), opts.vis_num_samples, + np.int32) if opts.enable_vis else None # sample idxs for visualization + denorm = utils.Denormalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # denormalization for ori images + + if opts.test_only: + model.eval() + val_score, ret_samples = validate( + opts=opts, model=model, loader=val_loader, device=device, metrics=metrics, ret_samples_ids=vis_sample_id) + print(metrics.to_str(val_score)) + return + + scaler = torch.cuda.amp.GradScaler(enabled=opts.amp) + + avg_loss = AverageMeter() + avg_time = AverageMeter() + + interval_loss = 0 + while True: #cur_itrs < opts.total_itrs: + # ===== Train ===== + avg_loss.reset() + avg_time.reset() + model.train() + cur_epochs += 1 + end_time = time.time() + + for (images, labels) in train_loader: + cur_itrs += 1 + + images = images.to(device, dtype=torch.float32) + labels = labels.to(device, dtype=torch.long) + + optimizer.zero_grad() + + with torch.cuda.amp.autocast(enabled=opts.amp): + outputs = model(images) + loss = criterion(outputs, labels) + + scaler.scale(loss).backward() + scaler.step(optimizer) + scaler.update() + + scheduler.step() + avg_loss.update(loss.item()) + avg_time.update(time.time() - end_time) + end_time = time.time() + + if vis is not None: + vis.vis_scalar('Loss', cur_itrs, avg_loss.avg) + + if (cur_itrs) % 10 == 0: + print(" Epoch %d, Itrs %d/%d, Loss=%6f, Time=%.2f , LR=%.8f" % + (cur_epochs, cur_itrs, opts.total_itrs, + avg_loss.avg, avg_time.avg*1000, optimizer.param_groups[0]['lr'])) + + if (cur_itrs) % opts.val_interval == 0: + #save_ckpt('checkpoints/latest_%s_%s_os%d.pth' % + # (opts.model, opts.dataset, opts.output_stride)) + print("validation...") + model.eval() + val_score, ret_samples = validate( + opts=opts, model=model, loader=val_loader, device=device, metrics=metrics, ret_samples_ids=vis_sample_id) + print(metrics.to_str(val_score)) + if val_score['Mean IoU'] > best_score: # save best model + best_score = val_score['Mean IoU'] + save_ckpt('checkpoints/best_%s_%s_os%d.pth' % + (opts.model, opts.dataset,opts.output_stride)) + + if vis is not None: # visualize validation score and samples + vis.vis_scalar("[Val] Overall Acc", cur_itrs, val_score['Overall Acc']) + vis.vis_scalar("[Val] Mean IoU", cur_itrs, val_score['Mean IoU']) + vis.vis_table("[Val] Class IoU", val_score['Class IoU']) + + for k, (img, target, lbl) in enumerate(ret_samples): + img = (denorm(img) * 255).astype(np.uint8) + target = train_dst.decode_target(target).transpose(2, 0, 1).astype(np.uint8) + lbl = train_dst.decode_target(lbl).transpose(2, 0, 1).astype(np.uint8) + concat_img = np.concatenate((img, target, lbl), axis=2) # concat along width + vis.vis_image('Sample %d' % k, concat_img) + model.train() + + if cur_itrs >= opts.total_itrs: + return + + +if __name__ == '__main__': + main() diff --git a/DeepLabV3Plus-Pytorch/metrics/__init__.py b/DeepLabV3Plus-Pytorch/metrics/__init__.py new file mode 100644 index 0000000..7042c87 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/metrics/__init__.py @@ -0,0 +1,2 @@ +from .stream_metrics import StreamSegMetrics, AverageMeter + diff --git a/DeepLabV3Plus-Pytorch/metrics/stream_metrics.py b/DeepLabV3Plus-Pytorch/metrics/stream_metrics.py new file mode 100644 index 0000000..33b8fe9 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/metrics/stream_metrics.py @@ -0,0 +1,110 @@ +import numpy as np +from sklearn.metrics import confusion_matrix + +class _StreamMetrics(object): + def __init__(self): + """ Overridden by subclasses """ + raise NotImplementedError() + + def update(self, gt, pred): + """ Overridden by subclasses """ + raise NotImplementedError() + + def get_results(self): + """ Overridden by subclasses """ + raise NotImplementedError() + + def to_str(self, metrics): + """ Overridden by subclasses """ + raise NotImplementedError() + + def reset(self): + """ Overridden by subclasses """ + raise NotImplementedError() + +class StreamSegMetrics(_StreamMetrics): + """ + Stream Metrics for Semantic Segmentation Task + """ + def __init__(self, n_classes): + self.n_classes = n_classes + self.confusion_matrix = np.zeros((n_classes, n_classes)) + + def update(self, label_trues, label_preds): + for lt, lp in zip(label_trues, label_preds): + self.confusion_matrix += self._fast_hist( lt.flatten(), lp.flatten() ) + + @staticmethod + def to_str(results): + string = "\n" + for k, v in results.items(): + if k!="Class IoU": + string += "%s: %f\n"%(k, v) + + #string+='Class IoU:\n' + #for k, v in results['Class IoU'].items(): + # string += "\tclass %d: %f\n"%(k, v) + return string + + def _fast_hist(self, label_true, label_pred): + mask = (label_true >= 0) & (label_true < self.n_classes) + hist = np.bincount( + self.n_classes * label_true[mask].astype(int) + label_pred[mask], + minlength=self.n_classes ** 2, + ).reshape(self.n_classes, self.n_classes) + return hist + + def get_results(self): + """Returns accuracy score evaluation result. + - overall accuracy + - mean accuracy + - mean IU + - fwavacc + """ + hist = self.confusion_matrix + acc = np.diag(hist).sum() / hist.sum() + acc_cls = np.diag(hist) / hist.sum(axis=1) + acc_cls = np.nanmean(acc_cls) + iu = np.diag(hist) / (hist.sum(axis=1) + hist.sum(axis=0) - np.diag(hist)) + mean_iu = np.nanmean(iu) + freq = hist.sum(axis=1) / hist.sum() + fwavacc = (freq[freq > 0] * iu[freq > 0]).sum() + cls_iu = dict(zip(range(self.n_classes), iu)) + + return { + "Overall Acc": acc, + "Mean Acc": acc_cls, + "FreqW Acc": fwavacc, + "Mean IoU": mean_iu, + "Class IoU": cls_iu, + } + + def reset(self): + self.confusion_matrix = np.zeros((self.n_classes, self.n_classes)) + +class AverageMeter(object): + """Computes average values""" + def __init__(self): + self.book = dict() + + def reset_all(self): + self.book.clear() + + def reset(self, id): + item = self.book.get(id, None) + if item is not None: + item[0] = 0 + item[1] = 0 + + def update(self, id, val): + record = self.book.get(id, None) + if record is None: + self.book[id] = [val, 1] + else: + record[0]+=val + record[1]+=1 + + def get_results(self, id): + record = self.book.get(id, None) + assert record is not None + return record[0] / record[1] diff --git a/DeepLabV3Plus-Pytorch/network/__init__.py b/DeepLabV3Plus-Pytorch/network/__init__.py new file mode 100644 index 0000000..ad24f33 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/__init__.py @@ -0,0 +1,2 @@ +from .modeling import * +from ._deeplab import convert_to_separable_conv \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/network/_deeplab.py b/DeepLabV3Plus-Pytorch/network/_deeplab.py new file mode 100644 index 0000000..c82f7e9 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/_deeplab.py @@ -0,0 +1,178 @@ +import torch +from torch import nn +from torch.nn import functional as F + +from .utils import _SimpleSegmentationModel + + +__all__ = ["DeepLabV3"] + + +class DeepLabV3(_SimpleSegmentationModel): + """ + Implements DeepLabV3 model from + `"Rethinking Atrous Convolution for Semantic Image Segmentation" + `_. + + Arguments: + backbone (nn.Module): the network used to compute the features for the model. + The backbone should return an OrderedDict[Tensor], with the key being + "out" for the last feature map used, and "aux" if an auxiliary classifier + is used. + classifier (nn.Module): module that takes the "out" element returned from + the backbone and returns a dense prediction. + aux_classifier (nn.Module, optional): auxiliary classifier used during training + """ + pass + +class DeepLabHeadV3Plus(nn.Module): + def __init__(self, in_channels, low_level_channels, num_classes, aspp_dilate=[12, 24, 36]): + super(DeepLabHeadV3Plus, self).__init__() + self.project = nn.Sequential( + nn.Conv2d(low_level_channels, 48, 1, bias=False), + nn.BatchNorm2d(48), + nn.ReLU(inplace=True), + ) + + self.aspp = ASPP(in_channels, aspp_dilate) + + self.classifier = nn.Sequential( + nn.Conv2d(304, 256, 3, padding=1, bias=False), + nn.BatchNorm2d(256), + nn.ReLU(inplace=True), + nn.Conv2d(256, num_classes, 1) + ) + self._init_weight() + + def forward(self, feature): + low_level_feature = self.project( feature['low_level'] ) + output_feature = self.aspp(feature['out']) + output_feature = F.interpolate(output_feature, size=low_level_feature.shape[2:], mode='bilinear', align_corners=False) + return self.classifier( torch.cat( [ low_level_feature, output_feature ], dim=1 ) ) + + def _init_weight(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + +class DeepLabHead(nn.Module): + def __init__(self, in_channels, num_classes, aspp_dilate=[12, 24, 36]): + super(DeepLabHead, self).__init__() + + self.classifier = nn.Sequential( + ASPP(in_channels, aspp_dilate), + nn.Conv2d(256, 256, 3, padding=1, bias=False), + nn.BatchNorm2d(256), + nn.ReLU(inplace=True), + nn.Conv2d(256, num_classes, 1) + ) + self._init_weight() + + def forward(self, feature): + return self.classifier( feature['out'] ) + + def _init_weight(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + +class AtrousSeparableConvolution(nn.Module): + """ Atrous Separable Convolution + """ + def __init__(self, in_channels, out_channels, kernel_size, + stride=1, padding=0, dilation=1, bias=True): + super(AtrousSeparableConvolution, self).__init__() + self.body = nn.Sequential( + # Separable Conv + nn.Conv2d( in_channels, in_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, bias=bias, groups=in_channels ), + # PointWise Conv + nn.Conv2d( in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=bias), + ) + + self._init_weight() + + def forward(self, x): + return self.body(x) + + def _init_weight(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + +class ASPPConv(nn.Sequential): + def __init__(self, in_channels, out_channels, dilation): + modules = [ + nn.Conv2d(in_channels, out_channels, 3, padding=dilation, dilation=dilation, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True) + ] + super(ASPPConv, self).__init__(*modules) + +class ASPPPooling(nn.Sequential): + def __init__(self, in_channels, out_channels): + super(ASPPPooling, self).__init__( + nn.AdaptiveAvgPool2d(1), + nn.Conv2d(in_channels, out_channels, 1, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True)) + + def forward(self, x): + size = x.shape[-2:] + x = super(ASPPPooling, self).forward(x) + return F.interpolate(x, size=size, mode='bilinear', align_corners=False) + +class ASPP(nn.Module): + def __init__(self, in_channels, atrous_rates): + super(ASPP, self).__init__() + out_channels = 256 + modules = [] + modules.append(nn.Sequential( + nn.Conv2d(in_channels, out_channels, 1, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True))) + + rate1, rate2, rate3 = tuple(atrous_rates) + modules.append(ASPPConv(in_channels, out_channels, rate1)) + modules.append(ASPPConv(in_channels, out_channels, rate2)) + modules.append(ASPPConv(in_channels, out_channels, rate3)) + modules.append(ASPPPooling(in_channels, out_channels)) + + self.convs = nn.ModuleList(modules) + + self.project = nn.Sequential( + nn.Conv2d(5 * out_channels, out_channels, 1, bias=False), + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True), + nn.Dropout(0.1),) + + def forward(self, x): + res = [] + for conv in self.convs: + res.append(conv(x)) + res = torch.cat(res, dim=1) + return self.project(res) + + + +def convert_to_separable_conv(module): + new_module = module + if isinstance(module, nn.Conv2d) and module.kernel_size[0]>1: + new_module = AtrousSeparableConvolution(module.in_channels, + module.out_channels, + module.kernel_size, + module.stride, + module.padding, + module.dilation, + module.bias) + for name, child in module.named_children(): + new_module.add_module(name, convert_to_separable_conv(child)) + return new_module \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/network/backbone/__init__.py b/DeepLabV3Plus-Pytorch/network/backbone/__init__.py new file mode 100644 index 0000000..afe983f --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/backbone/__init__.py @@ -0,0 +1,2 @@ +from . import resnet +from . import mobilenetv2 diff --git a/DeepLabV3Plus-Pytorch/network/backbone/mobilenetv2.py b/DeepLabV3Plus-Pytorch/network/backbone/mobilenetv2.py new file mode 100644 index 0000000..46fa16a --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/backbone/mobilenetv2.py @@ -0,0 +1,187 @@ +from torch import nn +from torchvision.models.utils import load_state_dict_from_url +import torch.nn.functional as F + +__all__ = ['MobileNetV2', 'mobilenet_v2'] + + +model_urls = { + 'mobilenet_v2': 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth', +} + + +def _make_divisible(v, divisor, min_value=None): + """ + This function is taken from the original tf repo. + It ensures that all layers have a channel number that is divisible by 8 + It can be seen here: + https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py + :param v: + :param divisor: + :param min_value: + :return: + """ + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +class ConvBNReLU(nn.Sequential): + def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, dilation=1, groups=1): + #padding = (kernel_size - 1) // 2 + super(ConvBNReLU, self).__init__( + nn.Conv2d(in_planes, out_planes, kernel_size, stride, 0, dilation=dilation, groups=groups, bias=False), + nn.BatchNorm2d(out_planes), + nn.ReLU6(inplace=True) + ) + +def fixed_padding(kernel_size, dilation): + kernel_size_effective = kernel_size + (kernel_size - 1) * (dilation - 1) + pad_total = kernel_size_effective - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + return (pad_beg, pad_end, pad_beg, pad_end) + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, dilation, expand_ratio): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2] + + hidden_dim = int(round(inp * expand_ratio)) + self.use_res_connect = self.stride == 1 and inp == oup + + layers = [] + if expand_ratio != 1: + # pw + layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1)) + + layers.extend([ + # dw + ConvBNReLU(hidden_dim, hidden_dim, stride=stride, dilation=dilation, groups=hidden_dim), + # pw-linear + nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False), + nn.BatchNorm2d(oup), + ]) + self.conv = nn.Sequential(*layers) + + self.input_padding = fixed_padding( 3, dilation ) + + def forward(self, x): + x_pad = F.pad(x, self.input_padding) + if self.use_res_connect: + return x + self.conv(x_pad) + else: + return self.conv(x_pad) + +class MobileNetV2(nn.Module): + def __init__(self, num_classes=1000, output_stride=8, width_mult=1.0, inverted_residual_setting=None, round_nearest=8): + """ + MobileNet V2 main class + + Args: + num_classes (int): Number of classes + width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount + inverted_residual_setting: Network structure + round_nearest (int): Round the number of channels in each layer to be a multiple of this number + Set to 1 to turn off rounding + """ + super(MobileNetV2, self).__init__() + block = InvertedResidual + input_channel = 32 + last_channel = 1280 + self.output_stride = output_stride + current_stride = 1 + if inverted_residual_setting is None: + inverted_residual_setting = [ + # t, c, n, s + [1, 16, 1, 1], + [6, 24, 2, 2], + [6, 32, 3, 2], + [6, 64, 4, 2], + [6, 96, 3, 1], + [6, 160, 3, 2], + [6, 320, 1, 1], + ] + + # only check the first element, assuming user knows t,c,n,s are required + if len(inverted_residual_setting) == 0 or len(inverted_residual_setting[0]) != 4: + raise ValueError("inverted_residual_setting should be non-empty " + "or a 4-element list, got {}".format(inverted_residual_setting)) + + # building first layer + input_channel = _make_divisible(input_channel * width_mult, round_nearest) + self.last_channel = _make_divisible(last_channel * max(1.0, width_mult), round_nearest) + features = [ConvBNReLU(3, input_channel, stride=2)] + current_stride *= 2 + dilation=1 + previous_dilation = 1 + + # building inverted residual blocks + for t, c, n, s in inverted_residual_setting: + output_channel = _make_divisible(c * width_mult, round_nearest) + previous_dilation = dilation + if current_stride == output_stride: + stride = 1 + dilation *= s + else: + stride = s + current_stride *= s + output_channel = int(c * width_mult) + + for i in range(n): + if i==0: + features.append(block(input_channel, output_channel, stride, previous_dilation, expand_ratio=t)) + else: + features.append(block(input_channel, output_channel, 1, dilation, expand_ratio=t)) + input_channel = output_channel + # building last several layers + features.append(ConvBNReLU(input_channel, self.last_channel, kernel_size=1)) + # make it nn.Sequential + self.features = nn.Sequential(*features) + + # building classifier + self.classifier = nn.Sequential( + nn.Dropout(0.2), + nn.Linear(self.last_channel, num_classes), + ) + + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.zeros_(m.bias) + + def forward(self, x): + x = self.features(x) + x = x.mean([2, 3]) + x = self.classifier(x) + return x + + +def mobilenet_v2(pretrained=False, progress=True, **kwargs): + """ + Constructs a MobileNetV2 architecture from + `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + model = MobileNetV2(**kwargs) + if pretrained: + state_dict = load_state_dict_from_url(model_urls['mobilenet_v2'], + progress=progress) + model.load_state_dict(state_dict) + return model diff --git a/DeepLabV3Plus-Pytorch/network/backbone/resnet.py b/DeepLabV3Plus-Pytorch/network/backbone/resnet.py new file mode 100644 index 0000000..cebee56 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/backbone/resnet.py @@ -0,0 +1,343 @@ +import torch +import torch.nn as nn +from torchvision.models.utils import load_state_dict_from_url + + +__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', + 'resnet152', 'resnext50_32x4d', 'resnext101_32x8d', + 'wide_resnet50_2', 'wide_resnet101_2'] + + +model_urls = { + 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', + 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', + 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', + 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', + 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', + 'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth', + 'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth', + 'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth', + 'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth', +} + + +def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=dilation, groups=groups, bias=False, dilation=dilation) + + +def conv1x1(in_planes, out_planes, stride=1): + """1x1 convolution""" + return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, + base_width=64, dilation=1, norm_layer=None): + super(BasicBlock, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + if groups != 1 or base_width != 64: + raise ValueError('BasicBlock only supports groups=1 and base_width=64') + if dilation > 1: + raise NotImplementedError("Dilation > 1 not supported in BasicBlock") + # Both self.conv1 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = norm_layer(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = norm_layer(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, + base_width=64, dilation=1, norm_layer=None): + super(Bottleneck, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + width = int(planes * (base_width / 64.)) * groups + # Both self.conv2 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv1x1(inplanes, width) + self.bn1 = norm_layer(width) + self.conv2 = conv3x3(width, width, stride, groups, dilation) + self.bn2 = norm_layer(width) + self.conv3 = conv1x1(width, planes * self.expansion) + self.bn3 = norm_layer(planes * self.expansion) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, block, layers, num_classes=1000, zero_init_residual=False, + groups=1, width_per_group=64, replace_stride_with_dilation=None, + norm_layer=None): + super(ResNet, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + self._norm_layer = norm_layer + + self.inplanes = 64 + self.dilation = 1 + if replace_stride_with_dilation is None: + # each element in the tuple indicates if we should replace + # the 2x2 stride with a dilated convolution instead + replace_stride_with_dilation = [False, False, False] + if len(replace_stride_with_dilation) != 3: + raise ValueError("replace_stride_with_dilation should be None " + "or a 3-element tuple, got {}".format(replace_stride_with_dilation)) + self.groups = groups + self.base_width = width_per_group + self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, + bias=False) + self.bn1 = norm_layer(self.inplanes) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2, + dilate=replace_stride_with_dilation[0]) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2, + dilate=replace_stride_with_dilation[1]) + self.layer4 = self._make_layer(block, 512, layers[3], stride=2, + dilate=replace_stride_with_dilation[2]) + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + # Zero-initialize the last BN in each residual branch, + # so that the residual branch starts with zeros, and each residual block behaves like an identity. + # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 + if zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + nn.init.constant_(m.bn3.weight, 0) + elif isinstance(m, BasicBlock): + nn.init.constant_(m.bn2.weight, 0) + + def _make_layer(self, block, planes, blocks, stride=1, dilate=False): + norm_layer = self._norm_layer + downsample = None + previous_dilation = self.dilation + if dilate: + self.dilation *= stride + stride = 1 + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + conv1x1(self.inplanes, planes * block.expansion, stride), + norm_layer(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample, self.groups, + self.base_width, previous_dilation, norm_layer)) + self.inplanes = planes * block.expansion + for _ in range(1, blocks): + layers.append(block(self.inplanes, planes, groups=self.groups, + base_width=self.base_width, dilation=self.dilation, + norm_layer=norm_layer)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = torch.flatten(x, 1) + x = self.fc(x) + + return x + + +def _resnet(arch, block, layers, pretrained, progress, **kwargs): + model = ResNet(block, layers, **kwargs) + if pretrained: + state_dict = load_state_dict_from_url(model_urls[arch], + progress=progress) + model.load_state_dict(state_dict) + return model + + +def resnet18(pretrained=False, progress=True, **kwargs): + r"""ResNet-18 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet18', BasicBlock, [2, 2, 2, 2], pretrained, progress, + **kwargs) + + +def resnet34(pretrained=False, progress=True, **kwargs): + r"""ResNet-34 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet34', BasicBlock, [3, 4, 6, 3], pretrained, progress, + **kwargs) + + +def resnet50(pretrained=False, progress=True, **kwargs): + r"""ResNet-50 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet50', Bottleneck, [3, 4, 6, 3], pretrained, progress, + **kwargs) + + +def resnet101(pretrained=False, progress=True, **kwargs): + r"""ResNet-101 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet101', Bottleneck, [3, 4, 23, 3], pretrained, progress, + **kwargs) + + +def resnet152(pretrained=False, progress=True, **kwargs): + r"""ResNet-152 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet('resnet152', Bottleneck, [3, 8, 36, 3], pretrained, progress, + **kwargs) + + +def resnext50_32x4d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-50 32x4d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['groups'] = 32 + kwargs['width_per_group'] = 4 + return _resnet('resnext50_32x4d', Bottleneck, [3, 4, 6, 3], + pretrained, progress, **kwargs) + + +def resnext101_32x8d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-101 32x8d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['groups'] = 32 + kwargs['width_per_group'] = 8 + return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3], + pretrained, progress, **kwargs) + + +def wide_resnet50_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-50-2 model from + `"Wide Residual Networks" `_ + + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['width_per_group'] = 64 * 2 + return _resnet('wide_resnet50_2', Bottleneck, [3, 4, 6, 3], + pretrained, progress, **kwargs) + + +def wide_resnet101_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-101-2 model from + `"Wide Residual Networks" `_ + + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs['width_per_group'] = 64 * 2 + return _resnet('wide_resnet101_2', Bottleneck, [3, 4, 23, 3], + pretrained, progress, **kwargs) diff --git a/DeepLabV3Plus-Pytorch/network/modeling.py b/DeepLabV3Plus-Pytorch/network/modeling.py new file mode 100644 index 0000000..b053083 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/modeling.py @@ -0,0 +1,137 @@ +from .utils import IntermediateLayerGetter +from ._deeplab import DeepLabHead, DeepLabHeadV3Plus, DeepLabV3 +from .backbone import resnet +from .backbone import mobilenetv2 + +def _segm_resnet(name, backbone_name, num_classes, output_stride, pretrained_backbone): + + if output_stride==8: + replace_stride_with_dilation=[False, True, True] + aspp_dilate = [12, 24, 36] + else: + replace_stride_with_dilation=[False, False, True] + aspp_dilate = [6, 12, 18] + + backbone = resnet.__dict__[backbone_name]( + pretrained=pretrained_backbone, + replace_stride_with_dilation=replace_stride_with_dilation) + + inplanes = 2048 + low_level_planes = 256 + + if name=='deeplabv3plus': + return_layers = {'layer4': 'out', 'layer1': 'low_level'} + classifier = DeepLabHeadV3Plus(inplanes, low_level_planes, num_classes, aspp_dilate) + elif name=='deeplabv3': + return_layers = {'layer4': 'out'} + classifier = DeepLabHead(inplanes , num_classes, aspp_dilate) + backbone = IntermediateLayerGetter(backbone, return_layers=return_layers) + + model = DeepLabV3(backbone, classifier) + return model + +def _segm_mobilenet(name, backbone_name, num_classes, output_stride, pretrained_backbone): + if output_stride==8: + aspp_dilate = [12, 24, 36] + else: + aspp_dilate = [6, 12, 18] + + backbone = mobilenetv2.mobilenet_v2(pretrained=pretrained_backbone, output_stride=output_stride) + + # rename layers + backbone.low_level_features = backbone.features[0:4] + backbone.high_level_features = backbone.features[4:-1] + backbone.features = None + backbone.classifier = None + + inplanes = 320 + low_level_planes = 24 + + if name=='deeplabv3plus': + return_layers = {'high_level_features': 'out', 'low_level_features': 'low_level'} + classifier = DeepLabHeadV3Plus(inplanes, low_level_planes, num_classes, aspp_dilate) + elif name=='deeplabv3': + return_layers = {'high_level_features': 'out'} + classifier = DeepLabHead(inplanes , num_classes, aspp_dilate) + backbone = IntermediateLayerGetter(backbone, return_layers=return_layers) + + model = DeepLabV3(backbone, classifier) + return model + +def _load_model(arch_type, backbone, num_classes, output_stride, pretrained_backbone): + + if backbone=='mobilenetv2': + model = _segm_mobilenet(arch_type, backbone, num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + elif backbone.startswith('resnet'): + model = _segm_resnet(arch_type, backbone, num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + else: + raise NotImplementedError + return model + + +# Deeplab v3 + +def deeplabv3_resnet50(num_classes=21, output_stride=8, pretrained_backbone=True): + """Constructs a DeepLabV3 model with a ResNet-50 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3', 'resnet50', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + +def deeplabv3_resnet101(num_classes=21, output_stride=8, pretrained_backbone=True): + """Constructs a DeepLabV3 model with a ResNet-101 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3', 'resnet101', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + +def deeplabv3_mobilenet(num_classes=21, output_stride=8, pretrained_backbone=True, **kwargs): + """Constructs a DeepLabV3 model with a MobileNetv2 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3', 'mobilenetv2', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + + +# Deeplab v3+ + +def deeplabv3plus_resnet50(num_classes=21, output_stride=8, pretrained_backbone=True): + """Constructs a DeepLabV3 model with a ResNet-50 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3plus', 'resnet50', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + + +def deeplabv3plus_resnet101(num_classes=21, output_stride=8, pretrained_backbone=True): + """Constructs a DeepLabV3+ model with a ResNet-101 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3plus', 'resnet101', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) + + +def deeplabv3plus_mobilenet(num_classes=21, output_stride=8, pretrained_backbone=True): + """Constructs a DeepLabV3+ model with a MobileNetv2 backbone. + + Args: + num_classes (int): number of classes. + output_stride (int): output stride for deeplab. + pretrained_backbone (bool): If True, use the pretrained backbone. + """ + return _load_model('deeplabv3plus', 'mobilenetv2', num_classes, output_stride=output_stride, pretrained_backbone=pretrained_backbone) \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/network/utils.py b/DeepLabV3Plus-Pytorch/network/utils.py new file mode 100644 index 0000000..d6e2782 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/network/utils.py @@ -0,0 +1,76 @@ +import torch +import torch.nn as nn +import numpy as np +import torch.nn.functional as F +from collections import OrderedDict + +class _SimpleSegmentationModel(nn.Module): + def __init__(self, backbone, classifier): + super(_SimpleSegmentationModel, self).__init__() + self.backbone = backbone + self.classifier = classifier + + def forward(self, x): + input_shape = x.shape[-2:] + features = self.backbone(x) + x = self.classifier(features) + x = F.interpolate(x, size=input_shape, mode='bilinear', align_corners=False) + return x + + +class IntermediateLayerGetter(nn.ModuleDict): + """ + Module wrapper that returns intermediate layers from a model + + It has a strong assumption that the modules have been registered + into the model in the same order as they are used. + This means that one should **not** reuse the same nn.Module + twice in the forward if you want this to work. + + Additionally, it is only able to query submodules that are directly + assigned to the model. So if `model` is passed, `model.feature1` can + be returned, but not `model.feature1.layer2`. + + Arguments: + model (nn.Module): model on which we will extract the features + return_layers (Dict[name, new_name]): a dict containing the names + of the modules for which the activations will be returned as + the key of the dict, and the value of the dict is the name + of the returned activation (which the user can specify). + + Examples:: + + >>> m = torchvision.models.resnet18(pretrained=True) + >>> # extract layer1 and layer3, giving as names `feat1` and feat2` + >>> new_m = torchvision.models._utils.IntermediateLayerGetter(m, + >>> {'layer1': 'feat1', 'layer3': 'feat2'}) + >>> out = new_m(torch.rand(1, 3, 224, 224)) + >>> print([(k, v.shape) for k, v in out.items()]) + >>> [('feat1', torch.Size([1, 64, 56, 56])), + >>> ('feat2', torch.Size([1, 256, 14, 14]))] + """ + def __init__(self, model, return_layers): + if not set(return_layers).issubset([name for name, _ in model.named_children()]): + raise ValueError("return_layers are not present in model") + + orig_return_layers = return_layers + return_layers = {k: v for k, v in return_layers.items()} + layers = OrderedDict() + for name, module in model.named_children(): + layers[name] = module + if name in return_layers: + del return_layers[name] + if not return_layers: + break + + super(IntermediateLayerGetter, self).__init__(layers) + self.return_layers = orig_return_layers + + def forward(self, x): + out = OrderedDict() + for name, module in self.named_children(): + x = module(x) + if name in self.return_layers: + out_name = self.return_layers[name] + out[out_name] = x + return out diff --git a/DeepLabV3Plus-Pytorch/requirements.txt b/DeepLabV3Plus-Pytorch/requirements.txt new file mode 100644 index 0000000..48b62a8 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/requirements.txt @@ -0,0 +1,8 @@ +torch +torchvision +numpy +pillow +scikit-learn +tqdm +matplotlib +visdom \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/train.sh b/DeepLabV3Plus-Pytorch/train.sh new file mode 100755 index 0000000..28350c7 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/train.sh @@ -0,0 +1,13 @@ +ROOT=/data/DB/VOC2012/ +MODEL=deeplabv3plus_resnet101 # deeplabv3plus_resnet101, deeplabv3_resnet101 +ITER=20000 +BATCH=32 +LR=0.05 + + +# training with 2 GPUs +CUDA_VISLBLE_DEVICES=0,1 python main.py --data_root ${ROOT} --model ${MODEL} --gpu_id 0,1 --amp --total_itrs ${ITER} --batch_size ${BATCH} --lr ${LR} + + +# evalutation with crf +CUDA_VISIBLE_DEVICES=0,1 python eval.py --gpu_id 0,1 --data_root ${ROOT} --model ${MODEL} --val_batch_size 16 --ckpt checkpoints/best_${MODEL}_voc_os16.pth \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/utils/__init__.py b/DeepLabV3Plus-Pytorch/utils/__init__.py new file mode 100644 index 0000000..172d9f8 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/__init__.py @@ -0,0 +1,4 @@ +from .utils import * +from .visualizer import Visualizer +from .scheduler import PolyLR +from .loss import FocalLoss \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/utils/crf.py b/DeepLabV3Plus-Pytorch/utils/crf.py new file mode 100755 index 0000000..5449883 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/crf.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# coding: utf-8 +# +# Author: Kazuto Nakashima +# URL: https://kazuto1011.github.io +# Date: 09 January 2019 + + +import numpy as np +import pydensecrf.densecrf as dcrf +import pydensecrf.utils as utils + + +class DenseCRF(object): + def __init__(self, iter_max, pos_w, pos_xy_std, bi_w, bi_xy_std, bi_rgb_std): + self.iter_max = iter_max + self.pos_w = pos_w + self.pos_xy_std = pos_xy_std + self.bi_w = bi_w + self.bi_xy_std = bi_xy_std + self.bi_rgb_std = bi_rgb_std + + def __call__(self, image, probmap): + C, H, W = probmap.shape + + U = utils.unary_from_softmax(probmap) + U = np.ascontiguousarray(U) + + image = np.ascontiguousarray(image) + + d = dcrf.DenseCRF2D(W, H, C) + d.setUnaryEnergy(U) + d.addPairwiseGaussian(sxy=self.pos_xy_std, compat=self.pos_w) + d.addPairwiseBilateral( + sxy=self.bi_xy_std, srgb=self.bi_rgb_std, rgbim=image, compat=self.bi_w + ) + + Q = d.inference(self.iter_max) + Q = np.array(Q).reshape((C, H, W)) + + return Q diff --git a/DeepLabV3Plus-Pytorch/utils/ext_transforms.py b/DeepLabV3Plus-Pytorch/utils/ext_transforms.py new file mode 100644 index 0000000..7a7bd9e --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/ext_transforms.py @@ -0,0 +1,571 @@ +import torchvision +import torch +import torchvision.transforms.functional as F +import random +import numbers +import numpy as np +from PIL import Image + + +# +# Extended Transforms for Semantic Segmentation +# +class ExtRandomHorizontalFlip(object): + """Horizontally flip the given PIL Image randomly with a given probability. + + Args: + p (float): probability of the image being flipped. Default value is 0.5 + """ + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be flipped. + + Returns: + PIL Image: Randomly flipped image. + """ + if random.random() < self.p: + return F.hflip(img), F.hflip(lbl) + return img, lbl + + def __repr__(self): + return self.__class__.__name__ + '(p={})'.format(self.p) + + + +class ExtCompose(object): + """Composes several transforms together. + Args: + transforms (list of ``Transform`` objects): list of transforms to compose. + Example: + >>> transforms.Compose([ + >>> transforms.CenterCrop(10), + >>> transforms.ToTensor(), + >>> ]) + """ + + def __init__(self, transforms): + self.transforms = transforms + + def __call__(self, img, lbl): + for t in self.transforms: + img, lbl = t(img, lbl) + return img, lbl + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.transforms: + format_string += '\n' + format_string += ' {0}'.format(t) + format_string += '\n)' + return format_string + + +class ExtCenterCrop(object): + """Crops the given PIL Image at the center. + Args: + size (sequence or int): Desired output size of the crop. If size is an + int instead of sequence like (h, w), a square crop (size, size) is + made. + """ + + def __init__(self, size): + if isinstance(size, numbers.Number): + self.size = (int(size), int(size)) + else: + self.size = size + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be cropped. + Returns: + PIL Image: Cropped image. + """ + return F.center_crop(img, self.size), F.center_crop(lbl, self.size) + + def __repr__(self): + return self.__class__.__name__ + '(size={0})'.format(self.size) + + +class ExtRandomScale(object): + def __init__(self, scale_range, interpolation=Image.BILINEAR): + self.scale_range = scale_range + self.interpolation = interpolation + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be scaled. + lbl (PIL Image): Label to be scaled. + Returns: + PIL Image: Rescaled image. + PIL Image: Rescaled label. + """ + assert img.size == lbl.size + scale = random.uniform(self.scale_range[0], self.scale_range[1]) + target_size = ( int(img.size[1]*scale), int(img.size[0]*scale) ) + return F.resize(img, target_size, self.interpolation), F.resize(lbl, target_size, Image.NEAREST) + + def __repr__(self): + interpolate_str = _pil_interpolation_to_str[self.interpolation] + return self.__class__.__name__ + '(size={0}, interpolation={1})'.format(self.size, interpolate_str) + +class ExtScale(object): + """Resize the input PIL Image to the given scale. + Args: + Scale (sequence or int): scale factors + interpolation (int, optional): Desired interpolation. Default is + ``PIL.Image.BILINEAR`` + """ + + def __init__(self, scale, interpolation=Image.BILINEAR): + self.scale = scale + self.interpolation = interpolation + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be scaled. + lbl (PIL Image): Label to be scaled. + Returns: + PIL Image: Rescaled image. + PIL Image: Rescaled label. + """ + assert img.size == lbl.size + target_size = ( int(img.size[1]*self.scale), int(img.size[0]*self.scale) ) # (H, W) + return F.resize(img, target_size, self.interpolation), F.resize(lbl, target_size, Image.NEAREST) + + def __repr__(self): + interpolate_str = _pil_interpolation_to_str[self.interpolation] + return self.__class__.__name__ + '(size={0}, interpolation={1})'.format(self.size, interpolate_str) + + +class ExtRandomRotation(object): + """Rotate the image by angle. + Args: + degrees (sequence or float or int): Range of degrees to select from. + If degrees is a number instead of sequence like (min, max), the range of degrees + will be (-degrees, +degrees). + resample ({PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC}, optional): + An optional resampling filter. + See http://pillow.readthedocs.io/en/3.4.x/handbook/concepts.html#filters + If omitted, or if the image has mode "1" or "P", it is set to PIL.Image.NEAREST. + expand (bool, optional): Optional expansion flag. + If true, expands the output to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the input image. + Note that the expand flag assumes rotation around the center and no translation. + center (2-tuple, optional): Optional center of rotation. + Origin is the upper left corner. + Default is the center of the image. + """ + + def __init__(self, degrees, resample=False, expand=False, center=None): + if isinstance(degrees, numbers.Number): + if degrees < 0: + raise ValueError("If degrees is a single number, it must be positive.") + self.degrees = (-degrees, degrees) + else: + if len(degrees) != 2: + raise ValueError("If degrees is a sequence, it must be of len 2.") + self.degrees = degrees + + self.resample = resample + self.expand = expand + self.center = center + + @staticmethod + def get_params(degrees): + """Get parameters for ``rotate`` for a random rotation. + Returns: + sequence: params to be passed to ``rotate`` for random rotation. + """ + angle = random.uniform(degrees[0], degrees[1]) + + return angle + + def __call__(self, img, lbl): + """ + img (PIL Image): Image to be rotated. + lbl (PIL Image): Label to be rotated. + Returns: + PIL Image: Rotated image. + PIL Image: Rotated label. + """ + + angle = self.get_params(self.degrees) + + return F.rotate(img, angle, self.resample, self.expand, self.center), F.rotate(lbl, angle, self.resample, self.expand, self.center) + + def __repr__(self): + format_string = self.__class__.__name__ + '(degrees={0}'.format(self.degrees) + format_string += ', resample={0}'.format(self.resample) + format_string += ', expand={0}'.format(self.expand) + if self.center is not None: + format_string += ', center={0}'.format(self.center) + format_string += ')' + return format_string + +class ExtRandomHorizontalFlip(object): + """Horizontally flip the given PIL Image randomly with a given probability. + Args: + p (float): probability of the image being flipped. Default value is 0.5 + """ + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be flipped. + Returns: + PIL Image: Randomly flipped image. + """ + if random.random() < self.p: + return F.hflip(img), F.hflip(lbl) + return img, lbl + + def __repr__(self): + return self.__class__.__name__ + '(p={})'.format(self.p) + + +class ExtRandomVerticalFlip(object): + """Vertically flip the given PIL Image randomly with a given probability. + Args: + p (float): probability of the image being flipped. Default value is 0.5 + """ + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be flipped. + lbl (PIL Image): Label to be flipped. + Returns: + PIL Image: Randomly flipped image. + PIL Image: Randomly flipped label. + """ + if random.random() < self.p: + return F.vflip(img), F.vflip(lbl) + return img, lbl + + def __repr__(self): + return self.__class__.__name__ + '(p={})'.format(self.p) + +class ExtPad(object): + def __init__(self, diviser=32): + self.diviser = diviser + + def __call__(self, img, lbl): + h, w = img.size + ph = (h//32+1)*32 - h if h%32!=0 else 0 + pw = (w//32+1)*32 - w if w%32!=0 else 0 + im = F.pad(img, ( pw//2, pw-pw//2, ph//2, ph-ph//2) ) + lbl = F.pad(lbl, ( pw//2, pw-pw//2, ph//2, ph-ph//2)) + return im, lbl + +class ExtToTensor(object): + """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor. + Converts a PIL Image or numpy.ndarray (H x W x C) in the range + [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0]. + """ + def __init__(self, normalize=True, target_type='uint8'): + self.normalize = normalize + self.target_type = target_type + def __call__(self, pic, lbl): + """ + Note that labels will not be normalized to [0, 1]. + Args: + pic (PIL Image or numpy.ndarray): Image to be converted to tensor. + lbl (PIL Image or numpy.ndarray): Label to be converted to tensor. + Returns: + Tensor: Converted image and label + """ + if self.normalize: + return F.to_tensor(pic), torch.from_numpy( np.array( lbl, dtype=self.target_type) ) + else: + return torch.from_numpy( np.array( pic, dtype=np.float32).transpose(2, 0, 1) ), torch.from_numpy( np.array( lbl, dtype=self.target_type) ) + + def __repr__(self): + return self.__class__.__name__ + '()' + +class ExtNormalize(object): + """Normalize a tensor image with mean and standard deviation. + Given mean: ``(M1,...,Mn)`` and std: ``(S1,..,Sn)`` for ``n`` channels, this transform + will normalize each channel of the input ``torch.*Tensor`` i.e. + ``input[channel] = (input[channel] - mean[channel]) / std[channel]`` + Args: + mean (sequence): Sequence of means for each channel. + std (sequence): Sequence of standard deviations for each channel. + """ + + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, tensor, lbl): + """ + Args: + tensor (Tensor): Tensor image of size (C, H, W) to be normalized. + tensor (Tensor): Tensor of label. A dummy input for ExtCompose + Returns: + Tensor: Normalized Tensor image. + Tensor: Unchanged Tensor label + """ + return F.normalize(tensor, self.mean, self.std), lbl + + def __repr__(self): + return self.__class__.__name__ + '(mean={0}, std={1})'.format(self.mean, self.std) + + +class ExtRandomCrop(object): + """Crop the given PIL Image at a random location. + Args: + size (sequence or int): Desired output size of the crop. If size is an + int instead of sequence like (h, w), a square crop (size, size) is + made. + padding (int or sequence, optional): Optional padding on each border + of the image. Default is 0, i.e no padding. If a sequence of length + 4 is provided, it is used to pad left, top, right, bottom borders + respectively. + pad_if_needed (boolean): It will pad the image if smaller than the + desired size to avoid raising an exception. + """ + + def __init__(self, size, padding=0, pad_if_needed=False): + if isinstance(size, numbers.Number): + self.size = (int(size), int(size)) + else: + self.size = size + self.padding = padding + self.pad_if_needed = pad_if_needed + + @staticmethod + def get_params(img, output_size): + """Get parameters for ``crop`` for a random crop. + Args: + img (PIL Image): Image to be cropped. + output_size (tuple): Expected output size of the crop. + Returns: + tuple: params (i, j, h, w) to be passed to ``crop`` for random crop. + """ + w, h = img.size + th, tw = output_size + if w == tw and h == th: + return 0, 0, h, w + + i = random.randint(0, h - th) + j = random.randint(0, w - tw) + return i, j, th, tw + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be cropped. + lbl (PIL Image): Label to be cropped. + Returns: + PIL Image: Cropped image. + PIL Image: Cropped label. + """ + assert img.size == lbl.size, 'size of img and lbl should be the same. %s, %s'%(img.size, lbl.size) + if self.padding > 0: + img = F.pad(img, self.padding) + lbl = F.pad(lbl, self.padding) + + # pad the width if needed + if self.pad_if_needed and img.size[0] < self.size[1]: + img = F.pad(img, padding=int((1 + self.size[1] - img.size[0]) / 2)) + lbl = F.pad(lbl, padding=int((1 + self.size[1] - lbl.size[0]) / 2)) + + # pad the height if needed + if self.pad_if_needed and img.size[1] < self.size[0]: + img = F.pad(img, padding=int((1 + self.size[0] - img.size[1]) / 2)) + lbl = F.pad(lbl, padding=int((1 + self.size[0] - lbl.size[1]) / 2)) + + i, j, h, w = self.get_params(img, self.size) + + return F.crop(img, i, j, h, w), F.crop(lbl, i, j, h, w) + + def __repr__(self): + return self.__class__.__name__ + '(size={0}, padding={1})'.format(self.size, self.padding) + + +class ExtResize(object): + """Resize the input PIL Image to the given size. + Args: + size (sequence or int): Desired output size. If size is a sequence like + (h, w), output size will be matched to this. If size is an int, + smaller edge of the image will be matched to this number. + i.e, if height > width, then image will be rescaled to + (size * height / width, size) + interpolation (int, optional): Desired interpolation. Default is + ``PIL.Image.BILINEAR`` + """ + + def __init__(self, size, interpolation=Image.BILINEAR): + assert isinstance(size, int) or (isinstance(size, collections.Iterable) and len(size) == 2) + self.size = size + self.interpolation = interpolation + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Image to be scaled. + Returns: + PIL Image: Rescaled image. + """ + return F.resize(img, self.size, self.interpolation), F.resize(lbl, self.size, Image.NEAREST) + + def __repr__(self): + interpolate_str = _pil_interpolation_to_str[self.interpolation] + return self.__class__.__name__ + '(size={0}, interpolation={1})'.format(self.size, interpolate_str) + +class ExtColorJitter(object): + """Randomly change the brightness, contrast and saturation of an image. + + Args: + brightness (float or tuple of float (min, max)): How much to jitter brightness. + brightness_factor is chosen uniformly from [max(0, 1 - brightness), 1 + brightness] + or the given [min, max]. Should be non negative numbers. + contrast (float or tuple of float (min, max)): How much to jitter contrast. + contrast_factor is chosen uniformly from [max(0, 1 - contrast), 1 + contrast] + or the given [min, max]. Should be non negative numbers. + saturation (float or tuple of float (min, max)): How much to jitter saturation. + saturation_factor is chosen uniformly from [max(0, 1 - saturation), 1 + saturation] + or the given [min, max]. Should be non negative numbers. + hue (float or tuple of float (min, max)): How much to jitter hue. + hue_factor is chosen uniformly from [-hue, hue] or the given [min, max]. + Should have 0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5. + """ + def __init__(self, brightness=0, contrast=0, saturation=0, hue=0): + self.brightness = self._check_input(brightness, 'brightness') + self.contrast = self._check_input(contrast, 'contrast') + self.saturation = self._check_input(saturation, 'saturation') + self.hue = self._check_input(hue, 'hue', center=0, bound=(-0.5, 0.5), + clip_first_on_zero=False) + + def _check_input(self, value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True): + if isinstance(value, numbers.Number): + if value < 0: + raise ValueError("If {} is a single number, it must be non negative.".format(name)) + value = [center - value, center + value] + if clip_first_on_zero: + value[0] = max(value[0], 0) + elif isinstance(value, (tuple, list)) and len(value) == 2: + if not bound[0] <= value[0] <= value[1] <= bound[1]: + raise ValueError("{} values should be between {}".format(name, bound)) + else: + raise TypeError("{} should be a single number or a list/tuple with lenght 2.".format(name)) + + # if value is 0 or (1., 1.) for brightness/contrast/saturation + # or (0., 0.) for hue, do nothing + if value[0] == value[1] == center: + value = None + return value + + @staticmethod + def get_params(brightness, contrast, saturation, hue): + """Get a randomized transform to be applied on image. + + Arguments are same as that of __init__. + + Returns: + Transform which randomly adjusts brightness, contrast and + saturation in a random order. + """ + transforms = [] + + if brightness is not None: + brightness_factor = random.uniform(brightness[0], brightness[1]) + transforms.append(Lambda(lambda img: F.adjust_brightness(img, brightness_factor))) + + if contrast is not None: + contrast_factor = random.uniform(contrast[0], contrast[1]) + transforms.append(Lambda(lambda img: F.adjust_contrast(img, contrast_factor))) + + if saturation is not None: + saturation_factor = random.uniform(saturation[0], saturation[1]) + transforms.append(Lambda(lambda img: F.adjust_saturation(img, saturation_factor))) + + if hue is not None: + hue_factor = random.uniform(hue[0], hue[1]) + transforms.append(Lambda(lambda img: F.adjust_hue(img, hue_factor))) + + random.shuffle(transforms) + transform = Compose(transforms) + + return transform + + def __call__(self, img, lbl): + """ + Args: + img (PIL Image): Input image. + + Returns: + PIL Image: Color jittered image. + """ + transform = self.get_params(self.brightness, self.contrast, + self.saturation, self.hue) + return transform(img), lbl + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + format_string += 'brightness={0}'.format(self.brightness) + format_string += ', contrast={0}'.format(self.contrast) + format_string += ', saturation={0}'.format(self.saturation) + format_string += ', hue={0})'.format(self.hue) + return format_string + +class Lambda(object): + """Apply a user-defined lambda as a transform. + + Args: + lambd (function): Lambda/function to be used for transform. + """ + + def __init__(self, lambd): + assert callable(lambd), repr(type(lambd).__name__) + " object is not callable" + self.lambd = lambd + + def __call__(self, img): + return self.lambd(img) + + def __repr__(self): + return self.__class__.__name__ + '()' + + +class Compose(object): + """Composes several transforms together. + + Args: + transforms (list of ``Transform`` objects): list of transforms to compose. + + Example: + >>> transforms.Compose([ + >>> transforms.CenterCrop(10), + >>> transforms.ToTensor(), + >>> ]) + """ + + def __init__(self, transforms): + self.transforms = transforms + + def __call__(self, img): + for t in self.transforms: + img = t(img) + return img + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.transforms: + format_string += '\n' + format_string += ' {0}'.format(t) + format_string += '\n)' + return format_string \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/utils/loss.py b/DeepLabV3Plus-Pytorch/utils/loss.py new file mode 100644 index 0000000..64a5f54 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/loss.py @@ -0,0 +1,21 @@ +import torch.nn as nn +import torch.nn.functional as F +import torch + +class FocalLoss(nn.Module): + def __init__(self, alpha=1, gamma=0, size_average=True, ignore_index=255): + super(FocalLoss, self).__init__() + self.alpha = alpha + self.gamma = gamma + self.ignore_index = ignore_index + self.size_average = size_average + + def forward(self, inputs, targets): + ce_loss = F.cross_entropy( + inputs, targets, reduction='none', ignore_index=self.ignore_index) + pt = torch.exp(-ce_loss) + focal_loss = self.alpha * (1-pt)**self.gamma * ce_loss + if self.size_average: + return focal_loss.mean() + else: + return focal_loss.sum() \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/utils/scheduler.py b/DeepLabV3Plus-Pytorch/utils/scheduler.py new file mode 100644 index 0000000..65ffcec --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/scheduler.py @@ -0,0 +1,12 @@ +from torch.optim.lr_scheduler import _LRScheduler, StepLR + +class PolyLR(_LRScheduler): + def __init__(self, optimizer, max_iters, power=0.9, last_epoch=-1, min_lr=1e-6): + self.power = power + self.max_iters = max_iters # avoid zero lr + self.min_lr = min_lr + super(PolyLR, self).__init__(optimizer, last_epoch) + + def get_lr(self): + return [ max( base_lr * ( 1 - self.last_epoch/self.max_iters )**self.power, self.min_lr) + for base_lr in self.base_lrs] \ No newline at end of file diff --git a/DeepLabV3Plus-Pytorch/utils/utils.py b/DeepLabV3Plus-Pytorch/utils/utils.py new file mode 100644 index 0000000..b5be062 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/utils.py @@ -0,0 +1,55 @@ +from torchvision.transforms.functional import normalize +import torch.nn as nn +import numpy as np +import os + +def denormalize(tensor, mean, std): + mean = np.array(mean) + std = np.array(std) + + _mean = -mean/std + _std = 1/std + return normalize(tensor, _mean, _std) + +class Denormalize(object): + def __init__(self, mean, std): + mean = np.array(mean) + std = np.array(std) + self._mean = -mean/std + self._std = 1/std + + def __call__(self, tensor): + if isinstance(tensor, np.ndarray): + return (tensor - self._mean.reshape(-1,1,1)) / self._std.reshape(-1,1,1) + return normalize(tensor, self._mean, self._std) + +def set_bn_momentum(model, momentum=0.1): + for m in model.modules(): + if isinstance(m, nn.BatchNorm2d): + m.momentum = momentum + +def fix_bn(model): + for m in model.modules(): + if isinstance(m, nn.BatchNorm2d): + m.eval() + +def mkdir(path): + if not os.path.exists(path): + os.mkdir(path) + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count diff --git a/DeepLabV3Plus-Pytorch/utils/visualizer.py b/DeepLabV3Plus-Pytorch/utils/visualizer.py new file mode 100644 index 0000000..d1280e2 --- /dev/null +++ b/DeepLabV3Plus-Pytorch/utils/visualizer.py @@ -0,0 +1,87 @@ +from visdom import Visdom +import json + +class Visualizer(object): + """ Visualizer + """ + def __init__(self, port='13579', env='main', id=None): + #self.cur_win = {} + self.vis = Visdom(port=port, env=env) + self.id = id + self.env = env + # Restore + #ori_win = self.vis.get_window_data() + #ori_win = json.loads(ori_win) + #print(ori_win) + #self.cur_win = { v['title']: k for k, v in ori_win.items() } + + def vis_scalar(self, name, x, y, opts=None): + if not isinstance(x, list): + x = [x] + if not isinstance(y, list): + y = [y] + + if self.id is not None: + name = "[%s]"%self.id + name + default_opts = { 'title': name } + if opts is not None: + default_opts.update(opts) + + #win = self.cur_win.get(name, None) + #if win is not None: + self.vis.line( X=x, Y=y, win=name, opts=default_opts, update='append') + #else: + # self.cur_win[name] = self.vis.line( X=x, Y=y, opts=default_opts) + + def vis_image(self, name, img, env=None, opts=None): + """ vis image in visdom + """ + if env is None: + env = self.env + if self.id is not None: + name = "[%s]"%self.id + name + #win = self.cur_win.get(name, None) + default_opts = { 'title': name } + if opts is not None: + default_opts.update(opts) + #if win is not None: + self.vis.image( img=img, win=name, opts=opts, env=env ) + #else: + # self.cur_win[name] = self.vis.image( img=img, opts=default_opts, env=env ) + + def vis_table(self, name, tbl, opts=None): + #win = self.cur_win.get(name, None) + + tbl_str = " " + tbl_str+=" \ + \ + \ + " + for k, v in tbl.items(): + tbl_str+= " \ + \ + \ + "%(k, v) + + tbl_str+="
TermValue
%s%s
" + + default_opts = { 'title': name } + if opts is not None: + default_opts.update(opts) + #if win is not None: + self.vis.text(tbl_str, win=name, opts=default_opts) + #else: + #self.cur_win[name] = self.vis.text(tbl_str, opts=default_opts) + + +if __name__=='__main__': + import numpy as np + vis = Visualizer(port=35588, env='main') + tbl = {"lr": 214, "momentum": 0.9} + vis.vis_table("test_table", tbl) + tbl = {"lr": 244444, "momentum": 0.9, "haha": "hoho"} + vis.vis_table("test_table", tbl) + + vis.vis_scalar(name='loss', x=0, y=1) + vis.vis_scalar(name='loss', x=2, y=4) + vis.vis_scalar(name='loss', x=4, y=6) \ No newline at end of file diff --git a/README.md b/README.md index 9053dc2..24598bd 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Discriminative Region Suppression for Weakly-Supervised Semantic Segmentation [[ We propose the discriminative region suppression (DRS) module that is a simple yet effective method to expand object activation regions. DRS suppresses the attention on discriminative regions and spreads it to adjacent non-discriminative regions, generating dense localization maps. +[2021.06.10] we support DeepLab-V3 segmentation network! + ![DRS module](https://github.com/qjadud1994/DRS/blob/main/docs/DRS_module.png) @@ -57,6 +59,8 @@ bash run.sh ## Training the DeepLab-V2 using pseudo labels We adopt the DeepLab-V2 pytorch implementation from https://github.com/kazuto1011/deeplab-pytorch. +* According to the [DeepLab-V2 pytorch implementation](https://github.com/kazuto1011/deeplab-pytorch#download-pre-trained-caffemodels) , we requires an initial weights [[download]](https://drive.google.com/file/d/1Wj8Maj9KGQgwtDfvIp8FChsdAIgDvliT/view?usp=sharing). + ~~~ cd DeepLab-V2-PyTorch/ @@ -70,13 +74,30 @@ bash train.sh bash eval.sh ~~~ +## Training the DeepLab-V3+ using pseudo labels +We adopt the DeepLab-V3+ pytorch implementation from https://github.com/VainF/DeepLabV3Plus-Pytorch. + +Note that **DeepLab-V2** suffers from the small batch issue, therefore, they utilize COCO pretrained weight and freeze batch-normalization layers; DeepLab-V2 without COCO-pretrained weight cannot reproduce their performance even in fully-supervised setting. + +In contrast, **DeepLab-V3 does not require the COCO-pretrained weight** due to the recent large memory GPUs and Synchronized BatchNorm. +We argue that the choice of DeepLab-V3 network is more reasonable and better to measure the quality of pseudo labels. + +~~~ +cd DeepLabV3Plus-Pytorch/ + +# training & evaluation the DeepLab-V3+ using pseudo labels +vi run.sh # modify the dataset path --data_root +bash run.sh +~~~ + | Model | mIoU | mIoU + CRF | pretrained | | :----: | :----: | :----: | :----: | | DeepLab-V2 with ResNet-101 | 69.4% | 70.4% | [[link]](https://drive.google.com/drive/folders/1zJnRI5WRnv4cL9XY5jAojwIcO7MrUwun?usp=sharing) +| DeepLab-V3+ with ResNet-101 | 70.4% | 71.0% | [[link]](https://drive.google.com/file/d/1W1LV3gvBPRr2lIlWdvqZ-cs87qYT8Nax/view?usp=sharing) * Note that the pretrained weight path `./DeepLab-V2-Pytorch/data/models/Deeplabv2_pseudo_segmentation_labels/deeplabv2_resnet101_msc/train_cls/checkpoint_final.pth` -* According to the [DeepLab-V2 pytorch implementation](https://github.com/kazuto1011/deeplab-pytorch#download-pre-trained-caffemodels) we used, we requires an initial weights [[download]](https://drive.google.com/file/d/1Wj8Maj9KGQgwtDfvIp8FChsdAIgDvliT/view?usp=sharing). +