@@ -139,5 +139,6 @@ docs/api | |||
events.out.tfevents* | |||
pretrained | |||
YOLOX_outputs | |||
.idea/* | |||
@@ -0,0 +1,20 @@ | |||
#PBS -N meta_bytetrack_resume_fake | |||
#PBS -m abe | |||
#PBS -M [email protected] | |||
#PBS -l nodes=1:ppn=1:gpus=1 | |||
#PBS -q DP | |||
#PBS -l mem=15GB | |||
export LD_LIBRARY_PATH=/share/apps/cuda/cuda-10.1/lib64:$LD_LIBRARY_PATH | |||
export PATH=/share/apps/cuda/cuda-10.1/bin/:$PATH | |||
source /share/apps/Anaconda/anaconda3.6/bin/activate abdollahpour.ce.sharif | |||
conda activate abd_env | |||
cd /home/abdollahpour.ce.sharif/ByteTrack | |||
python tools/train.py -t metamot -f exps/example/metamot/yolox_x_mot17_on_mot20.py -d 1 -b 1 --fp16 -o --resume --start_epoch 80 -c /home/abdollahpour.ce.sharif/ByteTrack/meta_experiments/train_17_on_20_resume2/best_ckpt.pth.tar --local_rank 0 -expn train_17_on_20_resume_fake |
@@ -0,0 +1,18 @@ | |||
#PBS -N track_17_on_20_no_adapt | |||
#PBS -m abe | |||
#PBS -M [email protected] | |||
#PBS -l nodes=1:ppn=1:gpus=1 | |||
#PBS -q cuda9 | |||
export LD_LIBRARY_PATH=/share/apps/cuda/cuda-10.1/lib64:$LD_LIBRARY_PATH | |||
export PATH=/share/apps/cuda/cuda-10.1/bin/:$PATH | |||
source /share/apps/Anaconda/anaconda3.6/bin/activate abdollahpour.ce.sharif | |||
conda activate abd_env | |||
cd /home/abdollahpour.ce.sharif/ByteTrack | |||
python tools/track.py -t metamot -f exps/example/metamot/yolox_x_mot17_on_mot20.py -d 1 -b 1 -c /home/abdollahpour.ce.sharif/ByteTrack/meta_experiments/train_17_on_20_resume2/best_ckpt.pth.tar --local_rank 0 -expn track_17_on_20_no_adapt --mot20 |
@@ -0,0 +1,16 @@ | |||
#PBS -N track_17_on_20_ada_4_with_GT | |||
#PBS -m abe | |||
#PBS -M [email protected] | |||
#PBS -l nodes=1:ppn=1:gpus=1 | |||
#PBS -q cuda9 | |||
export LD_LIBRARY_PATH=/share/apps/cuda/cuda-10.1/lib64:$LD_LIBRARY_PATH | |||
export PATH=/share/apps/cuda/cuda-10.1/bin/:$PATH | |||
source /share/apps/Anaconda/anaconda3.6/bin/activate abdollahpour.ce.sharif | |||
conda activate abd_env | |||
cd /home/abdollahpour.ce.sharif/ByteTrack | |||
python tools/track.py -t metamot -f exps/example/metamot/yolox_x_mot17_on_mot20.py -d 1 -b 1 -c /home/abdollahpour.ce.sharif/ByteTrack/meta_experiments/train_17_on_20_resume2/best_ckpt.pth.tar --local_rank 0 -expn track_17_on_20_ada_4_with_GT --mot20 --adaptation_period 4 --fp16 --use_existing_files |
@@ -32,12 +32,14 @@ class Exp(MyMetaExp): | |||
print('train_anns', self.train_anns) | |||
print('val_anns', self.val_anns) | |||
self.input_size = (800, 1440) | |||
self.test_size = (896, 1600) | |||
# TODO: try this | |||
self.test_size = (800, 1440) | |||
# self.test_size = (896, 1600) | |||
# self.test_size = (736, 1920) | |||
self.random_size = (20, 36) | |||
self.max_epoch = 80 | |||
self.print_interval = 250 | |||
self.eval_interval = 5 | |||
self.eval_interval = 10 | |||
self.test_conf = 0.001 | |||
self.nmsthre = 0.7 | |||
self.no_aug_epochs = 10 | |||
@@ -109,7 +111,7 @@ class Exp(MyMetaExp): | |||
return train_loaders | |||
def get_eval_loaders(self, batch_size, is_distributed, testdev=False): | |||
from yolox.data import MOTDataset, ValTransform, ValTransformWithPseudo | |||
from yolox.data import MOTDataset, ValTransform, ValTransformWithPseudo, TrainTransform | |||
val_loaders = [] | |||
for val_ann in self.val_anns: | |||
valdataset = MOTDataset( | |||
@@ -119,9 +121,10 @@ class Exp(MyMetaExp): | |||
name='train', # change to train when running on training set | |||
preproc=ValTransformWithPseudo( | |||
rgb_means=(0.485, 0.456, 0.406), | |||
std=(0.229, 0.224, 0.225), | |||
std=(0.229, 0.224, 0.225), max_labels=500, | |||
), | |||
load_weak=True | |||
load_weak=False | |||
) | |||
if is_distributed: | |||
@@ -142,7 +145,7 @@ class Exp(MyMetaExp): | |||
val_loaders.append(val_loader) | |||
return val_loaders | |||
def get_evaluator(self, batch_size, is_distributed, testdev=False): | |||
def get_evaluators(self, batch_size, is_distributed, testdev=False): | |||
from yolox.evaluators import COCOEvaluator | |||
val_loaders = self.get_eval_loaders(batch_size, is_distributed, testdev=testdev) |
@@ -134,7 +134,7 @@ def compare_dataframes(gts, ts): | |||
return accs, names | |||
def process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder, val_ann): | |||
def process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder): | |||
file_name = os.path.join(exp.output_dir, args.experiment_name) | |||
rank = args.local_rank | |||
if rank == 0: | |||
@@ -158,7 +158,7 @@ def process_loader(args, exp, val_loader, model, is_distributed, trt_file, decod | |||
# start evaluate | |||
*_, summary = evaluator.evaluate( | |||
model, is_distributed, args.fp16, trt_file, decoder, exp.test_size, results_folder, | |||
adaptation_period=adaptation_period, | |||
adaptation_period=adaptation_period, eval_det=False | |||
) | |||
logger.info("\n" + summary) | |||
@@ -262,7 +262,7 @@ def load_model(args, exp, is_distributed): | |||
exp.test_size = (args.tsize, args.tsize) | |||
if args.task == "metamot": | |||
model = l2l.algorithms.MAML(model, lr=exp.inner_lr, first_order=exp.first_order, allow_nograd=True) | |||
model = l2l.algorithms.MAML(model, lr=exp.inner_lr, first_order=exp.first_order) | |||
torch.cuda.set_device(rank) | |||
model.cuda(rank) | |||
model.eval() | |||
@@ -328,14 +328,14 @@ def main(exp, args, num_gpu): | |||
if args.task == 'metamot': | |||
val_loaders = exp.get_eval_loaders(args.batch_size, is_distributed, args.test) | |||
if not args.use_existing_files: | |||
for val_loader, val_ann in zip(val_loaders, exp.val_anns): | |||
for val_loader in val_loaders: | |||
logger.info('processing loader...') | |||
process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder, val_ann) | |||
process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder) | |||
eval_MOT(args, exp) | |||
else: | |||
if not args.use_existing_files: | |||
val_loader = exp.get_eval_loader(args.batch_size, is_distributed, args.test) | |||
process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder, exp.val_ann) | |||
process_loader(args, exp, val_loader, model, is_distributed, trt_file, decoder) | |||
eval_MOT(args, exp, exp.val_ann) | |||
@@ -137,7 +137,12 @@ class MetaTrainer: | |||
p.grad.data.mul_(1.0 / self.args.batch_size) | |||
self.optimizer.zero_grad() | |||
self.scaler.scale(loss).backward() | |||
logger.info("loss Norm: {} , scale {}".format(torch.norm(loss), self.scaler.get_scale())) | |||
loss = self.scaler.scale(loss) | |||
logger.info("loss Norm: {} , scale {}".format(torch.norm(loss), self.scaler.get_scale())) | |||
# self.scaler.scale(loss).backward() | |||
loss.backward() | |||
self.scaler.step(self.optimizer) | |||
self.scaler.update() | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding:utf-8 -*- | |||
# Copyright (c) Megvii, Inc. and its affiliates. | |||
from .data_augment import TrainTransform, ValTransform,ValTransformWithPseudo | |||
from .data_augment import TrainTransform, ValTransform, ValTransformWithPseudo | |||
from .data_prefetcher import DataPrefetcher | |||
from .dataloading import DataLoader, get_yolox_datadir | |||
from .datasets import * |
@@ -317,7 +317,7 @@ class ValTransformWithPseudo: | |||
data | |||
""" | |||
def __init__(self, rgb_means=None, std=None, swap=(2, 0, 1), max_labels=100): | |||
def __init__(self, rgb_means=None, std=None, swap=(2, 0, 1), max_labels=150): | |||
self.means = rgb_means | |||
self.swap = swap | |||
self.std = std | |||
@@ -330,6 +330,7 @@ class ValTransformWithPseudo: | |||
labels = targets[:, 4].copy() | |||
ids = targets[:, 5].copy() | |||
if len(boxes) == 0: | |||
print('inside if 1') | |||
targets = np.zeros((self.max_labels, 6), dtype=np.float32) | |||
image, r_o = preproc(image, input_dim, self.means, self.std) | |||
image = np.ascontiguousarray(image, dtype=np.float32) | |||
@@ -359,6 +360,7 @@ class ValTransformWithPseudo: | |||
ids_t = ids[mask_b] | |||
if len(boxes_t) == 0: | |||
print('inside if 2') | |||
image_t, r_o = preproc(image_o, input_dim, self.means, self.std) | |||
boxes_o *= r_o | |||
boxes_t = boxes_o |
@@ -6,6 +6,7 @@ import os | |||
from ..dataloading import get_yolox_datadir | |||
from .datasets_wrapper import Dataset | |||
import sys | |||
class MOTDataset(Dataset): | |||
@@ -102,25 +103,30 @@ class MOTDataset(Dataset): | |||
) | |||
head_tail = os.path.split(img_file) | |||
# label_path = os.path.join(head_tail[0], head_tail[1].replace('.jpg','.txt')) | |||
# sys.stderr.write('original shape' + str(res.shape) + '\n values \n' + str(res)) | |||
if self.load_weak: | |||
weak_label_path = os.path.join(head_tail[0], head_tail[1] + '_weak_yolox-x.txt') | |||
# load weak labels from weak_label_path | |||
width = img_info[1] | |||
height = img_info[0] | |||
labels = np.loadtxt(weak_label_path) | |||
res = np.ones_like(labels) | |||
labels[2, :] *= width | |||
labels[4, :] *= width | |||
labels[3, :] *= height | |||
labels[5, :] *= height | |||
labels[4, :] += labels[2, :] | |||
labels[5, :] += labels[3, :] | |||
labels = np.loadtxt(weak_label_path) | |||
# print('weak loaded', labels[:3, 2:]) | |||
labels[:, 2] = labels[:, 2] * width | |||
labels[:, 4] = labels[:, 4] * width | |||
labels[:, 3] = labels[:, 3] * height | |||
labels[:, 5] = labels[:, 5] * height | |||
labels[:, 4] += labels[:, 2] | |||
labels[:, 5] += labels[:, 3] | |||
# print('weak', labels[:3, 2:]) | |||
res = np.zeros_like(labels) | |||
res[:, 0:4] = labels[:, -4:] | |||
res[:, 5] = labels[:, 1] | |||
# all are from class one | |||
# res[:, 4] = labels[:, 0] | |||
# sys.stderr.write('weak shape ' + str(res.shape) + '\n values \n' + str(res)) | |||
# all are from class one | |||
# res[:, 4] = labels[:, 0] | |||
img = cv2.imread(img_file) | |||
if img is None: |
@@ -88,6 +88,7 @@ class MOTEvaluator: | |||
test_size=None, | |||
result_folder=None, | |||
adaptation_period=None, | |||
eval_det=True, | |||
): | |||
""" | |||
COCO average precision (AP) Evaluation. Iterate inference on the test dataset | |||
@@ -103,17 +104,22 @@ class MOTEvaluator: | |||
ap50 (float) : COCO AP of IoU=50 | |||
summary (sr): summary info of evaluation. | |||
""" | |||
tensor_type = torch.cuda.HalfTensor if half else torch.cuda.FloatTensor | |||
model = model.type(tensor_type) | |||
if adaptation_period is not None: | |||
logger.info('cloning model...') | |||
learner = model.clone() | |||
else: | |||
learner = model | |||
# TODO half to amp_test | |||
tensor_type = torch.cuda.HalfTensor if half else torch.cuda.FloatTensor | |||
self.scaler = torch.cuda.amp.GradScaler(enabled=half,init_scale=8192) | |||
learner = learner.eval() | |||
self.amp_training = False | |||
if half: | |||
logger.info('half...') | |||
learner = learner.half() | |||
self.amp_training = True | |||
ids = [] | |||
data_list = [] | |||
results = [] | |||
@@ -191,13 +197,21 @@ class MOTEvaluator: | |||
if is_time_record: | |||
start = time.time() | |||
if adaptation_period is not None and cur_iter % adaptation_period == 0: | |||
learner.train() | |||
targets = targets.type(tensor_type) | |||
targets.requires_grad = False | |||
outputs = learner(imgs, targets) | |||
loss = outputs["total_loss"] | |||
with torch.cuda.amp.autocast(enabled=self.amp_training): | |||
learner.train() | |||
targets = targets.type(tensor_type) | |||
targets.requires_grad = False | |||
outputs = learner(imgs, targets) | |||
loss = outputs["total_loss"] | |||
# loss = outputs["iou_loss"] | |||
# logger.info("loss Norm: {} , scale {}".format(torch.norm(loss), self.scaler.get_scale())) | |||
loss = self.scaler.scale(loss) | |||
# logger.info("loss Norm: {} , scale {}".format(torch.norm(loss), self.scaler.get_scale())) | |||
learner.adapt(loss) | |||
# self.scaler.update() | |||
# learner.adapt(self.scaler.scale(loss)) | |||
learner.eval() | |||
learner.half() | |||
with torch.no_grad(): | |||
outputs = learner(imgs) | |||
@@ -244,8 +258,10 @@ class MOTEvaluator: | |||
data_list = gather(data_list, dst=0) | |||
data_list = list(itertools.chain(*data_list)) | |||
torch.distributed.reduce(statistics, dst=0) | |||
eval_results = self.evaluate_prediction(data_list, statistics) | |||
if eval_det: | |||
eval_results = self.evaluate_prediction(data_list, statistics) | |||
else: | |||
eval_results = 0, 0, 'skipped' | |||
synchronize() | |||
return eval_results | |||
@@ -48,7 +48,7 @@ class BaseMetaExp(metaclass=ABCMeta): | |||
pass | |||
@abstractmethod | |||
def get_evaluator(self): | |||
def get_evaluators(self): | |||
pass | |||
@abstractmethod |
@@ -63,6 +63,7 @@ class MetaExp(BaseMetaExp): | |||
# ----------------- Meta-learning ------------------ # | |||
self.first_order = True | |||
self.inner_lr = 1e-6 | |||
# self.inner_lr = 1e-10 | |||
def get_model(self): | |||
from yolox.models import YOLOPAFPN, YOLOX, YOLOXHead |
@@ -7,7 +7,7 @@ | |||
import numpy as np | |||
from pycocotools.cocoeval import COCOeval | |||
##TODO: check this | |||
# import torch first to make yolox._C work without ImportError of libc10.so | |||
# in YOLOX, env is already set in __init__.py. | |||
from yolox import _C |
@@ -0,0 +1,5 @@ | |||
# Mahdi Abdollahpour, 16/12/2021, 10:22 AM, PyCharm, ByteTrack | |||
DATA_PATH = '/home/abdollahpour.ce.sharif/ByteTrackData' |