Team Ai
Apppublic

DFisch/Image-Manipulation-Detection

sourceHugging Facecc-by-nc-sa-4.0updated 2y agoView on Hugging Face
5likes
dfutils.py171 linesDownload Raw Back to scripts
1import matplotlib.pyplot as plt2import numpy as np3from sklearn.metrics import roc_auc_score, f1_score, jaccard_score, accuracy_score4import tensorflow as tf5 6 7 8# create prediction mask9def create_mask(pred_mask):10  if pred_mask.shape[-1] > 1:11      pred_mask = tf.argmax(pred_mask, axis=-1)12      pred_mask = pred_mask[..., tf.newaxis]13  14  return pred_mask[0]15 16 17 18def metric_copy(premask, groundtruth):19    seg_inv, gt_inv = np.logical_not(premask), np.logical_not(groundtruth)20    true_pos = float(np.logical_and(premask, groundtruth).sum())  # float for division21    true_neg = np.logical_and(seg_inv, gt_inv).sum()22    false_pos = np.logical_and(premask, gt_inv).sum()23    false_neg = np.logical_and(seg_inv, groundtruth).sum()24    f1 = 2 * true_pos / (2 * true_pos + false_pos + false_neg + 1e-6)25    cross = np.logical_and(premask, groundtruth)26    union = np.logical_or(premask, groundtruth)27    iou = np.sum(cross) / (np.sum(union) + 1e-6)28    if np.sum(cross) + np.sum(union) == 0:29        iou = 130    return f1, iou31 32 33 34def show_prediction(img, pred):35    print("max_pred = ", np.max(pred), " min_pred = ", np.min(pred))36    plt.subplot(1,2,1)37    plt.imshow(img)38    plt.subplot(1,2,2)39    plt.imshow(pred, cmap='gray') #, vmin=0, vmax=1)40    plt.show()41 42 43def show_predictions(dataset=None, num=1):44  if dataset:45    for image, mask in dataset.take(num):46      pred_mask = model.predict(image)47      display([image[0], mask[0], create_mask(pred_mask)])48  else:49    print(sample_image.shape)50    print(sample_mask.shape)51    display([sample_image, sample_mask,52             create_mask(model.predict(sample_image[tf.newaxis, ...]))])53 54 55 56def display(display_list, reverseRGB = True):57  plt.figure(figsize=(4, 4))58 59  title = ['Input Image', 'True Mask', 'Predicted Mask']60 61  for i in range(len(display_list)):62    plt.subplot(1, len(display_list), i+1)63    plt.title(title[i])64    if reverseRGB:65        plt.imshow(tf.keras.utils.array_to_img(display_list[i][...,::-1]))66    else:67        plt.imshow(tf.keras.utils.array_to_img(display_list[i]))68    plt.axis('off')69  plt.show()70 71 72def get_gt_and_osn_folders(folder):73    folder_list = [folder]74    folder_list.append(folder+"_Facebook")75    folder_list.append(folder+"_Whatsapp")76    folder_list.append(folder+"_Weibo")77    folder_list.append(folder+"_Wechat")78    gt_folder = folder + "_GT"79    return gt_folder,folder_list80 81def get_gt_and_osn_folder(folder, osn):82    osn_folder = folder+osn83    gt_folder = folder + "_GT"84    return gt_folder,osn_folder85 86 87# plots the image + prediction + ground truth88def plot_img_pred_gt(img_path, pre_t, gt):89    print("INPUT plot_img_pred_gt:")90    print("  img_path: ", img_path)91    #get image92    img = cv2.imread(img_path)93    #plot image, prediction and mask94    plot_img_pred_gt_execute(img,pre_t, gt)95 96    97def plot_img_pred_gt_execute(img, pre_t, gt, DISCRETIZE_OUTPUT=True):98    #print("plot_img_pred_gt_execute(): pre_t.max: ", np.max(pre_t))99    #print("plot_img_pred_gt_execute(): pre_t.min: ", np.min(pre_t))100    if DISCRETIZE_OUTPUT:101        pre_t = pre_t.numpy()102        pre_t[pre_t > 0.5] = 1.0103        pre_t[pre_t <= 0.5] = 0.0104    plt.subplots(1,3,figsize=(10,10))105    plt.subplot(1,3,1)106    plt.imshow(img[...,::-1])107    plt.title("Original Image")108    plt.subplot(1,3,2)109    plt.imshow(pre_t, cmap='gray')110    #plt.imshow(pre_t>0.5, cmap='gray')111    plt.title("Prediction")112    plt.subplot(1,3,3)113    plt.imshow(gt, cmap='gray')114    plt.title("Ground Truth")115    plt.show()116    117    118def mask_bigger_fifty_perc(mask):119    mask_size = mask.size120    #print("mask.shape: ", mask.shape)121    #print("mask_size: ", mask_size)122    nr_points_in_mask = mask_size - (mask == 0.).sum()123    mask_cover_perc_of_img = nr_points_in_mask/mask_size124    #print("mask_cover_perc_of_img: ", mask_cover_perc_of_img)125    if mask_cover_perc_of_img>0.5:126        return True127    return False128 129 130#evaluation for one image (auc roc, f1, iou)131def eval_image(pre_t, gt, auc, f1, iou, acc):132    #df_out("pre_t_in evalimage",pre_t,True)133 134    pre = np.repeat(pre_t.numpy()[:,:,np.newaxis],3,2)135    H, W, _ = pre.shape136    Hg, Wg, C = gt.shape137 138    if mask_bigger_fifty_perc(gt):139        print("FLIP pre because mask > 50% of image")140        pre = 1 - pre141    142    if H != Hg or W != Wg:143        print("ERROR: values not matching:")144        print(f'H: {H}, W: {W}, C: {C}')145        print(f'Hg: {Hg}, Wg: {Wg}, C: {C}')146        gt = cv2.resize(gt, (W, H))147        gt[gt > 127] = 255148        gt[gt <= 127] = 0149            150    if np.max(gt) != np.min(gt):    151        auc.append(roc_auc_score((gt.reshape(H*W*C) / 255.).astype('int'), pre.reshape(H*W*C)))152    else:153        print("!!!!!!!!!!!!!! eval_image(): np.max(gt) != np.min(gt) !!!!!!!!!!!!")154    pre[pre>0.5] = 1.0155    pre[pre<=0.5] = 0.0156    157    #consider changing to: a, b = metric_copy(pre , gt > 127)158    #a, b = metric_copy(pre , gt / 255.) #old159    a, b = metric_copy(pre , gt)160        161    162    pre_ = tf.reshape(pre, [-1])163    gt_ = tf.reshape(gt / 255., [-1]).astype(tf.int32)164    acc_tmp = accuracy_score(pre_, gt_)165    acc.append(acc_tmp)166          167    f1.append(a)168    iou.append(b)169    #print('Evaluation: AUC: %5.4f, F1: %5.4f, IOU: %5.4f' % (np.mean(auc), np.mean(f1), np.mean(iou)))170 171