博文

cmc计算

cmc计算 行人重识别中,计算cmc曲线代码的理解 假设我们已经通过网络得到query和gallery中每个行人的特征,并据此计算出对应的距离矩阵,为了方便,我们假设query和gallery中各有5个行人,因此得到的distmat大小为5*5。 distmat= [[0 1 2 3 4] [2 1 3 5 4] [4 0 6 3 5] [1 3 7 2 4] [0 3 4 1 5]] 对每一行从小到大排序,返回对应元素的位置, indices = np.argsort(distmat, axis=1) indices= [[0 1 2 3 4] [1 0 2 4 3] [1 3 0 4 2] [0 3 1 4 2] [0 3 1 2 4]] 理想的情况下,对应每一行,我们希望最小的出现在第一个,例如对于第一行,id=0,因此距离最小的index也应该是0;同理,对于第三行,id=2,希望最小的index=2出现在最前面的位置。matches要得到的是正确匹配的idx出现的位置。 matches = (g_pids[indices] == q_pids[:, np.newaxis]).astype(np.int32) orig_cmc = matches[q_idx][keep] orig_cmc = [1 0 0 0 0] [1 0 0 0 0] [0 0 0 0 1] [0 1 0 0 0] [0 0 0 0 1] 从orig_cmc我们已经可以看到,第一列中只出现两个1,因此rank-1就是2/5=0.4。前两列中出现3个1,rank-2就是3/5=0.6。

无需得到最佳epoch,计算rank-1

无需得到最佳epoch,计算rank-1 import os def get_best_rank(log_file): os.system('grep Results -A 6 '+log_file+' > get_old_result.txt') all_r1, all_r5, all_r10, all_r20 = [], [], [], [] with open('get_old_result.txt') as f: while True: line = f.readline() if 'Rank-1 ' in line: all_r1.append(float(line.split(': ')[-1].strip('%\n'))) elif 'Rank-5 ' in line: all_r5.append(float(line.split(': ')[-1].strip('%\n'))) elif 'Rank-10 ' in line: all_r10.append(float(line.split(': ')[-1].strip('%\n'))) elif 'Rank-20 ' in line: all_r20.append(float(line.split(': ')[-1].strip('%\n'))) if not line: break all_max = [0,0,0,0] while True: if all_r1 == []: break max_r...

计算rank1脚本

计算rank1脚本 s_r1=0 s_r5=0 s_r10=0 s_r20=0 echo "Sp_ID Rank-1 Rank-5 Rank-10 Rank-20" > te.txt function getdir(){ for element in `ls $1` do dir_or_file=$1"/"$element if [ -d $dir_or_file ] then best_rank1=$(grep rank-1 $dir_or_file"/log_train.txt") # grep the line: best rank-1 {} occured at epoch {} best_r1_value=${best_rank1:12:5} # get the rank-1 value, e.g, 90.00 best_epoch=${best_rank1:36:3} best_epoch_add=$(($best_epoch+1)) best_all_rank=$(grep "==> Epoch "$best_epoch -A 15 $dir_or_file"/log_train.txt" > temp.txt) best_r5_value=$(grep Rank-5 temp.txt) best_r10_value=$(grep Rank-10 temp.txt) best_r20_value=$(grep Rank-20 temp.txt) best_r5_value=${best_r5_value##*:} best_r10_value=${best_r10_value##*:} best_r20_value=${best_r20_value##*:} best_r5_value=${best_r5_value%*%} ...

服务器上的gedit配置

服务器上的gedit配置 用ssh连接服务器后使用gedit,在图形界面设置完成后,退出重启又是默认的设置,比如设置tab的宽度是4之后,退出gedit重启又变成默认的宽度8。 使用命令: gsettings list-recursively | grep -i gedit 可查看所有gedit的设置,现在假设我们需要显示行数,就输入以下命令 gsettings set org.gnome.gedit.preferences.editor display-line-numbers true 输入命令后如出现 Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications. 则需要在~/.bashrc文件中添加 export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/ 并重启终端 设置tab的宽度为4,替换tab为空格,自动缩进,自动保存 gsettings set org.gnome.gedit.preferences.editor tabs-size 4 gsettings set org.gnome.gedit.preferences.editor insert-spaces true gsettings set org.gnome.gedit.preferences.editor auto-indent true gsettings set org.gnome.gedit.preferences.editor auto-save true 若是安装了plugin tools,即可开启代码注释(ctrl + m),取消注释(ctrl + shift + m) gsettings set org.gnome.gedit.plugins active-plugins "['filebrowser', 'drawspaces', 'modelines', 'spell', 'time',...

np.concatenate()

np.concatenate() np.concatenate()的用法和torch.cat()的用法相同 qf.append(features) pids = pids.numpy().astype(np.int16) camids = camids.numpy().astype(np.int16) q_pids.append(pids) q_camids.append(camids) qf = torch.cat(qf) q_pids = np.asarray(np.concatenate(q_pids)) q_camids = np.asarray(np.concatenate(q_camids)) 其中q_pids包含的是numpy数组的列表,通过np.concatenate()可以直接转化成为列数组。如果先前不用pids = pids.numpy().astype(np.int16)来将pids转化为numpy数组,用torch.cat()也可以达到同样的效果。

M3D 测试脚本内存问题

M3D 测试脚本内存问题 昨晚在测试M3D的时候,服务器的94GB内存全被占满,今天来调试发现问题就是这两行代码 q_pids.extend(pids) q_camids.extend(camids) 不知道原因是什么,改为 pids = pids.numpy().astype(np.int16) camids = camids.numpy().astype(np.int16) g_pids.append(pids) g_camids.append(camids) 就可以正常运行了。 CUDA 显存 测试的是Video-Person-ReID,models是里面的模型,在模型计算之后,要将model(img)等号左边的变量删除,才会释放内存,否则下次计算的时候就会出现CUDA显存不足 import torch import models import time img1=torch.randn(64,4,3,224,112).cuda() img2=torch.randn(20,4,3,224,112).cuda() imgs=[img1, img2] qf=[] for i,img in enumerate(imgs): model = models.init_model(name='resnet50tp', num_classes=625, loss={'xent', 'htri'}).cuda() model.eval() f = model(img) f = f.view(img.size()[0], -1) f = torch.mean(f, 0) f = f.data.cpu() qf.append(f) del f # 释放f的内存空间 #torch.cuda.empty_cache() print(torch.cuda.memory_allocated())

deep_person_reid中数据读取的方式

deep_person_reid中数据读取的方式 deep person reid中的dataset_loader之前一直没有认真读代码,并不是很容易看懂。这几天看到[1]的代码,其中数据读取的部分是[1]的作者自己写的,比较简单,我就看了下,然后与deep person reid中的dataset_loade做了对比,发现我能看懂了。原始有三种采样模式:evenly、random和all。 evenly evenly是在整个tracklet中,每隔几帧选取一帧,这个间隔是根据这样计算的:先去掉余数部分,再以等间隔取数据。比如从17帧取8帧,就是以间隔 ( 17 - 17 % 8 ) / 8 = 2取;从27帧中取8帧,就是以间隔 ( 27 - 27 % 8 ) / 8 = 3取。 random random是在tracklet中随机选取seq_len张图片,然后重新排序。在[2]中的random是不同的方式,[2]中的方式与M3D中的方法是相同的,随机选取一个开始位置,然后连续选取seq_len张图片。之前的实验证明选取连续的seq_len张图片的效果比较好。 all tracklet中的所有图片都选取进来 dense dense是[2]中的方法,与M3D的相同,都是重复最后一个序列的元素,如[0,1,2,3,0,1]。 class VideoDataset(Dataset): """Video Person ReID Dataset. Note batch data has shape (batch, seq_len, channel, height, width). """ _sample_methods = ['evenly', 'random', 'all'] def __init__(self, dataset, seq_len=15, sample_method='evenly', transform=None): self.dataset = dataset self.seq_len = seq_...