研究テーマ
この作業の主な理由は、既存の事前フィルターを改善することでした。 人工ニューラルネットワークを使用して最高の予測を行い、ファイル圧縮の向上につながる新しいフィルターを作成します。
圧縮
従来、PNG圧縮は2つのステップに分けられます。
- 事前フィルタリング(予測子を使用);
- 圧縮(DEFLATEを使用)。
この記事では、最初のステップのみが重要です。 次の図では、現在存在するプレフィルターと、実際のピクセルと予測されたピクセルの違いをどのように保持するかを確認できます。
現在存在するフィルター+新しいソリューション:
種類 | 名 | フィルター機能 | リカバリー機能 |
0 | なし | フィルト(x)=元(x) | 偵察(x)=フィルト(x) |
1 | サブ | Filt(x)= Orig(x)-Orig(a) | Recon(x)= Filt(x)+ Recon(a) |
2 | 上へ | Filt(x)= Orig(x)-Orig(b) | Recon(x)= Filt(x)+ Recon(b) |
3 | 平均 | Filt(x)= Orig(x)-floor((Orig(a)-Orig(b)/ 2)) | Recon(x)= Filt(x)+ floor((Recon(a)-Recon(b)/ 2)) |
4 | ペース | Filt(x)= Orig(x)-PaethPredictor(Orig(a)、Orig(b)、Orig(d)) | Recon(x)= Filt(x)+ PaethPredictor(Recon(a)、Recon(b)、Recon(d)) |
5 | ニューラルネットワーク | Filt(x)= Orig(x)-NN(ArrayOfInputPixels) | Recon(x)= Filt(x)+ NN(ArrayOfInputPixels) |
予測子としてのニューラルネットワーク
最後のフィルターは、この記事の著者の新しい実装です。 入力ピクセルの配列を持つニューラルネットワークを内部的に使用します。 結果として、予測されたピクセル変数を返します。 他のフィルターと同様に、元の値と予測値の差は保持されます。 しかし、これらの入力値は何ですか? 次の図では、著者は入力値のニューラルネットワークをより明確に送信するプロセスを説明しようとしました。 まず、画像には3つの異なる部分があります。
- コピー可能(REDで表示);
- ニューラルネットワークの入力ピクセル(GREENとマーク);
- 予測されたピクセル(青で示されます)。
コピーされたピクセル
ニューロフィルターを開始するには初期データが必要なので、赤い領域全体が1対1でコピーされます。 それがそのような画像フレームをコピーする理由です。 ネットワーク構成は次のとおりです。
- 28個の入力ニューロン(緑色でマーク)-(8 * 4-4)px。
- 1個の出力ニューロン(青でマーク)-29番目のピクセル。
したがって、1番目から28番目までのすべてのピクセルがコピーされます。
入力ピクセル
フィルターによって処理される最初のピクセルは位置(5,4)にあります。 このピクセルは、残りの28ピクセルとニューラルネットワークを使用して予測できます。 これは上の図からわかります。
予測ピクセル
緑のピクセルはすべて、ニューラルネットワークが処理する入力ピクセルであり、青ピクセルの予測値になります。
コンポーネント
このセクションでは、作成者が開発および使用するコンポーネントについて説明します。 すべてのコードはJAVAで記述されています。
最初の段階では、ニューラルネットワークをトレーニングする必要があります。 このステップをもう少し速く完了するために、著者は、JavaNNSツールのトレーニングシーケンスを作成するパターンエクスポーターを開発しました。 わかりやすくするために、この手順を次の図で説明します。
ニューラルネットワークのトレーニングを完了した後、エンコーダー/エンコーダーで使用する必要があります。 説明した段階の詳細な説明を下図に示します。
- 入力画像:ニューラルネットワークを圧縮する単純な画像。
- PNGエンコーダー/デコーダー:ニューラルネットワークの予測子を使用して画像をエンコードおよびデコードします。
- Neural Netwrok:JAVAプログラミング言語で開発されたニューラルネットワーク。
- JNNSParser
- 出力画像:出力として、圧縮されたものよりも小さい画像を取得する必要があります。
エンコードとデコードのために、著者はpngjライブラリを使用しました。 ここで彼女を見つけることができます。
結果
ニューラルネットワーク構成を選択する方法は多数あります。
ニューラルネットワーク構成を選択する可能な方法:
- 入力ニューロンの数の選択。
- 入力ニューロン回路の決定;
- 隠れニューロンの数の選択。
- ニューロンの隠れ層の数の選択。
- ニューロン活性化機能の決定;
- 学習アルゴリズムの定義
- などなど...
以下は、著者によって評価されたニューラルネットワークの設計のための最適なオプションの一部です。 基本的に、彼は画像のいくつかのサンプルで単純にチェックすることでそれらを評価し、次にニューラルネットワークのBPP(ピクセルあたりのビット)を計算し、最適なパラメーターを決定しました。 これにより、次の結果が得られました。
推定ニューラルネットワーク構成:
- 入力ニューロンの数:28。
- 隠れニューロンの数:
- 9ニューロン(3x3);
- 25ニューロン(5x5)。
- 隠れ層の数:1。
- アクティベーション関数:シグモイド、範囲を0.2から0.8に制限。
- 学習アルゴリズム:後方誤差伝播。
他のPNG予測子との比較
次の段階で、著者は自分のニューラルフィルターを現在使用されている他のPNGフィルターと比較しました。 テストはいくつかの画像で行われました。
ニューラルネットワークは、PaethフィルターとAverageフィルターよりもやや劣った画像圧縮に対応していることがわかりますが、SubおよびUpよりもはるかに優れています。 この検証の後、別の画像が実行され、より多くの画像(111)が含まれ、その上に自然がキャプチャされました。 フィルターが最もよく処理するイメージと、より悪いイメージを見つける必要がありました。以下は、他のすべてのフィルターよりもニューラルネットワークがはるかにうまく処理したイメージです。
これらの写真の共通点はわかりませんでした。 さて、たくさんの花があります。 したがって、おそらく私のニューラルネットワークは花が本当に好きです。 しかし、私はその説明にあまり満足していませんでした。
したがって、画像に以下が含まれている場合、ニューラルネットワークの使用が適切であると結論付けることができます。
- 多くのテクスチャ。
- さまざまなテクスチャ。
- ノイズが少ない。
次のステップで、著者は休暇中に撮影した写真を調べて、上記の条件を満たすものを見つけ、これを見つけました:
その結果、6つのフィルターについて次のBPP値が計算されました。
種類 | 名 | BPP |
0 | なし | 7.289 |
1 | サブ | 6.681 |
2 | 上へ | 6.667 |
3 | 平均 | 6.433 |
4 | ペース | 6.486 |
5 | Nn | 6.368 |
このように、ニューロフィルターを使用したより良い圧縮のための画像特徴の理論が確認されました。
自然のイメージと人間が作成したイメージの比較
著者は、画像内のオブジェクトの原点が圧縮にどのように影響するかを調べるために、別のテストを実施しました。 次の結果が得られました。
おわりに
- 大きな可能性があります。 適切なニューラルネットワークのセットアップを見つけるのに十分な時間がありませんでした。 もし彼がこの分野に特化していたなら、ニューロフィルターはBPPに従って他のフィルターを破ったでしょう。
- おそらく、異なるニューラルネットワークトポロジを使用すると、改善がもたらされる可能性があります。 再帰的なニューラルネットワークについての考えがありました...
- 別のアイデアは、1種類の画像のみを処理するようにニューラルネットワークをトレーニングすることが可能であるというものでした。
- 生産性は著者が取り組んだ目標ではありませんでした。 他のフィルターが上記のソリューションよりもはるかに高速に画像を処理することは明らかです。
プロジェクトはGITハブにあります。 誰が気にします、あなたは見ることができます 。