boostcampaitech3 / level2-data-annotation_cv-level2-cv-17

[2022.04.14 ~ 2022.04.21] OCR Text Detection Competition - 부스트캠프 AI Tech 3기
1 stars 1 forks source link

[Inference] 학습 후 Inference 결과 Fiftyone으로 시각화 #27

Closed omocomo closed 2 years ago

omocomo commented 2 years ago

Background

학습된 pth로 원하는 데이터셋을 inference해 그 결과를 Fiftyone으로 볼 수 있게 한다. 학습 결과 어떤 이미지를 잘 예측하고, 어떤 이미지를 잘 예측하지 못하는지, 글자 영역을 어떻게 예측하고 있는지 직접 보려고 한다.

Content

Details

inference_val.py

기존 inference를 수정하지 않고 inference_val.py를 새로 만들었습니다. data_dir, model_dir, output_dir은 설정해주면 됩니다. 저는 아래와 같이 설정했습니다.

원래는 output.csv 파일을 생성하지만 이름을 output.json으로 변경했습니다.

json_normalize

normalize에 img_h, img_w가 이용되어 inference_val.py에서 ufo_result를 생성할 때 해당 값이 저장되도록 했습니다.

from pathlib import Path
import json

def read_json(filename):
    with Path(filename).open(encoding='utf8') as handle:
        ann = json.load(handle)
    return ann

def json_normalize(input_json_path = "/opt/ml/level2-data-annotation_cv-level2-cv-17/predictions/output.json",
                    output_json_path ="/opt/ml/level2-data-annotation_cv-level2-cv-17/predictions/normalize_output.json"):
    """Function normalize points value to 0-1 for visualization and etc

    Args:
        json_path (str, optional): json path which you want to normalize vertical points . Defaults to "../input/data/ICDAR17_Korean/ufo/train.json".
    """

    data = read_json(input_json_path)

    for image in data['images']:
        image = data['images'][image]
        img_h = image['img_h']
        img_w = image['img_w']
        for polygon in image['words']:
            for points in image['words'][polygon]['points']:
                points[0] = points[0]/img_w
                points[1] = points[1]/img_h
            image['words'][polygon]['points'] = list(map(lambda x: tuple(x),image['words'][polygon]['points']))

    with open(output_json_path,'w') as f:
        json.dump(data, f, indent=4)

json_normalize()

dataviz.py

이후 dataviz.py를 실행시키면 Fiftyone을 통해 inference 결과를 볼 수 있습니다. 이 때 json에 'illegibility'가 없으므로 해당 부분을 주석처리 해주고 filled=False로 넣어주었습니다. image