Files
2026-07-17 18:55:31 +08:00

238 lines
8.2 KiB
Python
Executable File
Raw Permalink 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.
'''
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)