├── 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 |
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 |
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 |
--------------------------------------------------------------------------------