Drowning_Person_Detection/utils/saver.py

168 lines
8.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# import shutil
# from collections import OrderedDict # collections模块中的OrderedDict类
# import glob
# import os
# import cv2
# import numpy as np
# import torch
# import sys # 引入某一模块的方法
# sys.path.append("../") # 为了导入上级目录的d2lzh_pytorch.py添加一个新路径
# import time
#
#
# class Saver(object):
#
# def __init__(self, args):
# self.args = args
# self.directory = os.path.join('runs', args.dataset, args.checkname) # 路径拼接runs\pascal\deeplab-resnet
# self.runs = sorted(glob.glob(os.path.join(self.directory, 'experiment_*'))) # 搜索并排序(默认升序)
# run_id = int(self.runs[-1].split('_')[-1]) + 1 if self.runs else 0 # split() 通过指定分隔符对字符串进行切片,run_id=从0开始加1
#
# # self.experiment_dir = os.path.join(self.directory, 'experiment_{}'.format(str(run_id))) # runs\pascal\deeplab-resnet\experiment_
# self.experiment_dir = args.output_dir # 自行设置的输出目录
# if not os.path.exists(self.experiment_dir):
# os.makedirs(self.experiment_dir) # 生成该路径下的目录
#
# # def save_checkpoint(self, state, is_best, filename='checkpoint.pth'):
# # """Saves checkpoint to disk"""
# # filename = os.path.join(self.experiment_dir, filename) # runs\pascal\deeplab-resnet\experiment_\checkpoint.pth.tar
# # torch.save(state, filename) # 生成checkpoint.pth
# # if is_best:
# # best_pred = state['best_pred']
# # epoch = state['epoch']
# # str_ = ("%15.5g;" * 2) % (epoch, best_pred)
# # with open(os.path.join(self.experiment_dir, 'best_pred.txt'), 'a') as f:
# # f.write(str_+'\n')
# # # if self.runs:
# # # previous_miou = [0.0]
# # # for run in self.runs:
# # # run_id = run.split('_')[-1]
# # # path = os.path.join(self.directory, 'experiment_{}'.format(str(run_id)), 'best_pred.txt')
# # # if os.path.exists(path):
# # # with open(path, 'r') as f:
# # # miou = float(f.readline())
# # # previous_miou.append(miou)
# # # else:
# # # continue
# # # max_miou = max(previous_miou)
# # # if best_pred > max_miou:
# # # shutil.copyfile(filename, os.path.join(self.directory, 'model_best.pth'))#全局最佳模型
# # # else:
# # # shutil.copyfile(filename, os.path.join(self.directory, 'model_best.pth'))
#
# def save_val_result(self, epoch, Acc, Acc_class, mIoU, class_IoU, FWIoU, recall, precision, f1):
# str_ = ("%15.5g;" * 13) % (epoch, Acc, Acc_class, mIoU, FWIoU, class_IoU[0], class_IoU[1], recall[0], recall[1], precision[0], precision[1], f1[0], f1[1]) # txt保存指标
# with open(os.path.join(self.experiment_dir, 'val_result.txt'), 'a') as f: # 这句话自带文件关闭功能所以和那些先open再write再close的方式来说更加pythontic
# f.write(str_ + '\n')
#
# # def save_experiment_config(self, num_pictures):
# # logfile = os.path.join(self.experiment_dir, 'parameters.txt') # runs\pascal\deeplab-resnet\experiment_\parameters.txt
# # log_file = open(logfile, 'w')
# # p = OrderedDict() # 创建实例对象
# # # 字典能够将信息关联起来但它们不记录键值对的顺序。OrederedDict实例的行为与字典相同区别在于记录了添加的键值对的顺序。
# # p['datset'] = self.args.dataset
# # p['backbone'] = self.args.backbone
# # p['out_stride'] = self.args.out_stride
# # p['lr'] = self.args.lr
# # p['lr_scheduler'] = self.args.lr_scheduler
# # p['loss_type'] = self.args.loss_type
# # p['epoch'] = self.args.epochs
# # p['base_size'] = self.args.base_size
# # p['crop_size'] = self.args.crop_size
# # p['batch_size'] = self.args.batch_size
# # p['num_pictures'] = num_pictures
# #
# # for key, val in p.items():
# # log_file.write(key + ':' + str(val) + '\n')
# # log_file.close()
#
# # def predict_save_images(self, model, args, epoch, label_info, test_loader, pathName):
# def predict_save_images(self, model, args, epoch, label_info, test_loader):
# # print('调用成功了')
# # if not args.dataset=='potsdam':
# # csv_path = os.path.join('path', args.dataset, 'class_dict.csv')
#
# # else:
# # csv_path = os.path.join('path/ISPRS', args.dataset, 'class_dict.csv')
# # label_info = get_label_info(csv_path)
# # print(test_loader)
# # Time_model = []
# # Time_test = []
# # time00 = time.time()
# # cnt_list = []
# # for (sample, name, WH) in test_loader:
# for (sample, name, WH) in test_loader: #封装在CbySegmentation.__getitem__里需调整
# bs = len(name) #name里是图名WH是高宽
# # cnt_list.append(bs)
# # begin1 = time.time()
# # image = sample[0] #取第一个tensor是原图第二个是mask
# image = sample #取第一个tensor是原图第二个是mask 这里要送进去四维的batch为1。将mask去掉了
# # print('sample_shape',sample.shape)
# # print('image_shape',image.shape)
# # print('sample',sample)
# # print('name',name)
# # print('WH',WH)
# model.eval()
# if args.cuda:
# image = image.cuda()
# # begin2 = time.time()
# with torch.no_grad():
# predict = model(image)
# # end2 = time.time()
# # time_model = end2 - begin2
# # print('batchTime:%.3f ms, each:%.3f , bs:%d ' % (time_model*1000.0, time_model*1000.0/(bs * 1.0), bs))
#
# # predict=torch.squeeze(predict)
#
# predict = predict.data.cpu().numpy()
# predict = np.argmax(predict, axis=1)
#
# label_values = [label_info[key] for key in label_info]
# colour_codes = np.array(label_values)
#
# predict = colour_codes[predict.astype(int)]
#
# # crop_size恢复到原图尺寸
# for ii in range(bs):
# # print('line120:',WH)
# w, h = WH[0][ii], WH[1][ii]
# # w,h=WH
# predict_one = cv2.resize(predict[ii], (int(w), int(h)), interpolation=cv2.INTER_NEAREST)
# # save_path = os.path.join(self.experiment_dir, pathName)
# save_path = self.experiment_dir
# if not os.path.exists(save_path):
# os.makedirs(save_path) # 生成该路径下的目录
# # save_path = os.path.join(save_path, '%d_' % epoch+name[ii])
# save_path = os.path.join(save_path, name[ii])
# # print('save_path',save_path)
# # print('epoch',epoch)
# # print('name[ii]',name[ii])
#
# cv2.imwrite(save_path, cv2.cvtColor(np.uint8(predict_one), cv2.COLOR_RGB2BGR)) # 保存图片
# # end1 = time.time()
# # time_test = end1 - begin1
#
# # print('time test: batchTime:%.3f ms, one Time:%.3f, bs:%d '%(time_test*1000.0,time_test*1000.0/(bs*1.0),bs))
# # Time_model.append(time_model)
# # Time_test.append(time_test)
# # time11 = time.time()
#
# # Max_model = max(Time_model) # 原始
# # Min_model = min(Time_model) # 原始
# # Max_test = max(Time_test) # 原始
# # Min_test = min(Time_test) # 原始
# #
# # cnt_sample = sum(cnt_list)
# # ave_model = np.mean(Time_model)
# # ave_test = np.mean(Time_test)
# # print()
# # print('each model: ave:%.3f ms bs:%d' % (sum(Time_model)*1000.0/cnt_sample, cnt_list[0]))
# # print('bacthc inference:max:%.3f ms ,min:%3f ms,ave:%3f ms bs:%d ' % (Max_model*1000.0, Min_model*1000.0, ave_model*1000.0, cnt_list[1])) # 原始
# # print('All task total time:%.3f s' % (time11-time00))
# #
# # print('ave_mo del:max:%.3f ms ,min:%.3f ms,ave:%.3f ms'%(Max_test*1000.0,Min_test*1000.0,ave_test*1000.0)) # 原始
# return sample,predict_one
#
#
#