Santipab's picture
Upload 30 files
a19d827 verified
raw
history blame
5.51 kB
import cv2
import torch
from draw_gaussian import *
import transform
import math
def processing_test(image, input_h, input_w):
image = cv2.resize(image, (input_w, input_h))
out_image = image.astype(np.float32) / 255.
out_image = out_image - 0.5
out_image = out_image.transpose(2, 0, 1).reshape(1, 3, input_h, input_w)
out_image = torch.from_numpy(out_image)
return out_image
def draw_spinal(pts, out_image):
colors = [(0, 0, 255), (0, 255, 255), (255, 0, 255), (0, 255, 0)]
for i in range(4):
cv2.circle(out_image, (int(pts[i, 0]), int(pts[i, 1])), 3, colors[i], 1, 1)
cv2.putText(out_image, '{}'.format(i+1), (int(pts[i, 0]), int(pts[i, 1])),
cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0,0,0),1,1)
for i,j in zip([0,1,2,3], [1,2,3,0]):
cv2.line(out_image,
(int(pts[i, 0]), int(pts[i, 1])),
(int(pts[j, 0]), int(pts[j, 1])),
color=colors[i], thickness=1, lineType=1)
return out_image
def rearrange_pts(pts):
# rearrange left right sequence
boxes = []
centers = []
for k in range(0, len(pts), 4):
pts_4 = pts[k:k+4,:]
x_inds = np.argsort(pts_4[:, 0])
pt_l = np.asarray(pts_4[x_inds[:2], :])
pt_r = np.asarray(pts_4[x_inds[2:], :])
y_inds_l = np.argsort(pt_l[:,1])
y_inds_r = np.argsort(pt_r[:,1])
tl = pt_l[y_inds_l[0], :]
bl = pt_l[y_inds_l[1], :]
tr = pt_r[y_inds_r[0], :]
br = pt_r[y_inds_r[1], :]
# boxes.append([tl, tr, bl, br])
boxes.append(tl)
boxes.append(tr)
boxes.append(bl)
boxes.append(br)
centers.append(np.mean(pts_4, axis=0))
bboxes = np.asarray(boxes, np.float32)
# rearrange top to bottom sequence
centers = np.asarray(centers, np.float32)
sort_tb = np.argsort(centers[:,1])
new_bboxes = []
for sort_i in sort_tb:
new_bboxes.append(bboxes[4*sort_i, :])
new_bboxes.append(bboxes[4*sort_i+1, :])
new_bboxes.append(bboxes[4*sort_i+2, :])
new_bboxes.append(bboxes[4*sort_i+3, :])
new_bboxes = np.asarray(new_bboxes, np.float32)
return new_bboxes
def generate_ground_truth(image,
pts_2,
image_h,
image_w,
img_id):
hm = np.zeros((1, image_h, image_w), dtype=np.float32)
wh = np.zeros((17, 2*4), dtype=np.float32)
reg = np.zeros((17, 2), dtype=np.float32)
ind = np.zeros((17), dtype=np.int64)
reg_mask = np.zeros((17), dtype=np.uint8)
if pts_2[:,0].max()>image_w:
print('w is big', pts_2[:,0].max())
if pts_2[:,1].max()>image_h:
print('h is big', pts_2[:,1].max())
if pts_2.shape[0]!=68:
print('ATTENTION!! image {} pts does not equal to 68!!! '.format(img_id))
for k in range(17):
pts = pts_2[4*k:4*k+4,:]
bbox_h = np.mean([np.sqrt(np.sum((pts[0,:]-pts[2,:])**2)),
np.sqrt(np.sum((pts[1,:]-pts[3,:])**2))])
bbox_w = np.mean([np.sqrt(np.sum((pts[0,:]-pts[1,:])**2)),
np.sqrt(np.sum((pts[2,:]-pts[3,:])**2))])
cen_x, cen_y = np.mean(pts, axis=0)
ct = np.asarray([cen_x, cen_y], dtype=np.float32)
ct_int = ct.astype(np.int32)
radius = gaussian_radius((math.ceil(bbox_h), math.ceil(bbox_w)))
radius = max(0, int(radius))
draw_umich_gaussian(hm[0,:,:], ct_int, radius=radius)
ind[k] = ct_int[1] * image_w + ct_int[0]
reg[k] = ct - ct_int
reg_mask[k] = 1
for i in range(4):
wh[k,2*i:2*i+2] = ct-pts[i,:]
ret = {'input': image,
'hm': hm,
'ind': ind,
'reg': reg,
'wh': wh,
'reg_mask': reg_mask,
}
return ret
# def filter_pts(pts, w, h):
# pts_new = []
# for pt in pts:
# if any(pt) < 0 or pt[0] > w - 1 or pt[1] > h - 1:
# continue
# else:
# pts_new.append(pt)
# return np.asarray(pts_new, np.float32)
def processing_train(image, pts, image_h, image_w, down_ratio, aug_label, img_id):
# filter pts ----------------------------------------------------
h,w,c = image.shape
# pts = filter_pts(pts, w, h)
# ---------------------------------------------------------------
data_aug = {'train': transform.Compose([transform.ConvertImgFloat(),
transform.PhotometricDistort(),
transform.Expand(max_scale=1.5, mean=(0, 0, 0)),
transform.RandomMirror_w(),
transform.Resize(h=image_h, w=image_w)]),
'val': transform.Compose([transform.ConvertImgFloat(),
transform.Resize(h=image_h, w=image_w)])}
if aug_label:
out_image, pts = data_aug['train'](image.copy(), pts)
else:
out_image, pts = data_aug['val'](image.copy(), pts)
out_image = np.clip(out_image, a_min=0., a_max=255.)
out_image = np.transpose(out_image / 255. - 0.5, (2,0,1))
pts = rearrange_pts(pts)
pts2 = transform.rescale_pts(pts, down_ratio=down_ratio)
return np.asarray(out_image, np.float32), pts2