재형이의 성장통 일지
  • Image Captcha 라이브러리 (Library)
    2024년 02월 20일 07시 01분 10초에 업로드 된 글입니다.
    작성자: 재형이
    반응형

    0. Image Captcha 라이브러리 설치하기

    • 특정 자릿수의 정수를 이미지 형태로 반환하는 이미지 캡차(image captcha) 라이브러리
    !pip install captcha

    1. 랜덤 캡차 이미지 생성하기

    • (이미지, 정답 레이블)을 생성한 뒤에, 메타 데이터를 저장하여 관리할 수 있다
    • 메타 데이터는 테이블(table) 형태의 데이터에 해당하므로, 판다스(Pandas)의 데이터프레임(dataframe) 형태로 저장할 수 있다
    from captcha.image import ImageCaptcha
    
    def generate_random_images(directory, n_digits, cnt):
        # 메타 데이터 (경로, 정답)
        metadata = []
    
        # 디렉토리(directory)가 존재하지 않을 때
        if not os.path.exists(directory):
            os.makedirs(directory)
    
        # 이미지 캡차(image captcha) 객체 생성
        image = ImageCaptcha()
    
        # 개수(cnt)만큼 이미지 캡차 생성
        for i in range(cnt):
            # 특정한 자릿수(n_digits)의 랜덤 정수 생성
            number = random.randint(0, (10 ** n_digits) - 1)
            # 문자열 형태로 변환
            string = str(number).zfill(n_digits)
            # 이미지 캡차 생성
            cur = 0
            path = os.path.join(directory, f"{string}_{cur}.png")
            while os.path.exists(path):
                cur += 1
                path = os.path.join(directory, f"{string}_{cur}.png")
            image.write(string, path)
            metadata.append((f"{string}_{cur}.png", string))
            
            if (i + 1) % 1000 == 0:
                print(f"[Log] {i + 1} images have been generated.")
        
        # 데이터를 엑셀 파일(.csv) 형태로 저장
        df = pd.DataFrame(metadata, columns=["image_path", "target"])
        df.to_csv(os.path.join(directory, "metadata.csv"))
    • 실질적으로 학습용/테스트용 데이터 세트를 구축할 수 있다
    • 만들어진 데이터 세트의 구성을 확인하면 다음과 같은 형태를 보인다

    # 학습 데이터 세트 생성
    directory = "./train"
    n_digits = 4
    cnt = 10000
    
    generate_random_images(directory, n_digits, cnt)
    
    # 테스트 데이터 세트 생성
    directory = "./test"
    n_digits = 4
    cnt = 1000
    
    generate_random_images(directory, n_digits, cnt)

    2. 만들어진 데이터 세트 불러오기

    • 메타 데이터를 먼저 불러온 뒤에, 실제 이미지 데이터에 접근할 수 있다
    train_directory = "./train"
    print(f"학습 데이터 개수: {len(os.listdir(train_directory))}")
    
    test_directory = "./test"
    print(f"테스트 데이터 개수: {len(os.listdir(test_directory))}")

    def csv_reader(path):
        start_time = time.time()
        dtype_dict = {
            "image_path": str, 
            "target" : str
        }
        data_list = []
        # 정답 레이블은 문자열(string) 형태
        df = pd.read_csv(path, dtype=dtype_dict)
        for index, row in df.iterrows():
            image_path = row["image_path"]
            target = row["target"]
            data = (image_path, target)
            data_list.append(data)
    
        print(f"Data inserted ({time.time() - start_time:.4f} seconds.)")
        return data_list
    
    data_list = csv_reader("./train/metadata.csv")
    print(f"전체 데이터 개수: {len(data_list)}")
    print(data_list[0])

    image_path, target = data_list[0]
    image = Image(os.path.join("./train", image_path))
    display(image)

    반응형
    댓글