rle_encode の +2については、

  • pixel は 1 から、採番していくため、+1
  • 0番目と1番目の差異を index=0とするため、実際のmask は +1
def rle_encode(mask):
    """ Ref. https://www.kaggle.com/paulorzp/run-length-encode-and-decode
    """
    pixels = mask.flatten('F')
    pixels[0] = 0
    pixels[-1] = 0
    runs = np.where(pixels[1:] != pixels[:-1])[0] + 2
    runs[1::2] = runs[1::2] - runs[:-1:2]
    return ' '.join(str(x) for x in runs)
rle_encode(np.array([0,1,1,0]))

>>> '2 2'