画像の強化と改善あなたの深い学習モデル


深い畳み込み型ニューラルネットワークによるコンピュータビジョンは近年ブームを見てきたが,コンピュータ支援医学診断から無人航空機,拡張現実感,視覚探索エンジンへの応用において応用されている.現代の深い学習技術の驚くべき能力にもかかわらず、特定の挑戦は、十分なデータを得るようなままです.救済策の一つはデータ増強である.このブログ記事では、画像認識におけるデータ増強手法の一握りを簡単に説明し、Albumentations 図書館.

データ増強-何が良いですか?


つの主要な問題は、深い学習モデルのパフォーマンスがトレーニングのために利用できるデータの量に非常に依存しているということです.データの不足は、我々のモデルのオーバーフィッティングに帰着することができます、そして、関連した、良質のデータが難しくなることができて、そして/または、得るために高価であるので、我々は我々が手に持っているデータからあらゆる甘露を押し出す必要があります.データ増強はこの点で特に有用であると証明されました.
我々がデータ増強を行うとき、我々は我々が我々のトレーニングデータセットでイメージの操作されたバージョンを作成するために、我々が同じイメージの多くの変わったバージョンで終わります.こうすることで、2つのことができます.
  • トレーニングデータのサンプル量を増やします.
  • モデルをより高い特徴の特徴でイメージに暴露することによって、それは非関連の特徴を無視することを強制されます.
  • 免責事項:選択し、使用して画像の強化技術を使用します.いくつかのメソッドはユースケースには適用できません.間違った使用と乱用は、モデルの性能を損なうことがあります.

    アルブミン


    それは私たちの深い学習パイプラインにデータの強化を実装するためのツールとライブラリになると多くの良いオプションがあります.たとえば、Numpyや枕を使用して独自の拡張を行うことができます.画像増強のための最も人気のある専用ライブラリのいくつかは、アルブミンを含んでいます.imgaug , and Augmentor . 両方TensorFlow and PyTorch も、自分のパッケージをイメージの強化に捧げて来る.
    イメージ増強のための専用のライブラリは、我々の命をより簡単にする多くの利点を提供します.1つについては、彼らは私たちが統一されたインターフェイスを使用するための単一の場所にデータ増強パイプラインを宣言することができます.Alphmenmentationsでは、このインターフェイスはA.Compose() これにより拡張子パイプラインを定義し、拡張子のリストを使用します.
    import albumentations as A
    import cv2
    
    # Load image
    im = cv2.imread("your_image_path.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        '''
            List of augmentation methods.
        '''
    ])
    
    それに適用されるaugmentationsでイメージを得るために、我々は単に走ることができますtransformed = transform(im) 画像を入力とします.
    画像増強ライブラリはまた、画像の分割タスクでの作業時に入力画像とそれぞれのマスクに同じ拡張を適用することが容易になります.加えて、ライブラリは、各変換の確率と大きさの単純な制御を可能にします.たとえば、私たちが回転の時間の50 %を適用する場合は、最大45度で、我々はそれを書くことができますA.Rotate(limit=45, p=0.5) .
    また、私たちがパイプラインに他のaugmentationsを加えるのを許している間、私がこのポストの例のために使うAlphenmentationsは60の異なるイメージ拡大を支持します.また、最も人気のある拡張ライブラリの間で速度の面で最高のパフォーマンスを誇っています.単純なpip install albumentations そして、我々は行く準備ができています!

    拡張パイプラインの定義


    Composeクラスでは、使用する拡張子のリストを持つ拡張パイプラインを定義できます.Commonを呼び出すと、画像の拡張を適用する関数を返します.
    import albumentations as A
    import cv2
    
    # Load image
    im = cv2.imread("your_image_path.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        '''
            List of augmentation methods.
        '''
    ])
    
    # Apply augmentations
    transformed = transform(im)
    

    アフィン変換


    アフィン変換は、幾何学的変換を翻訳、回転、スケーリング(ズーム)と剪断のようなイメージに含みます.ShiftScalerotateは、いくつかのアフィン変換を適用し、それぞれの大きさを調整します.
    # Load image
    im = cv2.imread("robin.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        A.ShiftScaleRotate(shift_limit=0.0625, 
                           scale_limit=0.1, 
                           rotate_limit=45, 
                           p=0.5), 
    ])
    
    # Apply augmentations
    transformed = transform(im)
    

    ノイズ


    ぼけ、ガウスノイズ、カラー画像のチャンネルのシャフリング、明るさの変化、色、コントラスト、リストが進むなど、さまざまな種類のノイズをイメージに注入する方法がたくさんあります.以下はほんの数例ですが、より多くのことができます.
    # Load image
    im = cv2.imread("robin.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        A.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.2, hue=0.2,p=0.5),
        A.MotionBlur(blur_limit=33, p=0.1),
        A.GaussNoise(var_limit=(0, 255), p=0.1)
    ])
    
    # Apply augmentations
    transformed = transform(im)
    

    ドロップアウト変換


    ドロップアウト変換を使用して画像の一部を削除することができます.これは、画像の領域をゼロまたはランダム値で置き換えることであり、カラー画像である場合には、チャネルを除去することを含むが、これに限定されない.
    # Load image
    im = cv2.imread("robin.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        A.CoarseDropout(max_holes=6, max_height=32, max_width=32, p=0.1),
        A.ChannelDropout(p=0.05)
    ])
    
    # Apply augmentations
    transformed = transform(im)
    

    その他の空間的歪み


    画像を増強する別のクールな方法は、画像に描かれた図形を変更するためのさまざまな歪みのテクニックを使用することです.私はより良い拡張を視覚化するためのイラストにグリッドを追加しました.
    # Load image
    im = cv2.imread("robin.png")
    
    # Define augmentation pipeline
    transform = A.Compose([
        A.GridDistortion(num_steps=5, distort_limit=0.1, p=0.1),
        A.OpticalDistortion(distort_limit=0.2, shift_limit=0.05, p=0.1)
    ])
    
    # Apply augmentations
    transformed = transform(im)
    

    最後に、このブログ記事から拡張パイプラインにすべての拡張を集めてみると、次のようになります.
    transform = A.Compose([
        A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.1, rotate_limit=45, p=0.5), 
        A.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.2, hue=0.2,p=0.5),
        A.MotionBlur(blur_limit=33, p=0.1),
        A.GaussNoise(var_limit=(0, 255), p=0.1),
        A.CoarseDropout(max_holes=6, max_height=32, max_width=32, p=0.1),
        A.ChannelDropout(p=0.05),
        A.GridDistortion(num_steps=5, distort_limit=0.1, p=0.1),
        A.OpticalDistortion(distort_limit=0.2, shift_limit=0.05, p=0.1)
    ])
    

    時間は自分自身を試してください!


    うまくいけば、あなたは今、データの強化とはどのように我々は深い学習モデルのトレーニングに使用するための拡張パイプラインを作成することができますの基本的な理解を持っている.もちろん、このブログの記事の例を超えて有用な多くのaugmentationsがあります.つまり、自分自身でそれを試してみる時間です.異なる方法で実験し、どのようにモデルのパフォーマンスに影響を与える参照してください!
    更なる読書
    イメージ増強技術に深く掘り下げたり、もっとたくさんの例を見てみたいならば、ここから始めましょう.
  • Connor Shorten & Taghi M. Khoshgoftaar, A survey on Image Data Augmentation for Deep Learning (2019) .
  • Albumentations examples