diff --git a/configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml b/configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml index 29750bc2e..7b0a016f5 100644 --- a/configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml +++ b/configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml @@ -20,16 +20,16 @@ loss: train: optim: 'amsgrad' lr: 0.0015 - max_epoch: 250 - batch_size: 64 + max_epoch: 50 # 250 + batch_size: 32 # 64 fixbase_epoch: 10 open_layers: ['classifier'] lr_scheduler: 'cosine' test: - batch_size: 300 + batch_size: 100 #300 dist_metric: 'euclidean' normalize_feature: False evaluate: False - eval_freq: -1 - rerank: False \ No newline at end of file + eval_freq: 5 # -1 + rerank: False diff --git a/scripts/default_config.py b/scripts/default_config.py index da448e363..d334f6fa7 100644 --- a/scripts/default_config.py +++ b/scripts/default_config.py @@ -8,7 +8,7 @@ def get_default_config(): cfg.model = CN() cfg.model.name = 'resnet50' cfg.model.pretrained = True # automatically load pretrained model weights if available - cfg.model.load_weights = '' # path to model weights + cfg.model.load_weights = 'log/osnet_x1_0_market1501_softmax_cosinelr/model.pth.tar-250' # path to model weights cfg.model.resume = '' # path to checkpoint for resume training # data @@ -47,7 +47,7 @@ def get_default_config(): # video reid setting cfg.video = CN() - cfg.video.seq_len = 15 # number of images to sample in a tracklet + cfg.video.seq_len = 15 # 15 # number of images to sample in a tracklet cfg.video.sample_method = 'evenly' # how to sample images from a tracklet cfg.video.pooling_method = 'avg' # how to pool features over a tracklet @@ -56,7 +56,7 @@ def get_default_config(): cfg.train.optim = 'adam' cfg.train.lr = 0.0003 cfg.train.weight_decay = 5e-4 - cfg.train.max_epoch = 60 + cfg.train.max_epoch = 60 cfg.train.start_epoch = 0 cfg.train.batch_size = 32 cfg.train.fixbase_epoch = 0 # number of epochs to fix base layers @@ -99,8 +99,8 @@ def get_default_config(): cfg.test.dist_metric = 'euclidean' # distance metric, ['euclidean', 'cosine'] cfg.test.normalize_feature = False # normalize feature vectors before computing distance cfg.test.ranks = [1, 5, 10, 20] # cmc ranks - cfg.test.evaluate = False # test only - cfg.test.eval_freq = -1 # evaluation frequency (-1 means to only test after training) + cfg.test.evaluate = False # True: test only -- False: train and test + cfg.test.eval_freq = 1 # -1 # evaluation frequency (-1 means to only test after training) cfg.test.start_eval = 0 # start to evaluate after a specific epoch cfg.test.rerank = False # use person re-ranking cfg.test.visrank = False # visualize ranked results (only available when cfg.test.evaluate=True) diff --git a/scripts/main.py b/scripts/main.py index 61aa49ddd..20906a4ff 100755 --- a/scripts/main.py +++ b/scripts/main.py @@ -16,8 +16,8 @@ get_default_config, lr_scheduler_kwargs ) - def build_datamanager(cfg): + print(f"HIIIIIIIIIIIIIII cfg.data.type {cfg.data.type} BYEEEEEEEE") if cfg.data.type == 'image': return torchreid.data.ImageDataManager(**imagedata_kwargs(cfg)) else: @@ -121,6 +121,11 @@ def main(): parser.add_argument( '--root', type=str, default='', help='path to data root' ) + + parser.add_argument( + '--data-type', type=str, help='data type' + ) + parser.add_argument( 'opts', default=None, @@ -131,9 +136,14 @@ def main(): cfg = get_default_config() cfg.use_gpu = torch.cuda.is_available() + if args.config_file: cfg.merge_from_file(args.config_file) reset_config(cfg, args) + + if args.data_type: + cfg.data.type = args.data_type + cfg.merge_from_list(args.opts) set_random_seed(cfg.train.seed) check_cfg(cfg) diff --git a/scripts/register_dataset.py b/scripts/register_dataset.py new file mode 100644 index 000000000..f9aa26ecf --- /dev/null +++ b/scripts/register_dataset.py @@ -0,0 +1,22 @@ + + +from __future__ import absolute_import +from __future__ import print_function +from __future__ import division + +import sys +import os +import os.path as osp +import torchreid +from torchreid.data.datasets.video.FRIDA import FRIDA +from torchreid.data.datasets.image.FRIDAimg import FRIDAimg + +try: + torchreid.data.register_video_dataset('FRIDA', FRIDA) +except Exception as e: + print(e) + +# try: +# torchreid.data.register_image_dataset('FRIDAimg', FRIDAimg) +# except Exception as e: +# print(e) \ No newline at end of file diff --git a/testamany.py b/testamany.py new file mode 100644 index 000000000..c913ea475 --- /dev/null +++ b/testamany.py @@ -0,0 +1,29 @@ +from torchreid.utils import FeatureExtractor + +market1501_model = 'log/osnet_x1_0_market1501_softmax_cosinelr/model/model.pth.tar-250' +frida_model = 'log/osnet_x1_0_market1501_softmax_cosinelr/model/frida_model.pth.tar-3' + +extractor_1 = FeatureExtractor( + model_name='osnet_x1_0', + model_path=market1501_model, + device='cuda' +) + +extractor_2 = FeatureExtractor( + model_name='osnet_x1_0', + model_path=frida_model, + device='cuda' +) + +image_list = [ + '../FRIDA/BBs/Segment_1/0001155/Camera_1/person_01.jpg', + '../FRIDA/BBs/Segment_1/0001155/Camera_1/person_02.jpg', + '../FRIDA/BBs/Segment_1/0001155/Camera_1/person_03.jpg' +] + +features_market = extractor_1(image_list) +features_frida= extractor_2(image_list) +print("Features MARKET1501") +print(features_market) +print("Features FRIDA") +print(features_frida) \ No newline at end of file diff --git a/torchreid/data/datasets/__init__.py b/torchreid/data/datasets/__init__.py index afb02a2bf..77e79bba2 100644 --- a/torchreid/data/datasets/__init__.py +++ b/torchreid/data/datasets/__init__.py @@ -2,9 +2,9 @@ from .image import ( GRID, PRID, CUHK01, CUHK02, CUHK03, MSMT17, CUHKSYSU, VIPeR, SenseReID, - Market1501, DukeMTMCreID, University1652, iLIDS + Market1501, DukeMTMCreID, University1652, iLIDS, FRIDAimg ) -from .video import PRID2011, Mars, DukeMTMCVidReID, iLIDSVID +from .video import PRID2011, Mars, DukeMTMCVidReID, iLIDSVID, FRIDA from .dataset import Dataset, ImageDataset, VideoDataset __image_datasets = { @@ -20,14 +20,16 @@ 'prid': PRID, 'cuhk02': CUHK02, 'university1652': University1652, - 'cuhksysu': CUHKSYSU + 'cuhksysu': CUHKSYSU, + 'FRIDAimg':FRIDAimg } __video_datasets = { 'mars': Mars, 'ilidsvid': iLIDSVID, 'prid2011': PRID2011, - 'dukemtmcvidreid': DukeMTMCVidReID + 'dukemtmcvidreid': DukeMTMCVidReID, + 'FRIDA':FRIDA } @@ -37,7 +39,7 @@ def init_image_dataset(name, **kwargs): if name not in avai_datasets: raise ValueError( 'Invalid dataset name. Received "{}", ' - 'but expected to be one of {}'.format(name, avai_datasets) + 'but expected to be one of image datasets: {}'.format(name, avai_datasets) ) return __image_datasets[name](**kwargs) @@ -48,7 +50,7 @@ def init_video_dataset(name, **kwargs): if name not in avai_datasets: raise ValueError( 'Invalid dataset name. Received "{}", ' - 'but expected to be one of {}'.format(name, avai_datasets) + 'but expected to be one of video datasets: {}'.format(name, avai_datasets) ) return __video_datasets[name](**kwargs) diff --git a/torchreid/data/datasets/dataset.py b/torchreid/data/datasets/dataset.py index 66b1e7a6e..36cb8a94c 100644 --- a/torchreid/data/datasets/dataset.py +++ b/torchreid/data/datasets/dataset.py @@ -324,8 +324,10 @@ def __init__(self, train, query, gallery, **kwargs): def __getitem__(self, index): img_path, pid, camid, dsetid = self.data[index] img = read_image(img_path) + if self.transform is not None: - img = self._transform_image(self.transform, self.k_tfm, img) + if img is not None: + img = self._transform_image(self.transform, self.k_tfm, img) item = { 'img': img, 'pid': pid, diff --git a/torchreid/data/datasets/image/FRIDAimg.py b/torchreid/data/datasets/image/FRIDAimg.py new file mode 100644 index 000000000..286a8f14b --- /dev/null +++ b/torchreid/data/datasets/image/FRIDAimg.py @@ -0,0 +1,175 @@ + +from __future__ import print_function, absolute_import +from __future__ import division, print_function, absolute_import +import os +import json +from collections import defaultdict +import random +from ..dataset import ImageDataset +import os.path as osp +import warnings + +import shutil + + +class FRIDAimg(ImageDataset): + """ + FRIDA Dataset + Args: + data_dir (str): Path to the root directory of FRIDA dataset. + min_seq_len (int): Tracklet with length shorter than this value will be discarded (default: 0). + """ + + data_dir = '' + data_url = None + + def __init__(self, root='', **kwargs): + self.root = osp.abspath(osp.expanduser(root)) + self.data_dir = osp.join(self.root, self.data_dir) + self.train_dirs = [f"Segment_{i + 1}" for i in range(4)] # FRIDA has 4 segments + self.cameras = ['Camera_1', 'Camera_2', 'Camera_3'] # FRIDA has 3 cameras + self._check_before_run() + + train, test, num_train_tracklets, num_test_tracklets, num_train_pids, num_test_pids, selected_persons_test = \ + self._process_data(self.train_dirs, min_seq_len=0, num_train_ids=10) + + self.train = train + self.test = test + self.num_train_pids = num_train_pids + self.num_test_pids = num_test_pids + self.num_train_cams = len(self.cameras) + self.num_test_cams = len(self.cameras) + self.num_train_vids = num_train_tracklets + self.num_test_vids = num_test_tracklets + + print(f"First 3 tracklets in train IMAGES: {self.train[:3]}") + + query, gallery, tracklet_query, tracklet_gallery, num_query_pids, num_gallery_pids = \ + self._create_query_gallery(self.test, selected_persons_test) + self.query = query + self.gallery = gallery + print(f"First 3 tracklets in query IMAGES: {self.query[:3]}") + print(f"First 3 tracklets in gallery IMAGES: {self.gallery[:3]}") + + + num_query_tracklets = tracklet_query + num_gallery_tracklets = tracklet_gallery + + super(FRIDAimg, self).__init__(train, query, gallery, **kwargs) + + def _check_before_run(self): + """Check if all files are available before going deeper""" + if not os.path.exists(self.data_dir): + raise RuntimeError("'{}' is not available".format(self.data_dir)) + + + def _process_data(self, dirnames, min_seq_len=0, num_train_ids=10): + tracklets_train = [] + tracklets_test = [] + + pid_container = list(range(1, 21)) + + # Randomly shuffle the list of person IDs + # random.shuffle(pid_container) + + random.seed(15) + + # Select the first num_train_ids for training, and the rest for testing + selected_persons_train = random.sample(pid_container, num_train_ids) # pid_container[:num_train_ids] + selected_persons_test = [pid for pid in pid_container if pid not in selected_persons_train] # pid_container[num_train_ids:] + + print("selected_persons_train: ", selected_persons_train) + print("selected_persons_test: ", selected_persons_test) + + # Define label_dict for training set + labelset = selected_persons_train + label_dict = {label: index for index, label in enumerate(labelset)} + + # Keep track of person IDs already added to the training and testing sets + added_persons_train = set() + added_persons_test = set() + + for segment in dirnames: + for camera in self.cameras: + json_file = os.path.join(self.data_dir, 'Annotations', segment, camera, 'data2.json') + with open(json_file, 'r') as f: + data = json.load(f) + + for person_info in data: + img_id = person_info['image_id'] + pid = person_info['person_id'] + person_id = f'person_{str(pid).zfill(2)}' # Convert integer ID to zero-padded string + + for camera_idx in range(len(self.cameras)): + camera_name = f'Camera_{camera_idx + 1}' + img_path = os.path.join(self.data_dir, 'BBs', segment, img_id, camera_name, f'{person_id}.jpg') + + if os.path.exists(img_path): + if pid in selected_persons_train: + if len(tracklets_train) < 100000: + if pid not in added_persons_train: + tracklet = (img_path, label_dict[pid], camera_idx) + tracklets_train.append(tracklet) + added_persons_train.add(pid) + elif pid in added_persons_train and len(added_persons_train) == len(selected_persons_train): + tracklet = (img_path, label_dict[pid], camera_idx) + tracklets_train.append(tracklet) + elif pid in selected_persons_test: + #if len(tracklets_test) < 80000: + if pid not in added_persons_test: + tracklet = (img_path, pid, camera_idx) + tracklets_test.append(tracklet) + added_persons_test.add(pid) + elif pid in added_persons_test and len(added_persons_test) == len(selected_persons_test): + tracklet = (img_path, pid, camera_idx) + tracklets_test.append(tracklet) + + + + num_train_tracklets = len(tracklets_train) + num_test_tracklets = len(tracklets_test) + num_train_pids = len(added_persons_train) + num_test_pids = len(added_persons_test) + + + return tracklets_train, tracklets_test, num_train_tracklets, num_test_tracklets, \ + num_train_pids, num_test_pids, selected_persons_test + + + + + def _create_query_gallery(self, tracklets, selected_persons): + query = [] + gallery = [] + tracklet_query, tracklet_gallery = 0, 0 + num_query_pids, num_gallery_pids = set(), set() + + for tracklet in tracklets: + img_path, person_id, camera_idx = tracklet + if person_id == 5 and camera_idx != 0: + print(" REQUIRED TRACKLET FOUND!") + + if camera_idx == 0: # Camera A (query) + if tracklet_query < 15000: + query.append(tracklet) + tracklet_query += 1 + num_query_pids.add(person_id) + else: # Other cameras (gallery) + if tracklet_gallery < 30000: + gallery.append(tracklet) + tracklet_gallery += 1 + num_gallery_pids.add(person_id) + + print("num_query_pids: ", list(num_query_pids)) + print("num_gallery_pids: ", list(num_gallery_pids)) + print("selected persons: ", selected_persons) + + num_query_pids = len(list(num_query_pids)) + num_gallery_pids = len(list(num_gallery_pids)) + + return query, gallery, tracklet_query, tracklet_gallery, num_query_pids, num_gallery_pids + + + + + diff --git a/torchreid/data/datasets/image/__init__.py b/torchreid/data/datasets/image/__init__.py index f2216e96d..9d0931170 100644 --- a/torchreid/data/datasets/image/__init__.py +++ b/torchreid/data/datasets/image/__init__.py @@ -13,3 +13,4 @@ from .market1501 import Market1501 from .dukemtmcreid import DukeMTMCreID from .university1652 import University1652 +from .FRIDAimg import FRIDAimg diff --git a/torchreid/data/datasets/image/market1501.py b/torchreid/data/datasets/image/market1501.py index 7d138d111..b53e02a1a 100644 --- a/torchreid/data/datasets/image/market1501.py +++ b/torchreid/data/datasets/image/market1501.py @@ -21,12 +21,12 @@ class Market1501(ImageDataset): """ _junk_pids = [0, -1] dataset_dir = 'market1501' - dataset_url = 'http://188.138.127.15:81/Datasets/Market-1501-v15.09.15.zip' + # dataset_url = 'http://188.138.127.15:81/Datasets/Market-1501-v15.09.15.zip' def __init__(self, root='', market1501_500k=False, **kwargs): self.root = osp.abspath(osp.expanduser(root)) self.dataset_dir = osp.join(self.root, self.dataset_dir) - self.download_dataset(self.dataset_dir, self.dataset_url) + # self.download_dataset(self.dataset_dir, self.dataset_url) # allow alternative directory structure self.data_dir = self.dataset_dir diff --git a/torchreid/data/datasets/video/FRIDA.py b/torchreid/data/datasets/video/FRIDA.py new file mode 100644 index 000000000..91c32b25f --- /dev/null +++ b/torchreid/data/datasets/video/FRIDA.py @@ -0,0 +1,191 @@ +from __future__ import print_function, absolute_import +from __future__ import division, print_function, absolute_import +import os +import json +from collections import defaultdict +import random +from ..dataset import VideoDataset +import os.path as osp +import warnings + +class FRIDA(VideoDataset): + """ + FRIDA Dataset + Args: + data_dir (str): Path to the root directory of FRIDA dataset. + min_seq_len (int): Tracklet with length shorter than this value will be discarded (default: 0). + """ + + data_dir = '' + data_url = None + + def __init__(self, root='', **kwargs): + self.root = osp.abspath(osp.expanduser(root)) + self.data_dir = osp.join(self.root, self.data_dir) + self.segments = [f"Segment_{i + 1}" for i in range(4)] # FRIDA has 4 segments + self.cameras = ['Camera_1', 'Camera_2', 'Camera_3'] # FRIDA has 3 cameras + self._check_before_run() + + train, test, num_train_tracklets, num_test_tracklets, num_train_pids, num_test_pids = self._process_data(num_train_ids=10) + + self.train = train + self.test = test + self.num_train_pids = num_train_pids + self.num_test_pids = num_test_pids + self.num_train_cams = len(self.cameras) + self.num_test_cams = len(self.cameras) + self.num_train_vids = num_train_tracklets + self.num_test_vids = num_test_tracklets + + # self.train = self._create_query_gallery(self.train) + print(f"First 3 tracklets in train: {self.train[:3]}") + + query, gallery, tracklet_query, tracklet_gallery, num_query_pids, num_gallery_pids = self._create_query_gallery(self.test) + self.query = query + self.gallery = gallery + print(f"First 3 tracklets in query: {self.query[:3]}") + + num_query_tracklets = tracklet_query + num_gallery_tracklets = tracklet_gallery + + + # print("=> FRIDA loaded") + # print("Dataset statistics:") + # print(" ------------------------------") + # print(" subset | # ids | # tracklets") + # print(" ------------------------------") + # print(" train | {:5d} | {:8d}".format(self.num_train_pids, self.num_train_vids)) + # print(" test | {:5d} | {:8d}".format(self.num_test_pids, self.num_test_vids)) + # print(" query | {:5d} | {:8d}".format(num_query_pids, num_query_tracklets)) + # print(" gallery | {:5d} | {:8d}".format(num_gallery_pids, num_gallery_tracklets)) + + + super(FRIDA, self).__init__(train, query, gallery, **kwargs) + + def _check_before_run(self): + """Check if all files are available before going deeper""" + if not os.path.exists(self.data_dir): + raise RuntimeError("'{}' is not available".format(self.data_dir)) + + + def _get_imgIDs(self): + person_imgIDs = {} + + for segment in self.segments: + for camera in self.cameras: + json_file = os.path.join(self.data_dir, 'Annotations', segment, camera, 'data2.json') + with open(json_file, 'r') as f: + data = json.load(f) + + for person_info in data: + img_id = person_info['image_id'] + pid = person_info['person_id'] + + if pid not in person_imgIDs: + person_imgIDs[pid] = [] + + person_imgIDs[pid].append(img_id) + + return person_imgIDs + + + def _get_tracklets(self, person_imgIDs): + + tracklets = [] + + for pid, img_ids in person_imgIDs.items(): + # Sort img_ids for the current person + sorted_img_ids = sorted(img_ids) + person_id = f'person_{str(pid).zfill(2)}' # Convert integer ID to zero-padded string + + # Create tracklets for each subsequent set of 3 img_ids + for i in range(0, len(sorted_img_ids) - 2, 3): + for segment in self.segments: + for camera_idx in range(1, 4): + camera_name = f'Camera_{camera_idx}' + tracklet_images = [] + + for j in range(3): + img_id = sorted_img_ids[i + j] + img_path = os.path.join(self.data_dir, 'BBs', segment, img_id, camera_name, f'{person_id}.jpg') + + if os.path.exists(img_path) and img_path not in tracklet_images: + tracklet_images.append(img_path) + + # Check if the tracklet has at least 2 images before adding it + if len(tracklet_images) >= 2: + # Create a tracklet as ((img1_path, img2_path, img3_path), person_id, camera_index) + tracklet = (tuple(tracklet_images), pid, camera_idx) + tracklets.append(tracklet) + + return tracklets + + + + def _process_data(self, num_train_ids=10): + tracklets_train = [] + tracklets_test = [] + pid_container = list(range(1, 21)) # Assuming 20 persons in total + + random.seed(42) + + # Select 10 random IDs for training + selected_persons_train = random.sample(pid_container, num_train_ids) + + # Select 10 different random IDs for testing + selected_persons_test = [pid for pid in pid_container if pid not in selected_persons_train] + + print("selected_persons_train: ", selected_persons_train) + print("selected_persons_test: ", selected_persons_test) + + person_imgIDs = self._get_imgIDs() + tracklets = self._get_tracklets(person_imgIDs) + + # Create a dictionary to map original person IDs to new labels for training + label_dict = {label: index for index, label in enumerate(selected_persons_train)} + print(f"pid mapping {label_dict}") + + for tracklet in tracklets: + img_paths, pid, camera_idx = tracklet + if pid in selected_persons_train: + mapped_pid = label_dict[pid] + tracklet = (img_paths, mapped_pid, camera_idx) + # tracklet = (img_paths, pid, camera_idx) + tracklets_train.append(tracklet) + + elif pid in selected_persons_test: + tracklets_test.append(tracklet) + + + num_train_tracklets = len(tracklets_train) + num_test_tracklets = len(tracklets_test) + num_train_pids = len(selected_persons_train) + num_test_pids = len(selected_persons_test) + + return tracklets_train, tracklets_test, num_train_tracklets, \ + num_test_tracklets, num_train_pids, num_test_pids + + + def _create_query_gallery(self, tracklets): + + query = [] + gallery = [] + + tracklet_query, tracklet_gallery = 0, 0 + num_query_pids, num_gallery_pids = set(), set() + + for tracklet in tracklets: + img_paths, person_id, camera_idx = tracklet + if camera_idx == 1: # Camera A + query.append(tracklet) + tracklet_query += 1 + num_query_pids.add(person_id) + else: # Cameras B and C + gallery.append(tracklet) + tracklet_gallery += 1 + num_gallery_pids.add(person_id) + + num_query_pids = len(list(num_query_pids)) + num_gallery_pids = len(list(num_gallery_pids)) + + return query, gallery, tracklet_query, tracklet_gallery, num_query_pids, num_gallery_pids diff --git a/torchreid/data/datasets/video/__init__.py b/torchreid/data/datasets/video/__init__.py index f4e75d316..28308fc09 100644 --- a/torchreid/data/datasets/video/__init__.py +++ b/torchreid/data/datasets/video/__init__.py @@ -4,3 +4,4 @@ from .ilidsvid import iLIDSVID from .prid2011 import PRID2011 from .dukemtmcvidreid import DukeMTMCVidReID +from .FRIDA import FRIDA diff --git a/torchreid/engine/engine.py b/torchreid/engine/engine.py index bbc01e09e..9f05888a0 100644 --- a/torchreid/engine/engine.py +++ b/torchreid/engine/engine.py @@ -112,7 +112,7 @@ def update_lr(self, names=None): def run( self, - save_dir='log', + save_dir='log/FRIDA', # 'log' max_epoch=0, start_epoch=0, print_freq=10, @@ -367,7 +367,7 @@ def _feature_extraction(data_loader): end = time.time() features = self.extract_features(imgs) batch_time.update(time.time() - end) - features = features.cpu() + features = features.cpu().clone() f_.append(features) pids_.extend(pids.tolist()) camids_.extend(camids.tolist()) diff --git a/torchreid/losses/cross_entropy_loss.py b/torchreid/losses/cross_entropy_loss.py index 4cfa5d46e..928cf7828 100644 --- a/torchreid/losses/cross_entropy_loss.py +++ b/torchreid/losses/cross_entropy_loss.py @@ -41,9 +41,13 @@ def forward(self, inputs, targets): targets (torch.LongTensor): ground truth labels with shape (batch_size). Each position contains the label index. """ + log_probs = self.logsoftmax(inputs) zeros = torch.zeros(log_probs.size()) + targets = zeros.scatter_(1, targets.unsqueeze(1).data.cpu(), 1) + + if self.use_gpu: targets = targets.cuda() targets = (1 - self.eps) * targets + self.eps / self.num_classes diff --git a/torchreid/metrics/distance.py b/torchreid/metrics/distance.py index f4fb38316..f962224f3 100644 --- a/torchreid/metrics/distance.py +++ b/torchreid/metrics/distance.py @@ -57,13 +57,18 @@ def euclidean_squared_distance(input1, input2): torch.Tensor: distance matrix. """ m, n = input1.size(0), input2.size(0) + mat1 = torch.pow(input1, 2).sum(dim=1, keepdim=True).expand(m, n) mat2 = torch.pow(input2, 2).sum(dim=1, keepdim=True).expand(n, m).t() + distmat = mat1 + mat2 distmat.addmm_(input1, input2.t(), beta=1, alpha=-2) + return distmat + + def cosine_distance(input1, input2): """Computes cosine distance. diff --git a/torchreid/utils/tools.py b/torchreid/utils/tools.py index 2ccf63ab0..b8ca97954 100644 --- a/torchreid/utils/tools.py +++ b/torchreid/utils/tools.py @@ -65,6 +65,7 @@ def set_random_seed(seed): torch.cuda.manual_seed_all(seed) + def download_url(url, dst): """Downloads file from a url to a destination. @@ -104,19 +105,18 @@ def read_image(path): Returns: PIL image """ + got_img = False - if not osp.exists(path): - raise IOError('"{}" does not exist'.format(path)) while not got_img: try: img = Image.open(path).convert('RGB') got_img = True + return img # Return the image if successfully loaded except IOError: - print( - 'IOError incurred when reading "{}". Will redo. Don\'t worry. Just chill.' - .format(path) - ) - return img + return None + + + def collect_env_info():