Diff of /utils_plots.py [000000] .. [70b6b3]

Switch to side-by-side view

--- a
+++ b/utils_plots.py
@@ -0,0 +1,363 @@
+import matplotlib
+import utils
+
+if utils.hostname() != 'user':
+    matplotlib.use('Agg')
+
+import matplotlib.pyplot as plt
+import warnings
+import numpy as np
+import matplotlib.animation as animation
+
+warnings.simplefilter('ignore')
+anim_running = True
+
+
+def plot_slice_3d_2(image3d, mask, axis, pid, img_dir=None, idx=None):
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    masked_image = image3d * mask
+    if idx is None:
+        roi_idxs = np.where(mask == 1.)
+        if len(roi_idxs[0]) > 0:
+            idx = (np.mean(roi_idxs[0]), np.mean(roi_idxs[1]), np.mean(roi_idxs[2]))
+        else:
+            print 'No nodules'
+            idx = np.array(image3d.shape) / 2
+    else:
+        idx = idx.astype(int)
+    if axis == 0:  # sax
+        ax[0, 0].imshow(image3d[idx[0], :, :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[idx[0], :, :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(masked_image[idx[0], :, :], cmap=plt.cm.gray)
+    if axis == 1:  # 2 lungs
+        ax[0, 0].imshow(image3d[:, idx[1], :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, idx[1], :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(masked_image[:, idx[1], :], cmap=plt.cm.gray)
+    if axis == 2:  # side view
+        ax[0, 0].imshow(image3d[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[1, 0].imshow(masked_image[:, :, idx[2]], cmap=plt.cm.gray)
+
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s%s.png' % (pid, axis), bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_slice_3d_3(input, mask, prediction, axis, pid, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+    mask = np.asarray(mask)
+    prediction = np.asarray(prediction)
+
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    if idx is None:
+        roi_idxs = np.where(mask > 0)
+        if len(roi_idxs[0]) > 0:
+            idx = (int(np.mean(roi_idxs[0])),
+                   int(np.mean(roi_idxs[1])),
+                   int(np.mean(roi_idxs[2])))
+        else:
+            print 'No nodules'
+            idx = np.array(input.shape) / 2
+    else:
+        idx = idx.astype(int)
+    if axis == 0:  # sax
+        ax[0, 0].imshow(prediction[idx[0], :, :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[idx[0], :, :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[idx[0], :, :], cmap=plt.cm.gray)
+    if axis == 1:  # 2 lungs
+        ax[0, 0].imshow(prediction[:, idx[1], :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, idx[1], :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, idx[1], :], cmap=plt.cm.gray)
+    if axis == 2:  # side view
+        ax[0, 0].imshow(prediction[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, :, idx[2]], cmap=plt.cm.gray)
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s-%s.png' % (pid, axis), bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_slice_3d_3axis(input, pid, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    ax[0, 0].imshow(input[idx[0], :, :], cmap=plt.cm.gray)
+    ax[1, 0].imshow(input[:, idx[1], :], cmap=plt.cm.gray)
+    ax[0, 1].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s.png' % (pid), bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_slice_3d_4(input, mask, prediction, lung_mask, axis, pid, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+    mask = np.asarray(mask)
+    prediction = np.asarray(prediction)
+
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    if idx is None:
+        roi_idxs = np.where(mask > 0)
+        if len(roi_idxs[0]) > 0:
+            idx = (int(np.mean(roi_idxs[0])),
+                   int(np.mean(roi_idxs[1])),
+                   int(np.mean(roi_idxs[2])))
+        else:
+            print 'No nodules'
+            idx = np.array(input.shape) / 2
+    else:
+        idx = idx.astype(int)
+    if axis == 0:  # sax
+        ax[0, 0].imshow(prediction[idx[0], :, :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[idx[0], :, :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[idx[0], :, :], cmap=plt.cm.gray)
+        ax[1, 1].imshow(lung_mask[idx[0], :, :], cmap=plt.cm.gray)
+    if axis == 1:  # 2 lungs
+        ax[0, 0].imshow(prediction[:, idx[1], :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, idx[1], :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, idx[1], :], cmap=plt.cm.gray)
+        ax[1, 1].imshow(lung_mask[:, idx[1], :], cmap=plt.cm.gray)
+    if axis == 2:  # side view
+        ax[0, 0].imshow(prediction[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[1, 1].imshow(lung_mask[:, :, idx[2]], cmap=plt.cm.gray)
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s-%s.png' % (pid, axis), bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_slice_3d_3_patch(input, mask, prediction, axis, pid, patch_size=64, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+    mask = np.asarray(mask)
+    prediction = np.asarray(prediction)
+
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    if idx is None:
+        roi_idxs = np.where(mask > 0)
+        if len(roi_idxs[0]) > 0:
+            idx = (np.mean(roi_idxs[0]), np.mean(roi_idxs[1]), np.mean(roi_idxs[2]))
+        else:
+            print 'No nodules'
+            idx = np.array(input.shape) / 2
+    if axis == 0:  # sax
+        sz, sy, sx = slice(idx[0], idx[0] + 1), slice(idx[1] - patch_size, idx[1] + patch_size), slice(
+            idx[2] - patch_size, idx[2] + patch_size)
+        ax[0, 0].imshow(prediction[sz, sy, sx], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[sz, sy, sx], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[sz, sy, sx], cmap=plt.cm.gray)
+    if axis == 1:  # 2 lungs
+        ax[0, 0].imshow(prediction[:, idx[1], :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, idx[1], :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, idx[1], :], cmap=plt.cm.gray)
+    if axis == 2:  # side view
+        ax[0, 0].imshow(prediction[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[:, :, idx[2]], cmap=plt.cm.gray)
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s.png' % pid, bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_slice_3d_2_patch(ct_scan, mask, pid, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    ct_scan = np.asarray(ct_scan)
+    mask = np.asarray(mask)
+
+    fig, ax = plt.subplots(2, 3, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+
+    if idx == None:
+        #just plot in the middle of the cube
+        in_sh = ct_scan.shape
+        idx = [in_sh[0]/2,in_sh[1]/2,in_sh[2]/2]
+    print np.amin(ct_scan), np.amax(ct_scan)
+    print np.amin(mask), np.amax(mask)
+
+
+    ax[0, 0].imshow(ct_scan[idx[0], :, :], cmap=plt.cm.gray)
+    ax[0, 1].imshow(ct_scan[:, idx[1], :], cmap=plt.cm.gray)
+    ax[0, 2].imshow(ct_scan[:, :, idx[2]], cmap=plt.cm.gray)
+
+    ax[1, 0].imshow(mask[idx[0], :, :], cmap=plt.cm.gray)
+    ax[1, 1].imshow(mask[:, idx[1], :], cmap=plt.cm.gray)
+    ax[1, 2].imshow(mask[:, :, idx[2]], cmap=plt.cm.gray)
+
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s.png' % pid, bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_2d(img, mask, pid, img_dir):
+    # fig = plt.figure()
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    ax[0, 0].imshow(img, cmap='gray')
+    ax[0, 1].imshow(mask, cmap='gray')
+    ax[1, 0].imshow(img * mask, cmap='gray')
+    plt.show()
+    fig.savefig(img_dir + '/%s.png' % pid, bbox_inches='tight')
+    fig.clf()
+    plt.close('all')
+
+
+def plot_2d_4(img, img_prev, img_next, mask, pid, img_dir):
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    ax[0, 0].imshow(img, cmap='gray')
+    ax[0, 1].imshow(img_prev, cmap='gray')
+    ax[1, 0].imshow(img_next, cmap='gray')
+    ax[1, 1].imshow(img * mask, cmap='gray')
+    plt.show()
+    fig.savefig(img_dir + '/%s.png' % pid, bbox_inches='tight')
+    fig.clf()
+    plt.close('all')
+
+
+def plot_2d_animation(input, mask, predictions):
+    rgb_image = np.concatenate((input, input, input), axis=0)
+    mask = np.concatenate((np.zeros_like(input), mask, predictions), axis=0)
+    # green = targets
+    # blue = predictions
+    # red = overlap
+
+    idxs = np.where(mask > 0.3)
+    rgb_image[idxs] = mask[idxs]
+
+    rgb_image = np.rollaxis(rgb_image, axis=0, start=4)
+    print rgb_image.shape
+
+    def get_data_step(step):
+        return rgb_image[step, :, :, :]
+
+    fig = plt.figure()
+    im = fig.gca().imshow(get_data_step(0))
+
+    def init():
+        im.set_data(get_data_step(0))
+        return im,
+
+    def animate(i):
+        im.set_data(get_data_step(i))
+        return im,
+
+    anim = animation.FuncAnimation(fig, animate, init_func=init,
+                                   frames=rgb_image.shape[1],
+                                   interval=20000 / rgb_image.shape[0],
+                                   blit=True)
+
+    def on_click(event):
+        global anim_running
+        if anim_running:
+            anim.event_source.stop()
+            anim_running = False
+        else:
+            anim.event_source.start()
+            anim_running = True
+
+    fig.canvas.mpl_connect('button_press_event', on_click)
+    try:
+        plt.show()
+    except AttributeError:
+        pass
+
+def plot_all_slices(input, pid, img_dir=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+
+    for idx in range(0, input.shape[0]-3, 4):
+        fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+        fig.canvas.set_window_title(pid)
+        ax[0, 0].imshow(input[idx, :, :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(input[idx+1, :, :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(input[idx+2, :, :], cmap=plt.cm.gray)
+        ax[1, 1].imshow(input[idx+3, :, :], cmap=plt.cm.gray)
+
+        if img_dir is not None:
+            fig.savefig(img_dir + '_' + str(pid) + '_' + str(idx) + '.png' , bbox_inches='tight')
+        else:
+            plt.show()
+        fig.clf()
+        plt.close('all')
+
+
+def plot_all_slices(ct_scan, mask, pid, img_dir=None):
+    # to convert cuda arrays to numpy array
+    ct_scan = np.asarray(ct_scan)
+    mask = np.asarray(mask)
+
+    for idx in range(0, mask.shape[0]-3, 2):
+        fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+        fig.canvas.set_window_title(pid)
+        ax[0, 0].imshow(mask[idx, :, :], cmap=plt.cm.gray)
+        ax[1, 0].imshow(ct_scan[idx+1, :, :], cmap=plt.cm.gray)
+        ax[0, 1].imshow(mask[idx+2, :, :], cmap=plt.cm.gray)
+        ax[1, 1].imshow(ct_scan[idx+3, :, :], cmap=plt.cm.gray)
+
+        if img_dir is not None:
+            fig.savefig(img_dir + '_' + str(pid) + '_' + str(idx) + '.png' , bbox_inches='tight')
+        else:
+            plt.show()
+        fig.clf()
+        plt.close('all')
+
+def plot_4_slices(input, pid, img_dir=None, idx=None):
+    # to convert cuda arrays to numpy array
+    input = np.asarray(input)
+
+    fig, ax = plt.subplots(2, 2, figsize=[8, 8])
+    fig.canvas.set_window_title(pid)
+    ax[0, 0].imshow(input[idx[0], :, :], cmap=plt.cm.gray)
+    ax[1, 0].imshow(input[:, idx[1], :], cmap=plt.cm.gray)
+    ax[0, 1].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+    ax[1, 1].imshow(input[:, :, idx[2]], cmap=plt.cm.gray)
+
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s.png' % (pid), bbox_inches='tight')
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')
+
+
+def plot_learning_curves(train_losses, valid_losses, expid, img_dir):
+    fig = plt.figure()
+    x_range = np.arange(len(train_losses)) + 1
+
+    plt.plot(x_range, train_losses)
+    plt.plot(x_range, valid_losses)
+
+    if img_dir is not None:
+        fig.savefig(img_dir + '/%s.png' % expid, bbox_inches='tight')
+        print 'Saved plot'
+    else:
+        plt.show()
+    fig.clf()
+    plt.close('all')