メインコンテンツへスキップ
見出し画像

Pythonライブラリ(画像データ拡張):Albumentations

    1.概要

     データ画像の水増し(data augment)ライブラリであるAlbumentationsを紹介します。
     画像モデル学習のためのデータが足りないためデータ数を増やす時などに利用できます(データ加工のイメージは下図参照)。

    画像

    2.環境構築

     現在のPC環境ではANACONDAを使用しておりますが、下記のみで使用可能でした。

    [Terminal]
    pip install -U albumentations

    3.基礎操作

    3-1.簡易処理:Alb.method()

     Albumentationsの簡易の使用法は”Alb.method(params)(image=データ)"
    で処理して["image"]でデータを抽出できます。

    [IN]
    import albumentations as Alb
    import matplotlib.pyplot as plt
    import cv2
    import japanize_matplotlib
    
    # データ読み込み
    imgfile = 'konan.JPG' #画像ファイルパス
    img = cv2.imread(imgfile) #画像読み込み->numpy配列
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGR→RGB変換
    
     #画像処理 img_alb = Alb.RandomCrop(width=256, height=256)(image=img)["image"] #切り取り
    
    #データ表示
    fig, ax = plt.subplots(1, 2, figsize=(12, 6))
    
    ax[0].axis("off") #axisを消す
    ax[0].set_title("オリジナル画像") 
    ax[0].imshow(img) #axisを消す
    ax[1].axis("off") #axisを消す
    ax[1].set_title("データ変換処理後") 
    ax[1].imshow(img_alb)
    
    [OUT]
    画像

    3-2.パイプライン化:Alb.Compose()

     複数の画像処理を一つのオブジェクトで実施する場合はパイプライン化します。コードの作成フローは下記の通りです。

    【パイプラインの作成フロー】
    1.画像データ読み込み(Numpy型)
    2.画像処理のパイプライン作成(一連の画像処理のオブジェクト)
    3.パイプラインのオブジェクトでデータ処理

     サンプルは①画像切り取り(RandomCrop)、②水平反転(HorizontalFlip)、③輝度(RandomBrightnessContrast)でデータ処理しました。

    [IN]
    import numpy as np
    import albumentations as Alb
    import matplotlib.pyplot as plt
    import cv2
    import japanize_matplotlib
    
    # データ読み込み+前処理
    imgfile = 'konan.JPG' #画像ファイルパス
    img = cv2.imread(imgfile) #画像読み込み->numpy配列
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGR→RGB変換
    
    # Declare an augmentation pipeline
    transform = Alb.Compose([
        Alb.RandomCrop(width=256, height=256),
        Alb.HorizontalFlip(p=1.0), #p:確率 0.0:なし 1.0:すべて
        Alb.RandomBrightnessContrast(p=0.2),
    ])
    
    # イメージ変換(augmentation)
    transformed = transform(image=img)
    transformed_img = transformed["image"]
    
    #データ表示
    fig, ax = plt.subplots(1, 2, figsize=(12, 6))
    
    ax[0].axis("off") #axisを消す
    ax[0].set_title("オリジナル画像") 
    ax[0].imshow(img) #axisを消す
    ax[1].axis("off") #axisを消す
    ax[1].set_title("データ変換処理後") 
    ax[1].imshow(transformed_img)
    
    [OUT]
    画像

     データ処理はパイプライン(Alb.Compose)に入っており、画像処理後のデータは{"image":Numpy配列型画像データ}のDict型で出力されるため["image"]でデータを抽出します。

    [IN]
    print(transform)
    print(transformed) #出力はdict型
    print(type(transformed_img), transformed_img.shape) #出力はnumpy配列型、shapeは(256, 256, 3)
    
    [OUT]
    Compose([
      RandomCrop(always_apply=False, p=1.0, height=256, width=256),
      HorizontalFlip(always_apply=False, p=1.0),
      RandomBrightnessContrast(always_apply=False, p=0.2, brightness_limit=(-0.2, 0.2), contrast_limit=(-0.2, 0.2), brightness_by_max=True),
    ], p=1.0, bbox_params=None, keypoint_params=None, additional_targets={})
    
    {'image': array([[[52, 44, 21],
            [46, 39, 15],
            [52, 44, 21],
            ...,
            [ 0,  0,  0],
            [ 0,  0,  0],
            [ 0,  0,  0]],
    ~以下省略~
    
    <class 'numpy.ndarray'> (256, 256, 3)

    4.Pixel-level transforms

     ピクセル単位の画像処理の一覧は下記の通りです。

    画像

    5.Spatial-level transforms

     空間系処理:追って

    画像

    参考資料


    あとがき

     とりあえず先出:PillowやOpenCV、torchvisionがある中で学習した方がよさそうかは別途検討

     


     
     

    KIYO

     
     
    普段は製造業で企画/開発/設計しております。記事はプログラミング・機械学習、IoT関係の記事をメインで作成し、なるべく1つの記事で知りたいことを網羅していきます。内容は学術的より実装・アウトプット(ほしくなるもの)を重視して作成しています。 面白そうな仕事があればやりたいです!

    あなたへのおすすめ