Exemple #1
0
def remove_tiny_areas_and_recalc_score():

    RESULT_ROOT_DIR = "tmp/detect_building_damage/master-v2/fixed_histogram"
    RESULT_GROUND_TRUTH = "img/resource/ground_truth"

    C_RED = [0, 0, 255]
    C_ORANGE = [0, 127, 255]

    target_dirs = [
        dir_path for (dir_path, dir_names, file_names) in walk(RESULT_ROOT_DIR)
        if dir_path.endswith("meanshift_and_color_thresholding")
    ]

    for target_dir in target_dirs:
        eprint(f"Target: {target_dir}")

        gt_type, experiment_num = re.match(r".*/GT_(.*)/aerial_roi([0-9]).*",
                                           target_dir).groups()

        eprint(
            dedent(f"""
            Experiment Num: {experiment_num}
            GT_TYPE: GT_{gt_type}
        """))

        result = imread_with_error(
            path.join(target_dir, "building_damage.tiff"),
            cv2.IMREAD_UNCHANGED)

        # Fixing Image
        result_fixed = BuildingDamageExtractor._remove_tiny_area(
            (result * 255.0).astype(np.uint8))

        imwrite_with_error(path.join(target_dir, "building_damage_fixed.tiff"),
                           result_fixed.astype(np.float32))

        # Re-calc Score
        ground_truth = imread_with_error(
            path.join(RESULT_GROUND_TRUTH, f"aerial_roi{experiment_num}.png"))

        if gt_type == "BOTH":
            ground_truth = np.all(
                (ground_truth == C_RED) | (ground_truth == C_ORANGE), axis=2)
        elif gt_type == "RED":
            ground_truth = np.all(ground_truth == C_RED, axis=2)
        elif gt_type == "ORANGE":
            ground_truth = np.all(ground_truth == C_ORANGE, axis=2)

        cm, scores = evaluation_by_confusion_matrix(result_fixed, ground_truth)

        j = {"Confusion Matrix": cm, "Score": scores}

        json.dump(j,
                  open(path.join(target_dir, "scores_fixed_result.json"), "w"),
                  ensure_ascii=False,
                  sort_keys=True,
                  indent="\t")
def gen_source_overlay():
    ROOT_DIR = "/Users/popunbom/Google Drive/情報学部/研究/修士/最終発表/Thesis/img/resource"
    
    SRC_DIR = join(ROOT_DIR, "aerial_image")
    GT_DIR = join(ROOT_DIR, "ground_truth")
    ROAD_MASK_DIR = join(ROOT_DIR, "road_mask")
    
    for exp_num in [1, 2, 3, 5, 9]:
        
        eprint("Experiment Num:", exp_num)
        
        bg, fg, road_mask = [
            imread_with_error(
                join(root_dir, f"aerial_roi{exp_num}.png")
            )
            for root_dir in [
                SRC_DIR,
                GT_DIR,
                ROAD_MASK_DIR
            ]
        ]
        
        road_mask[:, :, [0, 2]] = [0, 0]
        
        gt_overlay = hsv_blending(bg, fg)
        
        imwrite_with_error(
            join(
                GT_DIR,
                f"aerial_roi{exp_num}_overlay.png"
            ),
            gt_overlay
        )
        
        road_mask_overlay = hsv_blending(bg, road_mask)
        
        imwrite_with_error(
            join(
                ROAD_MASK_DIR,
                f"aerial_roi{exp_num}_overlay.png"
            ),
            road_mask_overlay
        )
def gen_result_road_damage():
    ROOT_DIR_RESULT = "/Users/popunbom/.tmp/EQDmgAnalyzr/detect_road_damage_v2"
    
    dirs = [
        join(ROOT_DIR_RESULT, d)
        for d in listdir(ROOT_DIR_RESULT)
        if isdir(join(ROOT_DIR_RESULT, d))
    ]
    
    for d in dirs:
        print(d)
        exp_num, = re.match(
            r".*aerial_roi([0-9]).*",
            d
        ).groups()
        
        src = imread_with_error(
            join(
                ROOT_DIR_SRC,
                f"aerial_roi{exp_num}.png"
            )
        )
        src_gs = cv2.cvtColor(
            cv2.cvtColor(
                src,
                cv2.COLOR_BGR2GRAY
            ),
            cv2.COLOR_GRAY2BGR
        )
        
        road_mask = imread_with_error(
            join(
                ROOT_DIR_ROAD_MASK,
                f"aerial_roi{exp_num}.png"
            ),
            cv2.IMREAD_GRAYSCALE
        ).astype(bool)
        
        src[road_mask == False] = [0, 0, 0]
        
        result_paths = [d]
        if exists(join(d, "removed_vegetation")):
            result_paths.append(
                join(d, "removed_vegetation")
            )
        
        for result_path in result_paths:
            result = imread_with_error(
                join(
                    result_path,
                    "result_extracted.tiff"
                ),
                cv2.IMREAD_UNCHANGED
            )
            
            result = (cm.get_cmap("jet")(
                result / result.max()
            ) * 255).astype(np.uint8)[:, :, [2, 1, 0]]
            
            dst = hsv_blending(src, result)
            
            dst[road_mask == False] = src_gs[road_mask == False]
            
            imwrite_with_error(
                join(
                    result_path,
                    f"study_overlay.png"
                ),
                dst
            )
def eval_by_utilize_methods():
    ROOT_DIR_RESULT = "/Users/popunbom/Google Drive/情報学部/研究/修士/最終発表/Thesis/img/result"
    
    SPLIT_PATTERNS = {
        "MEAN_SHIFT"                                      : (0,),
        "ANGLE_VARIANCE"                                  : (1,),
        "PIXEL_CLASSIFY"                                  : (2,),
        "MEAN_SHIFT_AND_ANGLE_VARIANCE"                   : (0, 1),
        "MEAN_SHIFT_AND_PIXEL_CLASSIFY"                   : (0, 2),
        "ANGLE_VARIANCE_AND_PIXEL_CLASSIFY"               : (1, 2),
        "MEAN_SHIFT_AND_ANGLE_VARIANCE_AND_PIXEL_CLASSIFY": (0, 1, 2)
    }
    
    result_paths = sorted([
        join(dir_path, "result.png")
        for (dir_path, dir_names, file_names) in walk(ROOT_DIR_RESULT)
        if "result.png" in file_names
    ])
    
    for result_path in result_paths:
        exp_num, = re.match(
            r".*aerial_roi([0-9]).*",
            result_path
        ).groups()
        
        result_src = imread_with_error(
            result_path
        )
        
        gt_src = imread_with_error(
            join(
                ROOT_DIR_GT,
                f"aerial_roi{exp_num}.png"
            )
        )
        
        result_dir = join(
            dirname(result_path),
            "evaluation"
        )
        if not exists(result_dir):
            makedirs(result_dir)
        
        NDARRAY_ASSERT(result_src, ndim=3)
        
        print("File:", result_path)
        print(
            np.unique(
                result_src.reshape(result_src.shape[0] * result_src.shape[1], result_src.shape[2]),
                axis=0
            )
        )
        
        # Use Vegetation Mask
        OPTIONS = ["NORMAL"]
        
        path_vegetation_mask = join(
            ROOT_DIR_VEG_MASK,
            f"aerial_roi{exp_num}.png"
        )
        vegetation_mask = None
        
        if exists(path_vegetation_mask):
            vegetation_mask = imread_with_error(
                path_vegetation_mask,
                cv2.IMREAD_GRAYSCALE
            ).astype(bool)
            OPTIONS.append("REMOVED_VEGETATION")
            
        
        scores = dict()
        
        for option in OPTIONS:
        
            for name, channels in SPLIT_PATTERNS.items():
                eprint("Evaluation:", name)
                
                result = np.zeros(result_src.shape[:2], dtype=np.int16)
                
                for channel in channels:
                    result += (result_src[:, :, channel] != 0)

                result = result.astype(bool)

                if option == "NORMAL":
                    save_dir = result_dir
                elif option == "REMOVED_VEGETATION":
                    result = result & ~vegetation_mask
                    save_dir = join(
                        result_dir,
                        "removed_vegetation"
                    )
                
                if not exists(save_dir):
                    makedirs(save_dir)
    
                imwrite_with_error(
                    join(save_dir, name.replace(" & ", "_and_") + ".png"),
                    (result * 255).astype(np.uint8)
                )
                
                scores[name] = dict()
                
                for gt_type in ["GT_BOTH", "GT_ORANGE", "GT_RED"]:
                    ground_truth = None
                    
                    if gt_type == "GT_BOTH":
                        ground_truth = np.all(
                            (gt_src == C_RED) | (gt_src == C_ORANGE),
                            axis=2
                        )
                    elif gt_type == "GT_RED":
                        ground_truth = np.all(
                            gt_src == C_RED,
                            axis=2
                        )
                    elif gt_type == "GT_ORANGE":
                        ground_truth = np.all(
                            gt_src == C_ORANGE,
                            axis=2
                        )
                    
                    cm, metrics = evaluation_by_confusion_matrix(
                        result,
                        ground_truth
                    )
                    
                    scores[name][gt_type] = {
                        "Confusion Matrix": cm,
                        "Score"           : metrics
                    }
            
            
            json.dump(
                scores,
                open(join(save_dir, "scores.json"), "w"),
                ensure_ascii=False,
                sort_keys=True,
                indent="\t"
            )
def apply_vegetation_mask():
    ROOT_DIR_RESULT = "/Users/popunbom/Google Drive/情報学部/研究/修士/最終発表/Thesis/img"
    ROOT_DIR_VEG = "img/resource/vegetation_mask"
    ROOT_DIR_SRC = join(ROOT_DIR_RESULT, "resource/aerial_image")
    
    for exp_num in [1, 2, 3, 5, 9]:
        file_name = f"aerial_roi{exp_num}.png"
        
        result_dir = join(ROOT_DIR_RESULT, f"result/aerial_roi{exp_num}")
        save_dir = join(result_dir, "extract_vegetation")

        if not exists(save_dir):
            makedirs(save_dir)
        
        src = imread_with_error(
            join(ROOT_DIR_SRC, file_name)
        )
        
        veg_mask = imread_with_error(
            join(ROOT_DIR_VEG, file_name),
        )
        
        result = imread_with_error(
            join(result_dir, "result.png")
        )

        imwrite_with_error(
            join(
                save_dir,
                "thresholded.png"
            ),
            veg_mask
        )
        
        # WHITE -> GREEN
        veg_mask[:, :, [0, 2]] = [0, 0]
        
        veg_overlay = hsv_blending(
            bg_img=src,
            fg_img=veg_mask,
            bg_v_scale=0.6,
            fg_v_scale=1.5,
        )
        
        imwrite_with_error(
            join(
                save_dir,
                "vegetation_overlay.png"
            ),
            veg_overlay
        )
        
        # Result - Vegetation
        veg_mask_bin = veg_mask[:, :, 1].astype(bool)
        result[veg_mask_bin == True] = [0, 0, 0]
        
        imwrite_with_error(
            join(
                result_dir,
                "result_removed_vegetation.png"
            ),
            result
        )
        
        # Overlay result
        
        result_overlay = hsv_blending(
            bg_img=src,
            fg_img=result,
            bg_v_scale=0.6
        )
        
        imwrite_with_error(
            join(
                result_dir,
                "result_overlay_removed_vegetation.png"
            ),
            result_overlay
        )
def gen_result_overlay():
    ROOT_DIR = "/Users/popunbom/Google Drive/情報学部/研究/修士/最終発表/Thesis/img"
    
    SRC_DIR = join(ROOT_DIR, "resource/aerial_image")
    
    for exp_num in [1, 2, 3, 5, 9]:
        
        eprint("Experiment Num:", exp_num)
        
        bg = imread_with_error(
            join(
                SRC_DIR,
                f"aerial_roi{exp_num}.png"
            )
        )
        
        building_damage = imread_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/result.png"
            )
        )
        
        building_damage_overlay = hsv_blending(bg, building_damage, bg_v_scale=0.6)
        
        imwrite_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/result_overlay.png"
            ),
            building_damage_overlay
        )
        
        road_damage = imread_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/road_damage/thresholded.png"
            )
        )
        
        # White -> Red
        road_damage[:, :, [0, 1]] = [0, 0]

        road_damage_overlay = hsv_blending(bg, road_damage)

        imwrite_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/road_damage/result_overlay.png"
            ),
            road_damage_overlay
        )
        
        
        road_damage_wo_veg = imread_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/road_damage/removed_vegetation/thresholded.png"
            )
        )
        
        # White -> Red
        road_damage_wo_veg[:, :, [0, 1]] = [0, 0]

        road_damage_wo_veg_overlay = hsv_blending(bg, road_damage_wo_veg)

        imwrite_with_error(
            join(
                ROOT_DIR,
                f"result/aerial_roi{exp_num}/road_damage/removed_vegetation/result_overlay.png"
            ),
            road_damage_wo_veg_overlay
        )