Spaces:
Sleeping
Sleeping
| from torch import randperm, utils | |
| from torch._utils import _accumulate | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| from matplotlib import offsetbox | |
| from PIL import Image | |
| class Subset(utils.data.Dataset): | |
| """ | |
| Subset of a dataset at specified indices. | |
| Arguments: | |
| dataset (Dataset): The whole Dataset | |
| indices (sequence): Indices in the whole set selected for subset | |
| """ | |
| def __init__(self, dataset, indices): | |
| self.dataset = dataset | |
| self.indices = indices | |
| def __getitem__(self, idx): | |
| return self.dataset[self.indices[idx]] | |
| def __len__(self): | |
| return len(self.indices) | |
| def random_split(dataset, lengths): | |
| """ | |
| Randomly split a dataset into non-overlapping new datasets of given lengths. | |
| Arguments: | |
| dataset (Dataset): Dataset to be split | |
| lengths (sequence): lengths of splits to be produced | |
| """ | |
| if sum(lengths) != len(dataset): | |
| raise ValueError("Sum of input lengths does not equal the length of the input dataset!") | |
| indices = randperm(sum(lengths)) | |
| return [Subset(dataset, indices[offset - length:offset]) for offset, length in zip(_accumulate(lengths), lengths)] | |
| # Quizas deberia eliminar 3d o limpiar | |
| def plot_embedding(X, merged, title = None, classes=11., showimage=True, distPl=0.006, onlyRoman=False): | |
| x_min, x_max = np.min(X, 0), np.max(X, 0) | |
| X = (X - x_min) / (x_max - x_min) | |
| plt.figure() | |
| ax = plt.subplot(111) | |
| ax.set_facecolor('xkcd:white') | |
| """ | |
| for i in range(X.shape[0]): | |
| plt.text(X[i, 0], X[i, 1], str(merged.iloc[i][1]), | |
| color=plt.cm.Set1(int(merged.iloc[i][1]) / float(classes)), | |
| fontdict={'weight': 'bold', 'size': 9}) | |
| """ | |
| """ | |
| for i in range(X.shape[0]): | |
| if int(merged.iloc[i][1]) == 22: | |
| plt.plot([X[i, 0]], [X[i, 1]], 'X', c="black", markersize=10) | |
| plt.plot([X[i, 0]], [X[i, 1]], 'X', c='black', markersize=8) | |
| else: | |
| plt.plot([X[i, 0]], [X[i, 1]], 'o', c="black", markersize=6) | |
| plt.plot([X[i, 0]], [X[i, 1]], 'o',c=plt.cm.Set3(int(merged.iloc[i][1])), markersize=4) | |
| """ | |
| if showimage and hasattr(offsetbox, 'AnnotationBbox'): | |
| shown_images = np.array([[1., 1.]]) | |
| for i in range(merged.shape[0]): | |
| dist = np.sum((X[i] - shown_images) ** 2, 1) | |
| if np.min(dist) < distPl: #6e-4: | |
| # don't show points that are too close | |
| continue | |
| shown_images = np.r_[shown_images, [X[i]]] | |
| image = Image.open(merged.iloc[i][0]) | |
| inverted_image = image #PIL.ImageOps.invert(image) | |
| inverted_image.thumbnail((40, 40), Image.ANTIALIAS) | |
| props = dict(facecolor=plt.cm.Set3(int(merged.iloc[i][1])), alpha=1, lw=1) | |
| imagebox = offsetbox.AnnotationBbox( | |
| offsetbox.OffsetImage(inverted_image, cmap=plt.cm.gray), | |
| X[i]+0.030, bboxprops=props) | |
| ax.add_artist(imagebox) | |
| plt.xticks([]), plt.yticks([]) | |
| #cbar = plt.colorbar() | |
| if title is not None: | |
| plt.title(title) | |
| import numpy as np | |
| import cv2 | |
| from skimage import measure | |
| def landmarks(img_grey, N = 50): | |
| thresh = 200 | |
| ret,img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY) | |
| if img.ndim == 2: | |
| img_s = np.ones((img.shape[0] + 100, img.shape[0] + 100)) * 255 | |
| img_s[50:-50, 50:-50] = img | |
| img = img_s | |
| contours = measure.find_contours(img, 0.5) | |
| #fig = plt.figure(figsize=(7, 7)) | |
| #ax = fig.add_subplot(111) | |
| #ax.imshow(img, interpolation='nearest', cmap=plt.cm.gray) | |
| # for n, contour in enumerate(contours): | |
| #print(contours[0].shape) | |
| contour = contours[0] | |
| #ax.plot(contour[:, 1], contour[:, 0], linewidth=5) | |
| # resample_contour = contour[np.random.choice(contour.shape[0], 150, replace=False), :] | |
| resample_contour = interpcurve(N, contour[:, 0], contour[:, 1]) | |
| # print(resample_contour[:4, 0], resample_contour[:4, 1], resample_contour[:4].ravel()) | |
| #df_semilandmarks.loc[index] = [id_name, classe_name] + list(resample_contour.ravel()) | |
| #ax.plot(resample_contour[:, 1], resample_contour[:, 0], 'om', linewidth=5) | |
| #plt.savefig('output/landmarked_'+id_name) | |
| #plt.show() | |
| return resample_contour | |
| def interpcurve(N, pX, pY): | |
| #equally spaced in arclength | |
| N = np.transpose(np.linspace(0, 1, N)) | |
| #how many points will be uniformly interpolated? | |
| nt = N.size | |
| #number of points on the curve | |
| n = pX.size | |
| pxy = np.array((pX, pY)).T | |
| p1 = pxy[0,:] | |
| pend = pxy[-1,:] | |
| last_segment = np.linalg.norm(np.subtract(p1, pend)) | |
| epsilon= 10 * np.finfo(float).eps | |
| #IF the two end points are not close enough lets close the curve | |
| if last_segment > epsilon * np.linalg.norm(np.amax(abs(pxy), axis=0)): | |
| pxy = np.vstack((pxy, p1)) | |
| nt = nt + 1 | |
| pt = np.zeros((nt, 2)) | |
| #Compute the chordal arclength of each segment. | |
| chordlen = (np.sum(np.diff(pxy, axis=0) ** 2, axis=1)) ** (1 / 2) | |
| #Normalize the arclengths to a unit total | |
| chordlen = chordlen / np.sum(chordlen) | |
| #cumulative arclength | |
| cumarc = np.append(0, np.cumsum(chordlen)) | |
| tbins= np.digitize(N, cumarc) # bin index in which each N is in | |
| #catch any problems at the ends | |
| tbins[np.where(tbins<=0 | (N<=0))]=1 | |
| tbins[np.where(tbins >= n | (N >= 1))] = n - 1 | |
| s = np.divide((N - cumarc[tbins]), chordlen[tbins-1]) | |
| pt = pxy[tbins,:] + np.multiply((pxy[tbins,:] - pxy[tbins-1,:]), (np.vstack([s]*2)).T) | |
| return pt | |
| def segmentation(img, vertical): | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| #plt.imshow(img, cmap=plt.cm.gray) | |
| if vertical: | |
| background_0 = np.ones((img.shape)) + 254 | |
| background_0[img.shape[0]//2:, :] = img[img.shape[0]//2:,:] | |
| #plt.imshow(background_0, cmap=plt.cm.gray) | |
| #fig = plt.figure() | |
| background_1 = np.ones((img.shape)) + 254 | |
| background_1[:img.shape[0]//2, :] = img[:img.shape[0]//2,:] | |
| #plt.imshow(background_1, cmap=plt.cm.gray) | |
| #fig = plt.figure() | |
| else: | |
| background_1 = np.ones((img.shape)) + 254 | |
| background_1[:, :img.shape[0]//2] = img[:,:img.shape[0]//2] | |
| #plt.imshow(background_0, cmap=plt.cm.gray) | |
| #fig = plt.figure() | |
| background_0 = np.ones((img.shape)) + 254 | |
| background_0[:, img.shape[0]//2:] = img[:,img.shape[0]//2:] | |
| #plt.imshow(background_1, cmap=plt.cm.gray) | |
| #fig = plt.figure() | |
| return background_0, background_1 | |
| def plotTwoImages(img_1, img_2, title): | |
| plt.figure(figsize=(12,5)) | |
| plt.subplot(1, 2, 1) | |
| plt.imshow(img_1) | |
| plt.title(title[0]) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| plt.subplot(1, 2, 2) | |
| plt.imshow(img_2) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| plt.title(title[1]) | |
| def plotLandmarks(landmarks_img_1_part_2, landmarks_img_2_part_2, title, comparateShow=True): | |
| plt.figure(figsize=(12,5)) | |
| size = (1, 2) | |
| if comparateShow: | |
| size = (1, 3) | |
| plt.subplot( size[0], size[1], 1) | |
| plt.plot(landmarks_img_1_part_2[:,0], landmarks_img_1_part_2[:,1], '-o') | |
| plt.fill(landmarks_img_1_part_2[:, 0] , landmarks_img_1_part_2[:, 1], 'k') | |
| plt.title(title[0]) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| plt.subplot(size[0], size[1], 2) | |
| plt.plot(landmarks_img_2_part_2[:,0], landmarks_img_2_part_2[:,1], '-o') | |
| plt.fill(landmarks_img_2_part_2[:, 0] , landmarks_img_2_part_2[:, 1], 'k') | |
| plt.title(title[1]) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| if comparateShow: | |
| plt.subplot(size[0], size[1], 3) | |
| plt.plot(landmarks_img_1_part_2[:,0], landmarks_img_1_part_2[:,1], '-o') | |
| plt.plot(landmarks_img_2_part_2[:,0], landmarks_img_2_part_2[:,1], '-o') | |
| plt.title(title[2]) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| def plotLandmarks2(landmarks_img_1_part_2, landmarks_img_2_part_2, title, comparateShow=True): | |
| plt.figure(figsize=(12,5)) | |
| fig, (ax1) = plt.subplots(1, 1, figsize=(12,5)) | |
| ax1.axis("off") | |
| landmarks_img_1_part_2 = landmarks_img_1_part_2 * -1 | |
| landmarks_img_2_part_2 = landmarks_img_2_part_2 * -1 | |
| ax1.plot(landmarks_img_1_part_2[:,1], landmarks_img_1_part_2[:,0], '-o') | |
| ax1.plot(landmarks_img_2_part_2[:,1], landmarks_img_2_part_2[:,0], '-o') | |
| plt.title(title[2]) | |
| ax1.set_aspect(2) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| def plotLandmarksItem(fig, ax1, landmarks_img_1_part_2, landmarks_img_2_part_2, title, comparateShow=True): | |
| ax1.axis("off") | |
| landmarks_img_1_part_2 = landmarks_img_1_part_2 * -1 | |
| landmarks_img_2_part_2 = landmarks_img_2_part_2 * -1 | |
| ax1.plot(landmarks_img_1_part_2[:,1], landmarks_img_1_part_2[:,0], '-o') | |
| ax1.plot(landmarks_img_2_part_2[:,1], landmarks_img_2_part_2[:,0], '-o') | |
| ax1.set_title(title) | |
| ax1.set_aspect(1) | |
| def plotLandmarksALL(img_0, img_1, landmarks_img_1_part_1, landmarks_img_2_part_1, landmarks_img_1_part_2, landmarks_img_2_part_2, title): | |
| plt.figure(figsize=(12,5)) | |
| fig, (ax0, ax1, ax2, ax3) = plt.subplots(1, 4, figsize=(12,5)) | |
| ax0.axis("off") | |
| ax0.set_title('INPUT') | |
| ax3.axis("off") | |
| ax3.set_title('OUTPUT') | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| ax0.imshow(img_0) | |
| plotLandmarksItem(fig, ax1, landmarks_img_1_part_1, landmarks_img_2_part_1, title[0]) | |
| plotLandmarksItem(fig, ax2, landmarks_img_1_part_2, landmarks_img_2_part_2, title[1]) | |
| ax3.imshow(img_1) | |
| plt.xticks([]) | |
| plt.yticks([]) | |
| if __name__ == "__main__": | |
| pass |