├── assets ├── architecture.png └── histogram_alignment.png ├── .gitignore ├── trained_models ├── download_ori_model.sh ├── download_sca_model.sh └── README.md ├── datasets ├── patchpose_dataset_generation │ ├── generation_script.sh │ ├── dataset_split.py │ ├── filter.py │ ├── data_generation.py │ ├── verification.ipynb │ ├── val_all.txt │ ├── test_all.txt │ └── train_all.txt ├── download.sh ├── test_dataset.py ├── patchpose.py └── hpatchespose_dataset_generation │ └── generate_dataset.py ├── model ├── loss.py └── model.py ├── LICENSE ├── install.sh ├── config.py ├── test.py ├── utils ├── utils.py ├── train_utils.py └── test_utils.py ├── README.md └── train.py /assets/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bluedream1121/self-sca-ori/HEAD/assets/architecture.png -------------------------------------------------------------------------------- /assets/histogram_alignment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bluedream1121/self-sca-ori/HEAD/assets/histogram_alignment.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints/ 2 | *__pycache__* 3 | *.vscode 4 | *.ipynb_checkpoints 5 | 6 | logs/ 7 | wandb/ 8 | trained_models/_* 9 | 10 | ## datasets 11 | datasets/patchPose 12 | datasets/patchpose_dataset_generation/SPair-71k 13 | datasets/hpatchesPose 14 | datasets/hpatchespose_dataset_generation/hpatches-sequences-release 15 | -------------------------------------------------------------------------------- /trained_models/download_ori_model.sh: -------------------------------------------------------------------------------- 1 | wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies \ 2 | --no-check-certificate 'https://docs.google.com/uc?export=download&id=1bCZqtRg2LoMQuZApagVLf3sd5daeW70A' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1bCZqtRg2LoMQuZApagVLf3sd5daeW70A" -O weights_ori.tar.gz && rm -rf /tmp/cookies.txt 3 | 4 | tar -zxvf weights_ori.tar.gz 5 | rm -rf weights_ori.tar.gz 6 | -------------------------------------------------------------------------------- /trained_models/download_sca_model.sh: -------------------------------------------------------------------------------- 1 | wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies \ 2 | --no-check-certificate 'https://docs.google.com/uc?export=download&id=1qO22Gz_ktji1NOigdrHgTyZAMs4Ecbxw' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1qO22Gz_ktji1NOigdrHgTyZAMs4Ecbxw" -O weights_sca.tar.gz && rm -rf /tmp/cookies.txt 3 | 4 | tar -zxvf weights_sca.tar.gz 5 | rm -rf weights_sca.tar.gz 6 | 7 | 8 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/generation_script.sh: -------------------------------------------------------------------------------- 1 | # PatchPoseA generation 2 | python data_generation.py --dataset patchPoseA --dataset_path ./SPair-71k --num_patches_per_image 3 --output_dir ../patchPose 3 | python filter.py --dataset patchPoseA --dataset_path ../patchPose 4 | python dataset_split.py --dataset patchPoseA --dataset_path ../patchPose 5 | 6 | # PatchPoseB generation 7 | python data_generation.py --dataset patchPoseB --dataset_path ./SPair-71k --num_patches_per_image 3 --output_dir ../patchPose 8 | python filter.py --dataset patchPoseB --dataset_path ../patchPose 9 | python dataset_split.py --dataset patchPoseB --dataset_path ../patchPose 10 | 11 | -------------------------------------------------------------------------------- /trained_models/README.md: -------------------------------------------------------------------------------- 1 | # Self-Supervised Learning of Image Scale and Orientation Estimation (BMVC 2021) 2 | 3 | 4 | 5 | 6 | ## Trained models 7 | 8 | ### Update (08/01) 9 | 10 | - We release the pre-trained model at the following link. 11 | 12 | please download 13 | 14 | Best orientation estimation model: [this link](https://postechackr-my.sharepoint.com/:u:/g/personal/ljm1121_postech_ac_kr/EUUkQkdDwPRKqrpRBy8nl7kBAOeSmtZmG9T3otZzJvyRHw?e=iuMpyY) (127M) (password : self). 15 | 16 | Best scale estimation model: [this link](https://postechackr-my.sharepoint.com/:u:/g/personal/ljm1121_postech_ac_kr/EWeGC1pi8ElClEcqEf6HuwIB2EVCxiJ66vd84QxBvwAeDA?e=WRV5Fo) (127M) (password : self). 17 | 18 | 19 | 20 | ## Contact 21 | 22 | Jongmin Lee (ljm1121@postech.ac.kr) 23 | 24 | Questions can also be left as issues in the repository. 25 | 26 | -------------------------------------------------------------------------------- /model/loss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | 4 | 5 | def kl_div_temperature(pred_p, pred_q, T): 6 | p = F.log_softmax(pred_p/T, dim=1) 7 | q = F.softmax(pred_q/T, dim=1) 8 | l_kl = F.kl_div(p, q, size_average=False) * (T**2) / pred_p.shape[0] 9 | return l_kl 10 | 11 | def kl_divergence(p, q): 12 | return - p * (torch.log(q + 1e-5)) + p * (torch.log(p + 1e-5)) 13 | 14 | def js_divergence(p_gt, q_model_output): 15 | M = (p_gt + q_model_output) * 0.5 16 | return (kl_divergence(p_gt, M) + kl_divergence(q_model_output, M)) * 0.5 17 | 18 | def cross_entropy_symmetric(p_gt, q_model_output): 19 | return - p_gt * (torch.log(q_model_output + 1e-5)) - q_model_output * (torch.log(p_gt + 1e-5)) 20 | 21 | def cross_entropy(p_gt, q_model_output): 22 | return - p_gt * (torch.log(q_model_output + 1e-5)) 23 | -------------------------------------------------------------------------------- /datasets/download.sh: -------------------------------------------------------------------------------- 1 | wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies \ 2 | --no-check-certificate 'https://docs.google.com/uc?export=download&id=1ylw6AZ8AsyRmvook3FXrR2miSNajo6HE' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1ylw6AZ8AsyRmvook3FXrR2miSNajo6HE" -O patchPose.tar.gz && rm -rf /tmp/cookies.txt 3 | 4 | tar -zxvf patchPose.tar.gz 5 | rm -rf patchPose.tar.gz 6 | 7 | 8 | 9 | wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies \ 10 | --no-check-certificate 'https://docs.google.com/uc?export=download&id=1KUv6PAAIuRlzoZbw1xEv4-l_3gQ3_UCF' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1KUv6PAAIuRlzoZbw1xEv4-l_3gQ3_UCF" -O hpatchesPose.tar.gz && rm -rf /tmp/cookies.txt 11 | 12 | tar -zxvf hpatchesPose.tar.gz 13 | rm -rf hpatchesPose.tar.gz 14 | 15 | 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jongmin Lee 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | if [ "$#" -ne 2 ]; then 5 | echo "ERROR! Illegal number of parameters. Usage: bash install.sh conda_install_path environment_name" 6 | exit 0 7 | fi 8 | 9 | conda_install_path=$1 10 | conda_env_name=$2 11 | 12 | echo "" 13 | echo "" 14 | 15 | source $conda_install_path/etc/profile.d/conda.sh 16 | echo "****************** Creating conda environment ${conda_env_name} python=3.8.5 ******************" 17 | conda create -y --name $conda_env_name python=3.8.5 18 | 19 | echo "" 20 | echo "" 21 | echo "****************** Activating conda environment ${conda_env_name} ******************" 22 | conda activate $conda_env_name 23 | 24 | echo "****************** Installing pytorch with cuda11.1 ******************" 25 | conda install -y pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia 26 | 27 | echo "" 28 | echo "" 29 | echo "****************** Installing matplotlib ******************" 30 | conda install -y matplotlib 31 | 32 | echo "" 33 | echo "" 34 | echo "****************** Installing opencv, scipy, tqdm, exifread ******************" 35 | pip install opencv-python 36 | pip install scipy 37 | pip install argparse 38 | pip install tqdm 39 | pip install wandb 40 | 41 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import os, wandb, argparse 2 | 3 | def get_train_config(): 4 | ## 1. hyperparameters 5 | parser = argparse.ArgumentParser(description='Self-supervised learning of image scale and orientation estimation.') 6 | 7 | parser.add_argument('--output_ori', type=int, default=36, help="orientation histogram size; default: 36") 8 | parser.add_argument('--output_sca', type=int, default=13, help="scale histogram size; default: 13") 9 | parser.add_argument('--epochs', type=int, default=250) 10 | parser.add_argument('--batch_size', type=int, default=64) 11 | parser.add_argument('--lr', type=float, default=3, help="learning rate") 12 | parser.add_argument('--momentum', type=float, default=0.9, help='0.9, 0.99, 0.999') 13 | parser.add_argument('--backbone', type=str, default='resnet18') 14 | parser.add_argument('--dataset_type', type=str, default="ppa_ppb", help="ppa: patchposeA, ppb: patchposeB, ppa_ppb: patchposeA + patchposeB") 15 | parser.add_argument('--load', type=str, default=False, help="Load a trained model.") 16 | parser.add_argument('--branch', type=str, default='ori', help='alter, sca, ori; alter is batch-alternation of sca/ori. ') 17 | parser.add_argument('--softmax_temperature', type=float, default=20, help='softmax temperature. ') 18 | 19 | args = parser.parse_args() 20 | print(args) 21 | 22 | ## 2. wandb init 23 | os.environ["WANDB_MODE"] = "dryrun" 24 | 25 | wandb.init() 26 | wandb.config.update(args, allow_val_change=True) 27 | 28 | return args 29 | 30 | def get_test_config(): 31 | ## hyperparameters 32 | parser = argparse.ArgumentParser(description='test code.') 33 | parser.add_argument('--load', type=str, default='') 34 | parser.add_argument('--test_set', type=str, default='test') 35 | parser.add_argument('--dataset_type', type=str, default='ppa_ppb', help='ppa_ppb, hpa.') 36 | parser.add_argument('--batch_size', type=int, default=512) 37 | parser.add_argument('--output_file_ori', type=str, default='', help='e.g. _1118_ori.txt') 38 | parser.add_argument('--output_file_sca', type=str, default='', help='e.g. _1118_sca.txt') 39 | args = parser.parse_args() 40 | 41 | return args 42 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import os, torch, argparse 2 | import torch.nn as nn 3 | import numpy as np 4 | 5 | from model.model import PatchPoseNet 6 | 7 | from torch.utils.data import DataLoader 8 | from datasets.test_dataset import test_dataset, get_test_list, get_test_imnames 9 | from utils.test_utils import test, scale_evaluation, orientation_evaluation 10 | from config import get_test_config 11 | 12 | ## hyperparameters 13 | args = get_test_config() 14 | 15 | ## Load model and make configurations by directory name parsing. 16 | trained_model_name = args.load 17 | scale_hist_size = int(trained_model_name.split('/')[-2].split('sca')[1].split('_')[0]) 18 | scale_hist_size_one_way = (scale_hist_size -1) / 2 19 | 20 | orient_hist_size = int(trained_model_name.split('/')[-2].split('ori')[1].split('_')[0]) 21 | orient_hist_interval = 360 / orient_hist_size 22 | 23 | backbone = 'resnet' + trained_model_name.split('resnet')[1].split('_')[0] 24 | 25 | net = PatchPoseNet(backbone=backbone, output_ori = orient_hist_size, output_sca = scale_hist_size, use_pretrain=False).cuda() 26 | net.load_state_dict(torch.load(trained_model_name)) 27 | net.eval() 28 | 29 | ## load test list 30 | test_list, dataset_path = get_test_list(args.dataset_type, args.test_set) 31 | 32 | print(' trained_model_name : ', trained_model_name, '\n') 33 | print(" scale hist_size " , scale_hist_size, "\n orientation hist_size " , orient_hist_size, '\n') 34 | print(' total test samples: ', len(test_list), '\n') 35 | 36 | ## init dataloader 37 | scale_imnames, orientation_imnames = get_test_imnames(test_list) 38 | 39 | dataset_scale = test_dataset(dataset_path, scale_imnames, 'scale') 40 | dataloader_scale = DataLoader(dataset_scale, batch_size=args.batch_size, num_workers=0, shuffle=False) 41 | dataset_orientation = test_dataset(dataset_path, orientation_imnames, 'orientation') 42 | dataloader_orientation = DataLoader(dataset_orientation, batch_size=args.batch_size, num_workers=0, shuffle=False) 43 | 44 | ## Compute the error. 45 | scale_err = test(net, dataloader_scale, 'scale', scale_hist_size_one_way, None) 46 | orientation_err = test(net, dataloader_orientation, 'orientation', None, orient_hist_interval) 47 | 48 | ## Compute the results. 49 | res_sca = scale_evaluation(scale_err, scale_hist_size_one_way) 50 | res_ori = orientation_evaluation(orientation_err, orient_hist_size) 51 | 52 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/dataset_split.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import pdb 3 | import os 4 | import torch 5 | from torchvision.models import resnet18 6 | from torch.utils.data import Dataset, DataLoader 7 | import torchvision.transforms as tf 8 | import torch.nn as nn 9 | from PIL import Image 10 | import tqdm 11 | import shutil 12 | import numpy as np 13 | import random 14 | 15 | random.seed(100) 16 | 17 | if __name__ == "__main__": 18 | 19 | parser = argparse.ArgumentParser("Filtering PatchPoseA and PatchPoseB") 20 | parser.add_argument("--dataset_path", type=str, default="output", help="path to dataset") 21 | parser.add_argument("--dataset", type=str, choices=["patchPoseA", "patchPoseB", "hpatchesPoseA", "hpatchesPoseB"], default="patchPoseA", help="dataset to use") 22 | parser.add_argument("--split_ratio", type=float, default=0.98, help="ratio of images to be filtered") 23 | args = parser.parse_args() 24 | 25 | args.txt_path = os.path.join(args.dataset_path, args.dataset + ".txt") 26 | filtered_list = os.path.join(args.dataset_path, f"{args.dataset}ImageList") 27 | 28 | train_txt, val_txt, test_txt = ( 29 | open(os.path.join(filtered_list, "train_acquired.txt"), "r"), 30 | open(os.path.join(filtered_list, "val_acquired.txt"), "r"), 31 | open(os.path.join(filtered_list, "test_acquired.txt"), "r"), 32 | ) 33 | 34 | # train_txt_pruned, val_txt_pruned, test_txt_pruned = ( 35 | # open(os.path.join(filtered_list, "train_pruned.txt"), "w"), 36 | # open(os.path.join(filtered_list, "val_pruned.txt"), "w"), 37 | # open(os.path.join(filtered_list, "test_pruned.txt"), "w"), 38 | # ) 39 | a = train_txt.readlines() 40 | b = val_txt.readlines() 41 | c = test_txt.readlines() 42 | print(len(a), len(b), len(c)) 43 | all_list = np.concatenate((a,b,c), axis=0) 44 | random.shuffle(all_list) 45 | 46 | print(len(all_list) , args.split_ratio) 47 | train_idx = int(len(all_list) * args.split_ratio) 48 | val_idx = int(len(all_list) * ((1 - args.split_ratio) /2)) 49 | test_idx = len(all_list) 50 | train_list = all_list[:train_idx] 51 | val_list = all_list[train_idx:train_idx+val_idx] 52 | test_list = all_list[train_idx+val_idx:] 53 | print(len(all_list), train_idx, val_idx, test_idx) 54 | print(len(train_list), len(val_list), len(test_list)) 55 | # exit() 56 | def file_write(path_list, split): 57 | print("Save as ", os.path.join(filtered_list, split+"_acquired.txt")) 58 | with open(os.path.join(filtered_list, split+"_acquired.txt"), 'w') as f: 59 | for i in path_list: 60 | f.write(i) 61 | file_write(train_list, 'train') 62 | file_write(val_list, 'val') 63 | file_write(test_list, 'test') 64 | print("Dataset split is Done!") 65 | -------------------------------------------------------------------------------- /utils/utils.py: -------------------------------------------------------------------------------- 1 | import torch, random, wandb 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | import numpy as np 5 | 6 | from PIL import Image 7 | from torchvision import transforms 8 | 9 | def fix_randseed(randseed): 10 | r"""Fix random seed""" 11 | random.seed(randseed) 12 | np.random.seed(randseed) 13 | torch.manual_seed(randseed) 14 | torch.cuda.manual_seed(randseed) 15 | torch.cuda.manual_seed_all(randseed) 16 | torch.backends.cudnn.benchmark = False 17 | torch.backends.cudnn.deterministic = True 18 | 19 | def log_wandb(mode, loss, acc, loss_val_ori, acc_val_ori, loss_val_sca, acc_val_sca, best_acc_ori, best_acc_sca): 20 | if mode == 'orientation': 21 | wandb.log({'ori/train_loss':loss, 'ori/train_acc': acc, 22 | 'ori/val_loss': loss_val_ori, 'ori/val_acc': acc_val_ori}) 23 | elif mode == 'scale': 24 | wandb.log({'sca/train_loss':loss, 'sca/train_acc': acc, 25 | 'sca/val_loss': loss_val_sca, 'sca/val_acc': acc_val_sca}) 26 | wandb.log({'ori/best_val_acc': best_acc_ori, 'sca/best_val_acc': best_acc_sca}) 27 | 28 | 29 | ########### ============================== 30 | class Normalize: 31 | def __init__(self): 32 | self.normalize = transforms.Compose([transforms.ToTensor(), 33 | transforms.Normalize(mean=[0.485, 0.456, 0.406], 34 | std=[0.229, 0.224, 0.225])]) 35 | 36 | def __call__(self, image): 37 | return self.normalize(image).unsqueeze(0) 38 | 39 | class UnNormalize: 40 | r"""Image unnormalization""" 41 | def __init__(self): 42 | self.mean = [0.485, 0.456, 0.406] 43 | self.std = [0.229, 0.224, 0.225] 44 | 45 | def __call__(self, image): 46 | img = image.clone() 47 | for im_channel, mean, std in zip(img, self.mean, self.std): 48 | im_channel.mul_(std).add_(mean) 49 | return img 50 | 51 | def normalize_gray_image(image): 52 | ## 1. resize the input 32x32 53 | image = F.interpolate(image, size=(32,32), mode='bilinear') 54 | B, C, H, W = image.shape 55 | ## 2. compute per-patch normalization 56 | mean = torch.mean(image.view(B, -1), dim=1) 57 | std = torch.std(image.view(B, -1), dim=1) 58 | 59 | image = image.view(B, -1).sub( mean.unsqueeze(1) ).div(std.unsqueeze(1)) 60 | image = image.reshape(B, C, H, W ) 61 | 62 | return image 63 | 64 | def degree_to_radian(degree): 65 | return degree * np.pi / 180. 66 | 67 | def radian_to_degree(radian): 68 | return radian * 180. / np.pi 69 | 70 | def shift_vector_by_gt(vectors, gt_shifts): 71 | shifted_vector = [] 72 | for vector, shift in zip(vectors, gt_shifts): 73 | shifted_vector.append(torch.roll(vector, int(shift))) ## NOTICE : torch.roll shift values to RIGHT side. 74 | return torch.stack(shifted_vector) 75 | 76 | 77 | -------------------------------------------------------------------------------- /model/model.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | from torchvision import models 6 | from collections import OrderedDict 7 | 8 | class PatchPoseNet(nn.Module): 9 | def __init__(self, backbone, output_ori, output_sca, use_pretrain): 10 | super(PatchPoseNet, self).__init__() 11 | 12 | final_output_channel = None 13 | if 'resnet' in backbone: 14 | if backbone == 'resnet101': 15 | self.backbone = models.resnet101(pretrained=use_pretrain) 16 | final_output_channel = 2048 17 | elif backbone == 'resnet50': 18 | self.backbone = models.resnet50(pretrained=use_pretrain) 19 | final_output_channel = 2048 20 | elif backbone == 'resnet34': 21 | self.backbone = models.resnet34(pretrained=use_pretrain) 22 | final_output_channel = 512 23 | elif backbone == 'resnet18': 24 | self.backbone = models.resnet18(pretrained=use_pretrain) 25 | final_output_channel = 512 26 | self.backbone = nn.Sequential(*list(self.backbone.children())[:-2]) 27 | 28 | self.orientation_learners = nn.Sequential( ## classifier 29 | nn.Linear(final_output_channel, final_output_channel), 30 | nn.BatchNorm1d(final_output_channel), 31 | nn.ReLU(), 32 | nn.Linear(final_output_channel, 128), 33 | nn.BatchNorm1d(128), 34 | nn.ReLU(), 35 | nn.Linear(128, 64), 36 | nn.BatchNorm1d(64), 37 | nn.ReLU(), 38 | nn.Linear(64, output_ori) 39 | ) 40 | self.scale_learners = nn.Sequential( ## classifier 41 | nn.Linear(final_output_channel, final_output_channel), 42 | nn.BatchNorm1d(final_output_channel), 43 | nn.ReLU(), 44 | nn.Linear(final_output_channel, 128), 45 | nn.BatchNorm1d(128), 46 | nn.ReLU(), 47 | nn.Linear(128, 64), 48 | nn.BatchNorm1d(64), 49 | nn.ReLU(), 50 | nn.Linear(64, output_sca) 51 | ) 52 | 53 | self.GlobalMaxPooling = nn.AdaptiveMaxPool2d(1) 54 | 55 | def forward(self, x): 56 | B = x.shape[0] 57 | x = self.backbone(x) 58 | x_ori = self.orientation_learners(self.GlobalMaxPooling(x).view(B, -1)) 59 | x_sca = self.scale_learners(self.GlobalMaxPooling(x).view(B, -1)) 60 | 61 | return x_ori, x_sca 62 | 63 | def state_dict(self): 64 | res = OrderedDict() 65 | res['backbone'] = self.backbone.state_dict() 66 | res['orientation_learners'] = self.orientation_learners.state_dict() 67 | res['scale_learners'] = self.scale_learners.state_dict() 68 | 69 | return res 70 | 71 | def load_state_dict(self, state_dict): 72 | self.backbone.load_state_dict(state_dict['backbone']) 73 | self.orientation_learners.load_state_dict(state_dict['orientation_learners']) 74 | self.scale_learners.load_state_dict(state_dict['scale_learners']) 75 | 76 | def eval(self): 77 | self.backbone.eval() 78 | self.orientation_learners.eval() 79 | self.scale_learners.eval() 80 | 81 | def train(self): 82 | self.backbone.train() 83 | self.orientation_learners.train() 84 | self.scale_learners.train() 85 | 86 | if __name__ == "__main__": 87 | net = PatchPoseNet('resnet18',18,13,False).cuda() 88 | temp = torch.randn(4,3,32,32).cuda() 89 | res_ori, res_sc = net(temp) 90 | print(res_ori.shape, res_sc.shape, temp.shape) 91 | -------------------------------------------------------------------------------- /utils/train_utils.py: -------------------------------------------------------------------------------- 1 | import torch, math 2 | from tqdm import tqdm 3 | 4 | def train(epoch, dataloader, net, criterion, optimizer, mode, normalizer, softmax_t, training): 5 | loss_sum = 0 6 | accuracy = 0 7 | accuracy_prev = 0 8 | temperature = float(softmax_t) 9 | 10 | for i, batch in tqdm(enumerate(dataloader), total=len(dataloader)): 11 | img, img_aug, gt = batch ## img_aug : img_rot or img_scale. gt is shifting factor. 12 | img, img_aug, gt = img.cuda(), img_aug.cuda(), gt.cuda() 13 | 14 | res_ori, res_sca = net(img) 15 | res_ori_aug, res_sca_aug = net(img_aug) 16 | 17 | if mode == 'orientation': 18 | loss, _, correct_vector = train_orientation(res_ori, gt, normalizer, res_ori_aug, criterion, temperature) 19 | elif mode == 'scale': 20 | loss, _, correct_vector = train_scale(res_sca, gt, normalizer, res_sca_aug, criterion, temperature) 21 | 22 | loss_sum += loss 23 | accuracy += torch.sum(correct_vector) 24 | 25 | if training: 26 | optimizer.zero_grad() 27 | loss.backward() 28 | optimizer.step() 29 | 30 | return loss_sum / len(dataloader.dataset), float(int(accuracy) / len(dataloader.dataset)) *100 31 | 32 | 33 | def train_scale(res_sca, gt, normalizer, res_sca_aug, criterion, temperature): 34 | res_shift = shift_vector_by_gt_float(res_sca, gt) 35 | res_shift = scale_shift_vector_modification(res_shift, gt.long()) ## scale gt can be negative integer. 36 | 37 | loss = criterion(normalizer(res_sca_aug / temperature ), normalizer(res_shift / temperature )) 38 | loss = torch.sum(loss) / gt.shape[0] 39 | ## for evaluation 40 | pred_scale_diff =( torch.argmax(res_sca_aug, dim=1) - torch.argmax(res_sca, dim=1)) 41 | correct_vector = (pred_scale_diff == gt) 42 | 43 | return loss, pred_scale_diff, correct_vector 44 | 45 | def train_orientation(res_ori, gt, normalizer, res_ori_aug, criterion, temperature): 46 | res_shift = shift_vector_by_gt_float(res_ori, gt) 47 | 48 | loss = criterion(normalizer(res_ori_aug / temperature ), normalizer(res_shift / temperature )) 49 | loss = torch.sum(loss) / gt.shape[0] 50 | ## for evaluation 51 | pred_angle_idx =( torch.argmax(res_ori_aug, dim=1) - torch.argmax(res_ori, dim=1)) % res_ori.shape[1] 52 | correct_vector = (pred_angle_idx == gt) 53 | 54 | return loss, pred_angle_idx, correct_vector 55 | 56 | 57 | def shift_vector_by_gt_float(vectors, gt_shifts): 58 | shifted_vector = [] 59 | for vector, shift in zip(vectors, gt_shifts): 60 | shift_floor = math.floor(shift) 61 | shift_ceil = math.ceil(shift) 62 | 63 | if shift_floor == shift_ceil: 64 | shift_float = torch.roll(vector, int(shift)) 65 | else: 66 | shift_float = (shift_ceil - shift) * torch.roll(vector, shift_floor) + \ 67 | (shift - shift_floor) * torch.roll(vector, shift_ceil) 68 | shifted_vector.append(shift_float) ## NOTICE : torch.roll shift values to RIGHT side. 69 | return torch.stack(shifted_vector) 70 | 71 | def scale_shift_vector_modification(shifted_vector, gt): 72 | ## The shifted vector should be probility distribution. (it means all non-zero positive values.) 73 | modified_shift_vector = [] 74 | for vector, move in zip(shifted_vector, gt): 75 | if move >= 0: 76 | mask = torch.cat((torch.zeros(move), torch.ones(len(vector) - move))) 77 | else: 78 | mask = torch.cat((torch.ones(len(vector) + move), torch.zeros(-move))) 79 | vector = vector * mask.cuda() 80 | modified_shift_vector.append(vector) 81 | modified_shift_vector = torch.stack(modified_shift_vector) 82 | return modified_shift_vector -------------------------------------------------------------------------------- /utils/test_utils.py: -------------------------------------------------------------------------------- 1 | import os, time, math, torch 2 | import torch.nn as nn 3 | import numpy as np 4 | from tqdm import tqdm 5 | 6 | def test(net, dataloader, evaluation, scale_hist_size_one_way, orient_hist_interval): 7 | err = [] 8 | tic = time.time() 9 | softmax = nn.Softmax(dim=0) 10 | for i, batch in tqdm(enumerate(dataloader), total=len(dataloader)): 11 | src_img, trg_img, gt = batch 12 | src_img, trg_img, gt = src_img.cuda(), trg_img.cuda(), gt.cuda() 13 | 14 | res1_ori, res1_sca = net(src_img) 15 | res2_ori, res2_sca = net(trg_img) 16 | if evaluation == 'scale': 17 | gt = torch.log2(gt) / 2 * scale_hist_size_one_way ## math.log(gt, 4) == torch.log2() / 2 18 | res1 = res1_sca 19 | res2 = res2_sca 20 | elif evaluation == 'orientation': 21 | gt = gt / orient_hist_interval 22 | res1 = res1_ori 23 | res2 = res2_ori 24 | 25 | pred1 = torch.argmax(res1, dim=1) 26 | pred2 = torch.argmax(res2, dim=1) 27 | res = torch.stack(((pred2 - pred1).float(), gt.float()), dim=0) 28 | 29 | err.append(res) 30 | 31 | toc = time.time() 32 | print("total " , evaluation, " evaluation time : ", round(toc-tic, 3), " (sec.) with ", len(dataloader.dataset) ," pairs") 33 | 34 | err = torch.cat([i for i in err], dim=1).t() 35 | return err 36 | 37 | def scale_evaluation(scale_err, scale_hist_size_one_way, scale_thres=[0.5, 1, 1.5, 2]): 38 | print(" \n Evaluate scale ") 39 | ## 0.5, 1, 2 -> 2^(1/6), 2^(1/3), 2^(2/3) (at histogram 13) 40 | scale_thres = np.array(scale_thres) / int(6 / scale_hist_size_one_way) ## difference of bin idx. (at histogram 13) 41 | res_scale = [] 42 | scale_res = {} 43 | scale_diff = [] 44 | for thres in scale_thres: 45 | scale_res[thres] = [] 46 | for sc in scale_err: 47 | a = float(sc[0]) 48 | b = round(float(sc[1])) 49 | 50 | diff = torch.abs(torch.tensor([a - b])) 51 | scale_diff.append(diff / 3) 52 | if diff <= thres: 53 | scale_res[thres].append(True) 54 | else: 55 | scale_res[thres].append(False) 56 | 57 | print("accuracy at threshold ", round(2 ** (thres/3),4) , "(", thres, ")" , " : ", round(np.sum(scale_res[thres])/ len(scale_res[thres]), 4)) 58 | res_scale.append(round(np.sum(scale_res[thres]) *100 / len(scale_res[thres]), 2) ) 59 | 60 | print(res_scale) 61 | 62 | return res_scale 63 | 64 | def orientation_evaluation(orientation_err, orient_hist_size, ori_thres=[0.5,1,2,4]): 65 | print(" \n Evaluate orientation ") 66 | ## 0.5, 1, 2 -> 5 degrees, 10 degrees, 20 degrees (at histogram 36) 67 | orientation_thres = np.array(ori_thres) / int(36 / orient_hist_size ) 68 | res_ori = [] 69 | orientation_res = {} 70 | orientation_diff = [] 71 | for thres in orientation_thres: 72 | orientation_res[thres] = [] 73 | for ori in orientation_err: 74 | diff = torch.min ( torch.tensor([torch.abs(ori[0] - ori[1]) , \ 75 | torch.abs(ori[0] - ori[1] - orient_hist_size) , \ 76 | torch.abs(ori[0] - ori[1] + orient_hist_size )] ) ) ## orientation is cyclic. 77 | 78 | orientation_diff.append(diff * (360 / orient_hist_size)) 79 | 80 | if diff <= thres: 81 | orientation_res[thres].append(True) 82 | else: 83 | orientation_res[thres].append(False) 84 | print("accuracy at threshold ", thres * int(360 / orient_hist_size) , "(", thres, ")" , " : ", round(np.sum(orientation_res[thres])/ len(orientation_res[thres]), 4)) 85 | res_ori.append(round(np.sum(orientation_res[thres]) * 100/ len(orientation_res[thres]), 2) ) 86 | 87 | print(res_ori) 88 | 89 | return res_ori -------------------------------------------------------------------------------- /datasets/test_dataset.py: -------------------------------------------------------------------------------- 1 | import os, torch 2 | import numpy as np 3 | from torch.utils.data import Dataset 4 | from torchvision import transforms 5 | from PIL import Image 6 | 7 | def get_test_list(dataset_type, test_set): 8 | test_list_file = [] 9 | if 'ppa' in dataset_type: 10 | dataset_path = 'datasets/patchPose/' 11 | test_list_file.append(os.path.join(os.path.join(dataset_path, 'patchPoseAImageList'), test_set + '_acquired.txt')) 12 | if 'ppb' in dataset_type: 13 | dataset_path = 'datasets/patchPose/' 14 | test_list_file.append(os.path.join(os.path.join(dataset_path, 'patchPoseBImageList'), test_set + '_acquired.txt')) 15 | if dataset_type == 'hpa': 16 | dataset_path = 'datasets/hpatchesPose/' 17 | test_list_file.append(os.path.join(os.path.join(dataset_path, 'hpatchesPoseAImageList'), test_set + '_acquired.txt') ) 18 | 19 | test_list = [] 20 | for test_file in test_list_file: 21 | with open(test_file) as f: 22 | a = f.readlines() 23 | test_list.append(a) 24 | test_list = np.concatenate(test_list, axis=0) 25 | return test_list, dataset_path 26 | 27 | def get_test_imnames(test_list): 28 | ## Get scale variant image name 29 | scale_imnames = [] 30 | for img_name in test_list: 31 | if 'angle000' in img_name: 32 | scale_imnames.append(img_name) 33 | ## Get orientation variant image name 34 | orientation_imnames = [] 35 | for img_name in test_list: 36 | if 'scale1.0000' in img_name: 37 | orientation_imnames.append(img_name) 38 | return scale_imnames, orientation_imnames 39 | 40 | class test_parent(Dataset): 41 | """ Parent class of test dataset.""" 42 | def __init__(self, dataset_path, image_list, evaluation): 43 | super(test_parent, self).__init__() 44 | self.dataset_path = dataset_path 45 | self.image_list = image_list 46 | self.evaluation = evaluation ## scale or orientation. 47 | 48 | self.to_torch_img = transforms.ToTensor() 49 | 50 | def __len__(self): 51 | return len(self.image_list) 52 | 53 | def get_image_rsz(self, imname, patch_size= (32,32)): 54 | img = Image.open(self.dataset_path+ imname.rstrip('\n')).convert('RGB') 55 | img = img.resize(patch_size) 56 | img_torch = self.to_torch_img(img) 57 | 58 | return img_torch 59 | 60 | def get_image_crop(self, imname, patch_size = (32,32)): 61 | ## Open at dataset_path, by (32,32) patch_size. 62 | img = Image.open(self.dataset_path+ imname.rstrip('\n')).convert('RGB') 63 | center_point = np.array(img.size) / 2 ## W, H 64 | start_x = int(center_point[0] - patch_size[0] / 2) 65 | start_y = int(center_point[1] - patch_size[1] / 2) 66 | end_x = int(center_point[0] + patch_size[0] / 2) 67 | end_y = int(center_point[1] + patch_size[1] / 2) 68 | 69 | img = img.crop( (start_x, start_y, end_x, end_y) ) 70 | img_torch = self.to_torch_img(img) 71 | 72 | return img_torch 73 | 74 | class test_dataset(test_parent): 75 | def __init__(self, dataset_path, image_list, evaluation): 76 | super(test_dataset, self).__init__(dataset_path, image_list, evaluation) 77 | 78 | def __getitem__(self, idx): 79 | trg_imname = self.image_list[idx] 80 | 81 | if self.evaluation == 'scale': 82 | prefix, postfix = trg_imname.split('scale') 83 | src_imname = prefix + 'scale1.0000' + postfix[-5:] 84 | gt_scale_factor = float(trg_imname.split('scale')[1].split('.jpg')[0]) 85 | gt = gt_scale_factor 86 | 87 | if self.evaluation == 'orientation': 88 | prefix, postfix = trg_imname.split('angle') 89 | src_imname = prefix + 'angle000' + postfix[3:] 90 | gt_angle = trg_imname.split('angle')[1].split('_scale')[0] 91 | gt = float(gt_angle) 92 | 93 | ## resize 94 | src_img = self.get_image_rsz(src_imname, patch_size = (32,32)) 95 | trg_img = self.get_image_rsz(trg_imname, patch_size = (32,32)) 96 | 97 | gt = torch.tensor(gt) 98 | 99 | return src_img, trg_img, gt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Self-Supervised Learning of Image Scale and Orientation Estimation (BMVC 2021) 2 | 3 | 4 | *** 5 | PatchPoseNet 6 | *** 7 | 8 | This is the official implementation of the paper "Self-Supervised Learning of Image Scale and Orientation Estimation" by Jongmin Lee [[Google Scholar]](https://scholar.google.com/citations?user=WVVqJX8AAAAJ&hl=en), [Yoonwoo Jeong](https://jeongyw12382.github.io) [[Google Scholar]](https://scholar.google.com/citations?user=HQ1PMggAAAAJ&hl=en), and [Minsh Cho](http://cvlab.postech.ac.kr/~mcho/) [[Google Scholar]](https://scholar.google.com/citations?user=5TyoF5QAAAAJ&hl=en&oi=ao). 9 | We introduce a self-supervised framework for learning patch pose. Given a rescaled/rotated pair of image patches, we feed them to the patch pose estimation networks that output scale/orientation histograms for each. We compare the output histogram vectors by the histogram alignment technique and compute the loss. 10 | 11 | 12 | ## Requirements 13 | 14 | * Ubuntu 18.04 15 | * python 3.8 16 | * pytorch 1.8.1 17 | * torchvision 0.9.1 18 | * wandb 0.10.28 19 | 20 | ## Environment 21 | 22 | #### Clone the Git repository 23 | ```bash 24 | git clone https://github.com/bluedream1121/SelfScaOri.git 25 | ``` 26 | 27 | #### Install dependency 28 | Run the script to install all the dependencies. You need to provide the conda install path (e.g. ~/anaconda3) and the name for the created conda environment. 29 | 30 | ```bashd 31 | bash install.sh conda_install_path self-sca-ori 32 | ``` 33 | 34 | ## Dataset preparation 35 | 36 | You can download the training/test dataset using the following scripts: 37 | 38 | ```bash 39 | cd datasets 40 | bash download.sh 41 | ``` 42 | 43 | If the upper link does not work, please use this link [patchPose](https://postechackr-my.sharepoint.com/:u:/g/personal/ljm1121_postech_ac_kr/EUzUapf-ZDxJjRJ7L-Py88cBso7YZdzFz88E9BTBDM6CQg?e=BMqwhD), [hpatchesPose](https://postechackr-my.sharepoint.com/:u:/g/personal/ljm1121_postech_ac_kr/EfGKxwxLwzxDim6g9fMvFOQB9nbrmVKJ_hNfa9XyPlcNlQ?e=IWwv7o). (password: self) 44 | 45 | If you want to regenerate the patchPose datasets, please run the following script: 46 | 47 | ```bash 48 | cd datasets/patchpose_dataset_generation 49 | bash generation_script.sh 50 | ``` 51 | 52 | ## Trained models 53 | 54 | ```bash 55 | cd trained_models 56 | bash download_ori_model.sh 57 | bash download_sca_model.sh 58 | ``` 59 | 60 | ## Test on the patchPose and the HPatches 61 | After download the datasets and the pre-trained models, you can evaluate the patch pose estimation results using the following scripts: 62 | 63 | ```bash 64 | python test.py --load trained_models/_*branchori/best_model.pt --dataset_type ppa_ppb 65 | python test.py --load trained_models/_*branchsca/best_model.pt --dataset_type ppa_ppb 66 | 67 | python test.py --load trained_models/_*branchori/best_model.pt --dataset_type hpa 68 | python test.py --load trained_models/_*branchsca/best_model.pt --dataset_type hpa 69 | ``` 70 | 71 | ## Training 72 | 73 | *** 74 |

75 | Hitogram_alignment 76 |

77 | 78 | *** 79 | 80 | You can train the networks for patch scale estimation and orientation estimation using the proposed histogram alignment loss as follows: 81 | 82 | ```bash 83 | python train.py --branch ori --output_ori 36 84 | 85 | python train.py --branch sca --output_sca 13 86 | ``` 87 | 88 | 89 | ## Citation 90 | If you find our code or paper useful to your research work, please consider citing our work using the following bibtex: 91 | ``` 92 | @inproceedings{lee2021self, 93 | title={Self-Supervised Learning of Image Scale and Orientation}, 94 | author={Lee, Jongmin and Jeong, Yoonwoo and Cho, Minsu }, 95 | booktitle = {31st British Machine Vision Conference 2021, {BMVC} 2021, Virtual Event, UK}, 96 | publisher = {{BMVA} Press}, 97 | year = {2021}, 98 | url = {https://www.bmvc2021-virtualconference.com/programme/accepted-papers/}, 99 | } 100 | ``` 101 | 102 | ## Contact 103 | 104 | Jongmin Lee (ljm1121@postech.ac.kr) 105 | 106 | Questions can also be left as issues in the repository. 107 | 108 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/filter.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import pdb 3 | import os 4 | import torch 5 | from torchvision.models import resnet18 6 | from torch.utils.data import Dataset, DataLoader 7 | import torchvision.transforms as tf 8 | import torch.nn as nn 9 | from PIL import Image 10 | import tqdm 11 | import shutil 12 | 13 | class BatchifiedPatch(Dataset): 14 | 15 | def __init__(self, img_paths): 16 | self.img_paths = img_paths 17 | 18 | def __getitem__(self, idx): 19 | return tf.ToTensor()(Image.open(self.img_paths[idx])) 20 | 21 | def __len__(self): 22 | return len(self.img_paths) 23 | 24 | def parse_txt(path, dataset_path): 25 | with open(path) as fp: 26 | lines = fp.readlines() 27 | img_paths = list(map(lambda line: os.path.join(dataset_path, line.split(" ")[1]), lines)) 28 | return img_paths, lines 29 | 30 | def batchify_images(img_paths, per_image): 31 | 32 | dset = BatchifiedPatch(img_paths) 33 | dloader = DataLoader(dset, batch_size=per_image) 34 | return dloader 35 | 36 | def filter_images(args): 37 | 38 | img_paths, raw_txt = parse_txt(args.txt_path, args.dataset_path) 39 | dloader = batchify_images(img_paths, args.per_image) 40 | 41 | filtered_list = os.path.join(args.dataset_path, f"{args.dataset}ImageList") 42 | 43 | if os.path.exists(filtered_list): 44 | shutil.rmtree(filtered_list) 45 | 46 | os.mkdir(filtered_list) 47 | 48 | std_array = [] 49 | 50 | model = nn.Sequential(*list(resnet18(pretrained=True).children())[:-2]).cuda() 51 | # model = resnet18(pretrained=args.use_pretrained).cuda() 52 | for data in tqdm.tqdm(dloader): 53 | feats = model(data.cuda()) 54 | sigma = torch.std(feats, dim=1) 55 | std_array.append(sigma.mean().detach()) 56 | del sigma, feats 57 | 58 | std_array = torch.stack(std_array) 59 | argsort = torch.argsort(std_array)[-int(args.filter_ratio * len(img_paths) / args.per_image):] 60 | img_idx = torch.flip(argsort, dims=[0]) 61 | img_pruned_idx = torch.argsort(std_array)[:-int(args.filter_ratio * len(img_paths) / args.per_image)] 62 | 63 | assert len(img_pruned_idx) + len(img_idx) == len(std_array) 64 | 65 | train_txt, val_txt, test_txt = ( 66 | open(os.path.join(filtered_list, "train_acquired.txt"), "w"), 67 | open(os.path.join(filtered_list, "val_acquired.txt"), "w"), 68 | open(os.path.join(filtered_list, "test_acquired.txt"), "w"), 69 | ) 70 | 71 | train_txt_pruned, val_txt_pruned, test_txt_pruned = ( 72 | open(os.path.join(filtered_list, "train_pruned.txt"), "w"), 73 | open(os.path.join(filtered_list, "val_pruned.txt"), "w"), 74 | open(os.path.join(filtered_list, "test_pruned.txt"), "w"), 75 | ) 76 | 77 | fp_dict = { 78 | "train": train_txt, 79 | "val": val_txt, 80 | "test": test_txt 81 | } 82 | 83 | fp_pruned_dict = { 84 | "train": train_txt_pruned, 85 | "val": val_txt_pruned, 86 | "test": test_txt_pruned, 87 | } 88 | 89 | print("Saving txt files") 90 | 91 | for idx in tqdm.tqdm(img_idx): 92 | for l in raw_txt[args.per_image * idx : args.per_image * (idx + 1)]: 93 | split = l.rstrip("\n").split(" ")[-1] 94 | fp_dict[split].write(l.split(" ")[1]+ "\n") 95 | 96 | for idx in tqdm.tqdm(img_pruned_idx): 97 | for l in raw_txt[args.per_image * idx : args.per_image * (idx + 1)]: 98 | split = l.rstrip("\n").split(" ")[-1] 99 | fp_pruned_dict[split].write(l.split(" ")[1]+ "\n") 100 | 101 | train_txt.close(); val_txt.close(); test_txt.close() 102 | train_txt_pruned.close(); val_txt_pruned.close(); test_txt_pruned.close() 103 | 104 | 105 | if __name__ == "__main__": 106 | 107 | parser = argparse.ArgumentParser("Filtering PatchPoseA and PatchPoseB") 108 | parser.add_argument("--dataset_path", type=str, default="output", help="path to dataset") 109 | parser.add_argument("--dataset", type=str, choices=["patchPoseA", "patchPoseB", "hpatchesPoseA", "hpatchesPoseB"], default="patchPoseA", help="dataset to use") 110 | parser.add_argument("--filter_ratio", type=float, default=0.8, help="ratio of images to be filtered") 111 | parser.add_argument("--use_pretrained", action="store_true", default=False, help="use pretrained ResNet18 for pruning") 112 | parser.add_argument("--per_image", type=int, default=468, help="number of patches per image") 113 | args = parser.parse_args() 114 | 115 | args.txt_path = os.path.join(args.dataset_path, args.dataset + ".txt") 116 | 117 | filter_images(args) 118 | 119 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import os, sys, torch, argparse 2 | import torch.nn as nn 3 | import torch.optim as optim 4 | import numpy as np 5 | 6 | from datetime import datetime 7 | from torch.utils.data import DataLoader 8 | 9 | import model.loss as loss 10 | from model.model import PatchPoseNet 11 | 12 | from datasets.patchpose import PatchPoseScaleOfflineDataset, PatchPoseOrientationOfflineDataset 13 | 14 | from utils.utils import fix_randseed, log_wandb 15 | from utils.train_utils import train 16 | from config import get_train_config 17 | 18 | ## 1. hyperparameters 19 | args = get_train_config() 20 | 21 | fix_randseed(randseed=0) 22 | 23 | ## 2. Configurations 24 | epochs = args.epochs 25 | batch_size = args.batch_size 26 | learning_rate = args.lr 27 | output_ori = args.output_ori 28 | output_sca = args.output_sca 29 | softmax_temperature = args.softmax_temperature 30 | dataset_type = args.dataset_type 31 | 32 | device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 33 | cur_datetime = datetime.now().__format__('_%m%d_%H%M%S') 34 | 35 | ## 3. Load dataset 36 | dataset_path = 'datasets/patchPose/' 37 | 38 | if args.branch == 'sca': 39 | mode = 'scale' 40 | sca_dataset_train = PatchPoseScaleOfflineDataset(dataset_path, output_sca, dataset_type=args.dataset_type, mode='train') 41 | sca_dataloader_train = DataLoader(sca_dataset_train, batch_size=batch_size, num_workers=4, shuffle=True, drop_last=True) 42 | dataloader_train = sca_dataloader_train 43 | 44 | if args.branch == 'ori': 45 | mode = 'orientation' 46 | ori_dataset_train = PatchPoseOrientationOfflineDataset(dataset_path, output_ori, dataset_type=args.dataset_type, mode='train') 47 | ori_dataloader_train = DataLoader(ori_dataset_train, batch_size=batch_size, num_workers=4, shuffle=True, drop_last=True) 48 | dataloader_train = ori_dataloader_train 49 | 50 | sca_dataset_val = PatchPoseScaleOfflineDataset(dataset_path, output_sca, dataset_type="ppa_ppb", mode='val') 51 | sca_dataloader_val = DataLoader(sca_dataset_val, batch_size=batch_size, num_workers=4, shuffle=False, drop_last=True) 52 | ori_dataset_val = PatchPoseOrientationOfflineDataset(dataset_path, output_ori, dataset_type="ppa_ppb", mode='val') 53 | ori_dataloader_val = DataLoader(ori_dataset_val, batch_size=batch_size, num_workers=4, shuffle=False, drop_last=True) 54 | 55 | ## 4. Network initialization 56 | net = PatchPoseNet(backbone=args.backbone, output_ori = args.output_ori, output_sca = args.output_sca, use_pretrain=False).cuda() 57 | net.zero_grad() 58 | 59 | if args.load: 60 | net.load_state_dict(torch.load(args.load)) 61 | 62 | ## 5. Loss function & optimizer 63 | criterion = loss.cross_entropy_symmetric 64 | optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=args.momentum) 65 | 66 | ## 6. init distribution normalizers 67 | softmax = nn.Softmax(dim=1) 68 | normalizer = softmax 69 | 70 | ## 7. Logger 71 | os.makedirs('logs', exist_ok=True) 72 | logpath = os.path.join('logs', cur_datetime ) 73 | 74 | logpath += '_' + '_ep' + str(epochs) + '_' + args.backbone + '_lr' + str(round(learning_rate, 3)) \ 75 | + '_bsz' + str(args.batch_size) + '_data' + str(args.dataset_type) \ 76 | + '_ori' + str(output_ori) + '_sca' + str(output_sca) + '_branch' + args.branch 77 | os.mkdir(logpath) 78 | 79 | ## 8. best model selection & alternating optimization options 80 | best_acc_sca = 0 81 | best_acc_ori = 0 82 | best_acc_both = 0 83 | 84 | best_acc_sca_epoch = 0 85 | best_acc_ori_epoch = 0 86 | best_acc_both_epoch = 0 87 | 88 | ## 9. training 89 | for idx, epoch in enumerate(range(epochs)): 90 | ## 9-1. Training: single branch training. 91 | net.train() 92 | loss, acc = train(epoch, dataloader_train, net, criterion, optimizer, mode, normalizer, softmax_temperature, training=True) 93 | 94 | ## 9-2. Validate for best model selection. 95 | with torch.no_grad(): 96 | net.eval() 97 | loss_val_ori, acc_val_ori = train(epoch, ori_dataloader_val, net, criterion, optimizer, "orientation", normalizer, softmax_temperature, training=False) 98 | loss_val_sca, acc_val_sca = train(epoch, sca_dataloader_val, net, criterion, optimizer, "scale", normalizer, softmax_temperature, training=False) 99 | 100 | ## 9-3. best model update 101 | acc_val_both = acc_val_ori + acc_val_sca 102 | if acc_val_ori > best_acc_ori: 103 | best_acc_ori = acc_val_ori 104 | best_acc_ori_epoch = idx 105 | torch.save(net.state_dict(), os.path.join(logpath, 'ori_best_model.pt')) 106 | if acc_val_sca > best_acc_sca: 107 | best_acc_sca = acc_val_sca 108 | best_acc_sca_epoch = idx 109 | torch.save(net.state_dict(), os.path.join(logpath, 'sca_best_model.pt')) 110 | if acc_val_both > best_acc_both: 111 | best_acc_both = acc_val_both 112 | best_acc_both_epoch = idx 113 | torch.save(net.state_dict(), os.path.join(logpath, 'best_model.pt')) 114 | 115 | print("\n epoch {:d} (trn of {:s}) acc : {:.2f}%, loss : {:.4f} ".format(epoch, mode[:3], acc, loss) ) 116 | if mode == 'orientation': 117 | print(" epoch {:d} (val acc) -> ori : {:.2f}%, best (epoch {:d}): {:.2f}%/{:.2f}%".format(epoch, acc_val_ori, best_acc_ori_epoch, best_acc_ori, 100) ) 118 | elif mode == 'scale': 119 | print(" epoch {:d} (val acc) -> sca : {:.2f}%, best (epoch {:d}): {:.2f}%/{:.2f}%".format(epoch, acc_val_sca, best_acc_sca_epoch, best_acc_sca, 100) ) 120 | 121 | ## 9-4. log wandb 122 | log_wandb(mode, loss, acc, loss_val_ori, acc_val_ori, loss_val_sca, acc_val_sca, best_acc_ori, best_acc_sca) 123 | 124 | 125 | print("Done!") 126 | -------------------------------------------------------------------------------- /datasets/patchpose.py: -------------------------------------------------------------------------------- 1 | import os, cv2, glob, torch 2 | import numpy as np 3 | from PIL import Image 4 | from torchvision import transforms 5 | from torch.utils.data import Dataset 6 | from math import log 7 | 8 | def get_angle(im_name): 9 | angle = im_name.split('angle')[1][:3] 10 | return angle 11 | 12 | def get_scale(im_name): 13 | scale = im_name.split('scale')[1][:6] 14 | return scale 15 | 16 | class PatchPoseOfflineDataset(Dataset): 17 | def __init__(self, dataset_path, target_branch, histogram_size=36, dataset_type='ppa', mode='train'): 18 | super(PatchPoseOfflineDataset, self).__init__() 19 | 20 | training_data_list = dataset_type.split('_') 21 | image_list_file = [] 22 | 23 | if 'ppa' in training_data_list: 24 | image_list_file.append(os.path.join(os.path.join(dataset_path,'patchPoseAImageList'), mode + '_acquired.txt')) 25 | if 'all' in training_data_list: 26 | image_list_file.append(os.path.join(os.path.join(dataset_path,'patchPoseAImageList'), mode + '_pruned.txt')) 27 | 28 | if 'ppb' in training_data_list: 29 | image_list_file.append(os.path.join(os.path.join(dataset_path,'patchPoseBImageList'), mode + '_acquired.txt')) 30 | if 'all' in training_data_list: 31 | image_list_file.append(os.path.join(os.path.join(dataset_path,'patchPoseBImageList'), mode + '_pruned.txt')) 32 | 33 | if 'hpa' in training_data_list: 34 | image_list_file.append(os.path.join(os.path.join(dataset_path,'hpatchesPoseAImageList'), mode + '_acquired.txt') ) 35 | if 'all' in training_data_list: 36 | image_list_file.append(os.path.join(os.path.join(dataset_path,'hpatchesPoseAImageList'), mode + '_pruned.txt')) 37 | 38 | if 'hpb' in training_data_list: 39 | image_list_file.append(os.path.join(os.path.join(dataset_path,'hpatchesPoseBImageList'), mode + '_acquired.txt') ) 40 | if 'all' in training_data_list: 41 | image_list_file.append(os.path.join(os.path.join(dataset_path,'hpatchesPoseBImageList'), mode + '_pruned.txt')) 42 | 43 | if len(image_list_file) == 0: 44 | print(" No such dataset are defined : ", dataset_type) 45 | exit() 46 | 47 | self.image_list = [] 48 | for image_file in image_list_file: 49 | ## Load the patch image list. 50 | with open(image_file, 'r') as f: 51 | image_list_all = f.readlines() 52 | 53 | dataset_type = None 54 | if 'PoseA' in image_file: 55 | dataset_type = 'grid' 56 | elif 'PoseB' in image_file: 57 | dataset_type = 'random' 58 | 59 | ## filtering the dataset list by parsing 60 | if target_branch == 'ori': 61 | possible_angles = np.linspace(0, 360, histogram_size+1)[:-1] 62 | for i in image_list_all: 63 | prefix1, prefix2, prefix3, prefix4, ori_str, sca_str = i.rstrip('\n').split('_') 64 | if round(float(get_scale(sca_str[:-4]))) == 1: 65 | if dataset_type == 'random': 66 | self.image_list.append(i) 67 | elif dataset_type == 'grid': 68 | if float(get_angle(i)) in possible_angles: 69 | self.image_list.append(i) 70 | 71 | if target_branch == 'sca': 72 | possible_scales = np.round(4 ** np.linspace(-1, 1, histogram_size), 4) 73 | for i in image_list_all: 74 | prefix1, prefix2, prefix3, prefix4, ori_str, sca_str = i.rstrip('\n').split('_') 75 | if float(get_angle(ori_str)) == 0: 76 | if dataset_type == 'random': 77 | self.image_list.append(i) 78 | elif dataset_type == 'grid': 79 | if float(get_scale(sca_str[:-4])) in possible_scales: 80 | self.image_list.append(i) 81 | 82 | self.dataset_type = dataset_type 83 | self.dataset_path = dataset_path 84 | ## pre-processer 85 | self.to_torch_img = transforms.ToTensor() 86 | ## for output displacement computation. 87 | self.histogram_size = histogram_size 88 | self.bin_size = 360 / histogram_size 89 | 90 | self.mode = mode 91 | print(" Number of samples ", mode, " of ", target_branch, len(self.image_list)) 92 | 93 | def __len__(self): 94 | return len(self.image_list) 95 | 96 | def get_image_rsz(self, imname, patch_size= (32,32)): 97 | img = Image.open(imname.rstrip('\n')).convert('RGB') 98 | img = img.resize(patch_size) 99 | img_torch = self.to_torch_img(img) 100 | 101 | return img_torch 102 | 103 | def get_image_crop(self, imname, patch_size = (32,32)): 104 | ## Open at dataset_path, by (32,32) patch_size. 105 | img = Image.open(imname.rstrip('\n')).convert('RGB') 106 | center_point = np.array(img.size) / 2 ## W, H 107 | start_x = int(center_point[0] - patch_size[0] / 2) 108 | start_y = int(center_point[1] - patch_size[1] / 2) 109 | end_x = int(center_point[0] + patch_size[0] / 2) 110 | end_y = int(center_point[1] + patch_size[1] / 2) 111 | 112 | img = img.crop( (start_x, start_y, end_x, end_y) ) 113 | img_torch = self.to_torch_img(img) 114 | 115 | return img_torch 116 | 117 | class PatchPoseOrientationOfflineDataset(PatchPoseOfflineDataset): 118 | def __init__(self, dataset_path, histogram_size=36, dataset_type='ppa', mode='train'): 119 | super(PatchPoseOrientationOfflineDataset, self).__init__(dataset_path, 'ori', histogram_size, dataset_type, mode) 120 | 121 | def __getitem__(self, idx): 122 | im_name = self.image_list[idx].rstrip('\n') 123 | 124 | prefix1, prefix2, prefix3, prefix4, ori_str, sca_str = im_name.split('_') 125 | im_no_rot_name = prefix1 + '_' + prefix2 + '_' + prefix3 + '_' + prefix4 + '_angle000_' + sca_str 126 | 127 | img_path = os.path.join(self.dataset_path, im_no_rot_name) 128 | img_rot_path = os.path.join(self.dataset_path, im_name) 129 | 130 | angle = float(get_angle(ori_str)) 131 | angle = angle / self.bin_size ## angle / bin_size == shifting value. 132 | 133 | ## load the images and ground-truth 134 | patch_size = (32,32) 135 | img = self.get_image_rsz(img_path, patch_size) 136 | img_rot = self.get_image_rsz(img_rot_path, patch_size) 137 | angle = torch.tensor(angle).float() 138 | 139 | return img, img_rot, angle 140 | 141 | 142 | class PatchPoseScaleOfflineDataset(PatchPoseOfflineDataset): 143 | def __init__(self, dataset_path, histogram_size=13, dataset_type='ppa', mode='train'): 144 | super(PatchPoseScaleOfflineDataset, self).__init__(dataset_path, 'sca', histogram_size, dataset_type, mode) 145 | 146 | def __getitem__(self, idx): 147 | im_name = self.image_list[idx].rstrip('\n') 148 | 149 | prefix1, prefix2, prefix3, prefix4, ori_str, sca_str = im_name.split('_') 150 | im_no_sca_name = prefix1 + '_' + prefix2 + '_' + prefix3 + '_' + prefix4 + '_' + ori_str + '_scale1.0000.jpg' 151 | 152 | img_path = os.path.join(self.dataset_path, im_no_sca_name) 153 | img_rot_path = os.path.join(self.dataset_path, im_name) 154 | 155 | scale = float(get_scale(sca_str.split('.jpg')[0])) 156 | 157 | ## currently, only consider histogram size 13. 158 | one_way = (self.histogram_size -1) / 2 159 | scale = round(one_way* log(scale, 4) ) ## e,g, round(6 * log(scale, 4) + int(13/2)) == shifing value 160 | 161 | ## image preprocessing 162 | patch_size = (32,32) 163 | img = self.get_image_rsz(img_path, patch_size) 164 | img_rot = self.get_image_rsz(img_rot_path, patch_size) 165 | scale = torch.tensor(scale).float() 166 | 167 | return img, img_rot, scale 168 | 169 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/data_generation.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import os 3 | import pdb 4 | import numpy as np 5 | import cv2 6 | import math 7 | import imutils 8 | import tqdm 9 | import pdb 10 | from PIL import Image 11 | import random 12 | 13 | def filter_image(img_path, patch_size): 14 | img = cv2.imread(img_path) 15 | H, W = img.shape[:2] 16 | usable = H > math.ceil(patch_size * 2 * 1.415) * 2 + 3 and W > math.ceil(patch_size * 2 * 1.415) * 2 + 3 17 | img = None if not usable else img 18 | return img, H, W 19 | 20 | def generation(args): 21 | 22 | file_list, file_split = [], dict() 23 | 24 | if args.dataset in ["patchPoseA", "patchPoseB"]: 25 | split_list = ["train", "test", "val"] 26 | files = [os.path.join(args.image_list_path, fname + "_all.txt") for fname in split_list] 27 | for split, file in zip(split_list, files): 28 | with open(file) as fp: 29 | lines = [os.path.join(args.dataset_path, img_path).rstrip("\n") for img_path in fp.readlines()] 30 | file_list += lines 31 | for img_path in lines: 32 | file_split[img_path] = split 33 | 34 | 35 | save_dir = os.path.join(args.output_dir, args.dataset) 36 | os.makedirs(save_dir, exist_ok=True) 37 | 38 | fp_write = open(os.path.join(args.output_dir, f"{args.dataset}.txt"), "w") 39 | sift = cv2.SIFT_create(nfeatures=1024) 40 | 41 | 42 | for (idx, img_path) in tqdm.tqdm(enumerate(file_list), total=len(file_list)): 43 | 44 | if args.dataset == "patchPoseA": 45 | rotation_list = np.array([10 * i for i in range(36)]) 46 | scale_list = np.array([2 ** ((i - 6) / 3) for i in range(13)]) 47 | fkey = "_".join(img_path.split("/")[-2:])[:-len(".jpg")] 48 | 49 | elif args.dataset == "patchPoseB": 50 | rotation_list = np.concatenate([np.array([0]), np.random.choice([i for i in range(360) if i != 0], 35, replace=False)]) 51 | scale_list = np.concatenate([np.array([1.0]), np.random.choice([i for i in range(37501) if i != 7500], 12, replace=False) / (10 ** 4) + 0.25]) 52 | fkey = "_".join(img_path.split("/")[-2:])[:-len(".jpg")] 53 | 54 | 55 | else: 56 | raise Exception("Add an appropriate argument to use the dataset!") 57 | 58 | 59 | assert len(rotation_list) == 36 and len(scale_list) == 13 60 | 61 | img, H, W = filter_image(img_path, args.patch_size) 62 | if img is None : continue 63 | gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 64 | 65 | intermediate_patch_size = math.ceil(args.patch_size * 1.415) 66 | 67 | ## 1. SIFT 68 | kpts = sift.detect(gray, None) 69 | 70 | ## 2. Harris 71 | # find Harris corners 72 | dst = cv2.cornerHarris(gray,2,3,0.04) 73 | dst = cv2.dilate(dst,None) 74 | ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0) 75 | dst = np.uint8(dst) 76 | # find centroids 77 | ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) 78 | # define the criteria to stop and refine the corners 79 | criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) 80 | corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria) 81 | 82 | kpts_topk = [] 83 | ## 1. SIFT keypoints selection (exception reject) 84 | for kpt in kpts: 85 | x = int(kpt.pt[0]) 86 | y = int(kpt.pt[1]) 87 | if x > intermediate_patch_size * 2 and x < (W - intermediate_patch_size * 2 - 1): 88 | if y > intermediate_patch_size * 2 and y < (H - intermediate_patch_size * 2 - 1): 89 | kpts_topk.append( (x,y) ) 90 | 91 | if len(kpts_topk) > args.num_patches_per_image // 2: 92 | kpts_topk = random.sample(kpts_topk, args.num_patches_per_image // 2) 93 | 94 | ## 2. Harris corner exception reject 95 | corners_topk = [] 96 | for kpt in corners: 97 | x = int(kpt[0]) 98 | y = int(kpt[1]) 99 | if x > intermediate_patch_size * 2 and x < (W - intermediate_patch_size * 2 - 1): 100 | if y > intermediate_patch_size * 2 and y < (H - intermediate_patch_size * 2 - 1): 101 | corners_topk.append( (x,y) ) 102 | 103 | if len(corners_topk) > args.num_patches_per_image // 2: 104 | corners_topk = random.sample(corners_topk, args.num_patches_per_image // 2) 105 | 106 | kpts_topk.extend(corners_topk) 107 | 108 | ## exception control : If there are no enough valid points. 109 | if len(kpts_topk) < args.num_patches_per_image: 110 | num_of_pad_points = args.num_patches_per_image-len(kpts_topk) 111 | print("No valid keypoints are detected : ", num_of_pad_points) 112 | x = W // 2 113 | y = H // 2 114 | center = (x, y) 115 | for itera in range(num_of_pad_points): 116 | kpts_topk.append(center) 117 | 118 | random.shuffle(kpts_topk) 119 | print('len(kpts), len(corners), selected_kpts : ' , len(kpts), len(corners), len(kpts_topk)) 120 | 121 | for kpt_idx in range(args.num_patches_per_image): 122 | 123 | # ( W_rand, H_rand ) = ( 124 | # np.random.randint(intermediate_patch_size * 2, W - intermediate_patch_size * 2 - 1), 125 | # np.random.randint(intermediate_patch_size * 2, H - intermediate_patch_size * 2 - 1) 126 | # ) 127 | W_rand, H_rand = kpts_topk[kpt_idx] 128 | 129 | fname0 = os.path.join(args.dataset, "{}_{}_angle{:03d}_scale{:06.4f}.jpg".format(fkey, kpt_idx, 0, 1.0)) 130 | 131 | fname_set = set() 132 | 133 | for rot in rotation_list: 134 | for scale in scale_list: 135 | 136 | fname = os.path.join(args.dataset, "{}_{}_angle{:03d}_scale{:06.4f}.jpg".format(fkey, kpt_idx, rot, scale)) 137 | 138 | img_rescale = imutils.resize(img, width=int(scale * W)) 139 | img_crop = img_rescale[ 140 | int(H_rand * scale) - intermediate_patch_size // 2 : int(H_rand * scale) + intermediate_patch_size // 2, 141 | int(W_rand * scale) - intermediate_patch_size // 2 : int(W_rand * scale) + intermediate_patch_size // 2 142 | ] 143 | img_rotate = imutils.rotate(img_crop, rot) 144 | img_final = img_rotate[ 145 | intermediate_patch_size//2 - args.patch_size // 2 : intermediate_patch_size//2 + args.patch_size // 2, 146 | intermediate_patch_size//2 - args.patch_size // 2 : intermediate_patch_size//2 + args.patch_size // 2, 147 | ] 148 | 149 | assert img_final.shape[:2] == (args.patch_size, args.patch_size) 150 | 151 | img_save = Image.fromarray(img_final) 152 | img_save.save(os.path.join(args.output_dir, fname)) 153 | 154 | fp_write.write("{} {} {} {} {}\n".format(fname0, fname, W_rand, H_rand, file_split[img_path])) 155 | fname_set.add(fname) 156 | 157 | assert len(fname_set) == 468 158 | 159 | 160 | if __name__ == "__main__": 161 | parser = argparse.ArgumentParser() 162 | parser.add_argument("--dataset", choices=["patchPoseA", "patchPoseB"], default="patchPoseB", help="data type to generate") 163 | parser.add_argument("--dataset_path", required=True, type=str, help="path to spair directory") 164 | parser.add_argument("--image_list_path", default="./", type=str, help="path to a directory containing image lists") 165 | parser.add_argument("--patch_size", default=32, type=int, help="size of patch to extract") 166 | 167 | parser.add_argument("--output_dir", default="./output", type=str, help="path to generate an output directory") 168 | parser.add_argument("--num_patches_per_image", default=1, type=int, help="number of patches to be extracted per image") 169 | parser.add_argument("--seed", default=777, type=int, help="default seed to use") 170 | 171 | args = parser.parse_args() 172 | np.random.seed(args.seed) 173 | 174 | generation(args) -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/verification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import os\n", 10 | "from PIL import Image\n", 11 | "import matplotlib.pyplot as plt" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": null, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "# Verify whether image directory exists and the form is the correct form.\n", 21 | "\n", 22 | "per_image = 468\n", 23 | "dataset_path = \"../../data\"\n", 24 | "assert os.path.exists(os.path.join(dataset_path, \"patchPoseA\"))\n", 25 | "assert os.path.exists(os.path.join(dataset_path, \"patchPoseB\"))\n", 26 | "print(os.listdir(os.path.join(dataset_path, \"patchPoseA\"))[0])\n", 27 | "print(os.listdir(os.path.join(dataset_path, \"patchPoseB\"))[0])" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": null, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "# PatchPoseA, PatchPoseB, data number verification\n", 37 | "# The number of whole images in the data directory must be divisible to the patches extracted per image. \n", 38 | "\n", 39 | "\n", 40 | "print(len(os.listdir(os.path.join(dataset_path, \"patchPoseA\"))))\n", 41 | "print(len(os.listdir(os.path.join(dataset_path, \"patchPoseB\"))))\n", 42 | "\n", 43 | "assert len(os.listdir(os.path.join(dataset_path, \"patchPoseA\"))) % per_image == 0\n", 44 | "assert len(os.listdir(os.path.join(dataset_path, \"patchPoseB\"))) % per_image == 0\n" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": null, 50 | "metadata": { 51 | "tags": [] 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "# You could change the idx to observe images\n", 56 | "idx_to_observe = 0\n", 57 | "\n", 58 | "lines = open(os.path.join(dataset_path, \"patchPoseA.txt\")).readlines()\n", 59 | "fig, axs = plt.subplots(6, 6, figsize=(20, 20))\n", 60 | "for i in range(per_image // 13):\n", 61 | " image = Image.open(os.path.join(dataset_path, lines[13 * i + 468 * idx_to_observe].split(' ')[1]))\n", 62 | " axs[i // 6, i % 6].imshow(image)\n", 63 | "plt.show()\n", 64 | "\n", 65 | "fig, axs = plt.subplots(1, 13, figsize=(20, 20))\n", 66 | "for i in range(per_image // 36):\n", 67 | " image = Image.open(os.path.join(dataset_path, lines[i + 468 * idx_to_observe].split(' ')[1]))\n", 68 | " axs[i].imshow(image)\n", 69 | "plt.show()\n", 70 | " " 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "# Check train: val: test\n", 80 | "patchPoseA_list_dir = os.path.join(dataset_path, \"patchPoseAImageList\")\n", 81 | "patchPoseB_list_dir = os.path.join(dataset_path, \"patchPoseAImageList\")\n", 82 | "\n", 83 | "assert os.path.exists(patchPoseA_list_dir)\n", 84 | "assert os.path.exists(patchPoseB_list_dir)\n", 85 | "\n", 86 | "trainAfp, valAfp, testAfp = (\n", 87 | " open(os.path.join(patchPoseA_list_dir, \"train_acquired.txt\")), \n", 88 | " open(os.path.join(patchPoseA_list_dir, \"val_acquired.txt\")), \n", 89 | " open(os.path.join(patchPoseA_list_dir, \"test_acquired.txt\")),\n", 90 | ")\n", 91 | "\n", 92 | "trainA, valA, testA = (\n", 93 | " trainAfp.readlines(), \n", 94 | " valAfp.readlines(),\n", 95 | " testAfp.readlines(),\n", 96 | ")\n", 97 | "\n", 98 | "trainBfp, valBfp, testBfp = (\n", 99 | " open(os.path.join(patchPoseB_list_dir, \"train_acquired.txt\")),\n", 100 | " open(os.path.join(patchPoseB_list_dir, \"val_acquired.txt\")), \n", 101 | " open(os.path.join(patchPoseB_list_dir, \"test_acquired.txt\")),\n", 102 | ")\n", 103 | "\n", 104 | "trainB, valB, testB = (\n", 105 | " trainBfp.readlines(), \n", 106 | " valBfp.readlines(),\n", 107 | " testBfp.readlines(),\n", 108 | ")\n", 109 | "\n", 110 | "allA = len(trainA) + len(valA) + len(testA)\n", 111 | "allB = len(trainB) + len(valB) + len(testB)\n", 112 | "\n", 113 | "print(f\"train: val: test = {len(trainA) / allA} : {len(valA) / allA} : {len(testA) / allA}\")\n", 114 | "print(f\"train: val: test = {len(trainB) / allB} : {len(valB) / allB} : {len(testB) / allB}\")\n", 115 | "\n", 116 | "trainAfp.close(); valAfp.close(); testAfp.close(); \n", 117 | "trainBfp.close(); valBfp.close(); testBfp.close(); \n" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "# You could change the idx to observe images\n", 127 | "idx_to_observe = 2\n", 128 | "\n", 129 | "lines = open(os.path.join(patchPoseA_list_dir, \"train_acquired.txt\")).readlines()\n", 130 | "print(len(lines))\n", 131 | "fig, axs = plt.subplots(5, 10, figsize=(120, 60))\n", 132 | "for i in range(50):\n", 133 | " image = Image.open(os.path.join(dataset_path, lines[468 * i].rstrip(\"\\n\")))\n", 134 | " axs[i // 10, i % 10].imshow(image)\n", 135 | " " 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": null, 141 | "metadata": {}, 142 | "outputs": [], 143 | "source": [ 144 | "# You could change the idx to observe images\n", 145 | "\n", 146 | "lines = open(os.path.join(patchPoseA_list_dir, \"train_pruned.txt\")).readlines()\n", 147 | "fig, axs = plt.subplots(5, 10, figsize=(120, 60))\n", 148 | "for i in range(50):\n", 149 | " image = Image.open(os.path.join(dataset_path, lines[468 * i].rstrip(\"\\n\")))\n", 150 | " axs[i // 10, i % 10].imshow(image)\n", 151 | "plt.show()\n", 152 | "\n", 153 | " " 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": null, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [ 162 | "# Evaluating Performance\n", 163 | "import numpy as np\n", 164 | "import tqdm\n", 165 | "\n", 166 | "path = \"/user4/yoonwoo/output_sift/output_feat.txt.result.npz\"\n", 167 | "npz_file = np.load(path, allow_pickle=True)\n", 168 | "thresholds = 5" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": null, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [ 177 | "angle_separate, sca_separate, both_separate = {}, {}, {}\n", 178 | "for angle in range(0, 360, 10):\n", 179 | " angle_separate[angle] = []\n", 180 | "for scale in [round(2 ** ((i - 6) / 3), 4) for i in range(13)]:\n", 181 | " sca_separate[scale] = []\n", 182 | "for angle in range(0, 360, 10): \n", 183 | " for scale in [round(2 ** ((i - 6) / 3), 4) for i in range(13)]:\n", 184 | " both_separate[(angle, scale)] = []\n", 185 | " \n", 186 | "for key,val in tqdm.tqdm(npz_file.items()):\n", 187 | " ori = int(key.split(\"/\")[-1].split(\"_\")[0])\n", 188 | " sca = float(key.split(\"/\")[-1].split(\"_\")[1][:-len(\".ppm\")])\n", 189 | " score = (val < thresholds).astype(float).mean()\n", 190 | " sca_separate[sca].append(score)\n", 191 | " angle_separate[ori].append(score)\n", 192 | " both_separate[(ori, sca)].append(score)" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": null, 198 | "metadata": {}, 199 | "outputs": [], 200 | "source": [ 201 | "angle_mean = {k: np.mean(v) for (k,v) in angle_separate.items()}\n", 202 | "sca_mean = {k: np.mean(v) for (k,v) in sca_separate.items()}\n", 203 | "both_mean = {k: np.mean(v) for (k,v) in both_separate.items()}" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": null, 209 | "metadata": {}, 210 | "outputs": [], 211 | "source": [ 212 | "angle_list = np.array(list(angle_mean.values())).reshape(1, -1)\n", 213 | "sca_list = np.array(list(sca_mean.values())).reshape(1, -1)\n", 214 | "both_list = np.array(list(both_mean.values())).reshape(36, 13)" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": null, 220 | "metadata": {}, 221 | "outputs": [], 222 | "source": [ 223 | "import matplotlib.pyplot as plt\n", 224 | "angle_list" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": null, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "# Scale Accuracy Color Map\n", 234 | "fig, ax = plt.subplots(figsize=(40,6))\n", 235 | "im = ax.imshow(angle_list, cmap=\"Blues\")\n", 236 | "ax.set_xticks(np.arange(36))\n", 237 | "ax.set_yticks(np.arange(1))\n", 238 | "ax.set_xticklabels(list(map(str, range(0, 360, 10))))\n", 239 | "for i in range(36):\n", 240 | " ax.text(i, 0, round(angle_list[0][i], 4), ha=\"center\", va=\"center\", color=\"b\")\n", 241 | "plt.show()" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": null, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": [ 250 | "# Scale Accuracy Color Map\n", 251 | "fig, ax = plt.subplots(figsize=(40,6))\n", 252 | "im = ax.imshow(sca_list, cmap=\"Blues\")\n", 253 | "ax.set_xticks(np.arange(13))\n", 254 | "ax.set_yticks(np.arange(1))\n", 255 | "ax.set_xticklabels(list(map(str, [round(2 ** ((i - 6) / 3), 4) for i in range(13)])))\n", 256 | "for i in range(13):\n", 257 | " ax.text(i, 0, round(sca_list[0][i], 4), ha=\"center\", va=\"center\", color=\"b\")\n", 258 | "plt.show()" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": null, 264 | "metadata": {}, 265 | "outputs": [], 266 | "source": [ 267 | "# Scale Accuracy Color Map\n", 268 | "fig, ax = plt.subplots(figsize=(40,50))\n", 269 | "im = ax.imshow(both_list, cmap=\"Blues\")\n", 270 | "ax.set_yticks(np.arange(36))\n", 271 | "ax.set_xticks(np.arange(13))\n", 272 | "ax.set_yticklabels(range(0, 360, 10))\n", 273 | "ax.set_xticklabels(list(map(str, [round(2 ** ((i - 6) / 3), 4) for i in range(13)])))\n", 274 | "for i in range(36):\n", 275 | " for j in range(13):\n", 276 | " ax.text(j, i, round(both_list[i][j], 4), ha=\"center\", va=\"center\", color=\"b\")\n", 277 | "plt.show()" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": null, 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": [] 286 | } 287 | ], 288 | "metadata": { 289 | "kernelspec": { 290 | "display_name": "Python 3.8.5 64-bit ('lfnet': conda)", 291 | "language": "python", 292 | "name": "python38564bitlfnetconda4ff9592734cf4855b0a807ac88c2f442" 293 | }, 294 | "language_info": { 295 | "codemirror_mode": { 296 | "name": "ipython", 297 | "version": 3 298 | }, 299 | "file_extension": ".py", 300 | "mimetype": "text/x-python", 301 | "name": "python", 302 | "nbconvert_exporter": "python", 303 | "pygments_lexer": "ipython3", 304 | "version": "3.8.5-final" 305 | } 306 | }, 307 | "nbformat": 4, 308 | "nbformat_minor": 2 309 | } 310 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/val_all.txt: -------------------------------------------------------------------------------- 1 | JPEGImages/aeroplane/2010_000477.jpg 2 | JPEGImages/tvmonitor/2008_006159.jpg 3 | JPEGImages/chair/2009_001431.jpg 4 | JPEGImages/aeroplane/2010_001448.jpg 5 | JPEGImages/tvmonitor/2008_002140.jpg 6 | JPEGImages/chair/2008_003547.jpg 7 | JPEGImages/bicycle/2008_005978.jpg 8 | JPEGImages/sheep/2008_000669.jpg 9 | JPEGImages/pottedplant/2009_003679.jpg 10 | JPEGImages/train/2010_002896.jpg 11 | JPEGImages/pottedplant/2009_002771.jpg 12 | JPEGImages/person/2007_003530.jpg 13 | JPEGImages/chair/2009_004746.jpg 14 | JPEGImages/tvmonitor/2008_004754.jpg 15 | JPEGImages/cow/2009_004186.jpg 16 | JPEGImages/motorbike/2008_002955.jpg 17 | JPEGImages/person/2007_002120.jpg 18 | JPEGImages/motorbike/2008_008218.jpg 19 | JPEGImages/boat/2009_003284.jpg 20 | JPEGImages/aeroplane/2011_003034.jpg 21 | JPEGImages/aeroplane/2008_001546.jpg 22 | JPEGImages/cow/2009_003297.jpg 23 | JPEGImages/chair/2010_000470.jpg 24 | JPEGImages/motorbike/2010_002396.jpg 25 | JPEGImages/aeroplane/2009_000327.jpg 26 | JPEGImages/pottedplant/2011_001382.jpg 27 | JPEGImages/sheep/2009_002245.jpg 28 | JPEGImages/dog/2008_005838.jpg 29 | JPEGImages/bicycle/2008_005412.jpg 30 | JPEGImages/bus/2009_002066.jpg 31 | JPEGImages/horse/2008_003596.jpg 32 | JPEGImages/horse/2008_000499.jpg 33 | JPEGImages/train/2009_001259.jpg 34 | JPEGImages/cow/2009_001798.jpg 35 | JPEGImages/dog/2010_004052.jpg 36 | JPEGImages/tvmonitor/2011_002514.jpg 37 | JPEGImages/bus/2008_004725.jpg 38 | JPEGImages/bus/2009_000006.jpg 39 | JPEGImages/cat/2009_004234.jpg 40 | JPEGImages/aeroplane/2008_005685.jpg 41 | JPEGImages/bus/2010_003855.jpg 42 | JPEGImages/cow/2009_003542.jpg 43 | JPEGImages/tvmonitor/2008_004093.jpg 44 | JPEGImages/motorbike/2008_006708.jpg 45 | JPEGImages/cow/2009_000250.jpg 46 | JPEGImages/dog/2010_005522.jpg 47 | JPEGImages/bicycle/2009_002145.jpg 48 | JPEGImages/car/2010_005119.jpg 49 | JPEGImages/aeroplane/2009_000796.jpg 50 | JPEGImages/car/2008_006921.jpg 51 | JPEGImages/chair/2009_004849.jpg 52 | JPEGImages/pottedplant/2008_004171.jpg 53 | JPEGImages/boat/2009_000686.jpg 54 | JPEGImages/cat/2010_004954.jpg 55 | JPEGImages/boat/2010_005780.jpg 56 | JPEGImages/bottle/2009_001848.jpg 57 | JPEGImages/person/2007_007109.jpg 58 | JPEGImages/train/2010_005130.jpg 59 | JPEGImages/chair/2008_007561.jpg 60 | JPEGImages/aeroplane/2008_007879.jpg 61 | JPEGImages/sheep/2008_005505.jpg 62 | JPEGImages/bicycle/2010_000401.jpg 63 | JPEGImages/sheep/2009_005089.jpg 64 | JPEGImages/bus/2008_002412.jpg 65 | JPEGImages/horse/2009_002957.jpg 66 | JPEGImages/horse/2007_009841.jpg 67 | JPEGImages/train/2009_001823.jpg 68 | JPEGImages/tvmonitor/2009_000216.jpg 69 | JPEGImages/cat/2010_001647.jpg 70 | JPEGImages/train/2010_001143.jpg 71 | JPEGImages/bird/2008_001829.jpg 72 | JPEGImages/boat/2009_000420.jpg 73 | JPEGImages/bicycle/2010_004537.jpg 74 | JPEGImages/motorbike/2009_000897.jpg 75 | JPEGImages/bottle/2009_003914.jpg 76 | JPEGImages/pottedplant/2010_001430.jpg 77 | JPEGImages/cat/2010_003174.jpg 78 | JPEGImages/bus/2010_003534.jpg 79 | JPEGImages/sheep/2010_003372.jpg 80 | JPEGImages/sheep/2009_003541.jpg 81 | JPEGImages/bus/2011_003086.jpg 82 | JPEGImages/car/2011_002420.jpg 83 | JPEGImages/train/2010_003482.jpg 84 | JPEGImages/pottedplant/2009_004191.jpg 85 | JPEGImages/motorbike/2008_006517.jpg 86 | JPEGImages/motorbike/2009_003411.jpg 87 | JPEGImages/dog/2008_006870.jpg 88 | JPEGImages/train/2008_002965.jpg 89 | JPEGImages/aeroplane/2008_008004.jpg 90 | JPEGImages/bird/2009_000692.jpg 91 | JPEGImages/dog/2009_004082.jpg 92 | JPEGImages/bus/2009_003592.jpg 93 | JPEGImages/chair/2009_004537.jpg 94 | JPEGImages/aeroplane/2008_005916.jpg 95 | JPEGImages/cow/2008_006355.jpg 96 | JPEGImages/horse/2010_001077.jpg 97 | JPEGImages/bottle/2009_002475.jpg 98 | JPEGImages/motorbike/2010_002452.jpg 99 | JPEGImages/cat/2011_002034.jpg 100 | JPEGImages/horse/2007_007748.jpg 101 | JPEGImages/bottle/2010_003037.jpg 102 | JPEGImages/person/2007_006076.jpg 103 | JPEGImages/dog/2008_006020.jpg 104 | JPEGImages/chair/2009_004229.jpg 105 | JPEGImages/tvmonitor/2010_001367.jpg 106 | JPEGImages/sheep/2009_004805.jpg 107 | JPEGImages/cat/2009_005037.jpg 108 | JPEGImages/horse/2008_005668.jpg 109 | JPEGImages/pottedplant/2009_000526.jpg 110 | JPEGImages/bottle/2009_000840.jpg 111 | JPEGImages/person/2008_001761.jpg 112 | JPEGImages/cat/2008_006190.jpg 113 | JPEGImages/tvmonitor/2008_001021.jpg 114 | JPEGImages/train/2008_005763.jpg 115 | JPEGImages/car/2010_002175.jpg 116 | JPEGImages/person/2007_003188.jpg 117 | JPEGImages/aeroplane/2010_002147.jpg 118 | JPEGImages/aeroplane/2008_008028.jpg 119 | JPEGImages/bird/2008_005092.jpg 120 | JPEGImages/boat/2009_000723.jpg 121 | JPEGImages/cow/2008_004394.jpg 122 | JPEGImages/sheep/2008_006570.jpg 123 | JPEGImages/chair/2009_004737.jpg 124 | JPEGImages/tvmonitor/2009_000336.jpg 125 | JPEGImages/cat/2008_000464.jpg 126 | JPEGImages/bottle/2010_003512.jpg 127 | JPEGImages/bicycle/2011_001028.jpg 128 | JPEGImages/bottle/2009_002521.jpg 129 | JPEGImages/chair/2008_004896.jpg 130 | JPEGImages/motorbike/2010_005359.jpg 131 | JPEGImages/bird/2008_005357.jpg 132 | JPEGImages/bird/2010_002614.jpg 133 | JPEGImages/bus/2008_008674.jpg 134 | JPEGImages/car/2008_002741.jpg 135 | JPEGImages/bicycle/2010_000571.jpg 136 | JPEGImages/sheep/2008_007814.jpg 137 | JPEGImages/bicycle/2008_007861.jpg 138 | JPEGImages/chair/2008_008589.jpg 139 | JPEGImages/dog/2009_004200.jpg 140 | JPEGImages/bicycle/2008_000133.jpg 141 | JPEGImages/car/2010_005323.jpg 142 | JPEGImages/boat/2009_000385.jpg 143 | JPEGImages/boat/2008_008170.jpg 144 | JPEGImages/person/2007_008897.jpg 145 | JPEGImages/cow/2008_007123.jpg 146 | JPEGImages/dog/2008_005897.jpg 147 | JPEGImages/cow/2010_002047.jpg 148 | JPEGImages/tvmonitor/2008_004217.jpg 149 | JPEGImages/sheep/2010_003541.jpg 150 | JPEGImages/aeroplane/2011_000103.jpg 151 | JPEGImages/bus/2008_006483.jpg 152 | JPEGImages/pottedplant/2008_004615.jpg 153 | JPEGImages/bottle/2009_003562.jpg 154 | JPEGImages/car/2008_006986.jpg 155 | JPEGImages/cow/2009_005307.jpg 156 | JPEGImages/chair/2008_007415.jpg 157 | JPEGImages/pottedplant/2009_004263.jpg 158 | JPEGImages/bird/2008_007317.jpg 159 | JPEGImages/train/2008_000657.jpg 160 | JPEGImages/car/2009_004327.jpg 161 | JPEGImages/bus/2009_001811.jpg 162 | JPEGImages/pottedplant/2008_005954.jpg 163 | JPEGImages/motorbike/2009_001827.jpg 164 | JPEGImages/boat/2009_001406.jpg 165 | JPEGImages/motorbike/2011_001524.jpg 166 | JPEGImages/car/2009_004556.jpg 167 | JPEGImages/pottedplant/2007_001154.jpg 168 | JPEGImages/train/2010_002667.jpg 169 | JPEGImages/bicycle/2010_002055.jpg 170 | JPEGImages/person/2008_000778.jpg 171 | JPEGImages/bottle/2008_006104.jpg 172 | JPEGImages/sheep/2009_003430.jpg 173 | JPEGImages/bicycle/2008_008753.jpg 174 | JPEGImages/cow/2010_004283.jpg 175 | JPEGImages/bottle/2009_000562.jpg 176 | JPEGImages/train/2009_001192.jpg 177 | JPEGImages/bird/2008_005618.jpg 178 | JPEGImages/train/2008_003083.jpg 179 | JPEGImages/chair/2008_007006.jpg 180 | JPEGImages/tvmonitor/2008_006409.jpg 181 | JPEGImages/person/2008_001231.jpg 182 | JPEGImages/bus/2009_001910.jpg 183 | JPEGImages/pottedplant/2010_004029.jpg 184 | JPEGImages/bottle/2010_002941.jpg 185 | JPEGImages/bus/2011_001826.jpg 186 | JPEGImages/bird/2008_004024.jpg 187 | JPEGImages/person/2007_003205.jpg 188 | JPEGImages/bird/2008_003997.jpg 189 | JPEGImages/pottedplant/2008_005874.jpg 190 | JPEGImages/dog/2009_001828.jpg 191 | JPEGImages/horse/2008_000008.jpg 192 | JPEGImages/motorbike/2008_007558.jpg 193 | JPEGImages/car/2008_006833.jpg 194 | JPEGImages/car/2009_001767.jpg 195 | JPEGImages/bottle/2010_006021.jpg 196 | JPEGImages/aeroplane/2009_002714.jpg 197 | JPEGImages/bird/2008_004296.jpg 198 | JPEGImages/train/2011_003059.jpg 199 | JPEGImages/horse/2007_009807.jpg 200 | JPEGImages/bird/2008_004730.jpg 201 | JPEGImages/bottle/2011_002088.jpg 202 | JPEGImages/horse/2007_000392.jpg 203 | JPEGImages/cat/2008_002597.jpg 204 | JPEGImages/dog/2008_007494.jpg 205 | JPEGImages/car/2008_000959.jpg 206 | JPEGImages/tvmonitor/2011_001926.jpg 207 | JPEGImages/bottle/2008_005140.jpg 208 | JPEGImages/dog/2010_005615.jpg 209 | JPEGImages/cow/2010_000427.jpg 210 | JPEGImages/aeroplane/2008_006364.jpg 211 | JPEGImages/bottle/2009_002749.jpg 212 | JPEGImages/bicycle/2008_008530.jpg 213 | JPEGImages/horse/2008_002866.jpg 214 | JPEGImages/tvmonitor/2011_001387.jpg 215 | JPEGImages/dog/2009_004227.jpg 216 | JPEGImages/sheep/2009_004768.jpg 217 | JPEGImages/dog/2010_002924.jpg 218 | JPEGImages/tvmonitor/2008_005918.jpg 219 | JPEGImages/cat/2008_006999.jpg 220 | JPEGImages/boat/2010_004253.jpg 221 | JPEGImages/bicycle/2008_003270.jpg 222 | JPEGImages/person/2008_001852.jpg 223 | JPEGImages/car/2010_003854.jpg 224 | JPEGImages/dog/2008_003838.jpg 225 | JPEGImages/bottle/2009_002649.jpg 226 | JPEGImages/person/2007_003191.jpg 227 | JPEGImages/dog/2010_000746.jpg 228 | JPEGImages/person/2008_000630.jpg 229 | JPEGImages/bicycle/2010_005909.jpg 230 | JPEGImages/bottle/2010_002956.jpg 231 | JPEGImages/person/2008_000544.jpg 232 | JPEGImages/chair/2009_003694.jpg 233 | JPEGImages/boat/2009_004078.jpg 234 | JPEGImages/pottedplant/2011_001055.jpg 235 | JPEGImages/car/2009_002380.jpg 236 | JPEGImages/cow/2008_000905.jpg 237 | JPEGImages/car/2008_005216.jpg 238 | JPEGImages/pottedplant/2011_001360.jpg 239 | JPEGImages/cat/2010_005763.jpg 240 | JPEGImages/bird/2009_000938.jpg 241 | JPEGImages/bird/2008_008197.jpg 242 | JPEGImages/chair/2010_002319.jpg 243 | JPEGImages/person/2008_000261.jpg 244 | JPEGImages/motorbike/2009_001638.jpg 245 | JPEGImages/train/2009_002938.jpg 246 | JPEGImages/pottedplant/2010_004072.jpg 247 | JPEGImages/bicycle/2011_001806.jpg 248 | JPEGImages/boat/2008_000567.jpg 249 | JPEGImages/bird/2011_001505.jpg 250 | JPEGImages/bus/2010_001982.jpg 251 | JPEGImages/car/2008_003005.jpg 252 | JPEGImages/horse/2007_000799.jpg 253 | JPEGImages/tvmonitor/2011_000288.jpg 254 | JPEGImages/pottedplant/2010_005860.jpg 255 | JPEGImages/tvmonitor/2008_006295.jpg 256 | JPEGImages/sheep/2010_003028.jpg 257 | JPEGImages/bird/2009_002056.jpg 258 | JPEGImages/person/2007_007203.jpg 259 | JPEGImages/horse/2010_001797.jpg 260 | JPEGImages/person/2007_003431.jpg 261 | JPEGImages/boat/2008_000007.jpg 262 | JPEGImages/horse/2008_003344.jpg 263 | JPEGImages/bicycle/2010_003350.jpg 264 | JPEGImages/tvmonitor/2008_006288.jpg 265 | JPEGImages/bottle/2008_007811.jpg 266 | JPEGImages/chair/2010_000018.jpg 267 | JPEGImages/cat/2011_000999.jpg 268 | JPEGImages/aeroplane/2008_005078.jpg 269 | JPEGImages/bicycle/2008_006813.jpg 270 | JPEGImages/person/2008_000096.jpg 271 | JPEGImages/boat/2008_007441.jpg 272 | JPEGImages/sheep/2008_004621.jpg 273 | JPEGImages/bus/2008_002205.jpg 274 | JPEGImages/car/2008_003755.jpg 275 | JPEGImages/boat/2009_003351.jpg 276 | JPEGImages/train/2011_001827.jpg 277 | JPEGImages/aeroplane/2009_003005.jpg 278 | JPEGImages/train/2008_005446.jpg 279 | JPEGImages/cat/2010_000616.jpg 280 | JPEGImages/cat/2007_006303.jpg 281 | JPEGImages/pottedplant/2009_000488.jpg 282 | JPEGImages/boat/2008_004570.jpg 283 | JPEGImages/train/2009_004988.jpg 284 | JPEGImages/sheep/2007_000175.jpg 285 | JPEGImages/pottedplant/2009_001085.jpg 286 | JPEGImages/bottle/2008_004982.jpg 287 | JPEGImages/train/2008_008382.jpg 288 | JPEGImages/tvmonitor/2010_005071.jpg 289 | JPEGImages/dog/2010_004683.jpg 290 | JPEGImages/boat/2009_002897.jpg 291 | JPEGImages/cat/2009_004983.jpg 292 | JPEGImages/train/2011_002636.jpg 293 | JPEGImages/dog/2009_002093.jpg 294 | JPEGImages/motorbike/2010_002149.jpg 295 | JPEGImages/bus/2009_004055.jpg 296 | JPEGImages/cat/2010_004768.jpg 297 | JPEGImages/bus/2011_002780.jpg 298 | JPEGImages/horse/2007_006364.jpg 299 | JPEGImages/horse/2008_002762.jpg 300 | JPEGImages/cow/2009_002229.jpg 301 | JPEGImages/cow/2009_002150.jpg 302 | JPEGImages/pottedplant/2008_007823.jpg 303 | JPEGImages/motorbike/2008_001168.jpg 304 | JPEGImages/motorbike/2010_004066.jpg 305 | JPEGImages/cat/2008_005421.jpg 306 | JPEGImages/bird/2008_007593.jpg 307 | JPEGImages/boat/2009_002397.jpg 308 | JPEGImages/bicycle/2011_002006.jpg 309 | JPEGImages/aeroplane/2008_004704.jpg 310 | JPEGImages/horse/2008_000765.jpg 311 | JPEGImages/car/2010_000036.jpg 312 | JPEGImages/cow/2010_001692.jpg 313 | JPEGImages/dog/2009_002445.jpg 314 | JPEGImages/bicycle/2008_007993.jpg 315 | JPEGImages/horse/2008_000403.jpg 316 | JPEGImages/chair/2008_007691.jpg 317 | JPEGImages/chair/2010_004962.jpg 318 | JPEGImages/sheep/2009_000168.jpg 319 | JPEGImages/cow/2011_003019.jpg 320 | JPEGImages/bird/2009_002754.jpg 321 | JPEGImages/bottle/2008_008694.jpg 322 | JPEGImages/boat/2011_000749.jpg 323 | -------------------------------------------------------------------------------- /datasets/hpatchespose_dataset_generation/generate_dataset.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import math 3 | import cv2 4 | import os.path 5 | import glob 6 | import random 7 | from tqdm import tqdm 8 | 9 | import matplotlib.pyplot as plt 10 | patch_size = 32 11 | nfeatures = 500 12 | noutputs = 25 13 | datadir = os.path.normpath(os.path.join(os.path.dirname(__file__), "hpatches-sequences-release")) 14 | save_path = os.path.normpath(os.path.join(os.path.dirname(__file__), "hpatchesPoseA")) 15 | list_path = os.path.normpath(os.path.join(os.path.dirname(__file__), "hpatchesPoseAImageList")) 16 | 17 | save_path = '../hpatchesPose/' + save_path 18 | list_path = '../hpatchesPose/' + list_path 19 | 20 | random.seed(1121) 21 | 22 | def affine_matrix_decompose(h): 23 | # normalize h 24 | h /= h[2][2] 25 | A11, A12, A21, A22 = h[0][0], h[0][1], h[1][0], h[1][1] 26 | s_x = math.sqrt(A11 ** 2 + A21 ** 2) 27 | theta = np.arctan2(A21, A11) 28 | ms_y = A12 * np.cos(theta) + A22 * np.sin(theta) 29 | if theta == 0: 30 | s_y = (A22 - ms_y * np.sin(theta)) / np.cos(theta) 31 | else: 32 | s_y = (ms_y * np.cos(theta) - A12) / np.sin(theta) 33 | 34 | m = ms_y / s_y 35 | return theta, s_x, s_y, m 36 | 37 | def warpPerspectivePoint(src_point, H): 38 | # normalize h 39 | H /= H[2][2] 40 | src_point = np.append(src_point, 1) 41 | 42 | dst_point = np.dot(H, src_point) 43 | dst_point /= dst_point[2] 44 | 45 | return dst_point[0:2] 46 | 47 | def warpPerspectivePoints(src_points, H): 48 | # normalize H 49 | H /= H[2][2] 50 | 51 | ones = np.ones((src_points.shape[0], 1)) 52 | points = np.append(src_points, ones, axis = 1) 53 | 54 | warpPoints = np.dot(H, points.T) 55 | warpPoints = warpPoints.T / warpPoints.T[:, 2][:,None] 56 | 57 | return warpPoints[:,0:2] 58 | 59 | 60 | def points_sample(points): 61 | # remove duplicate keypoints 62 | points = list(set(points)) 63 | 64 | # sampling 65 | num = nfeatures 66 | if (len(points) < num): 67 | num = len(points) 68 | points = random.sample(points, num) 69 | 70 | points = np.array(points) 71 | return points 72 | 73 | def detect_SIFT(img): 74 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 75 | 76 | # sift = cv2.xfeatures2d.SIFT_create() 77 | sift = cv2.SIFT_create() 78 | kp = sift.detect(gray, None) 79 | 80 | points = [] 81 | for point in kp: 82 | points.append(point.pt) 83 | 84 | return points_sample(points) 85 | 86 | 87 | def detect_Harris(img): 88 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 89 | # kp = cv2.cornerHarris(gray,2,3,0.04) 90 | dst = cv2.cornerHarris(gray,2,3,0.1) 91 | 92 | # find Harris corners 93 | dst = cv2.cornerHarris(gray,2,3,0.04) 94 | dst = cv2.dilate(dst,None) 95 | ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0) 96 | dst = np.uint8(dst) 97 | # find centroids 98 | ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) 99 | # define the criteria to stop and refine the corners 100 | criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) 101 | corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria) 102 | 103 | ## for vis 104 | # res = np.hstack((centroids,corners)) 105 | # res = np.int0(res) 106 | # img[res[:,1],res[:,0]]=[0,0,255] 107 | # img[res[:,3],res[:,2]] = [0,255,0] 108 | # cv2.imshow('dst',img) 109 | # if cv2.waitKey(0) & 0xff == 27: 110 | # cv2.destroyAllWindows() 111 | 112 | kp = corners 113 | points = [] 114 | for point in kp: 115 | # points.append((point[0], point[1])) 116 | points.append((int(point[0]), int(point[1]))) 117 | 118 | return points_sample(points) 119 | 120 | def draw_points(img, points, radius, color, thickness, max_num=-1): 121 | cnt = 0 122 | for idx in range(points.shape[0]): 123 | if (max_num != -1) & (cnt >= max_num): 124 | break 125 | img = cv2.circle(img.copy(), (int(points[idx][0]),int(points[idx][1])), radius = radius, color=color, thickness=thickness) 126 | cnt += 1 127 | 128 | return img 129 | 130 | def draw_and_save_image_with_points(seq_name, tar_idx, points_list, img_list, name_list): 131 | prefix = save_path+'/'+seq_name+'_1_' 132 | 133 | for i in range(len(img_list)): 134 | img_with_points = draw_points(img_list[i], points_list[i], 3, (0, 0, 255), -1) 135 | cv2.imwrite(prefix+str(tar_idx)+'_' + name_list[i] + '_img.jpg', img_with_points) 136 | 137 | def is_inside(img, patch_size, point): 138 | p = patch_size // 2 139 | st_x = st_y = p 140 | height, width, _ = img.shape 141 | end_x = width - 1 - p 142 | end_y = height - 1 - p 143 | 144 | if (st_x > point[0]) | (point[0] > end_x) | \ 145 | (st_y > point[1]) | (point[1] > end_y): 146 | return False 147 | return True 148 | 149 | def filter_points(points_list, img_list, patch_size): 150 | out_idxs = [] 151 | n, _ = points.shape 152 | 153 | for idx in range(n): 154 | is_in = True 155 | for l in range(len(points_list)): 156 | if (is_inside(img_list[l], patch_size, points_list[l][idx]) == False): 157 | is_in = False 158 | break 159 | if is_in == False: 160 | out_idxs.append(idx) 161 | 162 | for idx in reversed(out_idxs): 163 | for l in range(len(points_list)): 164 | points_list[l] = np.delete(points_list[l], idx, 0) 165 | 166 | return points_list 167 | 168 | def generate_ref_tar_patches(points, warp_points, ref_img, tar_img, theta, s_x, s_y): 169 | tar_list = [] 170 | patches_cnt = 1 171 | for idx in range(len(points)): 172 | ref_x, ref_y = points[idx][0], points[idx][1] 173 | p = patch_size // 2 174 | ref_crop = ref_img[ref_y - p: ref_y + p, ref_x - p: ref_x + p] 175 | tar_x, tar_y = warp_points[idx][0], warp_points[idx][1] 176 | tar_crop = tar_img[tar_y - p: tar_y + p, tar_x - p: tar_x + p] 177 | 178 | angle = int((theta * 180 / np.pi) // 10 * 10) 179 | scale = (s_x + s_y) / 2 180 | scale = 1.2 ** math.floor(math.log(scale, 1.2)) 181 | 182 | prefix = save_path + '/' + seq_name+'_1-'+str(tar_idx)+'_'+str(patches_cnt) 183 | ref_crop_name = prefix + '_angle000_scale1.0000.jpg' 184 | tar_crop_name = prefix + '_angle' + f"{angle:03d}" + '_scale' + f"{scale:.4f}" +'.jpg' 185 | 186 | patches_cnt += 1 187 | 188 | # if (angle > 90) | (angle < -90) : 189 | # continue 190 | 191 | # if (scale < (1.2) ** (-4)) | (scale > (1.2) ** 4): 192 | # continue 193 | 194 | 195 | if ref_crop.size == 0: 196 | print('ref_crop {} is empty center {}x{}, image {}x{}'.format(ref_crop_name, ref_x, ref_y, ref_img.shape[1], ref_img.shape[0])) 197 | if tar_crop.size == 0: 198 | print('tar_crop {} is empty center {}x{}, image {}x{}'.format(tar_crop_name, tar_x, tar_y, tar_img.shape[1], tar_img.shape[0])) 199 | cv2.imwrite(ref_crop_name, ref_crop) 200 | cv2.imwrite(tar_crop_name, tar_crop) 201 | 202 | # save image list 203 | tar_list.append(tar_crop_name) 204 | 205 | return tar_list 206 | 207 | def generate_ref_tar_approx_patches(points, warp_points, aff_points, ref_img, tar_img, aff_img, theta, s_x, s_y): 208 | patches_cnt = 1 209 | for idx in tqdm(range(len(points)), total=len(points)): 210 | ref_x, ref_y = points[idx][0], points[idx][1] 211 | p = patch_size // 2 212 | ref_crop = ref_img[ref_y - p: ref_y + p, ref_x - p: ref_x + p] 213 | tar_x, tar_y = warp_points[idx][0], warp_points[idx][1] 214 | tar_crop = tar_img[tar_y - p: tar_y + p, tar_x - p: tar_x + p] 215 | aff_x, aff_y = aff_points[idx][0], aff_points[idx][1] 216 | aff_crop = aff_img[aff_y - p: aff_y + p, aff_x - p: aff_x + p] 217 | 218 | 219 | angle = (theta * 180 / np.pi) 220 | scale = (s_x + s_y) / 2 221 | scale = 1.2 ** math.floor(math.log(scale, 1.2)) 222 | 223 | prefix = save_path + '/' + seq_name+'_1-'+str(tar_idx)+'_'+str(patches_cnt)+f"({angle:.2f}, {s_x:.4f}, {s_y:.4f})" 224 | ref_crop_name = prefix + '_ref.jpg' 225 | tar_crop_name = prefix + '_tar.jpg' 226 | aff_crop_name = prefix + '_aff.jpg' 227 | 228 | patches_cnt += 1 229 | 230 | # if (angle > 90) | (angle < -90) : 231 | # continue 232 | 233 | # if (scale < (1.2) ** (-4)) | (scale > (1.2) ** 4): 234 | # continue 235 | 236 | if ref_crop.size == 0: 237 | print('ref_crop {} is empty center {}x{}, image {}x{}'.format(ref_crop_name, ref_x, ref_y, ref_img.shape[1], ref_img.shape[0])) 238 | if tar_crop.size == 0: 239 | print('tar_crop {} is empty center {}x{}, image {}x{}'.format(tar_crop_name, tar_x, tar_y, tar_img.shape[1], tar_img.shape[0])) 240 | if aff_crop.size == 0: 241 | print('aff_crop {} is empty center {}x{}, image {}x{}'.format(aff_crop_name, aff_x, aff_y, aff_img.shape[1], aff_img.shape[0])) 242 | # cv2.imwrite(ref_crop_name, ref_crop) 243 | # cv2.imwrite(tar_crop_name, tar_crop) 244 | # cv2.imwrite(aff_crop_name, aff_crop) 245 | 246 | fig = plt.figure() 247 | rows = 1 248 | cols = 3 249 | ax1 = fig.add_subplot(rows, cols, 1) 250 | ax1.imshow(cv2.cvtColor(ref_crop, cv2.COLOR_BGR2RGB)) 251 | ax1.axis("off") 252 | 253 | ax2 = fig.add_subplot(rows, cols, 2) 254 | ax2.imshow(cv2.cvtColor(tar_crop, cv2.COLOR_BGR2RGB)) 255 | ax2.axis("off") 256 | 257 | ax3 = fig.add_subplot(rows, cols, 3) 258 | ax3.imshow(cv2.cvtColor(aff_crop, cv2.COLOR_BGR2RGB)) 259 | ax3.axis("off") 260 | save_dir ='vis' 261 | 262 | save_name = ref_crop_name[:-8] + '.jpg' 263 | plt.savefig(os.path.join(save_dir, save_name)) 264 | plt.clf() 265 | plt.close() 266 | break 267 | 268 | def dataset_split(file_list): 269 | type_ratio = { 270 | 'train_acquired':8, 271 | 'val_acquired':1, 272 | 'test_acquired':1 273 | } 274 | 275 | idx = 0 276 | data_dic = {} 277 | ratio_list = list(type_ratio.values()) 278 | ratio_total = sum(ratio_list) 279 | for type, ratio in type_ratio.items(): 280 | cnt = int(len(file_list) * (ratio / ratio_total)) 281 | data_dic[type] = file_list[idx:idx+cnt] 282 | idx += cnt 283 | return data_dic 284 | 285 | 286 | os.makedirs(save_path, exist_ok=True) 287 | os.makedirs(list_path, exist_ok=True) 288 | 289 | total_pair = 0 290 | selected_pair = 0 291 | 292 | tar_paths = [] 293 | statistics = [] 294 | seqs = glob.glob(datadir+'/v_*') 295 | for seq in tqdm(seqs, total=len(seqs)): 296 | seq_name = seq.split('/')[-1] 297 | 298 | ref_idx = 1 299 | ref_path = seq+'/'+str(ref_idx)+'.png' 300 | if os.path.exists(ref_path) == False: 301 | continue 302 | 303 | # load reference image 304 | ref_img = cv2.imread(ref_path) 305 | 306 | # detect SIFT keypoints 307 | points1 = detect_SIFT(ref_img) 308 | points2 = detect_Harris(ref_img) 309 | 310 | # print(points1.shape, points2.shape) 311 | points = np.concatenate((points1, points2), axis=0) 312 | # print(points.shape) 313 | for tar_idx in range(2, 7): 314 | H_path = seq+'/H_1_'+str(tar_idx) 315 | tar_path = seq+'/'+str(tar_idx)+'.png' 316 | if (os.path.exists(H_path) == False) | \ 317 | (os.path.exists(tar_path) == False): 318 | continue 319 | 320 | total_pair += 1 321 | # load target image 322 | tar_img = cv2.imread(tar_path) 323 | 324 | # load homography matrix 325 | H = np.fromfile(H_path, sep=" ") 326 | H.resize((3, 3)) 327 | 328 | theta, s_x, s_y, m = affine_matrix_decompose(H) 329 | statistics.append([theta * 180 / np.pi, s_x, s_y]) 330 | 331 | ## this is shearing remove 332 | # if abs(m) > 0.1: 333 | # continue 334 | 335 | selected_pair += 1 336 | 337 | # warp keypoint with homography matrix 338 | warp_points = warpPerspectivePoints(points, H) 339 | 340 | # # # # warp keypoint with approximated affine matrix 341 | # visualize = True 342 | # if visualize: 343 | # A = np.zeros((3,3)) 344 | # A[0][0] = s_x * np.cos(theta) 345 | # A[0][1] = -s_y * np.sin(theta) 346 | # A[1][0] = s_x * np.sin(theta) 347 | # A[1][1] = s_y * np.cos(theta) 348 | # A[2][2] = 1 349 | # aff_points = warpPerspectivePoints(points, A) 350 | # aff_img = cv2.warpPerspective(ref_img, A, (ref_img.shape[1], ref_img.shape[0])) 351 | 352 | # points = np.around(points).astype(np.int) 353 | # warp_points = np.around(warp_points).astype(np.int) 354 | # aff_points = np.around(aff_points).astype(np.int) 355 | # points, warp_points, aff_points = filter_points([points, warp_points, aff_points], [ref_img, tar_img, aff_img], patch_size) 356 | 357 | # print(points.shape, warp_points.shape, aff_points.shape) 358 | # if points.shape[0] < noutputs: 359 | # continue 360 | # ## sample 25 points. 361 | # assert points.shape == warp_points.shape == aff_points.shape 362 | # select = random.sample(list(range(points.shape[0])), noutputs) 363 | # points_select = points[select] 364 | # warp_points_select = warp_points[select] 365 | # aff_points_select = aff_points[select] 366 | # assert points_select.shape == warp_points_select.shape ==aff_points_select.shape 367 | 368 | # print(points_select.shape, warp_points_select.shape, aff_points_select.shape) 369 | # draw_and_save_image_with_points(seq_name, tar_idx, [points_select, warp_points_select, aff_points_select], [ref_img, tar_img, aff_img], ['ref', 'tar', 'aff']) 370 | 371 | # # generate ref, tar, approximation patch pairs. 372 | # generate_ref_tar_approx_patches(points_select, warp_points_select, aff_points_select, ref_img, tar_img, aff_img, theta, s_x, s_y) 373 | # print(f"{seq_name}_1_{tar_idx} : {m:.5f}") 374 | 375 | 376 | # # filter out of bound points 377 | points = np.around(points).astype(np.int) 378 | warp_points = np.around(warp_points).astype(np.int) 379 | points, warp_points = filter_points([points, warp_points], [ref_img, tar_img], patch_size) 380 | assert points.shape == warp_points.shape 381 | select = random.sample(list(range(points.shape[0])), noutputs) 382 | points_select = points[select] 383 | warp_points_select = warp_points[select] 384 | assert points_select.shape == warp_points_select.shape 385 | 386 | # # save reference and target image with points 387 | draw_and_save_image_with_points(seq_name, tar_idx, [points_select, warp_points_select], [ref_img, tar_img], ['ref', 'tar']) 388 | 389 | # generate patch pairs 390 | tar_list = generate_ref_tar_patches(points_select, warp_points_select, ref_img, tar_img, theta, s_x, s_y) 391 | 392 | tar_paths.extend(tar_list) 393 | 394 | print('total_pair, selected_pair : ', total_pair, selected_pair) 395 | print(len(tar_paths)) 396 | # exit() 397 | with open(list_path +'/'+'test_acquired.txt', 'w') as f: 398 | for item in tar_paths: 399 | f.write("%s\n" % item) 400 | random.shuffle(tar_paths) 401 | # data_dic = dataset_split(tar_paths) 402 | # for data_type, paths in data_dic.items(): 403 | # with open(list_path + '/' + data_type + '.txt', 'w') as f: 404 | # for item in paths: 405 | # f.write("%s\n" % item) 406 | # f.close() 407 | 408 | # with open(save_path+'/statistics.txt', 'w') as file: 409 | # file.writelines('\t'.join(str(j) for j in i) + '\n' for i in statistics) 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/test_all.txt: -------------------------------------------------------------------------------- 1 | JPEGImages/boat/2008_007653.jpg 2 | JPEGImages/bottle/2011_002387.jpg 3 | JPEGImages/bus/2008_004088.jpg 4 | JPEGImages/cat/2008_000112.jpg 5 | JPEGImages/horse/2009_001323.jpg 6 | JPEGImages/bird/2010_004252.jpg 7 | JPEGImages/cow/2007_006761.jpg 8 | JPEGImages/chair/2008_000089.jpg 9 | JPEGImages/person/2007_003022.jpg 10 | JPEGImages/train/2009_004170.jpg 11 | JPEGImages/bicycle/2010_002180.jpg 12 | JPEGImages/cat/2011_001568.jpg 13 | JPEGImages/person/2007_002055.jpg 14 | JPEGImages/cat/2008_002682.jpg 15 | JPEGImages/bicycle/2010_003115.jpg 16 | JPEGImages/chair/2009_002362.jpg 17 | JPEGImages/chair/2008_004490.jpg 18 | JPEGImages/train/2009_001831.jpg 19 | JPEGImages/cat/2010_005115.jpg 20 | JPEGImages/motorbike/2011_002413.jpg 21 | JPEGImages/pottedplant/2011_000514.jpg 22 | JPEGImages/person/2008_001769.jpg 23 | JPEGImages/sheep/2007_003714.jpg 24 | JPEGImages/horse/2008_004396.jpg 25 | JPEGImages/bicycle/2011_001966.jpg 26 | JPEGImages/train/2008_007999.jpg 27 | JPEGImages/person/2007_007235.jpg 28 | JPEGImages/tvmonitor/2010_004460.jpg 29 | JPEGImages/cow/2010_000910.jpg 30 | JPEGImages/train/2008_008221.jpg 31 | JPEGImages/train/2009_003407.jpg 32 | JPEGImages/sheep/2009_001203.jpg 33 | JPEGImages/pottedplant/2011_001863.jpg 34 | JPEGImages/bicycle/2008_008564.jpg 35 | JPEGImages/bicycle/2008_004654.jpg 36 | JPEGImages/horse/2007_008142.jpg 37 | JPEGImages/aeroplane/2008_004726.jpg 38 | JPEGImages/cow/2010_004436.jpg 39 | JPEGImages/pottedplant/2010_004974.jpg 40 | JPEGImages/pottedplant/2010_005593.jpg 41 | JPEGImages/horse/2007_008256.jpg 42 | JPEGImages/train/2010_003788.jpg 43 | JPEGImages/horse/2007_008596.jpg 44 | JPEGImages/boat/2010_005192.jpg 45 | JPEGImages/pottedplant/2009_001975.jpg 46 | JPEGImages/motorbike/2011_001876.jpg 47 | JPEGImages/pottedplant/2007_001420.jpg 48 | JPEGImages/bus/2009_000648.jpg 49 | JPEGImages/tvmonitor/2009_001526.jpg 50 | JPEGImages/bicycle/2008_008368.jpg 51 | JPEGImages/pottedplant/2010_005932.jpg 52 | JPEGImages/tvmonitor/2010_002245.jpg 53 | JPEGImages/aeroplane/2008_007604.jpg 54 | JPEGImages/pottedplant/2009_001922.jpg 55 | JPEGImages/car/2010_005785.jpg 56 | JPEGImages/aeroplane/2010_005632.jpg 57 | JPEGImages/tvmonitor/2010_004816.jpg 58 | JPEGImages/person/2008_001577.jpg 59 | JPEGImages/bottle/2009_001494.jpg 60 | JPEGImages/bicycle/2010_000342.jpg 61 | JPEGImages/dog/2008_008636.jpg 62 | JPEGImages/bicycle/2008_002515.jpg 63 | JPEGImages/tvmonitor/2010_005805.jpg 64 | JPEGImages/sheep/2010_003253.jpg 65 | JPEGImages/bird/2009_000317.jpg 66 | JPEGImages/bus/2009_000060.jpg 67 | JPEGImages/bottle/2010_004551.jpg 68 | JPEGImages/cat/2008_005386.jpg 69 | JPEGImages/cat/2010_000702.jpg 70 | JPEGImages/sheep/2010_002507.jpg 71 | JPEGImages/car/2009_003406.jpg 72 | JPEGImages/chair/2010_005800.jpg 73 | JPEGImages/train/2009_003938.jpg 74 | JPEGImages/horse/2008_000783.jpg 75 | JPEGImages/tvmonitor/2010_001780.jpg 76 | JPEGImages/car/2008_007214.jpg 77 | JPEGImages/train/2009_001164.jpg 78 | JPEGImages/horse/2008_004705.jpg 79 | JPEGImages/bottle/2010_002388.jpg 80 | JPEGImages/train/2009_002568.jpg 81 | JPEGImages/sheep/2008_004629.jpg 82 | JPEGImages/pottedplant/2008_000564.jpg 83 | JPEGImages/bird/2008_008022.jpg 84 | JPEGImages/bicycle/2009_001780.jpg 85 | JPEGImages/bird/2009_004375.jpg 86 | JPEGImages/sheep/2010_004259.jpg 87 | JPEGImages/tvmonitor/2008_000023.jpg 88 | JPEGImages/bus/2009_002457.jpg 89 | JPEGImages/pottedplant/2011_000145.jpg 90 | JPEGImages/train/2010_004604.jpg 91 | JPEGImages/train/2011_000558.jpg 92 | JPEGImages/aeroplane/2008_004630.jpg 93 | JPEGImages/person/2008_000628.jpg 94 | JPEGImages/dog/2010_000899.jpg 95 | JPEGImages/chair/2009_002755.jpg 96 | JPEGImages/bird/2009_000037.jpg 97 | JPEGImages/person/2007_002426.jpg 98 | JPEGImages/boat/2008_006487.jpg 99 | JPEGImages/sheep/2009_001699.jpg 100 | JPEGImages/cat/2008_003519.jpg 101 | JPEGImages/pottedplant/2011_001034.jpg 102 | JPEGImages/horse/2009_001055.jpg 103 | JPEGImages/motorbike/2011_002062.jpg 104 | JPEGImages/car/2008_007171.jpg 105 | JPEGImages/dog/2011_001389.jpg 106 | JPEGImages/motorbike/2009_003238.jpg 107 | JPEGImages/boat/2008_006825.jpg 108 | JPEGImages/bicycle/2008_003395.jpg 109 | JPEGImages/boat/2008_003480.jpg 110 | JPEGImages/aeroplane/2008_006933.jpg 111 | JPEGImages/boat/2010_003117.jpg 112 | JPEGImages/motorbike/2009_000611.jpg 113 | JPEGImages/aeroplane/2010_002357.jpg 114 | JPEGImages/bird/2008_000512.jpg 115 | JPEGImages/bird/2008_005303.jpg 116 | JPEGImages/chair/2011_002177.jpg 117 | JPEGImages/aeroplane/2009_002448.jpg 118 | JPEGImages/motorbike/2008_002383.jpg 119 | JPEGImages/dog/2009_000550.jpg 120 | JPEGImages/person/2007_003189.jpg 121 | JPEGImages/cat/2010_001590.jpg 122 | JPEGImages/cow/2009_004233.jpg 123 | JPEGImages/motorbike/2009_000515.jpg 124 | JPEGImages/bottle/2008_007076.jpg 125 | JPEGImages/aeroplane/2011_002222.jpg 126 | JPEGImages/car/2008_007872.jpg 127 | JPEGImages/cat/2010_000469.jpg 128 | JPEGImages/pottedplant/2008_005146.jpg 129 | JPEGImages/boat/2009_003032.jpg 130 | JPEGImages/tvmonitor/2008_005064.jpg 131 | JPEGImages/bird/2008_006447.jpg 132 | JPEGImages/tvmonitor/2008_004259.jpg 133 | JPEGImages/car/2008_005638.jpg 134 | JPEGImages/bottle/2009_002856.jpg 135 | JPEGImages/person/2007_005064.jpg 136 | JPEGImages/boat/2010_003878.jpg 137 | JPEGImages/bicycle/2008_005713.jpg 138 | JPEGImages/pottedplant/2009_001806.jpg 139 | JPEGImages/chair/2008_001467.jpg 140 | JPEGImages/person/2008_000854.jpg 141 | JPEGImages/bus/2010_002263.jpg 142 | JPEGImages/dog/2009_004016.jpg 143 | JPEGImages/pottedplant/2010_000639.jpg 144 | JPEGImages/tvmonitor/2008_004807.jpg 145 | JPEGImages/motorbike/2009_003416.jpg 146 | JPEGImages/sheep/2008_007909.jpg 147 | JPEGImages/motorbike/2008_007739.jpg 148 | JPEGImages/cow/2008_006063.jpg 149 | JPEGImages/bottle/2008_006792.jpg 150 | JPEGImages/aeroplane/2010_004998.jpg 151 | JPEGImages/person/2007_009320.jpg 152 | JPEGImages/sheep/2009_003076.jpg 153 | JPEGImages/bicycle/2010_000910.jpg 154 | JPEGImages/car/2009_004436.jpg 155 | JPEGImages/sheep/2010_002058.jpg 156 | JPEGImages/tvmonitor/2008_003885.jpg 157 | JPEGImages/dog/2010_000453.jpg 158 | JPEGImages/train/2009_002441.jpg 159 | JPEGImages/motorbike/2011_001022.jpg 160 | JPEGImages/cow/2011_001079.jpg 161 | JPEGImages/person/2008_000432.jpg 162 | JPEGImages/bicycle/2009_005103.jpg 163 | JPEGImages/dog/2009_004716.jpg 164 | JPEGImages/boat/2009_003936.jpg 165 | JPEGImages/aeroplane/2010_004601.jpg 166 | JPEGImages/cat/2010_000439.jpg 167 | JPEGImages/aeroplane/2008_008215.jpg 168 | JPEGImages/sheep/2008_007430.jpg 169 | JPEGImages/bus/2009_003781.jpg 170 | JPEGImages/aeroplane/2009_001056.jpg 171 | JPEGImages/cow/2007_009082.jpg 172 | JPEGImages/bus/2010_003936.jpg 173 | JPEGImages/chair/2009_004005.jpg 174 | JPEGImages/cow/2008_008654.jpg 175 | JPEGImages/bicycle/2010_002801.jpg 176 | JPEGImages/chair/2009_003110.jpg 177 | JPEGImages/tvmonitor/2010_003857.jpg 178 | JPEGImages/train/2009_004371.jpg 179 | JPEGImages/person/2007_005430.jpg 180 | JPEGImages/motorbike/2010_002251.jpg 181 | JPEGImages/dog/2010_005361.jpg 182 | JPEGImages/bicycle/2011_000933.jpg 183 | JPEGImages/tvmonitor/2010_003236.jpg 184 | JPEGImages/car/2010_005817.jpg 185 | JPEGImages/cow/2011_001232.jpg 186 | JPEGImages/dog/2011_002433.jpg 187 | JPEGImages/bird/2008_002369.jpg 188 | JPEGImages/horse/2011_001722.jpg 189 | JPEGImages/dog/2009_003172.jpg 190 | JPEGImages/pottedplant/2011_002022.jpg 191 | JPEGImages/aeroplane/2010_004817.jpg 192 | JPEGImages/pottedplant/2011_002386.jpg 193 | JPEGImages/bus/2008_000238.jpg 194 | JPEGImages/tvmonitor/2010_003874.jpg 195 | JPEGImages/cow/2011_001163.jpg 196 | JPEGImages/chair/2009_001676.jpg 197 | JPEGImages/motorbike/2008_003249.jpg 198 | JPEGImages/aeroplane/2009_002432.jpg 199 | JPEGImages/aeroplane/2011_002552.jpg 200 | JPEGImages/bird/2010_000023.jpg 201 | JPEGImages/dog/2008_004188.jpg 202 | JPEGImages/bottle/2010_001463.jpg 203 | JPEGImages/sheep/2008_000099.jpg 204 | JPEGImages/bird/2008_007656.jpg 205 | JPEGImages/chair/2009_001085.jpg 206 | JPEGImages/car/2009_002424.jpg 207 | JPEGImages/cow/2008_008132.jpg 208 | JPEGImages/bus/2011_001015.jpg 209 | JPEGImages/train/2009_001333.jpg 210 | JPEGImages/car/2010_002844.jpg 211 | JPEGImages/horse/2008_000428.jpg 212 | JPEGImages/aeroplane/2008_006085.jpg 213 | JPEGImages/chair/2009_003991.jpg 214 | JPEGImages/motorbike/2010_001923.jpg 215 | JPEGImages/boat/2010_002117.jpg 216 | JPEGImages/bicycle/2010_002660.jpg 217 | JPEGImages/bird/2010_004521.jpg 218 | JPEGImages/aeroplane/2010_000260.jpg 219 | JPEGImages/aeroplane/2009_002388.jpg 220 | JPEGImages/train/2008_003992.jpg 221 | JPEGImages/bus/2010_003893.jpg 222 | JPEGImages/cow/2007_002387.jpg 223 | JPEGImages/sheep/2008_005494.jpg 224 | JPEGImages/dog/2011_000307.jpg 225 | JPEGImages/horse/2010_003297.jpg 226 | JPEGImages/cat/2009_004291.jpg 227 | JPEGImages/train/2011_000442.jpg 228 | JPEGImages/tvmonitor/2008_000145.jpg 229 | JPEGImages/cow/2009_000971.jpg 230 | JPEGImages/bottle/2008_006558.jpg 231 | JPEGImages/person/2007_005845.jpg 232 | JPEGImages/cat/2007_005460.jpg 233 | JPEGImages/bottle/2010_001830.jpg 234 | JPEGImages/aeroplane/2008_008607.jpg 235 | JPEGImages/dog/2008_006203.jpg 236 | JPEGImages/cow/2007_004081.jpg 237 | JPEGImages/car/2010_000522.jpg 238 | JPEGImages/car/2010_002185.jpg 239 | JPEGImages/bicycle/2008_007421.jpg 240 | JPEGImages/sheep/2007_005469.jpg 241 | JPEGImages/horse/2008_001382.jpg 242 | JPEGImages/chair/2010_001731.jpg 243 | JPEGImages/boat/2009_003010.jpg 244 | JPEGImages/tvmonitor/2008_007217.jpg 245 | JPEGImages/boat/2008_006065.jpg 246 | JPEGImages/cat/2009_004051.jpg 247 | JPEGImages/bus/2008_006748.jpg 248 | JPEGImages/horse/2007_006866.jpg 249 | JPEGImages/train/2010_004980.jpg 250 | JPEGImages/car/2008_007466.jpg 251 | JPEGImages/sheep/2008_007245.jpg 252 | JPEGImages/chair/2011_001111.jpg 253 | JPEGImages/motorbike/2010_002408.jpg 254 | JPEGImages/bus/2009_002052.jpg 255 | JPEGImages/chair/2011_000813.jpg 256 | JPEGImages/cow/2007_005124.jpg 257 | JPEGImages/bottle/2010_002772.jpg 258 | JPEGImages/chair/2011_001972.jpg 259 | JPEGImages/dog/2008_005084.jpg 260 | JPEGImages/bottle/2009_004764.jpg 261 | JPEGImages/train/2009_005220.jpg 262 | JPEGImages/cat/2011_000469.jpg 263 | JPEGImages/bottle/2010_004344.jpg 264 | JPEGImages/bottle/2010_002843.jpg 265 | JPEGImages/aeroplane/2010_002065.jpg 266 | JPEGImages/bottle/2008_007394.jpg 267 | JPEGImages/horse/2010_004351.jpg 268 | JPEGImages/tvmonitor/2008_002826.jpg 269 | JPEGImages/aeroplane/2009_004203.jpg 270 | JPEGImages/bicycle/2010_003379.jpg 271 | JPEGImages/chair/2011_000755.jpg 272 | JPEGImages/boat/2009_003345.jpg 273 | JPEGImages/tvmonitor/2008_002817.jpg 274 | JPEGImages/boat/2010_001036.jpg 275 | JPEGImages/dog/2009_003879.jpg 276 | JPEGImages/boat/2010_002216.jpg 277 | JPEGImages/tvmonitor/2008_003883.jpg 278 | JPEGImages/bird/2008_008274.jpg 279 | JPEGImages/bicycle/2009_000161.jpg 280 | JPEGImages/bicycle/2010_003828.jpg 281 | JPEGImages/cat/2009_004382.jpg 282 | JPEGImages/chair/2008_007307.jpg 283 | JPEGImages/bottle/2010_000137.jpg 284 | JPEGImages/tvmonitor/2009_005256.jpg 285 | JPEGImages/bird/2009_003993.jpg 286 | JPEGImages/dog/2011_002398.jpg 287 | JPEGImages/train/2008_006055.jpg 288 | JPEGImages/bus/2009_000886.jpg 289 | JPEGImages/person/2007_002823.jpg 290 | JPEGImages/bottle/2010_004529.jpg 291 | JPEGImages/cat/2009_000716.jpg 292 | JPEGImages/train/2011_002535.jpg 293 | JPEGImages/person/2008_000704.jpg 294 | JPEGImages/aeroplane/2011_001320.jpg 295 | JPEGImages/bottle/2009_000130.jpg 296 | JPEGImages/bus/2010_001288.jpg 297 | JPEGImages/bicycle/2010_001183.jpg 298 | JPEGImages/bus/2009_000027.jpg 299 | JPEGImages/cat/2007_001825.jpg 300 | JPEGImages/train/2011_002987.jpg 301 | JPEGImages/bird/2008_003524.jpg 302 | JPEGImages/aeroplane/2008_007618.jpg 303 | JPEGImages/sheep/2007_001872.jpg 304 | JPEGImages/bottle/2010_004520.jpg 305 | JPEGImages/bird/2007_004143.jpg 306 | JPEGImages/horse/2008_007277.jpg 307 | JPEGImages/bus/2009_001967.jpg 308 | JPEGImages/sheep/2007_006678.jpg 309 | JPEGImages/cow/2009_005081.jpg 310 | JPEGImages/car/2009_003500.jpg 311 | JPEGImages/bus/2009_004947.jpg 312 | JPEGImages/aeroplane/2008_004100.jpg 313 | JPEGImages/bottle/2009_001640.jpg 314 | JPEGImages/chair/2010_000800.jpg 315 | JPEGImages/person/2008_001808.jpg 316 | JPEGImages/horse/2008_004125.jpg 317 | JPEGImages/car/2010_005501.jpg 318 | JPEGImages/car/2011_003055.jpg 319 | JPEGImages/horse/2007_006151.jpg 320 | JPEGImages/bird/2008_007587.jpg 321 | JPEGImages/tvmonitor/2010_004523.jpg 322 | JPEGImages/train/2009_003233.jpg 323 | JPEGImages/sheep/2007_004768.jpg 324 | JPEGImages/bus/2009_004417.jpg 325 | JPEGImages/aeroplane/2008_002719.jpg 326 | JPEGImages/pottedplant/2008_006543.jpg 327 | JPEGImages/bottle/2008_004607.jpg 328 | JPEGImages/train/2009_004799.jpg 329 | JPEGImages/motorbike/2008_005374.jpg 330 | JPEGImages/bus/2011_002687.jpg 331 | JPEGImages/person/2007_006483.jpg 332 | JPEGImages/bottle/2008_007858.jpg 333 | JPEGImages/bottle/2009_003958.jpg 334 | JPEGImages/pottedplant/2010_004757.jpg 335 | JPEGImages/dog/2009_001225.jpg 336 | JPEGImages/pottedplant/2011_000885.jpg 337 | JPEGImages/horse/2007_002273.jpg 338 | JPEGImages/bird/2009_000435.jpg 339 | JPEGImages/bus/2010_000770.jpg 340 | JPEGImages/cat/2009_005095.jpg 341 | JPEGImages/pottedplant/2007_004081.jpg 342 | JPEGImages/bird/2008_008037.jpg 343 | JPEGImages/cow/2009_003510.jpg 344 | JPEGImages/chair/2008_006733.jpg 345 | JPEGImages/horse/2009_003323.jpg 346 | JPEGImages/motorbike/2008_000378.jpg 347 | JPEGImages/cow/2011_001424.jpg 348 | JPEGImages/dog/2008_003587.jpg 349 | JPEGImages/sheep/2008_005938.jpg 350 | JPEGImages/sheep/2010_003865.jpg 351 | JPEGImages/tvmonitor/2008_005877.jpg 352 | JPEGImages/motorbike/2010_001614.jpg 353 | JPEGImages/horse/2008_002835.jpg 354 | JPEGImages/sheep/2010_001746.jpg 355 | JPEGImages/cat/2009_004940.jpg 356 | JPEGImages/cow/2009_003146.jpg 357 | JPEGImages/boat/2011_002943.jpg 358 | JPEGImages/motorbike/2008_000082.jpg 359 | JPEGImages/bicycle/2009_004121.jpg 360 | JPEGImages/sheep/2010_001245.jpg 361 | JPEGImages/bird/2009_000103.jpg 362 | JPEGImages/bus/2011_002079.jpg 363 | JPEGImages/person/2007_005368.jpg 364 | JPEGImages/horse/2008_001218.jpg 365 | JPEGImages/chair/2010_002575.jpg 366 | JPEGImages/chair/2009_004129.jpg 367 | JPEGImages/bird/2010_004953.jpg 368 | JPEGImages/bus/2008_005196.jpg 369 | JPEGImages/sheep/2010_004105.jpg 370 | JPEGImages/sheep/2010_003429.jpg 371 | JPEGImages/person/2007_000799.jpg 372 | JPEGImages/horse/2007_000783.jpg 373 | JPEGImages/person/2007_009327.jpg 374 | JPEGImages/pottedplant/2009_003074.jpg 375 | JPEGImages/sheep/2009_002133.jpg 376 | JPEGImages/horse/2007_008802.jpg 377 | JPEGImages/boat/2011_003081.jpg 378 | JPEGImages/motorbike/2011_000060.jpg 379 | JPEGImages/car/2010_003139.jpg 380 | JPEGImages/pottedplant/2008_001694.jpg 381 | JPEGImages/car/2010_000394.jpg 382 | JPEGImages/boat/2008_003313.jpg 383 | JPEGImages/bird/2009_000930.jpg 384 | JPEGImages/boat/2009_002306.jpg 385 | JPEGImages/car/2008_000052.jpg 386 | JPEGImages/boat/2008_003886.jpg 387 | JPEGImages/person/2007_003580.jpg 388 | JPEGImages/motorbike/2008_005423.jpg 389 | JPEGImages/bottle/2010_004488.jpg 390 | JPEGImages/pottedplant/2008_006112.jpg 391 | JPEGImages/tvmonitor/2009_002995.jpg 392 | JPEGImages/car/2011_001455.jpg 393 | JPEGImages/motorbike/2010_003856.jpg 394 | JPEGImages/bus/2010_001364.jpg 395 | JPEGImages/chair/2008_003290.jpg 396 | JPEGImages/pottedplant/2010_002195.jpg 397 | JPEGImages/boat/2009_002096.jpg 398 | JPEGImages/pottedplant/2007_004712.jpg 399 | JPEGImages/boat/2009_000690.jpg 400 | JPEGImages/bus/2010_005457.jpg 401 | JPEGImages/bus/2010_003040.jpg 402 | JPEGImages/dog/2007_008980.jpg 403 | JPEGImages/cow/2011_002189.jpg 404 | JPEGImages/dog/2009_001006.jpg 405 | JPEGImages/bottle/2009_000201.jpg 406 | JPEGImages/bird/2009_001160.jpg 407 | JPEGImages/person/2008_001643.jpg 408 | JPEGImages/tvmonitor/2010_002427.jpg 409 | JPEGImages/dog/2008_007163.jpg 410 | JPEGImages/motorbike/2010_005497.jpg 411 | JPEGImages/boat/2008_005695.jpg 412 | JPEGImages/cow/2009_000731.jpg 413 | JPEGImages/chair/2009_001598.jpg 414 | JPEGImages/dog/2009_000016.jpg 415 | JPEGImages/boat/2009_002830.jpg 416 | JPEGImages/sheep/2009_004513.jpg 417 | JPEGImages/motorbike/2009_004845.jpg 418 | JPEGImages/horse/2008_003020.jpg 419 | JPEGImages/motorbike/2010_000490.jpg 420 | JPEGImages/boat/2008_003913.jpg 421 | JPEGImages/train/2009_004527.jpg 422 | JPEGImages/cow/2007_005797.jpg 423 | JPEGImages/bird/2009_001242.jpg 424 | JPEGImages/pottedplant/2008_006751.jpg 425 | JPEGImages/bird/2009_000370.jpg 426 | JPEGImages/bicycle/2011_000505.jpg 427 | JPEGImages/car/2010_002048.jpg 428 | JPEGImages/train/2008_000045.jpg 429 | JPEGImages/car/2010_005432.jpg 430 | JPEGImages/dog/2007_009889.jpg 431 | JPEGImages/motorbike/2008_007716.jpg 432 | JPEGImages/cat/2010_002909.jpg 433 | JPEGImages/train/2009_004019.jpg 434 | JPEGImages/tvmonitor/2008_003200.jpg 435 | JPEGImages/pottedplant/2008_000196.jpg 436 | JPEGImages/dog/2010_003554.jpg 437 | JPEGImages/sheep/2010_004065.jpg 438 | JPEGImages/car/2010_003385.jpg 439 | JPEGImages/bus/2010_000165.jpg 440 | JPEGImages/dog/2010_003077.jpg 441 | JPEGImages/bus/2011_000901.jpg 442 | JPEGImages/cow/2010_002320.jpg 443 | JPEGImages/cat/2010_000218.jpg 444 | JPEGImages/cat/2010_004933.jpg 445 | JPEGImages/person/2007_000904.jpg 446 | JPEGImages/person/2007_002914.jpg 447 | JPEGImages/bird/2008_007465.jpg 448 | JPEGImages/cat/2007_009221.jpg 449 | JPEGImages/aeroplane/2009_001129.jpg 450 | JPEGImages/bicycle/2011_001896.jpg 451 | JPEGImages/pottedplant/2010_000330.jpg 452 | JPEGImages/cow/2009_003189.jpg 453 | JPEGImages/bicycle/2008_007915.jpg 454 | JPEGImages/bottle/2009_002464.jpg 455 | JPEGImages/bird/2010_002181.jpg 456 | JPEGImages/horse/2010_001856.jpg 457 | JPEGImages/bicycle/2008_004325.jpg 458 | JPEGImages/bottle/2010_005954.jpg 459 | JPEGImages/chair/2009_000192.jpg 460 | JPEGImages/train/2009_000244.jpg 461 | JPEGImages/bottle/2010_004838.jpg 462 | JPEGImages/boat/2008_005502.jpg 463 | JPEGImages/train/2009_005246.jpg 464 | JPEGImages/car/2010_002236.jpg 465 | JPEGImages/motorbike/2008_003152.jpg 466 | JPEGImages/pottedplant/2010_004982.jpg 467 | JPEGImages/cat/2009_000599.jpg 468 | JPEGImages/boat/2008_006925.jpg 469 | JPEGImages/bottle/2010_003199.jpg 470 | JPEGImages/cow/2008_000876.jpg 471 | JPEGImages/cat/2010_002026.jpg 472 | JPEGImages/cow/2009_002901.jpg 473 | JPEGImages/tvmonitor/2009_003140.jpg 474 | JPEGImages/motorbike/2010_004042.jpg 475 | JPEGImages/pottedplant/2009_004745.jpg 476 | JPEGImages/person/2007_008801.jpg 477 | JPEGImages/tvmonitor/2010_005158.jpg 478 | JPEGImages/car/2008_006254.jpg 479 | JPEGImages/aeroplane/2011_001753.jpg 480 | JPEGImages/bottle/2011_002967.jpg 481 | JPEGImages/chair/2008_003821.jpg -------------------------------------------------------------------------------- /datasets/patchpose_dataset_generation/train_all.txt: -------------------------------------------------------------------------------- 1 | JPEGImages/cow/2007_007772.jpg 2 | JPEGImages/horse/2007_004538.jpg 3 | JPEGImages/boat/2009_004524.jpg 4 | JPEGImages/bottle/2009_004324.jpg 5 | JPEGImages/boat/2011_001384.jpg 6 | JPEGImages/sheep/2009_005193.jpg 7 | JPEGImages/dog/2009_000892.jpg 8 | JPEGImages/chair/2009_000590.jpg 9 | JPEGImages/bus/2010_001204.jpg 10 | JPEGImages/car/2009_002058.jpg 11 | JPEGImages/pottedplant/2008_003726.jpg 12 | JPEGImages/horse/2008_006434.jpg 13 | JPEGImages/person/2008_001257.jpg 14 | JPEGImages/train/2009_004468.jpg 15 | JPEGImages/person/2007_001420.jpg 16 | JPEGImages/bus/2010_004844.jpg 17 | JPEGImages/bottle/2010_003625.jpg 18 | JPEGImages/pottedplant/2008_006068.jpg 19 | JPEGImages/dog/2010_002659.jpg 20 | JPEGImages/bottle/2010_002668.jpg 21 | JPEGImages/bicycle/2009_000457.jpg 22 | JPEGImages/bottle/2008_004659.jpg 23 | JPEGImages/boat/2008_000120.jpg 24 | JPEGImages/aeroplane/2011_002114.jpg 25 | JPEGImages/train/2009_002838.jpg 26 | JPEGImages/bird/2011_001229.jpg 27 | JPEGImages/chair/2010_006041.jpg 28 | JPEGImages/pottedplant/2009_003697.jpg 29 | JPEGImages/bird/2008_003894.jpg 30 | JPEGImages/bus/2008_000032.jpg 31 | JPEGImages/pottedplant/2009_003929.jpg 32 | JPEGImages/train/2010_001951.jpg 33 | JPEGImages/car/2010_002903.jpg 34 | JPEGImages/bird/2009_002890.jpg 35 | JPEGImages/cow/2010_005668.jpg 36 | JPEGImages/sheep/2009_000289.jpg 37 | JPEGImages/bicycle/2010_003914.jpg 38 | JPEGImages/bicycle/2010_000444.jpg 39 | JPEGImages/bird/2009_005131.jpg 40 | JPEGImages/motorbike/2011_003063.jpg 41 | JPEGImages/horse/2010_000139.jpg 42 | JPEGImages/tvmonitor/2011_002970.jpg 43 | JPEGImages/bottle/2010_000050.jpg 44 | JPEGImages/dog/2010_003147.jpg 45 | JPEGImages/cow/2009_001475.jpg 46 | JPEGImages/boat/2008_001516.jpg 47 | JPEGImages/sheep/2007_004969.jpg 48 | JPEGImages/cat/2010_003488.jpg 49 | JPEGImages/bottle/2009_000797.jpg 50 | JPEGImages/train/2011_002738.jpg 51 | JPEGImages/cat/2008_000115.jpg 52 | JPEGImages/bird/2009_003088.jpg 53 | JPEGImages/aeroplane/2009_005215.jpg 54 | JPEGImages/train/2008_004547.jpg 55 | JPEGImages/tvmonitor/2008_002066.jpg 56 | JPEGImages/bicycle/2009_000344.jpg 57 | JPEGImages/aeroplane/2010_001931.jpg 58 | JPEGImages/dog/2010_001473.jpg 59 | JPEGImages/boat/2008_005367.jpg 60 | JPEGImages/bus/2011_001536.jpg 61 | JPEGImages/sheep/2007_006832.jpg 62 | JPEGImages/tvmonitor/2008_002680.jpg 63 | JPEGImages/pottedplant/2007_003506.jpg 64 | JPEGImages/dog/2010_004832.jpg 65 | JPEGImages/motorbike/2008_000328.jpg 66 | JPEGImages/pottedplant/2008_001460.jpg 67 | JPEGImages/bicycle/2009_003519.jpg 68 | JPEGImages/aeroplane/2010_003798.jpg 69 | JPEGImages/bicycle/2010_003912.jpg 70 | JPEGImages/car/2010_005587.jpg 71 | JPEGImages/boat/2008_006730.jpg 72 | JPEGImages/motorbike/2008_004549.jpg 73 | JPEGImages/bicycle/2008_003768.jpg 74 | JPEGImages/car/2010_002368.jpg 75 | JPEGImages/motorbike/2010_002991.jpg 76 | JPEGImages/sheep/2009_001991.jpg 77 | JPEGImages/bottle/2010_001219.jpg 78 | JPEGImages/aeroplane/2010_003495.jpg 79 | JPEGImages/dog/2009_004828.jpg 80 | JPEGImages/dog/2009_002586.jpg 81 | JPEGImages/tvmonitor/2011_000036.jpg 82 | JPEGImages/aeroplane/2010_006023.jpg 83 | JPEGImages/person/2008_001566.jpg 84 | JPEGImages/bicycle/2008_004363.jpg 85 | JPEGImages/motorbike/2008_002202.jpg 86 | JPEGImages/sheep/2010_001256.jpg 87 | JPEGImages/bus/2008_008719.jpg 88 | JPEGImages/train/2009_000090.jpg 89 | JPEGImages/boat/2008_004026.jpg 90 | JPEGImages/cat/2010_000244.jpg 91 | JPEGImages/sheep/2010_001175.jpg 92 | JPEGImages/boat/2009_002530.jpg 93 | JPEGImages/car/2009_001898.jpg 94 | JPEGImages/person/2007_006615.jpg 95 | JPEGImages/aeroplane/2010_003933.jpg 96 | JPEGImages/tvmonitor/2010_005450.jpg 97 | JPEGImages/aeroplane/2008_005338.jpg 98 | JPEGImages/tvmonitor/2008_005609.jpg 99 | JPEGImages/bus/2011_000804.jpg 100 | JPEGImages/sheep/2010_003102.jpg 101 | JPEGImages/horse/2008_001031.jpg 102 | JPEGImages/motorbike/2008_003892.jpg 103 | JPEGImages/cat/2010_004829.jpg 104 | JPEGImages/train/2008_006919.jpg 105 | JPEGImages/bird/2008_005233.jpg 106 | JPEGImages/car/2008_000187.jpg 107 | JPEGImages/cat/2010_000099.jpg 108 | JPEGImages/cow/2010_000808.jpg 109 | JPEGImages/dog/2010_002616.jpg 110 | JPEGImages/tvmonitor/2010_004545.jpg 111 | JPEGImages/motorbike/2008_004365.jpg 112 | JPEGImages/person/2008_000367.jpg 113 | JPEGImages/train/2009_004159.jpg 114 | JPEGImages/car/2008_006885.jpg 115 | JPEGImages/person/2007_002545.jpg 116 | JPEGImages/person/2008_002003.jpg 117 | JPEGImages/bird/2008_003170.jpg 118 | JPEGImages/horse/2009_004530.jpg 119 | JPEGImages/horse/2008_008296.jpg 120 | JPEGImages/boat/2010_004772.jpg 121 | JPEGImages/car/2009_000825.jpg 122 | JPEGImages/sheep/2009_001349.jpg 123 | JPEGImages/train/2010_000984.jpg 124 | JPEGImages/motorbike/2008_003939.jpg 125 | JPEGImages/person/2008_000645.jpg 126 | JPEGImages/bicycle/2010_000056.jpg 127 | JPEGImages/boat/2008_004636.jpg 128 | JPEGImages/bicycle/2009_003836.jpg 129 | JPEGImages/aeroplane/2010_000285.jpg 130 | JPEGImages/train/2009_001359.jpg 131 | JPEGImages/boat/2009_000830.jpg 132 | JPEGImages/bottle/2009_003003.jpg 133 | JPEGImages/bird/2010_006084.jpg 134 | JPEGImages/motorbike/2011_002786.jpg 135 | JPEGImages/bottle/2008_006072.jpg 136 | JPEGImages/pottedplant/2008_001283.jpg 137 | JPEGImages/chair/2008_001783.jpg 138 | JPEGImages/sheep/2008_005633.jpg 139 | JPEGImages/tvmonitor/2008_007332.jpg 140 | JPEGImages/cow/2011_001354.jpg 141 | JPEGImages/dog/2009_000416.jpg 142 | JPEGImages/horse/2007_008307.jpg 143 | JPEGImages/bus/2010_001892.jpg 144 | JPEGImages/boat/2009_002662.jpg 145 | JPEGImages/bottle/2010_000805.jpg 146 | JPEGImages/cat/2008_005380.jpg 147 | JPEGImages/dog/2009_002419.jpg 148 | JPEGImages/cat/2008_002215.jpg 149 | JPEGImages/cat/2008_006175.jpg 150 | JPEGImages/dog/2010_001665.jpg 151 | JPEGImages/chair/2010_001216.jpg 152 | JPEGImages/bicycle/2009_001480.jpg 153 | JPEGImages/person/2007_006699.jpg 154 | JPEGImages/train/2010_005706.jpg 155 | JPEGImages/bottle/2009_001593.jpg 156 | JPEGImages/train/2010_006054.jpg 157 | JPEGImages/sheep/2008_008744.jpg 158 | JPEGImages/chair/2010_003563.jpg 159 | JPEGImages/tvmonitor/2009_001615.jpg 160 | JPEGImages/aeroplane/2010_002019.jpg 161 | JPEGImages/motorbike/2010_000035.jpg 162 | JPEGImages/bottle/2009_002980.jpg 163 | JPEGImages/sheep/2010_002378.jpg 164 | JPEGImages/person/2008_000950.jpg 165 | JPEGImages/person/2008_000036.jpg 166 | JPEGImages/bus/2011_000969.jpg 167 | JPEGImages/car/2008_001632.jpg 168 | JPEGImages/chair/2009_000483.jpg 169 | JPEGImages/pottedplant/2008_004977.jpg 170 | JPEGImages/train/2009_002982.jpg 171 | JPEGImages/train/2008_008074.jpg 172 | JPEGImages/bicycle/2010_001540.jpg 173 | JPEGImages/chair/2010_005930.jpg 174 | JPEGImages/dog/2010_000082.jpg 175 | JPEGImages/chair/2009_002785.jpg 176 | JPEGImages/motorbike/2008_008154.jpg 177 | JPEGImages/aeroplane/2009_003066.jpg 178 | JPEGImages/bottle/2010_001131.jpg 179 | JPEGImages/chair/2008_004071.jpg 180 | JPEGImages/chair/2010_001973.jpg 181 | JPEGImages/aeroplane/2010_003655.jpg 182 | JPEGImages/train/2010_000199.jpg 183 | JPEGImages/person/2007_007891.jpg 184 | JPEGImages/horse/2008_000552.jpg 185 | JPEGImages/cow/2009_002472.jpg 186 | JPEGImages/car/2010_005318.jpg 187 | JPEGImages/bicycle/2009_002119.jpg 188 | JPEGImages/bird/2010_003743.jpg 189 | JPEGImages/motorbike/2009_002763.jpg 190 | JPEGImages/dog/2007_003194.jpg 191 | JPEGImages/bottle/2010_003468.jpg 192 | JPEGImages/person/2008_000143.jpg 193 | JPEGImages/aeroplane/2009_000417.jpg 194 | JPEGImages/dog/2010_000033.jpg 195 | JPEGImages/pottedplant/2010_000567.jpg 196 | JPEGImages/car/2010_005546.jpg 197 | JPEGImages/aeroplane/2010_004791.jpg 198 | JPEGImages/pottedplant/2008_002379.jpg 199 | JPEGImages/tvmonitor/2008_001688.jpg 200 | JPEGImages/sheep/2009_001959.jpg 201 | JPEGImages/aeroplane/2008_008432.jpg 202 | JPEGImages/bus/2011_001479.jpg 203 | JPEGImages/aeroplane/2008_007884.jpg 204 | JPEGImages/bus/2008_007356.jpg 205 | JPEGImages/horse/2009_003768.jpg 206 | JPEGImages/bicycle/2009_004797.jpg 207 | JPEGImages/bird/2008_000361.jpg 208 | JPEGImages/pottedplant/2011_000468.jpg 209 | JPEGImages/train/2008_001866.jpg 210 | JPEGImages/tvmonitor/2008_002650.jpg 211 | JPEGImages/bird/2008_006882.jpg 212 | JPEGImages/motorbike/2009_002434.jpg 213 | JPEGImages/aeroplane/2008_008043.jpg 214 | JPEGImages/pottedplant/2010_003910.jpg 215 | JPEGImages/aeroplane/2008_006980.jpg 216 | JPEGImages/motorbike/2011_000651.jpg 217 | JPEGImages/cow/2009_002002.jpg 218 | JPEGImages/pottedplant/2010_003390.jpg 219 | JPEGImages/cow/2008_006528.jpg 220 | JPEGImages/sheep/2008_007497.jpg 221 | JPEGImages/tvmonitor/2008_004297.jpg 222 | JPEGImages/motorbike/2008_000143.jpg 223 | JPEGImages/person/2007_001423.jpg 224 | JPEGImages/cow/2011_003016.jpg 225 | JPEGImages/bottle/2009_000763.jpg 226 | JPEGImages/cow/2010_004140.jpg 227 | JPEGImages/car/2008_004488.jpg 228 | JPEGImages/car/2009_000720.jpg 229 | JPEGImages/chair/2010_003398.jpg 230 | JPEGImages/aeroplane/2008_006951.jpg 231 | JPEGImages/bottle/2009_003114.jpg 232 | JPEGImages/person/2008_001007.jpg 233 | JPEGImages/horse/2008_005558.jpg 234 | JPEGImages/cat/2009_002813.jpg 235 | JPEGImages/sheep/2009_003784.jpg 236 | JPEGImages/bird/2008_004893.jpg 237 | JPEGImages/bird/2009_003168.jpg 238 | JPEGImages/pottedplant/2008_007226.jpg 239 | JPEGImages/chair/2009_002301.jpg 240 | JPEGImages/person/2007_008407.jpg 241 | JPEGImages/bus/2010_004806.jpg 242 | JPEGImages/cat/2010_002531.jpg 243 | JPEGImages/chair/2009_005204.jpg 244 | JPEGImages/bottle/2008_002292.jpg 245 | JPEGImages/cow/2009_001145.jpg 246 | JPEGImages/bottle/2010_004680.jpg 247 | JPEGImages/motorbike/2010_003207.jpg 248 | JPEGImages/cat/2009_004887.jpg 249 | JPEGImages/motorbike/2009_003539.jpg 250 | JPEGImages/bicycle/2009_000195.jpg 251 | JPEGImages/cat/2010_001468.jpg 252 | JPEGImages/dog/2010_001911.jpg 253 | JPEGImages/bus/2009_001847.jpg 254 | JPEGImages/person/2008_000026.jpg 255 | JPEGImages/chair/2009_000209.jpg 256 | JPEGImages/car/2010_001561.jpg 257 | JPEGImages/chair/2008_003726.jpg 258 | JPEGImages/car/2009_005025.jpg 259 | JPEGImages/cow/2007_002088.jpg 260 | JPEGImages/cow/2010_002139.jpg 261 | JPEGImages/sheep/2008_006939.jpg 262 | JPEGImages/train/2010_005506.jpg 263 | JPEGImages/dog/2010_004311.jpg 264 | JPEGImages/cat/2010_006040.jpg 265 | JPEGImages/bicycle/2011_002742.jpg 266 | JPEGImages/tvmonitor/2010_002167.jpg 267 | JPEGImages/bicycle/2009_002295.jpg 268 | JPEGImages/tvmonitor/2008_004526.jpg 269 | JPEGImages/horse/2008_000142.jpg 270 | JPEGImages/person/2007_002565.jpg 271 | JPEGImages/aeroplane/2011_002193.jpg 272 | JPEGImages/train/2009_002734.jpg 273 | JPEGImages/bottle/2008_002870.jpg 274 | JPEGImages/cow/2011_001159.jpg 275 | JPEGImages/bicycle/2011_000465.jpg 276 | JPEGImages/tvmonitor/2010_002561.jpg 277 | JPEGImages/cow/2009_001079.jpg 278 | JPEGImages/tvmonitor/2009_004993.jpg 279 | JPEGImages/bicycle/2008_001813.jpg 280 | JPEGImages/pottedplant/2009_002817.jpg 281 | JPEGImages/bus/2009_000104.jpg 282 | JPEGImages/bird/2009_002298.jpg 283 | JPEGImages/train/2009_001245.jpg 284 | JPEGImages/car/2009_004272.jpg 285 | JPEGImages/bottle/2008_003591.jpg 286 | JPEGImages/dog/2009_004592.jpg 287 | JPEGImages/tvmonitor/2010_004306.jpg 288 | JPEGImages/dog/2010_003588.jpg 289 | JPEGImages/dog/2009_000935.jpg 290 | JPEGImages/chair/2009_005163.jpg 291 | JPEGImages/motorbike/2010_000806.jpg 292 | JPEGImages/sheep/2008_006477.jpg 293 | JPEGImages/pottedplant/2010_000773.jpg 294 | JPEGImages/dog/2009_005102.jpg 295 | JPEGImages/person/2007_000733.jpg 296 | JPEGImages/dog/2010_004224.jpg 297 | JPEGImages/bottle/2011_000951.jpg 298 | JPEGImages/boat/2009_000828.jpg 299 | JPEGImages/bottle/2009_002089.jpg 300 | JPEGImages/horse/2008_001171.jpg 301 | JPEGImages/chair/2011_003079.jpg 302 | JPEGImages/tvmonitor/2010_004479.jpg 303 | JPEGImages/bottle/2009_000377.jpg 304 | JPEGImages/dog/2009_004012.jpg 305 | JPEGImages/bus/2010_001771.jpg 306 | JPEGImages/person/2007_000836.jpg 307 | JPEGImages/car/2008_000595.jpg 308 | JPEGImages/bird/2008_005649.jpg 309 | JPEGImages/cat/2009_002592.jpg 310 | JPEGImages/bus/2008_007997.jpg 311 | JPEGImages/boat/2009_001544.jpg 312 | JPEGImages/boat/2008_006349.jpg 313 | JPEGImages/tvmonitor/2008_004333.jpg 314 | JPEGImages/aeroplane/2010_004546.jpg 315 | JPEGImages/boat/2009_000120.jpg 316 | JPEGImages/tvmonitor/2008_005678.jpg 317 | JPEGImages/chair/2009_000567.jpg 318 | JPEGImages/tvmonitor/2008_003026.jpg 319 | JPEGImages/dog/2009_001288.jpg 320 | JPEGImages/train/2010_000651.jpg 321 | JPEGImages/dog/2007_006444.jpg 322 | JPEGImages/aeroplane/2008_005634.jpg 323 | JPEGImages/bird/2008_002429.jpg 324 | JPEGImages/train/2009_000658.jpg 325 | JPEGImages/sheep/2010_003491.jpg 326 | JPEGImages/sheep/2010_004332.jpg 327 | JPEGImages/tvmonitor/2010_002513.jpg 328 | JPEGImages/tvmonitor/2010_000379.jpg 329 | JPEGImages/cat/2010_005408.jpg 330 | JPEGImages/chair/2008_004412.jpg 331 | JPEGImages/bottle/2010_005299.jpg 332 | JPEGImages/sheep/2010_000089.jpg 333 | JPEGImages/horse/2007_001960.jpg 334 | JPEGImages/bus/2009_004290.jpg 335 | JPEGImages/sheep/2010_002821.jpg 336 | JPEGImages/chair/2008_002920.jpg 337 | JPEGImages/chair/2011_001834.jpg 338 | JPEGImages/boat/2010_000748.jpg 339 | JPEGImages/cow/2010_001548.jpg 340 | JPEGImages/person/2008_001615.jpg 341 | JPEGImages/horse/2007_005248.jpg 342 | JPEGImages/boat/2010_002315.jpg 343 | JPEGImages/sheep/2011_000450.jpg 344 | JPEGImages/train/2009_005024.jpg 345 | JPEGImages/tvmonitor/2008_003213.jpg 346 | JPEGImages/bottle/2008_006941.jpg 347 | JPEGImages/bottle/2008_006641.jpg 348 | JPEGImages/bird/2008_008314.jpg 349 | JPEGImages/cow/2009_003634.jpg 350 | JPEGImages/train/2010_000743.jpg 351 | JPEGImages/pottedplant/2008_002653.jpg 352 | JPEGImages/car/2010_004890.jpg 353 | JPEGImages/pottedplant/2010_001717.jpg 354 | JPEGImages/bottle/2011_000713.jpg 355 | JPEGImages/tvmonitor/2011_002418.jpg 356 | JPEGImages/car/2008_007825.jpg 357 | JPEGImages/boat/2008_001040.jpg 358 | JPEGImages/motorbike/2008_007138.jpg 359 | JPEGImages/bus/2008_000075.jpg 360 | JPEGImages/bird/2008_008166.jpg 361 | JPEGImages/pottedplant/2011_001288.jpg 362 | JPEGImages/cat/2008_005252.jpg 363 | JPEGImages/cat/2009_003129.jpg 364 | JPEGImages/cat/2007_002597.jpg 365 | JPEGImages/aeroplane/2009_000817.jpg 366 | JPEGImages/pottedplant/2009_000590.jpg 367 | JPEGImages/dog/2008_000620.jpg 368 | JPEGImages/dog/2010_000484.jpg 369 | JPEGImages/cow/2007_002903.jpg 370 | JPEGImages/bus/2008_006554.jpg 371 | JPEGImages/aeroplane/2011_000531.jpg 372 | JPEGImages/pottedplant/2008_003225.jpg 373 | JPEGImages/dog/2010_004970.jpg 374 | JPEGImages/cat/2008_006325.jpg 375 | JPEGImages/motorbike/2010_005346.jpg 376 | JPEGImages/person/2008_000499.jpg 377 | JPEGImages/motorbike/2011_000053.jpg 378 | JPEGImages/cat/2009_003056.jpg 379 | JPEGImages/cat/2008_006728.jpg 380 | JPEGImages/car/2009_001536.jpg 381 | JPEGImages/person/2007_006317.jpg 382 | JPEGImages/motorbike/2008_005049.jpg 383 | JPEGImages/boat/2008_003858.jpg 384 | JPEGImages/boat/2011_002421.jpg 385 | JPEGImages/bicycle/2009_000354.jpg 386 | JPEGImages/horse/2008_004470.jpg 387 | JPEGImages/cow/2010_004322.jpg 388 | JPEGImages/cat/2008_005699.jpg 389 | JPEGImages/bird/2008_008380.jpg 390 | JPEGImages/chair/2009_005300.jpg 391 | JPEGImages/bicycle/2009_004876.jpg 392 | JPEGImages/aeroplane/2010_003051.jpg 393 | JPEGImages/bird/2009_001565.jpg 394 | JPEGImages/bicycle/2010_003799.jpg 395 | JPEGImages/bottle/2009_000992.jpg 396 | JPEGImages/sheep/2010_001881.jpg 397 | JPEGImages/dog/2009_000804.jpg 398 | JPEGImages/bus/2008_007635.jpg 399 | JPEGImages/horse/2008_001682.jpg 400 | JPEGImages/horse/2008_003380.jpg 401 | JPEGImages/tvmonitor/2010_004109.jpg 402 | JPEGImages/sheep/2009_003425.jpg 403 | JPEGImages/bicycle/2008_004995.jpg 404 | JPEGImages/cat/2011_000426.jpg 405 | JPEGImages/bus/2009_000455.jpg 406 | JPEGImages/person/2007_009295.jpg 407 | JPEGImages/dog/2010_005011.jpg 408 | JPEGImages/bus/2009_004037.jpg 409 | JPEGImages/tvmonitor/2008_002218.jpg 410 | JPEGImages/motorbike/2008_002374.jpg 411 | JPEGImages/train/2009_000628.jpg 412 | JPEGImages/sheep/2010_000822.jpg 413 | JPEGImages/motorbike/2010_004941.jpg 414 | JPEGImages/sheep/2008_006892.jpg 415 | JPEGImages/bus/2009_002238.jpg 416 | JPEGImages/bicycle/2011_002657.jpg 417 | JPEGImages/tvmonitor/2008_004881.jpg 418 | JPEGImages/cow/2010_000465.jpg 419 | JPEGImages/chair/2008_007893.jpg 420 | JPEGImages/boat/2008_005628.jpg 421 | JPEGImages/pottedplant/2007_000661.jpg 422 | JPEGImages/train/2009_002557.jpg 423 | JPEGImages/aeroplane/2008_006623.jpg 424 | JPEGImages/motorbike/2008_007241.jpg 425 | JPEGImages/bird/2010_000075.jpg 426 | JPEGImages/horse/2007_003022.jpg 427 | JPEGImages/cat/2010_003402.jpg 428 | JPEGImages/motorbike/2008_006944.jpg 429 | JPEGImages/boat/2008_005321.jpg 430 | JPEGImages/sheep/2010_003725.jpg 431 | JPEGImages/dog/2008_005436.jpg 432 | JPEGImages/bird/2010_004483.jpg 433 | JPEGImages/horse/2007_003189.jpg 434 | JPEGImages/bottle/2009_003517.jpg 435 | JPEGImages/cow/2010_003345.jpg 436 | JPEGImages/person/2007_001185.jpg 437 | JPEGImages/bicycle/2009_003343.jpg 438 | JPEGImages/chair/2011_001666.jpg 439 | JPEGImages/car/2009_001463.jpg 440 | JPEGImages/motorbike/2009_002335.jpg 441 | JPEGImages/cow/2008_007031.jpg 442 | JPEGImages/aeroplane/2008_002221.jpg 443 | JPEGImages/cow/2010_000498.jpg 444 | JPEGImages/chair/2008_003432.jpg 445 | JPEGImages/boat/2008_007101.jpg 446 | JPEGImages/tvmonitor/2008_002464.jpg 447 | JPEGImages/bus/2009_005201.jpg 448 | JPEGImages/chair/2009_001038.jpg 449 | JPEGImages/cat/2008_000227.jpg 450 | JPEGImages/cow/2008_005105.jpg 451 | JPEGImages/cow/2010_001937.jpg 452 | JPEGImages/bicycle/2009_005154.jpg 453 | JPEGImages/horse/2008_004476.jpg 454 | JPEGImages/motorbike/2009_001253.jpg 455 | JPEGImages/bicycle/2010_004069.jpg 456 | JPEGImages/boat/2009_004539.jpg 457 | JPEGImages/sheep/2009_000039.jpg 458 | JPEGImages/cat/2008_003499.jpg 459 | JPEGImages/bottle/2009_000277.jpg 460 | JPEGImages/car/2009_001917.jpg 461 | JPEGImages/bus/2010_005636.jpg 462 | JPEGImages/bicycle/2010_004307.jpg 463 | JPEGImages/bicycle/2008_007265.jpg 464 | JPEGImages/sheep/2010_003806.jpg 465 | JPEGImages/car/2009_003709.jpg 466 | JPEGImages/boat/2010_003604.jpg 467 | JPEGImages/train/2011_000895.jpg 468 | JPEGImages/person/2008_001106.jpg 469 | JPEGImages/bicycle/2008_004101.jpg 470 | JPEGImages/tvmonitor/2008_000495.jpg 471 | JPEGImages/pottedplant/2010_003302.jpg 472 | JPEGImages/dog/2010_000811.jpg 473 | JPEGImages/tvmonitor/2009_000791.jpg 474 | JPEGImages/person/2008_000328.jpg 475 | JPEGImages/chair/2008_007361.jpg 476 | JPEGImages/chair/2009_003813.jpg 477 | JPEGImages/bicycle/2008_006424.jpg 478 | JPEGImages/person/2007_002539.jpg 479 | JPEGImages/cat/2009_002228.jpg 480 | JPEGImages/bird/2008_005186.jpg 481 | JPEGImages/cow/2011_001708.jpg 482 | JPEGImages/bottle/2008_006890.jpg 483 | JPEGImages/horse/2007_000332.jpg 484 | JPEGImages/aeroplane/2010_002295.jpg 485 | JPEGImages/pottedplant/2008_004477.jpg 486 | JPEGImages/chair/2009_000794.jpg 487 | JPEGImages/cow/2007_008973.jpg 488 | JPEGImages/cat/2010_002504.jpg 489 | JPEGImages/bird/2008_003161.jpg 490 | JPEGImages/motorbike/2010_000695.jpg 491 | JPEGImages/horse/2007_001420.jpg 492 | JPEGImages/sheep/2007_002618.jpg 493 | JPEGImages/boat/2008_003362.jpg 494 | JPEGImages/horse/2008_002665.jpg 495 | JPEGImages/cat/2008_007726.jpg 496 | JPEGImages/bicycle/2009_003187.jpg 497 | JPEGImages/pottedplant/2009_001137.jpg 498 | JPEGImages/chair/2009_003116.jpg 499 | JPEGImages/chair/2010_000485.jpg 500 | JPEGImages/bird/2008_003222.jpg 501 | JPEGImages/pottedplant/2011_001369.jpg 502 | JPEGImages/train/2009_000824.jpg 503 | JPEGImages/bottle/2009_004332.jpg 504 | JPEGImages/horse/2008_006779.jpg 505 | JPEGImages/dog/2010_003222.jpg 506 | JPEGImages/bird/2010_000241.jpg 507 | JPEGImages/train/2008_008583.jpg 508 | JPEGImages/person/2007_007651.jpg 509 | JPEGImages/train/2009_002144.jpg 510 | JPEGImages/horse/2008_002806.jpg 511 | JPEGImages/pottedplant/2008_008220.jpg 512 | JPEGImages/chair/2008_008536.jpg 513 | JPEGImages/train/2009_001078.jpg 514 | JPEGImages/bird/2008_003211.jpg 515 | JPEGImages/motorbike/2009_002216.jpg 516 | JPEGImages/person/2007_007154.jpg 517 | JPEGImages/bus/2008_003321.jpg 518 | JPEGImages/horse/2009_002231.jpg 519 | JPEGImages/boat/2008_001260.jpg 520 | JPEGImages/cow/2011_002864.jpg 521 | JPEGImages/person/2008_000917.jpg 522 | JPEGImages/aeroplane/2008_003926.jpg 523 | JPEGImages/aeroplane/2008_007504.jpg 524 | JPEGImages/car/2008_002710.jpg 525 | JPEGImages/car/2008_000109.jpg 526 | JPEGImages/pottedplant/2010_003651.jpg 527 | JPEGImages/train/2010_002223.jpg 528 | JPEGImages/dog/2009_000496.jpg 529 | JPEGImages/person/2007_000999.jpg 530 | JPEGImages/tvmonitor/2011_001705.jpg 531 | JPEGImages/bicycle/2009_003832.jpg 532 | JPEGImages/cow/2008_005714.jpg 533 | JPEGImages/boat/2008_000262.jpg 534 | JPEGImages/bird/2009_005282.jpg 535 | JPEGImages/chair/2010_002881.jpg 536 | JPEGImages/bicycle/2009_005098.jpg 537 | JPEGImages/bird/2008_007709.jpg 538 | JPEGImages/cow/2010_002905.jpg 539 | JPEGImages/horse/2010_004477.jpg 540 | JPEGImages/car/2009_002387.jpg 541 | JPEGImages/chair/2009_004536.jpg 542 | JPEGImages/aeroplane/2008_006778.jpg 543 | JPEGImages/car/2008_003888.jpg 544 | JPEGImages/bus/2010_004616.jpg 545 | JPEGImages/person/2007_006490.jpg 546 | JPEGImages/bottle/2009_001309.jpg 547 | JPEGImages/pottedplant/2008_005070.jpg 548 | JPEGImages/horse/2008_001112.jpg 549 | JPEGImages/pottedplant/2011_001022.jpg 550 | JPEGImages/bottle/2008_006427.jpg 551 | JPEGImages/chair/2009_005216.jpg 552 | JPEGImages/motorbike/2008_002696.jpg 553 | JPEGImages/bicycle/2011_002811.jpg 554 | JPEGImages/dog/2010_000644.jpg 555 | JPEGImages/horse/2009_003294.jpg 556 | JPEGImages/person/2007_009654.jpg 557 | JPEGImages/bicycle/2009_001558.jpg 558 | JPEGImages/train/2010_004256.jpg 559 | JPEGImages/dog/2007_004189.jpg 560 | JPEGImages/person/2007_002378.jpg 561 | JPEGImages/motorbike/2008_003429.jpg 562 | JPEGImages/aeroplane/2009_003883.jpg 563 | JPEGImages/bird/2009_001397.jpg 564 | JPEGImages/bicycle/2010_000747.jpg 565 | JPEGImages/bicycle/2008_008652.jpg 566 | JPEGImages/person/2007_003910.jpg 567 | JPEGImages/bicycle/2010_000624.jpg 568 | JPEGImages/motorbike/2008_006879.jpg 569 | JPEGImages/bottle/2010_001013.jpg 570 | JPEGImages/aeroplane/2010_000541.jpg 571 | JPEGImages/bottle/2008_003467.jpg 572 | JPEGImages/bus/2009_001354.jpg 573 | JPEGImages/horse/2008_002686.jpg 574 | JPEGImages/chair/2010_004813.jpg 575 | JPEGImages/boat/2008_006229.jpg 576 | JPEGImages/tvmonitor/2008_001576.jpg 577 | JPEGImages/cat/2010_000009.jpg 578 | JPEGImages/pottedplant/2008_005345.jpg 579 | JPEGImages/horse/2008_000141.jpg 580 | JPEGImages/sheep/2010_001522.jpg 581 | JPEGImages/aeroplane/2010_002532.jpg 582 | JPEGImages/dog/2008_000080.jpg 583 | JPEGImages/dog/2008_003276.jpg 584 | JPEGImages/aeroplane/2008_005373.jpg 585 | JPEGImages/chair/2009_001784.jpg 586 | JPEGImages/sheep/2007_000676.jpg 587 | JPEGImages/motorbike/2010_005433.jpg 588 | JPEGImages/motorbike/2009_004756.jpg 589 | JPEGImages/sheep/2009_004945.jpg 590 | JPEGImages/pottedplant/2010_000399.jpg 591 | JPEGImages/car/2008_003685.jpg 592 | JPEGImages/dog/2009_002789.jpg 593 | JPEGImages/person/2008_000558.jpg 594 | JPEGImages/cat/2008_001640.jpg 595 | JPEGImages/car/2009_001782.jpg 596 | JPEGImages/sheep/2008_004007.jpg 597 | JPEGImages/cow/2009_000472.jpg 598 | JPEGImages/pottedplant/2008_000188.jpg 599 | JPEGImages/person/2007_005227.jpg 600 | JPEGImages/horse/2009_000312.jpg 601 | JPEGImages/chair/2008_006350.jpg 602 | JPEGImages/train/2008_004610.jpg 603 | JPEGImages/tvmonitor/2010_003437.jpg 604 | JPEGImages/bus/2008_007969.jpg 605 | JPEGImages/car/2009_004340.jpg 606 | JPEGImages/bird/2008_003023.jpg 607 | JPEGImages/motorbike/2008_006874.jpg 608 | JPEGImages/cat/2010_005216.jpg 609 | JPEGImages/car/2008_005960.jpg 610 | JPEGImages/car/2010_004291.jpg 611 | JPEGImages/horse/2008_008279.jpg 612 | JPEGImages/person/2007_005859.jpg 613 | JPEGImages/bus/2009_004667.jpg 614 | JPEGImages/bus/2010_002218.jpg 615 | JPEGImages/tvmonitor/2010_004254.jpg 616 | JPEGImages/bus/2008_007056.jpg 617 | JPEGImages/cow/2010_001317.jpg 618 | JPEGImages/bus/2009_000135.jpg 619 | JPEGImages/motorbike/2011_000455.jpg 620 | JPEGImages/bird/2009_000503.jpg 621 | JPEGImages/cow/2009_004366.jpg 622 | JPEGImages/car/2011_000086.jpg 623 | JPEGImages/train/2009_000592.jpg 624 | JPEGImages/sheep/2010_003153.jpg 625 | JPEGImages/chair/2009_001070.jpg 626 | JPEGImages/motorbike/2008_003820.jpg 627 | JPEGImages/bus/2008_006635.jpg 628 | JPEGImages/boat/2008_001135.jpg 629 | JPEGImages/person/2008_001167.jpg 630 | JPEGImages/aeroplane/2008_005889.jpg 631 | JPEGImages/cat/2010_000291.jpg 632 | JPEGImages/boat/2008_007599.jpg 633 | JPEGImages/bird/2008_001185.jpg 634 | JPEGImages/horse/2007_006134.jpg 635 | JPEGImages/bird/2011_003091.jpg 636 | JPEGImages/horse/2009_003734.jpg 637 | JPEGImages/aeroplane/2009_002011.jpg 638 | JPEGImages/bus/2011_000178.jpg 639 | JPEGImages/motorbike/2010_003605.jpg 640 | JPEGImages/bicycle/2011_000474.jpg 641 | JPEGImages/cat/2011_000973.jpg 642 | JPEGImages/car/2010_002841.jpg 643 | JPEGImages/horse/2008_002697.jpg 644 | JPEGImages/car/2008_007364.jpg 645 | JPEGImages/boat/2009_002173.jpg 646 | JPEGImages/aeroplane/2010_006082.jpg 647 | JPEGImages/chair/2009_005263.jpg 648 | JPEGImages/tvmonitor/2010_002152.jpg 649 | JPEGImages/bird/2011_002868.jpg 650 | JPEGImages/car/2008_007389.jpg 651 | JPEGImages/pottedplant/2008_004380.jpg 652 | JPEGImages/bird/2008_003439.jpg 653 | JPEGImages/motorbike/2008_006323.jpg 654 | JPEGImages/boat/2009_004273.jpg 655 | JPEGImages/cow/2010_005258.jpg 656 | JPEGImages/bus/2008_008113.jpg 657 | JPEGImages/train/2009_003022.jpg 658 | JPEGImages/bicycle/2008_001626.jpg 659 | JPEGImages/cow/2011_001942.jpg 660 | JPEGImages/bottle/2010_001698.jpg 661 | JPEGImages/boat/2008_008616.jpg 662 | JPEGImages/cow/2008_004701.jpg 663 | JPEGImages/cat/2008_001078.jpg 664 | JPEGImages/cow/2011_001679.jpg 665 | JPEGImages/cow/2009_001257.jpg 666 | JPEGImages/person/2008_002643.jpg 667 | JPEGImages/chair/2009_001490.jpg 668 | JPEGImages/cat/2010_000576.jpg 669 | JPEGImages/chair/2009_004921.jpg 670 | JPEGImages/aeroplane/2011_002091.jpg 671 | JPEGImages/bottle/2008_008700.jpg 672 | JPEGImages/car/2010_004258.jpg 673 | JPEGImages/bird/2008_007870.jpg 674 | JPEGImages/person/2008_001021.jpg 675 | JPEGImages/bird/2010_001061.jpg 676 | JPEGImages/car/2010_003024.jpg 677 | JPEGImages/bottle/2009_004112.jpg 678 | JPEGImages/bicycle/2010_000113.jpg 679 | JPEGImages/pottedplant/2008_008689.jpg 680 | JPEGImages/bicycle/2009_002371.jpg 681 | JPEGImages/dog/2010_003999.jpg 682 | JPEGImages/cat/2008_006973.jpg 683 | JPEGImages/chair/2010_005052.jpg 684 | JPEGImages/pottedplant/2010_001864.jpg 685 | JPEGImages/pottedplant/2010_000132.jpg 686 | JPEGImages/cow/2008_002778.jpg 687 | JPEGImages/person/2007_004328.jpg 688 | JPEGImages/cow/2008_001359.jpg 689 | JPEGImages/sheep/2009_001537.jpg 690 | JPEGImages/tvmonitor/2008_001073.jpg 691 | JPEGImages/sheep/2008_002150.jpg 692 | JPEGImages/car/2008_005989.jpg 693 | JPEGImages/chair/2008_005066.jpg 694 | JPEGImages/cat/2010_002224.jpg 695 | JPEGImages/sheep/2010_000002.jpg 696 | JPEGImages/dog/2009_003217.jpg 697 | JPEGImages/bicycle/2009_002401.jpg 698 | JPEGImages/sheep/2010_000117.jpg 699 | JPEGImages/cow/2010_001694.jpg 700 | JPEGImages/car/2008_000939.jpg 701 | JPEGImages/bird/2008_007623.jpg 702 | JPEGImages/motorbike/2009_004987.jpg 703 | JPEGImages/sheep/2010_004431.jpg 704 | JPEGImages/boat/2009_003080.jpg 705 | JPEGImages/bus/2010_004367.jpg 706 | JPEGImages/train/2008_002222.jpg 707 | JPEGImages/tvmonitor/2011_002292.jpg 708 | JPEGImages/chair/2008_003681.jpg 709 | JPEGImages/bird/2009_004540.jpg 710 | JPEGImages/dog/2009_004507.jpg 711 | JPEGImages/horse/2008_003242.jpg 712 | JPEGImages/bottle/2009_000494.jpg 713 | JPEGImages/chair/2009_002064.jpg 714 | JPEGImages/train/2009_004880.jpg 715 | JPEGImages/sheep/2009_002391.jpg 716 | JPEGImages/motorbike/2008_004611.jpg 717 | JPEGImages/tvmonitor/2010_004295.jpg 718 | JPEGImages/sheep/2010_005285.jpg 719 | JPEGImages/dog/2010_000626.jpg 720 | JPEGImages/bus/2011_000095.jpg 721 | JPEGImages/car/2009_003003.jpg 722 | JPEGImages/bird/2010_005426.jpg 723 | JPEGImages/car/2010_001449.jpg 724 | JPEGImages/cat/2008_000345.jpg 725 | JPEGImages/cat/2010_000374.jpg 726 | JPEGImages/bird/2008_005531.jpg 727 | JPEGImages/tvmonitor/2008_006617.jpg 728 | JPEGImages/aeroplane/2008_003905.jpg 729 | JPEGImages/bus/2009_001752.jpg 730 | JPEGImages/cat/2010_001386.jpg 731 | JPEGImages/motorbike/2010_001251.jpg 732 | JPEGImages/chair/2009_002415.jpg 733 | JPEGImages/pottedplant/2010_002982.jpg 734 | JPEGImages/bottle/2009_003818.jpg 735 | JPEGImages/tvmonitor/2008_005439.jpg 736 | JPEGImages/train/2009_002197.jpg 737 | JPEGImages/bottle/2010_003779.jpg 738 | JPEGImages/bus/2009_001734.jpg 739 | JPEGImages/dog/2009_002324.jpg 740 | JPEGImages/bird/2008_008284.jpg 741 | JPEGImages/cat/2010_002993.jpg 742 | JPEGImages/motorbike/2010_000433.jpg 743 | JPEGImages/train/2009_002265.jpg 744 | JPEGImages/aeroplane/2010_003353.jpg 745 | JPEGImages/boat/2010_000145.jpg 746 | JPEGImages/cat/2010_005853.jpg 747 | JPEGImages/person/2007_005331.jpg 748 | JPEGImages/chair/2011_003011.jpg 749 | JPEGImages/chair/2011_000009.jpg 750 | JPEGImages/car/2010_003813.jpg 751 | JPEGImages/bus/2010_004903.jpg 752 | JPEGImages/car/2010_005907.jpg 753 | JPEGImages/train/2009_003638.jpg 754 | JPEGImages/aeroplane/2011_001133.jpg 755 | JPEGImages/bus/2009_002057.jpg 756 | JPEGImages/cow/2011_001840.jpg 757 | JPEGImages/bicycle/2010_005664.jpg 758 | JPEGImages/car/2011_002234.jpg 759 | JPEGImages/boat/2008_003701.jpg 760 | JPEGImages/pottedplant/2008_007977.jpg 761 | JPEGImages/sheep/2010_003954.jpg 762 | JPEGImages/cat/2010_002098.jpg 763 | JPEGImages/cow/2008_008428.jpg 764 | JPEGImages/bus/2011_002384.jpg 765 | JPEGImages/car/2008_006691.jpg 766 | JPEGImages/dog/2008_004174.jpg 767 | JPEGImages/bird/2008_003426.jpg 768 | JPEGImages/car/2008_007241.jpg 769 | JPEGImages/motorbike/2011_002097.jpg 770 | JPEGImages/tvmonitor/2008_000244.jpg 771 | JPEGImages/bus/2008_007254.jpg 772 | JPEGImages/bicycle/2010_005848.jpg 773 | JPEGImages/person/2007_002824.jpg 774 | JPEGImages/car/2008_002258.jpg 775 | JPEGImages/person/2008_000235.jpg 776 | JPEGImages/cat/2010_004717.jpg 777 | JPEGImages/sheep/2009_001172.jpg 778 | JPEGImages/bus/2010_002438.jpg 779 | JPEGImages/motorbike/2009_005086.jpg 780 | JPEGImages/chair/2011_001812.jpg 781 | JPEGImages/car/2008_005641.jpg 782 | JPEGImages/motorbike/2009_000402.jpg 783 | JPEGImages/dog/2010_000608.jpg 784 | JPEGImages/car/2008_002212.jpg 785 | JPEGImages/train/2009_004766.jpg 786 | JPEGImages/aeroplane/2011_002930.jpg 787 | JPEGImages/cat/2010_000054.jpg 788 | JPEGImages/cat/2010_000109.jpg 789 | JPEGImages/person/2008_002639.jpg 790 | JPEGImages/person/2008_001283.jpg 791 | JPEGImages/tvmonitor/2009_000987.jpg 792 | JPEGImages/tvmonitor/2010_003688.jpg 793 | JPEGImages/bus/2008_008252.jpg 794 | JPEGImages/cow/2008_007586.jpg 795 | JPEGImages/pottedplant/2011_001611.jpg 796 | JPEGImages/boat/2010_002364.jpg 797 | JPEGImages/bus/2009_002128.jpg 798 | JPEGImages/bus/2011_000767.jpg 799 | JPEGImages/horse/2010_003714.jpg 800 | JPEGImages/dog/2008_000931.jpg 801 | JPEGImages/cat/2010_001382.jpg 802 | JPEGImages/boat/2008_005541.jpg 803 | JPEGImages/boat/2008_002850.jpg 804 | JPEGImages/bird/2009_001607.jpg 805 | JPEGImages/horse/2008_001464.jpg 806 | JPEGImages/horse/2008_005792.jpg 807 | JPEGImages/boat/2010_002780.jpg 808 | JPEGImages/train/2008_006365.jpg 809 | JPEGImages/horse/2007_001586.jpg 810 | JPEGImages/sheep/2010_002737.jpg 811 | JPEGImages/bottle/2008_007142.jpg 812 | JPEGImages/car/2008_004312.jpg 813 | JPEGImages/chair/2010_005188.jpg 814 | JPEGImages/person/2007_003621.jpg 815 | JPEGImages/bicycle/2010_006063.jpg 816 | JPEGImages/bottle/2008_000023.jpg 817 | JPEGImages/cow/2008_008541.jpg 818 | JPEGImages/horse/2008_004533.jpg 819 | JPEGImages/tvmonitor/2008_004279.jpg 820 | JPEGImages/motorbike/2010_002271.jpg 821 | JPEGImages/tvmonitor/2010_004591.jpg 822 | JPEGImages/cow/2010_001000.jpg 823 | JPEGImages/dog/2008_004833.jpg 824 | JPEGImages/cat/2009_003771.jpg 825 | JPEGImages/cow/2010_004635.jpg 826 | JPEGImages/cow/2011_001546.jpg 827 | JPEGImages/pottedplant/2010_004466.jpg 828 | JPEGImages/sheep/2010_000190.jpg 829 | JPEGImages/sheep/2010_003742.jpg 830 | JPEGImages/bus/2010_004558.jpg 831 | JPEGImages/pottedplant/2011_003103.jpg 832 | JPEGImages/sheep/2010_000189.jpg 833 | JPEGImages/horse/2007_006445.jpg 834 | JPEGImages/person/2007_009554.jpg 835 | JPEGImages/motorbike/2009_002129.jpg 836 | JPEGImages/dog/2010_001908.jpg 837 | JPEGImages/bicycle/2009_000573.jpg 838 | JPEGImages/chair/2010_003957.jpg 839 | JPEGImages/tvmonitor/2009_001682.jpg 840 | JPEGImages/pottedplant/2011_001440.jpg 841 | JPEGImages/cat/2010_000468.jpg 842 | JPEGImages/pottedplant/2009_001627.jpg 843 | JPEGImages/bottle/2009_001818.jpg 844 | JPEGImages/car/2010_004747.jpg 845 | JPEGImages/chair/2009_003677.jpg 846 | JPEGImages/train/2009_000347.jpg 847 | JPEGImages/dog/2011_001984.jpg 848 | JPEGImages/motorbike/2008_002115.jpg 849 | JPEGImages/train/2010_004193.jpg 850 | JPEGImages/bird/2011_002100.jpg 851 | JPEGImages/boat/2008_000834.jpg 852 | JPEGImages/dog/2008_004121.jpg 853 | JPEGImages/person/2007_001585.jpg 854 | JPEGImages/aeroplane/2011_001114.jpg 855 | JPEGImages/bottle/2009_004122.jpg 856 | JPEGImages/boat/2010_001807.jpg 857 | JPEGImages/train/2011_000627.jpg 858 | JPEGImages/horse/2008_000177.jpg 859 | JPEGImages/cow/2009_002708.jpg 860 | JPEGImages/bird/2008_008455.jpg 861 | JPEGImages/bus/2009_000097.jpg 862 | JPEGImages/bicycle/2009_000696.jpg 863 | JPEGImages/horse/2008_004649.jpg 864 | JPEGImages/tvmonitor/2008_005393.jpg 865 | JPEGImages/pottedplant/2011_002031.jpg 866 | JPEGImages/tvmonitor/2011_002942.jpg 867 | JPEGImages/bicycle/2010_002820.jpg 868 | JPEGImages/cat/2010_003483.jpg 869 | JPEGImages/bird/2007_002896.jpg 870 | JPEGImages/cow/2007_000491.jpg 871 | JPEGImages/bird/2010_003255.jpg 872 | JPEGImages/bird/2008_002043.jpg 873 | JPEGImages/cow/2010_005458.jpg 874 | JPEGImages/aeroplane/2010_005888.jpg 875 | JPEGImages/chair/2008_007988.jpg 876 | JPEGImages/cow/2010_005562.jpg 877 | JPEGImages/dog/2008_003645.jpg 878 | JPEGImages/boat/2008_002504.jpg 879 | JPEGImages/dog/2009_005153.jpg 880 | JPEGImages/train/2008_003571.jpg 881 | JPEGImages/person/2007_000847.jpg 882 | JPEGImages/bottle/2009_002060.jpg 883 | JPEGImages/boat/2008_000235.jpg 884 | JPEGImages/bottle/2009_004745.jpg 885 | JPEGImages/cat/2008_001885.jpg 886 | JPEGImages/aeroplane/2010_001426.jpg 887 | JPEGImages/aeroplane/2010_005557.jpg 888 | JPEGImages/car/2009_002267.jpg 889 | JPEGImages/bird/2007_003349.jpg 890 | JPEGImages/aeroplane/2008_004138.jpg 891 | JPEGImages/horse/2008_002993.jpg 892 | JPEGImages/train/2010_002697.jpg 893 | JPEGImages/aeroplane/2008_006621.jpg 894 | JPEGImages/horse/2010_000666.jpg 895 | JPEGImages/bird/2008_006281.jpg 896 | JPEGImages/horse/2007_005331.jpg 897 | JPEGImages/aeroplane/2009_003705.jpg 898 | JPEGImages/bicycle/2010_006031.jpg 899 | JPEGImages/cat/2010_000872.jpg 900 | JPEGImages/cat/2010_000163.jpg 901 | JPEGImages/sheep/2007_006136.jpg 902 | JPEGImages/person/2008_000725.jpg 903 | JPEGImages/bus/2009_001707.jpg 904 | JPEGImages/cow/2008_008121.jpg 905 | JPEGImages/tvmonitor/2010_003461.jpg 906 | JPEGImages/dog/2010_001976.jpg 907 | JPEGImages/horse/2008_000696.jpg 908 | JPEGImages/cow/2009_000709.jpg 909 | JPEGImages/tvmonitor/2008_003667.jpg 910 | JPEGImages/bicycle/2010_001753.jpg 911 | JPEGImages/sheep/2009_000924.jpg 912 | JPEGImages/tvmonitor/2008_004301.jpg 913 | JPEGImages/bottle/2008_005904.jpg 914 | JPEGImages/bird/2010_005603.jpg 915 | JPEGImages/pottedplant/2011_001009.jpg 916 | JPEGImages/pottedplant/2009_004274.jpg 917 | JPEGImages/aeroplane/2008_000585.jpg 918 | JPEGImages/person/2007_006373.jpg 919 | JPEGImages/chair/2010_005540.jpg 920 | JPEGImages/horse/2010_000461.jpg 921 | JPEGImages/train/2009_004708.jpg 922 | JPEGImages/dog/2009_001139.jpg 923 | JPEGImages/car/2010_000466.jpg 924 | JPEGImages/boat/2008_004904.jpg 925 | JPEGImages/bus/2010_000148.jpg 926 | JPEGImages/bird/2008_006090.jpg 927 | JPEGImages/bus/2009_004276.jpg 928 | JPEGImages/boat/2008_004983.jpg 929 | JPEGImages/dog/2009_000647.jpg 930 | JPEGImages/tvmonitor/2009_002849.jpg 931 | JPEGImages/aeroplane/2008_004771.jpg 932 | JPEGImages/cow/2009_000632.jpg 933 | JPEGImages/horse/2007_007109.jpg 934 | JPEGImages/sheep/2010_000866.jpg 935 | JPEGImages/horse/2007_000836.jpg 936 | JPEGImages/motorbike/2010_003736.jpg 937 | JPEGImages/motorbike/2008_002972.jpg 938 | JPEGImages/train/2011_001525.jpg 939 | JPEGImages/aeroplane/2011_002470.jpg 940 | JPEGImages/person/2007_003742.jpg 941 | JPEGImages/horse/2008_003379.jpg 942 | JPEGImages/bus/2010_003772.jpg 943 | JPEGImages/pottedplant/2010_000737.jpg 944 | JPEGImages/boat/2010_004567.jpg 945 | JPEGImages/cat/2008_007403.jpg 946 | JPEGImages/boat/2010_000382.jpg 947 | JPEGImages/cat/2010_001994.jpg 948 | JPEGImages/motorbike/2008_008288.jpg 949 | JPEGImages/car/2009_002618.jpg 950 | JPEGImages/tvmonitor/2010_005744.jpg 951 | JPEGImages/dog/2010_005929.jpg 952 | JPEGImages/person/2007_002105.jpg 953 | JPEGImages/sheep/2009_002282.jpg 954 | JPEGImages/car/2009_004986.jpg 955 | JPEGImages/sheep/2010_004074.jpg 956 | JPEGImages/bus/2011_003109.jpg 957 | JPEGImages/dog/2009_000923.jpg 958 | JPEGImages/bird/2009_003640.jpg 959 | JPEGImages/horse/2008_003018.jpg 960 | JPEGImages/tvmonitor/2009_004478.jpg 961 | JPEGImages/bird/2008_006626.jpg 962 | JPEGImages/bicycle/2008_007222.jpg 963 | JPEGImages/boat/2008_002625.jpg 964 | JPEGImages/bus/2010_001808.jpg 965 | JPEGImages/bottle/2011_002974.jpg 966 | JPEGImages/chair/2009_000214.jpg 967 | JPEGImages/train/2009_001291.jpg 968 | JPEGImages/boat/2011_001771.jpg 969 | JPEGImages/sheep/2010_002665.jpg 970 | JPEGImages/pottedplant/2009_004554.jpg 971 | JPEGImages/bicycle/2008_004758.jpg 972 | JPEGImages/horse/2007_001724.jpg 973 | JPEGImages/cow/2010_002834.jpg 974 | JPEGImages/train/2009_004559.jpg 975 | JPEGImages/motorbike/2008_007485.jpg 976 | JPEGImages/motorbike/2010_005684.jpg 977 | JPEGImages/cat/2010_003539.jpg 978 | JPEGImages/horse/2008_001729.jpg 979 | JPEGImages/train/2009_002291.jpg 980 | JPEGImages/aeroplane/2011_000656.jpg 981 | JPEGImages/pottedplant/2008_003636.jpg 982 | JPEGImages/bus/2008_002451.jpg 983 | JPEGImages/car/2010_001337.jpg 984 | JPEGImages/cow/2008_008169.jpg 985 | JPEGImages/sheep/2008_006059.jpg 986 | JPEGImages/boat/2008_005512.jpg 987 | JPEGImages/cat/2010_005394.jpg 988 | JPEGImages/boat/2010_000887.jpg 989 | JPEGImages/boat/2010_000195.jpg 990 | JPEGImages/sheep/2008_007334.jpg 991 | JPEGImages/motorbike/2008_006857.jpg 992 | JPEGImages/aeroplane/2010_004312.jpg 993 | JPEGImages/motorbike/2010_001313.jpg 994 | JPEGImages/sheep/2009_000837.jpg 995 | JPEGImages/bicycle/2008_008591.jpg 996 | JPEGImages/train/2009_000283.jpg 997 | JPEGImages/horse/2007_009251.jpg 998 | --------------------------------------------------------------------------------