Commit 51d31c2b authored by lucasb-eyer's avatar lucasb-eyer
Browse files

Fix the inference example when no black in anno.

Now it explicitly checks for there to be an all-0 pixel meaning
"unknown" and prints an info about it if it finds one.
This is a try at fixing #30 and #31.
parent 903c3316
...@@ -22,6 +22,7 @@ if len(sys.argv) != 4: ...@@ -22,6 +22,7 @@ if len(sys.argv) != 4:
print("Usage: python {} IMAGE ANNO OUTPUT".format(sys.argv[0])) print("Usage: python {} IMAGE ANNO OUTPUT".format(sys.argv[0]))
print("") print("")
print("IMAGE and ANNO are inputs and OUTPUT is where the result should be written.") print("IMAGE and ANNO are inputs and OUTPUT is where the result should be written.")
print("If there's at least one single full-black pixel in ANNO, black is assumed to mean unknown.")
sys.exit(1) sys.exit(1)
fn_im = sys.argv[1] fn_im = sys.argv[1]
...@@ -41,9 +42,15 @@ anno_lbl = anno_rgb[:,:,0] + (anno_rgb[:,:,1] << 8) + (anno_rgb[:,:,2] << 16) ...@@ -41,9 +42,15 @@ anno_lbl = anno_rgb[:,:,0] + (anno_rgb[:,:,1] << 8) + (anno_rgb[:,:,2] << 16)
# Note that all-black, i.e. the value 0 for background will stay 0. # Note that all-black, i.e. the value 0 for background will stay 0.
colors, labels = np.unique(anno_lbl, return_inverse=True) colors, labels = np.unique(anno_lbl, return_inverse=True)
# And create a mapping back from the labels to 32bit integer colors.
# But remove the all-0 black, that won't exist in the MAP! # But remove the all-0 black, that won't exist in the MAP!
colors = colors[1:] HAS_UNK = 0 in colors
if HAS_UNK:
print("Found a full-black pixel in annotation image, assuming it means 'unknown' label!")
colors = colors[1:]
#else:
# print("No single full-black pixel found in annotation image. Assuming there's no 'unknown' label!")
# And create a mapping back from the labels to 32bit integer colors.
colorize = np.empty((len(colors), 3), np.uint8) colorize = np.empty((len(colors), 3), np.uint8)
colorize[:,0] = (colors & 0x0000FF) colorize[:,0] = (colors & 0x0000FF)
colorize[:,1] = (colors & 0x00FF00) >> 8 colorize[:,1] = (colors & 0x00FF00) >> 8
...@@ -52,8 +59,8 @@ colorize[:,2] = (colors & 0xFF0000) >> 16 ...@@ -52,8 +59,8 @@ colorize[:,2] = (colors & 0xFF0000) >> 16
# Compute the number of classes in the label image. # Compute the number of classes in the label image.
# We subtract one because the number shouldn't include the value 0 which stands # We subtract one because the number shouldn't include the value 0 which stands
# for "unknown" or "unsure". # for "unknown" or "unsure".
n_labels = len(set(labels.flat)) - 1 n_labels = len(set(labels.flat)) - int(HAS_UNK)
print(n_labels, " labels and \"unknown\" 0: ", set(labels.flat)) print(n_labels, " labels", (" plus \"unknown\" 0: " if HAS_UNK else ""), set(labels.flat))
########################### ###########################
### Setup the CRF model ### ### Setup the CRF model ###
...@@ -67,7 +74,7 @@ if use_2d: ...@@ -67,7 +74,7 @@ if use_2d:
d = dcrf.DenseCRF2D(img.shape[1], img.shape[0], n_labels) d = dcrf.DenseCRF2D(img.shape[1], img.shape[0], n_labels)
# get unary potentials (neg log probability) # get unary potentials (neg log probability)
U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=True) U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=HAS_UNK)
d.setUnaryEnergy(U) d.setUnaryEnergy(U)
# This adds the color-independent term, features are the locations only. # This adds the color-independent term, features are the locations only.
...@@ -86,7 +93,7 @@ else: ...@@ -86,7 +93,7 @@ else:
d = dcrf.DenseCRF(img.shape[1] * img.shape[0], n_labels) d = dcrf.DenseCRF(img.shape[1] * img.shape[0], n_labels)
# get unary potentials (neg log probability) # get unary potentials (neg log probability)
U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=True) U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=HAS_UNK)
d.setUnaryEnergy(U) d.setUnaryEnergy(U)
# This creates the color-independent features and then add them to the CRF # This creates the color-independent features and then add them to the CRF
...@@ -114,8 +121,9 @@ Q = d.inference(5) ...@@ -114,8 +121,9 @@ Q = d.inference(5)
MAP = np.argmax(Q, axis=0) MAP = np.argmax(Q, axis=0)
# Convert the MAP (labels) back to the corresponding colors and save the image. # Convert the MAP (labels) back to the corresponding colors and save the image.
# Note that there is no "unknown" here anymore, no matter what we had at first.
MAP = colorize[MAP,:] MAP = colorize[MAP,:]
imsave(fn_output, MAP.reshape(img.shape)) imwrite(fn_output, MAP.reshape(img.shape))
# Just randomly manually run inference iterations # Just randomly manually run inference iterations
Q, tmp1, tmp2 = d.startInference() Q, tmp1, tmp2 = d.startInference()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment