Nodeを使うjsは深さ学習の中で画像の前処理をします

7038 ワード

背景
最近、オブジェクト識別に関するプロジェクトを行っていますが、チーム内の技術スタックはJavaScriptに偏っているため、PythonTensorflowでオブジェクト識別サーバを構築した後、チームメンバーのメンテナンスコストを増やさないように、できるだけ訓練と識別以外のタスクをNode.jsに渡して、今日お話しする画像の前処理はその一つです.
ここでは、まだ深く勉強していない人について、いくつかの概念を簡単に説明します.
  • オブジェクト識別:オブジェクト識別は、コンピュータが1枚の画像の中で特定の物体、例えば中のすべての犬を見つけることを理解することができる.
  • 訓練:コンピュータ学会の対象識別という能力は人間が話すことを学ぶように、絶えず練習しなければならない.深い学習の中でこの過程を「訓練」と呼ぶ.
  • 訓練集:人間が話すことを学ぶには、他人の言うことを見る必要があり、他人の声を聞くなど、自分が話すことを学ぶことができる情報を深い学習の中で訓練集と呼ぶが、対象識別に必要な訓練集は画像だけである.

  • 画像の前処理の目的は,オブジェクト識別における訓練セット不足の問題を解決することである.オブジェクト識別が特定の専用領域に適用されると,この問題に直面する.もしあなたが犬を識別しているなら、このような写真はたくさんあります.そして、誰かが訓練して、みんなにサービスを提供することができます.もしあなたがチーム内の文化シャツを認識しているならば、このような画像は少なすぎて、長い間100枚を撮るのに苦労して、このようなデータの量は依然としてかわいそうに少ないです.ネット上の成熟したAIサービスを知るには、訓練集は勝手に何千何万、さらには億単位である.もちろん、専用分野の一般的な需要も比較的簡単で、識別する必要があるものの種類は多くなく、特徴も明らかであるが、訓練セットが大きいほど良いことを望んでいる.この時、持っている画像に対していくつかの処理をして、新しい画像を生成し、現在の訓練セットを拡張することができる.この過程を画像前処理と呼ぶ.
    一般的な画像の前処理方法は以下の通りです.
  • 回転.回転の角度は任意の値であることができるため、ランダムにいくつかの角度を生成して回転する必要があります.これはランダム回転とも呼ばれます.
  • 反転.画像の横に鏡を置くのと同じで、新しい画像は鏡の中の画像で、一般的に水平反転と垂直反転の2種類があります.
  • 輝度を調整します.携帯電話の明るさを調節するとこの意味がわかります.
  • 飽和度を調整します.伝統的なテレビを調節することで、飽和度が高いほど色が鮮やかになり、逆に冷たい感じがします.
  • 色相を調整します.これは画像全体を色に変えるのと同じで、以前に調整された緑のテレビを想像してみてください.
  • コントラストを調整します.これは画像の明るいところをもっと明るくして、暗いところをもっと暗くします.テレビのコントラスト調整も想像できますが、テレビはこれらの専門名詞を啓蒙していると言わざるを得ません.

  • 上記の各操作はシーンに応じて選択する必要があります.現在、私たちのチームに適用されている処理方法は主に上記です.白化やGamma処理などの操作もありますが、そんなに直感的ではないので、興味のある人は自分で理解することができます.
    取付gmgmは画像処理のnpmライブラリで、性能はNode.jsライブラリの中で最も優れているはずです.その下層ではデフォルトでGraphicsMagickが使用されています.そのため、まずGraphicsMagickをインストールし、Macシステムで直接Homebrewでインストールする必要があります.
    brew install graphicsmagick

    他のシステムのインストール方法は、直接公式サイトで確認できます.
    画像に文字を追加する必要がある場合は、インストールも必要です.ghostscript、Macで使えるbrew install ghostscript取り付けます.この機能については触れていないので、インストールしなくてもいいです.
    また、gmをプロジェクトの下にインストールする必要があります.
    npm i gm -S

    プリプロセッシング
    直感的にするために、前処理オブジェクトとして画像を選択しました.
    また、本明細書の例示的なコードでは、各前処理方法の関数名は、TensorflowImageモジュールの同名の方法を参照して決定され、画像をより多く処理する方法は、Tensorflowドキュメントの公式サイトに行って自分で表示し、gm公式ドキュメントに行って同じ役割を果たす方法を探すことができる.
    反転
    Y軸に沿ってgmに転用された.flipの方法:
    import gm from 'gm';
    
    /**
     *   Y    ,     
     * @param inputPath          
     * @param outputPath          
     * @param callback         
     */
    function flip(inputPath, outputPath, callback) {
        gm(inputPath)
            .flip()
            .write(outputPath, callback);
    }

    反転後の効果は次の図のようになります.gm.flopにX軸に沿って反転する方法:
    import gm from 'gm';
    
    /**
     *   X    ,     
     * @param inputPath          
     * @param outputPath          
     * @param callback         
     */
    function flop(inputPath, outputPath, callback) {
        gm(inputPath)
            .flop()
            .write(outputPath, callback);
    }

    反転後の効果は次の図のようになります..flip.flopを組み合わせて使用して、対角線反転の効果を形成することもできます.
    原図をフロントエンドコンポーネント、すなわちショッピングボタングループと見なし、各ボタンの背景をカスタマイズすることができ、ボタンの中に文字、区切り線、文字の3つの要素から構成されている場合、上を反転した画像は同じコンポーネントと見なすことができ、トレーニングセットとして持つことができる.
    時には、反転がもたらす効果は自分が望んでいるものではなく、反転した後、元の画像と同じものと見なすべきではない場合があります.この方法には限界があります.
    明るさの調整
    その後に比べて、明るさを調整するのはもっと一般的で、どんな画像でも、明るさを調整した後も、中のものは元のものです.
    明るさの調整には、gm.modulateの方法が使用されます.
    /**
     *     
     * @param inputPath          
     * @param outputPath          
     * @param brightness       ,     100,  100        ,  100        
     * @param callback         
     */
    function adjustBrightness(inputPath, outputPath, brightness, callback) {
        gm(inputPath)
            .modulate(brightness, 100, 100)
            .write(outputPath, callback);
    }
    .modulate方法は、画像の輝度、飽和度、色相の3つの特性を同時に調整できる多機能な方法であり、この3つの特性はそれぞれこの方法の3つのパラメータに対応しており、ここでは輝度のみを調整するので、第1のパラメータ(100より高いと輝度が増加し、100より低いと輝度が減少する)のみを変更し、その他は100基準値を一定に保つ.
    輝度を0-200の画像から生成し,比較し,輝度処理に適した区間を選択した.0~200の間の隣接する輝度の差が10の画像間の差を見ることができます(ヒント:各画像の左上隅に画像の輝度が表示されます):
    輝度が60以下の画像を見ることができて、すべて暗すぎて、細部が明らかではありませんて、輝度が150以上の画像、すべて明るすぎて、細部が明らかではありません.複数の画像を総合的に比較した後、[60,140]という区間の画像の品質は比較的良く、原図に比べてあまり細部を失うことはないと思います.
    輝度50と60の2枚の画像を見ると、実は1枚の画像のように見え、訓練集の多様性の原則に合わない.ましてや隣接する輝度の差が1の2枚の画像だ.したがって、最終的には、トレーニングセットとして隣接する2枚のピクチャの輝度差が20であることが決定され、輝度が80と輝度が100の2枚のピクチャなどの差が顕著になる.
    最終的には、明るさを調節した新しい画像が4枚になります.輝度が60のピクチャから、20輝度を増加させるごとに、輝度が140のピクチャまで、輝度が100のピクチャはカウントされない訓練セットが選択される.
    彩度を調節する
    飽和度の調整も.modulateの方法で行われ、2番目のパラメータを調整するにすぎない.
    /**
     *      
     * @param inputPath          
     * @param outputPath          
     * @param saturation        ,     100,  100         ,  100         
     * @param callback         
     */
    function adjustSaturation(inputPath, outputPath, saturation, callback) {
        gm(inputPath)
            .modulate(100, saturation, 100)
            .write(outputPath, callback);
    }

    同様に、輝度を調整する方法によって、飽和度の範囲と、訓練セットの隣接する2枚のピクチャの飽和度の差を決定する.隣接する飽和度の差が10のピクチャ間の差を見ることができます(ヒント:各ピクチャの左上隅にそのピクチャの飽和度が表示されます):
    飽和度を調整した画像の詳細は失われず、訓練セットの画像として使用できることが多く、輝度と同様に飽和度が20の異なる2枚の画像の違いが明らかである.また、飽和度が140より大きい場合、画像の変化は明らかではありません.だから飽和度を調節して生まれた新しい画像は6枚になります.飽和度0のピクチャから、20飽和度を増加させるたびに訓練セットが選択され、飽和度140のピクチャまで選択され、飽和度100のピクチャは計算されない.
    色相を調節する
    色相を調整する方法はこのシーンで最も有用な方法であり、発生したトレーニングセットが最も多く、まず色相が隣接して10の画像間の差を見てみましょう(ヒント:各画像の左上隅にこの画像の色相が表示されています):
    ほとんどのピクチャは新しいトレーニングセットとして機能し、色相調整範囲は0〜200の間しかないため、色相が0のピクチャから10色相を増やすごとに選択され、色相が190のピクチャまで、色相が100のピクチャは計算されない.これにより訓練集として20枚の画像を生成することができる.
    色相を調整するコードは、輝度、飽和度と同様に、3番目のパラメータを変更しただけです.
    /**
     *     
     * @param inputPath          
     * @param outputPath          
     * @param hue       ,     100,  100        ,  100        
     * @param callback         
     */
    function adjustHue(inputPath, outputPath, hue, callback) {
        gm(inputPath)
            .modulate(100, 100, hue)
            .write(outputPath, callback);
    }

    色相の調整は万能ではなく、このシーンに適しているだけで、もちろん、私たちのチームのニーズはこのシーンに似ています.しかし、梨を識別する人工知能を訓練するには、青い梨があることを教えるのは明らかに適切ではありません.
    コントラストの調整
    コントラストの調整には、gm.contrastメソッドが使用されます.
    /**
     *      
     * @param inputPath          
     * @param outputPath          
     * @param multiplier         ,    0,     ,n      n     ,-n      n     
     * @param callback         
     */
    function adjustContrast(inputPath, outputPath, multiplier, callback) {
        gm(inputPath)
            .contrast(multiplier)
            .write(outputPath, callback);
    }

    以下に、コントラスト係数が-10から10の間の画像を示します.画像の品質が良い区間は[-5,2]であり、その他はいくつかの詳細が失われています.また,隣接するコントラスト因子のピクチャ間の差も顕著であるため,各ピクチャを訓練セットとして用いることができ,7枚のピクチャがさらに多くなる.
    まとめ
    上記の5つの方法により、1枚の画像に加えて40枚の画像を追加することができ、すなわち訓練セットが元の40倍である.これはやはり多様な方法で混合して使用していない場合、混合して使用すれば、おそらく数百倍以上になるだろう.gmはまた、画像の他の処理方法をサポートしています.あなたは自分で発掘することができます.それぞれの方法は特定のシーンの下で自分の限界があり、オーディションする必要があります.みんなが自分の満足する訓練集があることを望んでいます.
    宣伝する
    Star筆者のGithubを歓迎します.また、筆者の公衆番号に注目して、最新の文章のプッシュを得ることも歓迎します.