import os from os import path, makedirs, listdir import sys sys.setrecursionlimit(10000) from multiprocessing import Pool import numpy as np np.random.seed(1) import random random.seed(1) import pandas as pd from tqdm import tqdm import timeit import cv2 from skimage.morphology import remove_small_objects import matplotlib.pyplot as plt import seaborn as sns from skimage.morphology import square, dilation cv2.setNumThreads(0) cv2.ocl.setUseOpenCL(False) test_dir = 'test/images' pred_folders = ['dpn92cls_cce_0_tuned', 'dpn92cls_cce_1_tuned', 'dpn92cls_cce_2_tuned'] + ['res34cls2_0_tuned', 'res34cls2_1_tuned', 'res34cls2_2_tuned'] + ['res50cls_cce_0_tuned', 'res50cls_cce_1_tuned', 'res50cls_cce_2_tuned'] + ['se154cls_0_tuned', 'se154cls_1_tuned', 'se154cls_2_tuned'] pred_coefs = [1.0] * 12 loc_folders = ['pred50_loc_tuned', 'pred92_loc_tuned', 'pred34_loc', 'pred154_loc'] loc_coefs = [1.0] * 4 sub_folder = 'submission' _thr = [0.38, 0.13, 0.14] def process_image(f): preds = [] _i = -1 for d in pred_folders: _i += 1 msk1 = cv2.imread(path.join(d, f), cv2.IMREAD_UNCHANGED) msk2 = cv2.imread(path.join(d, f.replace('_part1', '_part2')), cv2.IMREAD_UNCHANGED) msk = np.concatenate([msk1, msk2[..., 1:]], axis=2) preds.append(msk * pred_coefs[_i]) preds = np.asarray(preds).astype('float').sum(axis=0) / np.sum(pred_coefs) / 255 loc_preds = [] _i = -1 for d in loc_folders: _i += 1 msk = cv2.imread(path.join(d, f), cv2.IMREAD_UNCHANGED) loc_preds.append(msk * loc_coefs[_i]) loc_preds = np.asarray(loc_preds).astype('float').sum(axis=0) / np.sum(loc_coefs) / 255 loc_preds = loc_preds msk_dmg = preds[..., 1:].argmax(axis=2) + 1 msk_loc = (1 * ((loc_preds > _thr[0]) | ((loc_preds > _thr[1]) & (msk_dmg > 1) & (msk_dmg < 4)) | ((loc_preds > _thr[2]) & (msk_dmg > 1)))).astype('uint8') msk_dmg = msk_dmg * msk_loc _msk = (msk_dmg == 2) if _msk.sum() > 0: _msk = dilation(_msk, square(5)) msk_dmg[_msk & msk_dmg == 1] = 2 msk_dmg = msk_dmg.astype('uint8') cv2.imwrite(path.join(sub_folder, '{0}'.format(f.replace('_pre_', '_localization_').replace('_part1.png', '_prediction'))), msk_loc, [cv2.IMWRITE_PNG_COMPRESSION, 9]) cv2.imwrite(path.join(sub_folder, '{0}'.format(f.replace('_pre_', '_damage_').replace('_part1.png', '_prediction'))), msk_dmg, [cv2.IMWRITE_PNG_COMPRESSION, 9]) if __name__ == '__main__': t0 = timeit.default_timer() makedirs(sub_folder, exist_ok=True) all_files = [] for f in tqdm(sorted(listdir(pred_folders[0]))): if '_part1.png' in f: all_files.append(f) with Pool() as pool: _ = pool.map(process_image, all_files) elapsed = timeit.default_timer() - t0 print('Time: {:.3f} min'.format(elapsed / 60))