''' author : Hatcher W Email: hcwang@semi.ac.cn use: 密度估计推理 ''' import torch import datetime import random from torch.utils.data import Dataset import numpy as np from network import CSRNet,MCNN,CANNet,PKSNet from dataset import People_Dataset from configs.config import * from configs.config import model_head import json import os from tqdm import tqdm import matplotlib.pyplot as plt import cv2 from torch.utils.data import DataLoader from PIL import Image from PIL import ImageFont,ImageDraw,Image #os.environ['CUDA_VISIBLE_DEVICES'] = '1' device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') result_path = "../data_MPKFNet/result/BirdCounting2" #raw_data_inf_path = '../data_MPKFNet/result_raw/'+"1_3" raw_data_inf_path ="/data1/Hatcher/model/data_MPKFNet/data/BirdCounting/BirdCounting2/train_data/images" display = 1 if not os.path.exists(result_path): os.mkdir(result_path) ''' 准备数据 ''' get_name = [] for _, _, filenames in os.walk(raw_data_inf_path): # root是一个list是正在遍历的文件夹本身的地址 dirs文件夹中的目录 files是文件夹下的所有文件 for filename in filenames: get_name.append(filename) train = raw_data_inf_path trainfile = os.listdir(raw_data_inf_path) train_json = [file for file in trainfile] train_json.sort() with open(inf_json,'w') as f: json.dump(train_json,f) class INf_Dataset(Dataset): def __init__(self, img_list, train=True): random.shuffle(img_list) self.img_list = img_list self.train = train def __len__(self): return len(self.img_list) def __getitem__(self, index): assert index <= len(self), 'index range error' path_temp = raw_data_inf_path + "/" + self.img_list[index] img = cv2.imread(path_temp) # H read image img = cv2.resize(img, (1024, 768)) / 255.0 img = np.transpose(img, [2, 0, 1]) torch.from_numpy(img).type(torch.FloatTensor) return img, self.img_list[index] with open(inf_json, 'r') as outfile: inf_list = json.load(outfile) inf_dataset = INf_Dataset(inf_list) inf_dataset.img_list.sort() data_loader = DataLoader(inf_dataset,1) def valide(): batch_size = 1 with open(trainA_json, 'r') as outfile: train_list = json.load(outfile) with open(testA_json, 'r') as outfile: test_list = json.load(outfile) train_dataset = People_Dataset(train_list) train_loader = DataLoader(train_dataset, batch_size=batch_size) test_dataset = People_Dataset(test_list) test_loader = DataLoader(test_dataset, batch_size=batch_size) net = PKSNet().to(device) checkpoint = torch.load('../data_MPKFNet/weigth/final.pth') net.load_state_dict(checkpoint['net']) print("load model weight ok") # net.load_state_dict(torch.load('../data_MPKFNet/weigth/final.pth')) # print("load model weight ok") mae, mse = 0, 0 if model_head: for img, traget, count, posture, species in tqdm(test_loader): img = img.to(device) target = traget.to(device) t1 = datetime.datetime.now() targets_pred, posture_pred, spice_pred = net(img) t2 = datetime.datetime.now() #print("haoshi ", t2 - t1) mae += abs(targets_pred.data.sum() - target.data.sum()) mse += ((target.data.sum() - targets_pred.data.sum()) * (target.data.sum() - targets_pred.data.sum())) mae = mae / len(test_list) mse = mse / len(test_list) else: for img, traget, countin in tqdm(test_loader): img = img.to(device) target = traget.to(device) t1 = datetime.datetime.now() targets_pred= net(img) t2 = datetime.datetime.now() print("haoshi ", t2 - t1) mae += abs(targets_pred.data.sum() - target.data.sum()) mse += ((target.data.sum() - targets_pred.data.sum()) * (target.data.sum() - targets_pred.data.sum())) mae = mae / len(test_list) mse = mse / len(test_list) print('test_data:{},calculate MAE: \n'.format(len(test_list))) print(' * MAE {mae:.3f} \n'.format(mae=mae)) print(' * MSE {mse:.3f} \n'.format(mse=mse)) def gen_inf(): """ 获取验证数据 :return: """ i, n = 0, len(get_name) while True: if i >= n: i = 0 break batch_x, batch_y ,w_a,h_a=[],[],[],[] path_temp = raw_data_inf_path +"/" +get_name[i] img = cv2.imread(path_temp) # H read image #h, w = np.shape(img)[0], np.shape(img)[1] img = cv2.resize(img, (1024, 768)) / 255.0 #img = img /255.0 img = np.transpose(img, [2, 0, 1]) torch.from_numpy(img).type(torch.FloatTensor) #batch_x.append(img) # batch_y.append(get_name[i]) # w_a.append(w) # h_a.append(h) i += 1 yield img,get_name[i] def inf(devices): net = PKSNet().to(devices) checkpoint = torch.load('../data_MPKFNet/weigth/final.pth') net.load_state_dict(checkpoint['net']) # net.load_state_dict(torch.load('../data_MPKFNet/weigth/sheep/bestmaesheep93,mse29262.pth')) print("load model weight ok") i = 0 for img, img_pathtemp in tqdm(data_loader): img_pathtemp = img_pathtemp[0] img = torch.tensor(img) img = img.to(devices) if model_head: targets_pred, posture_pred, spice_pred = net(img) else: targets_pred = net(img) t1 = datetime.datetime.now() num = targets_pred.data.sum() targets_pred1 = targets_pred.cpu() targets_pred1 = targets_pred1.data.numpy() t2 = datetime.datetime.now() if i % display == 0: num_display = num plt.figure(num_display) #img = cv2.putText(targets_pred1[0, 0, :, :], '3', (5, 5), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), 2) # cv2.imshow("hatcher", targets_pred1[0, 0, :, :]) # cv2.waitKey() # cv2.imwrite(result_path + "/"+str(img_pathtemp), targets_pred1[0, 0, :, :]*255) plt.title("predict:{}".format(int(num_display))) plt.imshow(targets_pred1[0, 0, :, :]) plt.savefig(result_path + "/" + str(img_pathtemp)) plt.close() i += 1 # # net = PKSNet().to(device) # checkpoint = torch.load('../data_MPKFNet/weigth/final.pth') # net.load_state_dict(checkpoint['net']) # #net.load_state_dict(torch.load('../data_MPKFNet/weigth/sheep/bestmaesheep93,mse29262.pth')) # print("load model weight ok") # # i=0 # for img, img_pathtemp in tqdm(data_loader): # # img_pathtemp = img_pathtemp[0] # img =torch.tensor(img) # img = img.to(device) # if model_head: # targets_pred, posture_pred, spice_pred = net(img) # else: # targets_pred = net(img) # #cv2.imshow("pre is {}".format(targets_pred.data.sum()),targets_pred.data.numpy()) # # t1 = datetime.datetime.now() # num = targets_pred.data.sum() # targets_pred1 = targets_pred.cpu() # targets_pred1 = targets_pred1.data.numpy() # t2 = datetime.datetime.now() # # print("haoshi ", t2 - t1) # # if i < 343: # # num=0 # if i%display ==0: # num_display = num # fontpath = "font/simsun.ttc" # #font = ImageFont.truetype(fontpath,32) # img = cv2.putText(targets_pred1[0, 0, :, :],'3',(58,5),cv2.FONT_HERSHEY_SIMPLEX,1.2,(255,255,255),2) # #img_pil = Image.fromarray(targets_pred1[0, 0, :, :]) # #draw = ImageDraw.Draw(img_pil) # #draw.text((58, 5), num_display, font=cv2.FONT_HERSHEY_SIMPLEX, fill=(255, 255, 255)) # #bk_img = np.array(img_pil) # cv2.imshow("hatcher", targets_pred1[0, 0, :, :]) # #cv2.waitKey() # # cv2.imwrite(result_path + "/"+str(img_pathtemp), img) # # plt.figure(num_display) # plt.title("predict:{}".format(int(num_display))) # plt.imshow(targets_pred1[0, 0, :, :]) # plt.savefig(result_path + "/"+str(img_pathtemp)) # plt.close() # # Image.fromarray(drawn_image).save(os.path.join(output_dir, image_name)) # i+=1 if __name__ == '__main__': # valide() # valide() inf(device)