Jjtumarai's picture
deploy: bodyfat estimation app
1cac303
Raw
History Blame Contribute Delete
15.5 kB
import torch.utils.data as data
import sys
sys.path.append('/home/benkesheng/BMI_DETECT/')
from sklearn.metrics import mean_absolute_error
from sklearn.svm import SVR
from Detected import Image_Processor
import torch
import torch.nn as nn
import torch.utils.data as data
from torchvision import models, transforms
import numpy as np
import os
import pandas as pd
import cv2
import re
import csv
from PIL import Image
from Data import Img_info
import random
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.deterministic = True
setup_seed(20)
END_EPOCH = 0
mask_model = "/home/benkesheng/BMI_DETECT/pose2seg_release.pkl"
keypoints_model = "COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml"
# P = Image_Processor(mask_model,keypoints_model)
IMG_MEAN = [0.485, 0.456, 0.406]
IMG_STD = [0.229, 0.224, 0.225]
DEVICE = torch.device("cuda:3")
IMG_SIZE = 224
BATCH_SIZE = 64
def _get_image_size(img):
if transforms.functional._is_pil_image(img):
return img.size
elif isinstance(img, torch.Tensor) and img.dim() > 2:
return img.shape[-2:][::-1]
else:
raise TypeError("Unexpected type {}".format(type(img)))
class Resize(transforms.Resize):
def __call__(self, img):
h, w = _get_image_size(img)
scale = max(w, h) / float(self.size)
new_w, new_h = int(w / scale), int(h / scale)
return transforms.functional.resize(img, (new_w, new_h), self.interpolation)
class Dataset(data.Dataset):
def __init__(self, file, transfrom):
self.Pic_Names = os.listdir(file)
self.file = file
self.transfrom = transfrom
def __len__(self):
return len(self.Pic_Names)
def __getitem__(self, idx):
img_name = self.Pic_Names[idx]
Pic = Image.open(os.path.join(self.file, self.Pic_Names[idx]))
Pic = self.transfrom(Pic)
try:
ret = re.match(r"\d+?_([FMfm])_(\d+?)_(\d+?)_(\d+).+", img_name)
BMI = (int(ret.group(4)) / 100000) / (int(ret.group(3)) / 100000) ** 2
Pic_name = os.path.join(self.file, self.Pic_Names[idx])
return (Pic, Pic_name), BMI
except:
return (Pic, ''), 10000
transform = transforms.Compose([
Resize(IMG_SIZE),
transforms.Pad(IMG_SIZE),
transforms.CenterCrop(IMG_SIZE),
transforms.ToTensor(),
transforms.Normalize(IMG_MEAN, IMG_STD)
])
dataset = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_train', transform)
# val_dataset = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_val', transform)
test_dataset = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_test', transform)
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = torch.utils.data.random_split(dataset, [train_size, val_size])
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=True)
# Vgg16
# Pred_Net = torchvision.models.vgg16(pretrained=True)
# for param in Pred_Net.parameters():
# param.requires_grad = True
#
# Pred_Net.classifier = nn.Sequential(
# nn.Linear(25088, 1024),
# nn.ReLU(True),
# nn.Linear(1024, 512),
# nn.ReLU(True),
# nn.Linear(512, 256),
# nn.ReLU(True),
# nn.Linear(256, 20),
# nn.ReLU(True),
# nn.Linear(20, 1)
# )
# Resnet101
Pred_Net = models.resnet101(pretrained=True,num_classes= 1)
print(Pred_Net)
for param in Pred_Net.parameters():
param.requires_grad = True
# Pred_Net.fc = nn.Sequential(
# nn.Linear(2048, 1024),
# nn.ReLU(True),
# nn.Linear(1024, 512),
# nn.ReLU(True),
# nn.Linear(512, 256),
# nn.ReLU(True),
# nn.Linear(256, 20),
# nn.ReLU(True),
# nn.Linear(20, 1)
# )
Pred_Net = Pred_Net.to(DEVICE)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam([
{'params': Pred_Net.parameters()}
], lr=0.0001)
def train(model, device, train_loader, epoch):
model.train()
runing_loss = 0.0
for idx, ((x, n), y) in enumerate(train_loader, 0):
x, y = x.to(device), y.to(device)
optimizer.zero_grad()
y_pred = model(x)
# print(y_pred.shape)
y = torch.unsqueeze(y, 1)
loss = criterion(y_pred.double(), y.double())
loss.backward()
optimizer.step()
runing_loss += loss.item()
print('loss:', loss.item())
print('Train Epoch:{}\t RealLoss:{:.6f}'.format(epoch, runing_loss / len(train_loader)))
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
def test(model, device, test_loader):
model.eval()
pred = []
targ = []
with torch.no_grad():
for i, ((x, n), y) in enumerate(test_loader):
x, y = x.to(device), y.to(device)
# optimizer.zero_grad()
y_pred = model(x)
pred.append(y_pred.item())
targ.append(y.item())
y = torch.unsqueeze(y, 1)
MAE = mean_absolute_error(targ, pred)
MAPE = mean_absolute_percentage_error(targ, pred)
print('\nTest MAE:{}\t Test MAPE:{} '.format(MAE, MAPE))
return MAE, MAPE
MIN_MAE, MAPE = test(Pred_Net, DEVICE, val_loader)
for epoch in range(100):
print('*' * 50)
train(Pred_Net, DEVICE, train_loader, epoch)
val_MAE, val_MAPE = test(Pred_Net, DEVICE, val_loader)
if val_MAE < MIN_MAE:
MIN_MAE = val_MAE
torch.save(Pred_Net.state_dict(), '/home/benkesheng/BMI_DETECT/MODEL/param/MIN_RESNET101_BMI_Cache_test.pkl')
END_EPOCH = epoch
Net = Pred_Net
Net.load_state_dict(torch.load('/home/benkesheng/BMI_DETECT/MODEL/param/MIN_RESNET101_BMI_Cache.pkl'))
Net = Net.to(DEVICE)
print('=' * 50)
Net.eval()
test(Net, DEVICE, test_loader)
# Net.train()
# train(Net, DEVICE, train_loader, 1)
print('END_EPOCH:', END_EPOCH)
print('=' * 50)
# class Dataset(data.Dataset):
# def __init__(self, file, transfrom):
# self.Pic_Names = os.listdir(file)
# self.file = file
# self.transfrom = transfrom
#
# def __len__(self):
# return len(self.Pic_Names)
#
# def __getitem__(self, idx):
# img_name = self.Pic_Names[idx]
# Pic = Image.open(os.path.join(self.file, self.Pic_Names[idx]))
# Pic = self.transfrom(Pic)
#
# ret = re.match(r"\d+?_([FMfm])_(\d+?)_(\d+?)_(\d+).+", img_name)
# sex = 0 if (ret.group(1) == 'F' or ret.group(1) == 'f') else 1
# age = int(ret.group(2))
# height = int(ret.group(3)) / 100000
# weight = int(ret.group(4)) / 100000
# BMI = weight / (height ** 2)
# # BMI = (int(ret.group(4))/100000) / (int(ret.group(3))/100000)**2
# Pic_name = os.path.join(self.file, self.Pic_Names[idx])
# return (Pic, Pic_name, img_name, sex, age, height, weight), BMI
#
#
# dataset_train = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_train', transform)
# # dataset_val = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_val',transform)
# dataset_test = Dataset('/home/benkesheng/BMI_DETECT/datasets/Image_test', transform)
# loader_train = torch.utils.data.DataLoader(dataset_train, batch_size=1, shuffle=True)
# loader_test = torch.utils.data.DataLoader(dataset_test, batch_size=1, shuffle=True)
#
#
# # loader_val = torch.utils.data.DataLoader(dataset_val,batch_size=1,shuffle=True)
#
# class LayerActivations:
# features = None
#
# def __init__(self, model, layer_num):
# self.hook = model[layer_num].register_forward_hook(self.hook_fn)
#
# def hook_fn(self, module, input, output):
# self.features = output.cpu()
#
# def remove(self):
# self.hook.remove()
#
#
# import time
#
#
# # with open('/home/benkesheng/BMI_DETECT/ReDone_CSV/HaveArms/Image_train1.csv', 'w', newline='') as fp:
# # writer = csv.writer(fp)
# # cnt = 1
# # loaders = [loader_train]
# # for loader in loaders:
# # for (data, name, img_name, sex, age, height, weight), target in loader:
# # try:
# # # if(1):
# # if target.numpy()[0] <= 10 or target.numpy()[0] > 100:
# # continue
# # values = []
# # data = data.to(DEVICE)
# #
# # values.append(img_name[0])
# # values.append(target.numpy()[0])
# # values.append(sex.numpy()[0])
# #
# # cnt += 1
# # t0 = time.time()
# # img_e = cv2.imread(name[0])
# # print('Handling the pic %s' % img_name[0])
# # F = P.Process(img_e)
# # print('The body features detected cost %.3f s' % (time.time() - t0))
# # values.append(F.WSR)
# # values.append(F.WTR)
# # values.append(F.WHpR)
# # values.append(F.WHdR)
# # values.append(F.HpHdR)
# # values.append(F.Area)
# # values.append(F.H2W)
# # conv_out = LayerActivations(Net.fc, 6)
# # t1 = time.time()
# # out = Net(data.to(DEVICE))
# # conv_out.remove()
# # xs = torch.squeeze(conv_out.features.detach()).numpy()
# # print('The deep features detected cost %.3f s' % (time.time() - t1))
# # for x in xs:
# # values.append(x)
# #
# # values.append(age.numpy()[0])
# # values.append(height.numpy()[0])
# # values.append(weight.numpy()[0])
# # writer.writerow(values)
# # print('The %d pic %s cost %.3f s' % (cnt, img_name[0], time.time() - t0))
# # print('The shape of the pic is %d * %d' % (img_e.shape[0], img_e.shape[1]))
# # print('*' * 40)
# # except:
# # print('error')
# # continue
# #
# # with open('/home/benkesheng/BMI_DETECT/ReDone_CSV/HaveArms/Image_test1.csv', 'w', newline='') as fp:
# # writer = csv.writer(fp)
# # cnt = 0
# # for (data, name, img_name, sex, age, height, weight), target in loader_test:
# # try:
# # if target.numpy()[0] <= 10 or target.numpy()[0] > 100:
# # continue
# # values = []
# # data = data.to(DEVICE)
# #
# # values.append(img_name[0])
# # values.append(target.numpy()[0])
# # values.append(sex.numpy()[0])
# #
# # print(img_name[0], '\t', str(cnt))
# # cnt += 1
# # img_e = cv2.imread(name[0])
# # F = P.Process(img_e)
# # values.append(F.WSR)
# # values.append(F.WTR)
# # values.append(F.WHpR)
# # values.append(F.WHdR)
# # values.append(F.HpHdR)
# # values.append(F.Area)
# # values.append(F.H2W)
# # conv_out = LayerActivations(Net.fc, 6)
# # out = Net(data.to(DEVICE))
# # conv_out.remove()
# # xs = torch.squeeze(conv_out.features.detach()).numpy()
# # # print(xs)
# # for x in xs:
# # values.append(x)
# #
# # values.append(age.numpy()[0])
# # values.append(height.numpy()[0])
# # values.append(weight.numpy()[0])
# # writer.writerow(values)
# # except:
# # print('error')
# # continue
#
#
# def Pre(raw_data):
# raw_data = raw_data.iloc[:, 1:]
# raw_data = raw_data.replace([np.inf, -np.inf], np.nan)
# raw_data = raw_data.replace(np.nan, 0)
# raw_data = raw_data.values
# return raw_data
#
#
# def Data(raw_data):
# x_5f = raw_data[:, 3:8]
# x_7f = raw_data[:, 2:9]
# x_20f = raw_data[:, 9:29]
# y = raw_data[:, 0]
# return x_5f, x_7f, x_20f, y
#
#
# raw_data = pd.read_csv('/home/benkesheng/BMI_DETECT/ReDone_CSV/HaveArms/Image_train.csv')
# raw_data = Pre(raw_data)
#
# x_5f_tr, x_7f_tr, x_20f_tr, y_train = Data(raw_data)
#
# x_7f_sm = raw_data[:, 2:9]
# x_5f_sm = raw_data[:, 3:8]
# Mean_7f = np.mean(x_7f_sm, axis=0)
# Std_7f = np.std(x_7f_sm, axis=0)
# Mean_5f = np.mean(x_5f_sm, axis=0)
# Std_5f = np.std(x_5f_sm, axis=0)
#
# # x_7f_tr = (x_7f_tr - Mean_7f)/Std_7f
# # x_5f_tr = (x_5f_tr - Mean_5f)/Std_5f
# x_train = np.append(x_7f_tr, x_20f_tr, axis=1)
# y_train = y_train
#
# raw_data_test = pd.read_csv('/home/benkesheng/BMI_DETECT/ReDone_CSV/HaveArms/Image_test.csv')
# raw_data_test = Pre(raw_data_test)
#
# x_5f, x_7f, x_20f, y_test = Data(raw_data_test)
#
# # x_7f = (x_7f - Mean_7f) / Std_7f
# # x_5f = (x_5f - Mean_5f) / Std_5f
#
# x_test = np.append(x_7f, x_20f, axis=1)
# y_test = y_test
#
# from sklearn.kernel_ridge import KernelRidge
# from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel
# import sklearn.gaussian_process
#
# svr1 = SVR()
# svr2 = SVR()
# svr3 = SVR()
# kr1 = KernelRidge()
# kr2 = KernelRidge()
# kr3 = KernelRidge()
# kernel = DotProduct() + WhiteKernel()
# gpr1 = sklearn.gaussian_process.GaussianProcessRegressor()
# gpr2 = sklearn.gaussian_process.GaussianProcessRegressor()
# gpr3 = sklearn.gaussian_process.GaussianProcessRegressor()
#
# svr1.fit(x_train, y_train)
# svr2.fit(x_20f_tr, y_train)
# svr3.fit(np.append(x_5f_tr, x_20f_tr, axis=1), y_train)
# kr1.fit(x_train, y_train)
# kr2.fit(x_20f_tr, y_train)
# kr3.fit(np.append(x_5f_tr, x_20f_tr, axis=1), y_train)
# gpr1.fit(x_train, y_train)
# gpr2.fit(x_20f_tr, y_train)
# gpr3.fit(np.append(x_5f_tr, x_20f_tr, axis=1), y_train)
#
# y_svr1 = svr1.predict(x_test)
# y_svr2 = svr2.predict(x_20f)
# y_svr3 = svr3.predict(np.append(x_5f, x_20f, axis=1))
# y_kr1 = kr1.predict(x_test)
# y_kr2 = kr2.predict(x_20f)
# y_kr3 = kr3.predict(np.append(x_5f, x_20f, axis=1))
# y_gpr1 = gpr1.predict(x_test)
# y_gpr2 = gpr2.predict(x_20f)
# y_gpr3 = gpr3.predict(np.append(x_5f, x_20f, axis=1))
#
#
# def mean_absolute_percentage_error(y_true, y_pred):
# y_true, y_pred = np.array(y_true), np.array(y_pred)
# return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
#
#
# print('SVR1 7+20: MAE: ', mean_absolute_error(y_test, y_svr1), ' MAPE: ',
# mean_absolute_percentage_error(y_test, y_svr1))
# print('SVR2 20: MAE: ', mean_absolute_error(y_test, y_svr2), ' MAPE: ', mean_absolute_percentage_error(y_test, y_svr2))
# print('SVR3 5+20: MAE: ', mean_absolute_error(y_test, y_svr3), ' MAPE: ',
# mean_absolute_percentage_error(y_test, y_svr3))
#
# print('KRR1 7+20: MAE: ', mean_absolute_error(y_test, y_kr1), ' MAPE: ', mean_absolute_percentage_error(y_test, y_kr1))
# print('KRR2 20: MAE: ', mean_absolute_error(y_test, y_kr2), ' MAPE: ', mean_absolute_percentage_error(y_test, y_kr2))
# print('KRR3 5+20: MAE: ', mean_absolute_error(y_test, y_kr3), ' MAPE: ', mean_absolute_percentage_error(y_test, y_kr3))
#
# print('GPR1 7+20: MAE: ', mean_absolute_error(y_test, y_gpr1), ' MAPE: ',
# mean_absolute_percentage_error(y_test, y_gpr1))
# print('GPR2 20: MAE: ', mean_absolute_error(y_test, y_gpr2), ' MAPE: ', mean_absolute_percentage_error(y_test, y_gpr2))
# print('GPR3 5+20: MAE: ', mean_absolute_error(y_test, y_gpr3), ' MAPE: ',
# mean_absolute_percentage_error(y_test, y_gpr3))