def train():
    parser = argparse.ArgumentParser()
    parser.add_argument('--epoch', '-e', type=int, default=100)
    parser.add_argument('--batchsize', '-b', type=int, default=1)
    parser.add_argument('--train_dataset', '-tr', default='./data/ori/')
    parser.add_argument('--target_dataset', '-ta', default='./data/label/')
    parser.add_argument(
        '--lr',
        '-l',
        type=float,
        default=1e-5,
    )
    parser.add_argument('--out_path', '-o')
    parser.add_argument('--binary', '-bi', type=int, default=0)
    parser.add_argument('--model', '-m', type=int, default=0)
    parser.add_argument('--weight', '-w', type=int, default=0)
    parser.add_argument('--gpu', '-g', type=int, default=2)

    args = parser.parse_args()
    path_to_train = args.train_dataset
    path_to_target = args.target_dataset
    epoch = args.epoch
    batchsize = args.batchsize
    lr = args.lr
    out = args.out_path
    binary = [False, True][args.binary]

    # set gpu environment
    os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu)
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    sess = tf.Session(config=config)
    K.set_session(sess)

    if not os.path.exists(out):
        os.mkdir(out)
    f = open(out + '/param.txt', 'w')
    f.write('epoch:' + str(args.epoch) + '\n' + 'batch:' + str(batchsize) +
            '\n' + 'lr:' + str(lr))
    f.close()
    np.random.seed(seed=1)
    img_size = 512
    if binary:
        nb_class = 2
    else:
        # nb_class = 5
        nb_class = 3
    # 訓練、テスト画像の番号を設定
    # 31画像を訓練に、13画像をテストに
    num_ar = np.random.permutation([str(i).zfill(3) for i in np.arange(1, 45)])
    train_names = num_ar[:31]
    test_names = num_ar[31:]

    # 訓練の時はこの辺りのコメントを入れる
    nb_data = len(train_names)
    train_X, train_y = generate_dataset(train_names,
                                        path_to_train,
                                        path_to_target,
                                        img_size,
                                        color=3,
                                        nb_class=nb_class,
                                        aug=20)
    test_X, test_y = generate_dataset(test_names,
                                      path_to_train,
                                      path_to_target,
                                      img_size,
                                      color=0,
                                      nb_class=nb_class,
                                      aug=0)
    nb_train = train_X.shape[0]
    print('train data is ' + str(nb_train))

    #--------------------------------------------------------------------------------------------------------------------
    # training
    #--------------------------------------------------------------------------------------------------------------------
    # 訓練時は以下2つのコメントを入れる
    class_freq = np.array(
        [np.sum(train_y.argmax(axis=3) == i) for i in range(nb_class)])
    # class_weights = np.median(class_freq) /class_freq
    class_weights = np.mean(class_freq) / class_freq

    # FCN = FullyConvolutionalNetwork(img_height=img_size, img_width=img_size,FCN_CLASSES=nb_class)
    # unet = Unet(img_height=img_size, img_width=img_size,FCN_CLASSES=nb_class)
    # adam = Adam(lr)
    # train_model = FCN.create_fcn32s()
    # train_model = unet.create_model2()
    # train_model.compile(loss=crossentropy, optimizer=adam)
    # train_model.compile(loss=weighted_crossentropy, optimizer=adam)

    es_cb = EarlyStopping(monitor='val_loss',
                          patience=5,
                          verbose=0,
                          mode='auto')
    train_model = make_model(
        args.model, args.weight, img_size, nb_class, class_weights,
        lr)  # (model(1:fcn, 2:unet, 3:unet2) ,  weight(0:no weight 1:weight))
    train_model.fit(train_X, train_y, batch_size=batchsize, epochs=epoch)
    train_model.save_weights(out + '/weights.h5')
    # train_model.load_weights(out + '/weights.h5')

    #--------------------------------------------------------------------------------------------------------------------
    # predict
    #--------------------------------------------------------------------------------------------------------------------
    nb_test = len(test_names)
    color_map = make_color_map()

    mat = np.zeros([nb_class, nb_class])
    pred = train_model.predict(test_X)
    pred_score = pred.reshape((-1, nb_class))[:, 1]
    pred_label = pred.reshape((-1, nb_class)).argmax(axis=1)
    y = test_y.reshape((-1, nb_class)).argmax(axis=1)
    for i in range(len(y)):
        mat[y[i], pred_label[i]] += 1
    file = open(out + '/accuracy.csv', 'w')
    pd.DataFrame(mat).to_csv(out + '/confusion.csv')
    pixel_wise = np.sum([mat[k, k] for k in range(nb_class)]) / np.sum(mat)
    mean_acc_list = [mat[k, k] / np.sum(mat[k, :]) for k in range(nb_class)]
    mean_acc = np.sum(mean_acc_list) / nb_class
    mean_iou_list = [
        mat[k, k] / (np.sum(mat[k, :]) + np.sum(mat[:, k]) - mat[k, k])
        for k in range(nb_class)
    ]
    mean_iou = np.sum(mean_iou_list) / nb_class
    if binary:
        fpr, tpr, threshods = roc_curve(y, pred_score, pos_label=1)
        precision, recall, threshold = precision_recall_curve(y, pred_score)
        fpr_tpr = np.concatenate(
            (np.array(fpr)[:, np.newaxis], np.array(tpr)[:, np.newaxis]),
            axis=1)
        pr = np.concatenate(
            (np.array(precision)[:, np.newaxis], np.array(recall)[:,
                                                                  np.newaxis]),
            axis=1)
        np.savetxt(out + '/fpr_tpr.csv', fpr_tpr, delimiter=',')
        np.savetxt(out + '/precsion_recall.csv', pr, delimiter=',')
        auc_score = auc(fpr, tpr)
        recall = mat[1, 1] / np.sum(mat[1, :])
        precision = mat[1, 1] / np.sum(mat[:, 1])
        if recall == 0 and precision == 0:
            f_value = 0
        else:
            f_value = 2 * recall * precision / (recall + precision)
        plt.plot(fpr, tpr)
        plt.savefig(out + '/ROC.png')
        file.write('pixel wize: ' + str(pixel_wise) + '\n' + 'mean acc: ' +
                   str(mean_acc) + '\n' + 'mean iou: ' + str(mean_iou) + '\n' +
                   'auc: ' + str(auc_score) + '\n' + 'f_value: ' +
                   str(f_value))
    else:
        file.write('pixel wize: ' + str(pixel_wise) + '\n' + 'mean acc: ' +
                   str(mean_acc) + '\n' + 'mean iou: ' + str(mean_iou))
    file.close()

    #--------------------------------------------------------------------------------------------------------------------
    # visualize
    #--------------------------------------------------------------------------------------------------------------------
    ind = np.random.permutation(nb_train)[0:10]
    imgs = train_X[ind]
    pred_train = train_model.predict(train_X[ind])
    train_y = train_y[ind]
    for j in range(10):
        img = imgs[j] * 255.0
        pr = pred_train[j]
        y = train_y[j]
        pr = pr.argmax(axis=2)
        y = y.argmax(axis=2)
        y_rgb = np.zeros((img_size, img_size, 3))
        pred_rgb = np.zeros((img_size, img_size, 3))
        for i in range(nb_class):
            y_rgb[y == i] = color_map[i]
            pred_rgb[pr == i] = color_map[i]
        Image.fromarray(img.astype(np.uint8)).save(out + '/train_input_' +
                                                   str(j) + '.png')
        Image.fromarray(y_rgb.astype(np.uint8)).save(out + '/train_label_' +
                                                     str(j) + '.png')
        Image.fromarray(pred_rgb.astype(np.uint8)).save(out + '/train_pred_' +
                                                        str(j) + '.png')

    for pr, y, name in zip(pred, test_y, test_names):
        pr = pr.argmax(axis=2)
        y = y.argmax(axis=2)
        y_rgb = np.zeros((img_size, img_size, 3))
        pred_rgb = np.zeros((img_size, img_size, 3))
        for i in range(nb_class):
            y_rgb[y == i] = color_map[i]
            pred_rgb[pr == i] = color_map[i]
        # img.save(out + '/test_input_' + name + '.png')
        Image.fromarray(y_rgb.astype(np.uint8)).save(out + '/label_' + name +
                                                     '.png')
        Image.fromarray(pred_rgb.astype(np.uint8)).save(out + '/pred_' + name +
                                                        '.png')
Beispiel #2
0
from preprocess import load_data
from color_map import make_color_map

parser = argparse.ArgumentParser(description='Chainer Fully Convolutional Network: predict')
parser.add_argument('--gpu', '-g', default=-1, type=int,
                    help='GPU ID (negative value indicates CPU)')
parser.add_argument('--image_path', '-i', default=None, type=str)
parser.add_argument('--weight', '-w', default="weight/chainer_fcn.weight", type=str)
parser.add_argument('--classes', default=21, type=int)
parser.add_argument('--clop', "-c", default=True, type=bool)
parser.add_argument('--clopsize', "-s", default=224, type=int)
args = parser.parse_args()

img_name = args.image_path.split("/")[-1].split(".")[0]

color_map = make_color_map()
FCN = FullyConvolutionalNetwork()
model = FCN.create_model()
model.load_weights('weights/fcn_params')

o = load_data(args.image_path, size=args.clopsize, mode="original")
x = load_data(args.image_path, size=args.clopsize, mode="data")

start = time()
pred = model.predict(x)
pred = pred[0].argmax(axis=0)
print(pred.max())

row, col = pred.shape
dst = np.ones((row, col, 3))
for i in range(21):
Beispiel #3
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--image", type=str)
    parser.add_argument("--gpu", type=int, default=0)
    parser.add_argument("--model", default=None)
    parser.add_argument("--n_class", type=int, default=5)
    args = parser.parse_args()
    print(args)

    model = RefineResNet(n_class=args.n_class)
    if model is not None:
        serializers.load_npz(args.model, model)

    if args.gpu >= 0:
        cuda.get_device(args.gpu).use()
        model.to_gpu()

    org = cv2.imread(args.image, cv2.IMREAD_COLOR)
    image = cv2.imread(args.image, cv2.IMREAD_COLOR)

    org = cv2.resize(org, (160, 160))
    image = cv2.resize(image, (160, 160))

    image = np.asarray(image, dtype=np.float32)
    image = image.transpose((2, 0, 1))
    image = np.expand_dims(image, axis=0)
    pred = F.softmax(model(image)).data
    pred = pred[0].argmax(axis=0)
    print(pred)

    color_map = make_color_map()

    row, col = pred.shape
    dst = np.ones((row, col, 3))
    for i in range(args.n_class):
        dst[pred == i] = color_map[i]
    img = Image.fromarray(np.uint8(dst))

    trans = Image.new('RGBA', img.size, (0, 0, 0, 0))
    w, h = img.size
    for x in range(w):
        for y in range(h):
            pixel = img.getpixel((x, y))
            if (pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0)or \
               (pixel[0] == 255 and pixel[1] == 255 and pixel[2] == 255):
                continue
            trans.putpixel((x, y), pixel)

    if not os.path.exists("out"):
        os.mkdir("out")

    cv2.imwrite("out/original.jpg", org)
    trans.save("out/pred.png")

    o = cv2.imread("out/original.jpg", 1)
    p = cv2.imread("out/pred.png", 1)

    pred = cv2.addWeighted(o, 0.6, p, 0.4, 0.0)

    cv2.imwrite("out/pred_alpha.png", pred)

    os.remove("out/original.jpg")