(57)【要約】      （修正有）【課題】畳み込みニューラルネットワークなどの畳み込みエンジンの計算とメモリ帯域幅の両方を減少するシステム及び方法を提供する。【解決手段】入力タイルがロードされ、蓄積された和は、カーネル内の係数の行及び列インデックスに従って、タイルをシフトすることによって、非ゼロ係数の入力タイルについて計算する。各係数は、個々にタイルに適用され、結果は、次の非ゼロ係数に移動する前に、蓄積バッファに書き込まれる。３Ｄ又は４Ｄ畳み込みは、１次元に沿って、異なるインデックスについて蓄積された和を格納する蓄積バッファの個別の領域についてこのように実装する。画像は、完全に処理され、各画像の結果は、次の画像に移動する前に、蓄積バッファに格納する。【選択図】図２
2018028908.tif 000002
【特許請求の範囲】
【請求項１】
畳み込みを実行する方法であって、
Ｚ次元、ｋｚ次元、ｋｘ次元、及びｋｙ次元を定義する係数C(kz, Z, kx, ky)のアレイを用意することと、
それぞれが、前記ｋｚ次元のインデックスに対応する複数の入力画像を用意することと、
（ａ）前記電子デバイスによって、現在のタイル位置として、複数のタイル位置の次のタイル位置を選択することと、
（ｂ）電子デバイスによって、前記現在の画像としての、前記複数の入力画像の次の入力画像I(kz1)と、現在のｋｚインデックスとしての前記現在の画像に対応するインデックスｋｚ１とを選択することと、
（ｃ）前記電子デバイスによって、前記現在のタイルとして、前記現在のタイル位置の前記現在の画像I(kz1)のタイルをバッファにロードすることと、
（ｄ）前記電子デバイスによって、ｋｚ１に等しい、前記ｋｚ次元のインデックスを有する係数の前記アレイの係数C(kz1, Z, kx, ky)の少なくとも一部の各係数について、個別に、順番に、
前記ｋｙ次元の各係数のｋｙインデックスに従って、前記現在のタイルのｋｙシフト量を設定することと、
前記ｋｘ次元の各係数のｋｘインデックスに従って、前記現在のタイルのｋｘシフト量を設定することと、
シフトされたタイルを得るために、前記現在のタイルへ、前記ｋｙ及びｋｘシフト量を適用することと、
積の集合を得るために、前記各係数により、前記シフトされたタイルを乗算することと、
更新された和の集合を得るために、蓄積バッファに格納された蓄積された和の集合に、積の前記集合を加算することと、
蓄積された和の前記集合を、更新された和の前記集合で上書きすることと、
を実行することと、
（ｅ）（ｂ）から（ｄ）に従って、前記複数の画像の全ての入力画像が処理されるまで、（ｂ）から（ｄ）を実行することと、
（ｆ）出力画像として、前記蓄積された和の現在の値を出力することと、
（ｇ）（ａ）から（ｆ）に従って、前記複数のタイル位置の全てのタイル位置が処理されるまで、（ａ）から（ｆ）を実行することと、を含み、
前記ｋｙシフト量とｋｘシフト量は、（ｆ）の完了時に、前記蓄積された和が、前記現在のタイルの前記複数の画像との三次元畳み込みであるように、選択される、方法。
【請求項２】
（ｄ）を実行することは、前記バッファの前記現在のタイルを上書き又は再ロードすることなしに実行される、請求項１に記載の方法。
【請求項３】
前記現在のｋｚインデックスを有する係数の前記アレイの前記係数の前記少なくとも前記一部は、前記現在のｋｚインデックスを有する係数の前記アレイの前記係数の非ゼロ係数のみを含む、請求項１に記載の方法。
【請求項４】
（ｄ）は、更に、前記現在のｋｚインデックスと、前記Ｚ次元の固有のインデックスを有する係数の前記アレイの係数をそれぞれが含む、複数のカーネルを復元することを含む、請求項１に記載の方法。
【請求項５】
前記複数のカーネルの各カーネルを復元することは、エントリの集合を得ることを含み、各エントリは、前記各カーネルの一係数、前記一係数の前記ｋｘインデックスと前記ｋｙインデックスを含む、請求項４に記載の方法。
【請求項６】
エントリの前記集合は、ゼロに等しい係数の前記アレイの係数についてのエントリを含まない、請求項５に記載の方法。
【請求項７】
シフトされたタイルを得るために、前記現在のタイルに前記ｋｙ及びｋｘシフト量を適用することは、
前記ｋｙシフト量に従って、前記バッファ内の開始アドレスを選択することと、
前記開始アドレスで開始する、前記バッファからの画像データを読み取ることと、
前記シフトされたデータを得るために、前記ｋｘシフト量に従って、前記画像データをシフトすることと、を含む、請求項１に記載の方法。
【請求項８】
積の前記集合を得るために、前記各係数により、前記シフトされたタイルを乗算することは、乗算器のアレイを用いて、同時に、前記シフトされた一部の各行を、前記各係数により乗算することを含む、請求項１に記載の方法。
【請求項９】
係数の前記アレイは、畳み込みニューラルネットワーク（ＣＮＮ）を規定する、請求項１に記載の方法。
【請求項１０】
前記蓄積された和は、前記Ｚ次元に沿った異なるＺインデックスにそれぞれ対応する蓄積された和の複数の集合を含み、
更新された和の前記集合を得るために、積の前記集合を、前記蓄積バッファに格納された蓄積された和の前記集合に加算し、更新された和の前記集合で、蓄積された和の前記集合を上書きすることは、
更新された和の集合を得るために、積の前記集合を、前記各係数のＺインデックスに対応する前記複数の蓄積された和の蓄積された和の集合に加算することと、
前記各係数の前記Ｚインデックスに対応する前記複数の蓄積された和の蓄積された和の前記集合を、更新された和の前記集合で上書きすることと、
を含む、請求項１に記載の方法。
【請求項１１】
畳み込みを実行する装置であって、前記装置は、
Ｚ次元、ｋｚ次元、ｋｘ次元、及びｋｙ次元を定義する係数C(kz, Z, kx, ky)のアレイを受信し、
前記ｋｚ次元のインデックスにそれぞれ対応する複数の入力画像を受信し、
（ａ）前記現在のタイル位置として、複数のタイル位置の次のタイル位置を選択し、
（ｂ）前記現在の画像としての、前記複数の入力画像の次の入力画像I(kz1)と、現在のｋｚインデックスとしての、現在の画像に対応するインデックスｋｚ１とを選択し、
（ｃ）現在のタイルとして、バッファに、前記現在のタイル位置の前記現在の画像I(kz1)のタイルをロードし、
（ｄ）ｋｚ１に等しい前記ｋｚ次元のインデックスを有する係数の前記アレイの係数C(kz1, Z, kx, ky)の少なくとも一部の各係数について、個別に、順番に、
前記ｋｙ次元の前記各係数のｋｙインデックスに従って、前記現在のタイルのｋｙシフト量を設定することと、
前記ｋｘ次元の前記各係数のｋｘインデックスに従って、前記現在のタイルのｋｘシフト量を設定することと、
シフトされたタイルを得るために、前記現在のタイルに、前記ｋｙ及びｋｘシフト量を適用することと、
積の集合を得るために、前記各係数により、前記シフトされたタイルを乗算することと、
更新された和の集合を得るために、積の前記集合を、蓄積されたバッファに格納された蓄積された和の集合に加算することと、
蓄積された和の前記集合を、更新された和の前記集合で上書きすることと、
を実行し、
（ｅ）（ｂ）から（ｄ）に従って、前記複数の画像の全ての入力画像が処理されるまで、（ｂ）から（ｄ）を実行し、
（ｆ）出力画像として、前記蓄積された和の現在の値を出力し、
（ａ）から（ｆ）に従って、前記複数のタイル位置の全てのタイル位置が処理されるまで、（ａ）から（ｆ）を実行する、ようにプログラムされる電子デバイスを備え、
前記ｋｙシフト量とｋｘシフト量は、前記蓄積された和が、（ｆ）の完了時に、前記現在のタイルの、前記複数の画像との三次元畳み込みであるように選択される、装置。
【請求項１２】
前記電子デバイスは、前記バッファに前記現在のタイルを上書き又は再ロードせずに、（ｄ）を実行するようにプログラムされる、請求項１１に記載の装置。
【請求項１３】
前記現在のｋｚインデックスを有する係数の前記アレイの前記係数の前記少なくとも前記一部は、前記現在のｋｚインデックスを有する係数の前記アレイの前記係数の非ゼロ係数のみを含む、請求項１１に記載の装置。
【請求項１４】
前記電子デバイスは、更に、前記現在のｋｚインデックスと、前記Ｚ次元の固有のインデックスを有する係数の前記アレイの係数をそれぞれが含む、複数のカーネルを復元することによって、（ｄ）を実行するようにプログラムされる、請求項１１に記載の装置。
【請求項１５】
前記電子デバイスは、更に、エントリの集合を得ることにより、前記複数のカーネルの各カーネルを復元するようにプログラムされ、各エントリは、前記各カーネルの一係数、前記一係数の前記ｋｘインデックス及び前記ｋｙインデックスを含む、請求項１４に記載の装置。
【請求項１６】
エントリの前記集合は、ゼロに等しい係数の前記アレイの係数についてのエントリを含まない、請求項１５に記載の装置。
【請求項１７】
前記電子デバイスは、更に、
前記ｋｙシフト量に従って、前記バッファの開始アドレスを選択し、
前記開始アドレスにおいて開始する、前記バッファからの画像データを読み取り、
前記シフトされたデータを得るために、前記ｋｘシフト量に従って、前記画像データをシフトする、
ことによって、シフトされたタイルを得るために、前記ｋｙ及びｋｘシフト量を前記現在のタイルに適用するようにプログラムされる、請求項１１に記載の装置。
【請求項１８】
前記電子デバイスは、更に、乗算器のアレイを用いて、前記シフトされた一部の各行を、前記各係数により、同時に乗算することによって、積の前記集合を得るために、前記各係数によって、前記シフトされたタイルを乗算するようにプログラムされる、請求項１１に記載の装置。
【請求項１９】
係数の前記アレイは、畳み込みニューラルネットワーク（ＣＮＮ）を規定する、請求項１１に記載の装置。
【請求項２０】
前記蓄積された和は、前記Ｚ次元に沿って、異なるＺインデックスにそれぞれが対応する、蓄積された和の複数の集合を含み、
前記電子デバイスは、更に、
更新された和の集合をえるために、前記各係数のＺインデックスに対応する前記複数の蓄積された和の蓄積された和の集合に、積の前記集合を加算し、
前記各係数の前記Ｚインデックスに対応する前記複数の蓄積された和の蓄積された和の前記集合を、更新された和の前記集合で上書きする、
ことにより、更新された和の前記集合を得るために、前記蓄積されたバッファに格納された蓄積された和の前記集合に、積の前記集合を加算し、蓄積された和の前記集合を、更新された和の前記集合で上書きする、ようにプログラムされる、請求項１１に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
＜関連出願＞
この出願は、２０１６年８月１１日に出願された、発明の名称ZERO COEFFICIENT SKIPPING CONVOLUTION NEURAL NETWORK ENGINEの米国仮出願第６２／３７３，５１８号の利益を主張し、これは、その全体が、参照によりここに組み込まれる。
【０００２】
＜技術分野＞
この発明は、畳み込みニューラルネットワークを実装することにおいて使用するなどのために、行列畳み込みを実行するシステム及び方法に関する。
【背景技術】
【０００３】
畳み込みニューラルネットワーク（ＣＮＮ）を用いた多くの機械学習用途には、非常に多くの計算とメモリ帯域幅が必要となる。この必要条件を緩和する一つの方法は、係数をゼロ除去し、係数がゼロのとき計算をスキップする事である。これらの既存のソフトウェア及びハードウェア最適化技術は、行列の乗算に基づいている。一例は、Sparse Convolutional Neural Networks (Baoyuan Liu , Min Wang1 , Hassan Foroosh1 , Marshall Tappen , 及び Marianna Penksy)とDeep Neural Network Model Compression and Efficient Inference Engine (Song Han CVA group, Stanford University）に記載されるスパース行列積技術であり、両文献は、その全体が、ここに参照により組み込まれる。
【０００４】
本明細書に開示されるシステムと方法は、ＣＮＮを実装するための改善されたアプローチを提供する。
【図面の簡単な説明】
【０００５】
本発明の利点が容易に理解されるために、簡単に上記した本発明のより具体的な記述は、添付の図面に図示された特定の実施形態を参照してなされるだろう。これらの図面は、本発明の典型的な実施形態を図示するのみであり、従って、その範囲を限定するものとは考えられないという理解の下に、本発明は、添付の図面の使用を通して、さらに具体的に、さらに詳細に記述され、説明されるだろう。
【０００６】
【図１】本明細書で記述する方法に従って用いられ、生成されるデータ構造の概略ブロック図である。
【図２】本発明の実施形態に従って、入力データを用いて、カーネルの畳み込みを計算するコンポーネントの概略ブロック図である。
【図３Ａ】本発明の実施形態に従って、入力データを用いて、カーネルの畳み込みを計算する方法のプロセスフロー図である。
【図３Ｂ】本発明の実施形態に従って、入力データを用いて、カーネルの畳み込みを計算する方法のプロセスフロー図である。
【図４】本明細書で開示するシステム及び方法が実装されうるコンピューティングデバイスの図である。
【発明を実施するための形態】
【０００７】
本明細書で図面に一般的に記述され、図示されるように、本発明のコンポーネントは、広範なさまざまな異なる構成に配置され、設計されうることは容易に理解されるだろう。従って、図面に表現されるように、本発明の実施形態の以下のより詳細な記述は、請求されるような本発明の範囲を限定することは意図されておらず、本発明に従って、現在考えられる実施形態のある例の単なる表現に過ぎない。現在記述される実施形態は、図面を参照することにより、最も良く理解されるだろう。図面においては、同様な部品は、全体を通して同様な参照番号が付けられる。
【０００８】
本発明による実施形態は、装置、方法、又は、コンピュータプログラム製品として、具現化されることが出来る。従って、本発明は、全体的にハードウェアの実施形態、全体的にソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、又は、ソフトウェアとハードウェアの態様を組み合わせる実施形態の形態を取ることが出来、これらは、全て一般に、「モジュール」又は、「システム」として、本明細書で参照されることが出来る。更に、本発明は、媒体に具現化されるコンピュータ使用可能なプログラムコードを有する表現の任意の有体媒体に具現化されるコンピュータプログラム製品の形態を取ることが出来る。
【０００９】
１以上のコンピュータ使用可能又はコンピュータ読み取り可能な媒体の任意の組み合わせが利用されることが出来、これは、非一時的媒体を含む。例えば、コンピュータ読み取り可能な媒体は、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）デバイス、リードオンリーメモリ（ＲＯＭ）デバイス、消去可能プログラマブルリードオンリーメモリ（ＥＰＲＯＭ又はフラッシュメモリ）デバイス、ポータブルコンパクトディスクリードオンリーメモリ（ＣＤＲＯＭ）、光格納デバイス、及び、磁気格納デバイスの１以上を含むことが出来る。選択された実施形態においては、コンピュータ読み取り可能な媒体は、命令実行システム、装置、又は、デバイスによって、または、これらに関連して使用されるプログラムを含み、格納し、通信し、伝搬し、又は、輸送することが出来る、任意の非一時的媒体を含むことが出来る。
【００１０】
本発明の動作を実行するコンピュータプログラムコードは、Java, Smalltalk, C++などのオブジェクト指向プログラミング言語及び、“C”プログラミング言語又は同様なプログラミング言語などの従来のプロシージャプログラミング言語を含む、１以上のプログラミング言語の任意の組み合わせで書かれることが出来る。プログラムコードは、完全に、スタンドアロンソフトウェアパッケージとして、コンピュータシステム上で、スタンドアロンハードウェアユニット上で、部分的に、コンピュータからある距離離れたリモートコンピュータ上で、又は、完全に、リモートコンピュータ又はサーバ上で、実行されることが出来る。後者のシナリオにおいては、リモートコンピュータは、コンピュータに、ローカルエリアネットワーク（ＬＡＮ）、又は、ワイドエリアネットワーク（ＷＡＮ）を含む、任意のタイプのネットワークを介して、接続されることが出来、又は、接続は、外部コンピュータになされることが出来る（例えば、インターネットサービスプロバイダを用いて、インターネットを介して）。
【００１１】
本発明は、本発明の実施形態による、フローチャート図及び／あるいは、方法、装置（システム）、及びコンピュータプログラム製品のブロック図を参照して、以下に記述される。フローチャート図及び／あるいはブロック図の各ブロックと、フローチャート図及び／あるいはブロック図のブロックの組み合わせは、コンピュータプログラム命令又はコードによって実装されることが出来ることは、理解されるだろう。これらのコンピュータプログラム命令は、汎用コンピュータ、専用コンピュータ、又は、他のプログラマブルデータ処理装置のプロセッサに提供され、マシンを構成することが出来、それによってコンピュータ又は他のプログラマブルデータ処理装置のプロセッサによって実行される命令が、フローチャート及び／あるいはブロック図のブロック又は複数のブロックに指定される機能／動作を実装するための手段を生成するようにする。
【００１２】
これらのコンピュータプログラム命令は、また、コンピュータ又は他のプログラマブルデータ処理装置に、特定の方法で機能させることが出来る非一時的コンピュータ読み取り可能な媒体に格納されることが出来、それによってコンピュータ読み取り可能な媒体に格納された命令が、フローチャート及び／あるいはブロック図のブロック又は複数のブロックに指定される機能／動作を実装する命令手段を含む製品を製造するようにする。
【００１３】
コンピュータプログラム命令は、また、コンピュータ又は他のプログラマブルデータ処理装置にロードされて、コンピュータ又は他のプログラマブル装置上で実行されるべき一連の動作ステップに、コンピュータ実装プロセスを生成させることが出来、それによってコンピュータ又は他のプログラマブル装置上で実行される命令が、フローチャート及び／あるいはブロック図のブロック又は複数のブロックに指定される機能／動作を実装するためのプロセスを提供するようにする。
【００１４】
行列積ベースのアーキテクチャは、入力行列を形成するために、オリジナルの２Ｄ画像データの二重化を必要とする基本的な問題を有している。そして、結果として、既に非常に大きいメモリ帯域幅の必要性を増加する。ＣＮＮ用の畳み込みベースのアーキテクチャ、例えば、Vinayak Gokhale, Jonghoon Jin, Aysegul Dundar, Berin Martini 及び Eugenio CulurcielloによるA 240 G-ops/s Mobile Coprocessor for Deep Neural Networksに記述されるアプローチのようなものが存在する。この文献は、参照により、ここに組み込まれる。
【００１５】
われわれの解法は、ゼロ係数スキップと新規の畳み込みエンジンを組み合わせる。これは、劇的に、計算とメモリ帯域幅の両方を減少する。従来の畳み込みは、一回に一つの結果を生成するために、入力２Ｄ画像に渡って、カーネル全体を移動することによってなされる。われわれのエンジンは、一つのカーネル係数のみを、毎回、入力２Ｄ画像の大きな部分（タイル）に適用する。一回に一つのみのカーネル係数を用いるので、ゼロ係数による乗算をスキップして、ずっと高い性能を達成する。カーネルが、先立って圧縮される場合、これは、更に、一回に一つの係数のみを復元する、ローコストカーネル復元器の使用を可能とする。
【００１６】
他の側面においては、畳み込みは、加算ではなく、蓄積を用いて実行される。これは、また、蓄積プロセスの一部に自然にフィットするので、ＣＮＮ入力の第３の次元への作業を可能とする。これは、更に、また、インタリーブして実行されるべき、異なるカーネルからの畳み込みを可能とする。これは、行列積と同様に、入力画像データの再使用を増加する。
【００１７】
適切なサイズの蓄積バッファを用いることで、マルチカーネル蓄積畳み込みニューラルネットワークエンジンは、複数のカーネルに渡って、まとめて、畳み込みを実行することが出来る。異なるカーネルからのこれらの畳み込みは、同一の２Ｄ入力画像データを効果的に共有し、入力画像データ帯域幅を小さくする。更に、この同一の蓄積バッファは、システムの全ての乗算器に渡って、一回に１つの係数ずつなされる畳み込みを可能とし、これは、多くのバッファリングなしに、一回に一つの係数のストリーミング入力を可能とする。
【００１８】
図１を参照すると、画像のピクセル値などの値のアレイについて、カーネルの畳み込みを計算するための、本明細書で開示する装置と方法は、ＣＮＮアルゴリズムの脈絡で用いられることが出来る。特に、三次元画像が、アルゴリズムに入力されることが出来る。例えば、入力は、画像１００のアレイであることが出来る。従って、各画像の各ピクセルは、しばしば、「ボクセル」と呼ばれる、三次元（３Ｄ空間）の体積を表すことが出来る。図示された実施形態においては、ｋｚを２より大きい整数、好ましくは、８より大きい整数として、ｋｚ枚の画像が存在する。各入力画像は、従って、ｋｚ次元に沿ったインデックスを用いて参照される、つまり、Ｉ（ｋｚ）とすることが出来る。
【００１９】
入力画像１００は、カーネル１０４のアレイ１０２によって処理されることが出来る。一つの用途においては、アレイ１０２の各カーネル１０４は、畳み込み出力のアレイを得るために、一つの入力画像に適用される。図示された実施形態においては、それぞれが、ｋｚ個のカーネルを含む、Ｚ個のアレイ１０２が存在する。各カーネルは、ｋｙ及びｋｚ次元を規定する。従って、各係数Ｃは、４つのインデックスについて規定される：Ｃ（ｋｚ，Ｚ，ｋｘ，ｋｙ）。カーネルＫは、ｋｚ及びＺ次元において同一のインデックスを有する係数をさすためにここでは用いられる、つまり、K(kz1, Z1) = C(kz1, Z1, kx, ky)。したがって、各入力画像Ｉ（ｋｚ）は、対応するカーネルＫ（ｋｚ，Ｚ）と畳み込まれ、畳み込みＶ（ｋｚ，Ｚ）を得る。同一のＺインデックスを有する畳み込みＶ（ｋｚ，Ｚ）は、それから、加算され、出力画像１０６、つまり、Ｏ（Ｚ）を得る。
【００２０】
出力画像１０６は、Ｘ値×Ｙ値の次元を有し、ここで、ＸとＹは、入力画像１００の元の次元と同一でもよいし、異なっても良い。各カーネル１０４は、当分野で知られているＣＮＮアルゴリズムに対する任意のアプローチによって決定される値の２次元アレイであることが出来る。
【００２１】
出力画像１０６は、それから、当分野で知られる任意の方法によって、好ましい出力を達成するために、他のカーネル１０４の追加的なアレイ１０２の適用を含むことが出来る、１以上の機能によって、処理されることが出来る。
【００２２】
画像１００のカーネル１０４との畳み込みは、図２及び３について、以下に記述されるコンポーネント及び方法を用いて、有利に実行される。特に、ｋｚ＝ｋｚ１の与えられた値については、カーネルK(kz1, Z)は、Ｚの全ての値に対して、同一の入力画像I(kz1)に適用されなければならない。従って、各画像I(kz1)は、（オーバラップしうる複数のタイルにおいて）一回だけロードされ、全てのカーネルK(kz1, Z)は、次の画像I(kz ≠  kz1)が処理される前に、それに適用される。
【００２３】
図２を参照すると、グラフィック処理ユニット（ＧＰＵ）、算術論理演算器（ＡＬＵ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、又は、プログラマブル汎用プロセッサは、図示されたコンポーネント、又は、図示されたコンポーネント２００の機能を実装することが出来る。
【００２４】
カーネルのグループは、係数復元器２０２に入力されることが出来る。カーネルは、復元ステップの出力がエントリの集合であるように、圧縮されることが出来、エントリのそれぞれは、係数C(kz, Z, kx, ky)とその場所（例えば、ｋｘ、ｋｙ、ｋｚ及びＺインデックス）を含む。このように、カーネルがスパースである場合、カーネルを格納するために必要なデータ量が減少される。
【００２５】
係数復元器２０２は、シーケンス内で、カーネルK(kz1,0)から始まるエントリのストリームを出力することができ、つまり、各カーネルについて、エントリは、順番にストリーミングされ、その後、最後のカーネルK(kz1,Z-1)のエントリがストリーミングされるまで、次のカーネルK(kz1,11)、K(kz1,2)のエントリが順番にストリーミングされる。
【００２６】
エントリのストリームは、ゼロスキップシーケンサ２０４によって順番に処理される。ゼロスキップシーケンサ２０４は、画像バッファ２０６に対して動作する。画像バッファ２０６は、画像I(kz1)の一部を格納する。例えば、画像I(kz1)は、タイルに分割されることが出来る。各タイルは、カーネルの行と列のインデックス（例えば、ｋｙ及びｋｘインデックス）に対応する行と列を含むことが出来る。
【００２７】
係数C(kx,ky) 、行インデックスｋｙ及び列インデックスｋｘを含む与えられたエントリについては、画像バッファ２０６に格納されたタイルは、ｋｙに等しい行数だけ、垂直にシフトされる（異なる位置にシフトされた行）ことが出来る。タイルは、また、ｋｘに等しい量だけ、水平にシフトされる（異なる位置にシフトされた列）ことが出来る。
【００２８】
垂直シフトはコンポーネント２００の後続のステージへの入力として、タイルが読み出されるだろう画像バッファの開始アドレス、例えば、行アドレスを選択し、そのことによって垂直シフトを達成するようにすることにより、実装されることが出来る。水平シフトは、水平シフト量に等しい列数だけ、画像バッファの各行の値をシフトするシフタ２０８によって達成されることが出来る。このシフトは、当分野で知られる任意のシフタの実装を用いて実行されることが出来る。
【００２９】
幾つかの実施形態においては、シフタ２０８は、１、２、又は４エレメントセグメントシフタ（element segmented shifter）である。このセグメントシフタは、画像バッファ２０６内のデータを、１行×６４列、２行×３２列、又は、４行×１６列として、扱うことが出来る。セグメントシフタは、この行及び列の定義により、水平シフト及び垂直シフトを実行する。例えば、データが、１行に配置されている場合、垂直シフトは、画像バッファ読み出しアドレス、つまり、画像バッファ２０６からデータが読み出されるアドレス、を制御するだけで、行われる。データが２又は４行である場合、画像バッファ読み出しアドレスを制御するのみでは十分ではない。むしろ、読み出されたデータは、また、正しい行を、画像バッファ２０６内の正しい位置に配置することによって行シフトされる必要があるだろう。
【００３０】
タイルに基づいて計算される畳み込みの行と列の数は、タイルのサイズより少ないことに注意するべきである。Ａ×Ｂカーネルが適用されるＭ（行）×Ｎ（列）タイルは、（Ｍ−Ａ＋１）×（Ｎ−Ｂ＋１）個の畳み込み値を有する出力タイルを得るだろう。従って、垂直シフト及び水平シフトは、画像バッファ２０６内のタイルに、（Ｍ−Ａ＋１）×（Ｎ−Ｂ＋１）ウィンドウを配置する効果を有し、そのウィンドウ内の値は、乗算器２１０及び加算器２１２によって更に処理されるために、出力される。乗算器２１０及び加算器２１２は、（Ｍ−Ａ−１）×（Ｎ−Ｂ−１）個の値を並列に処理することが出来る。
【００３１】
有効畳み込み値出力の数が、タイルのサイズより小さい限り、タイルは、１出力タイルが、一回に生成されるように処理されることが出来る。具体的には、M2 行及び N2 列を有する各出力タイルについては、ロードされた入力タイルは、M = M2 + A - 1 行及び N = N2+ B -1 列を含むだろう。各タイルは、出力画像１０６において、特定の出力タイルを生成するようにロードされる。
【００３２】
各出力タイルは、それが含むより多くの入力行と列を必要とするので、入力タイルは、相互に重なる、つまり、同一の行及び／あるいは列の幾つかを含むだろう。例えば、初期タイルは、入力画像１００の行０〜Ｍ−１及び列０〜Ｎ−１を有することが出来る。第２のタイルは、入力画像の行０〜Ｍ−１及び列Ｎ−Ｂ−１〜２＊Ｎ−Ｂ−１を有することが出来る。同様に、行０〜Ｍ−１の全てのタイルが処理された後、タイルの次の行は、行Ｍ−Ａ−１〜２＊Ｍ−Ａ−１及び列２＊Ｎ−Ｂ−１を含むことが出来る。
【００３３】
一般的に言うと、水平に移動することによって、各タイルは、前のタイルの最後Ｂ−１個の列を含むだろう。垂直に移動することによって、各タイルは、前のタイルの最後Ａ−１個の行を含むだろう。
【００３４】
係数のインデックスによりシフトされた係数とタイルは、それから、乗算器２１０に入力される。乗算器２１０は、出力タイルの各行の更新が並列に行われることが出来るように、少なくとも、出力タイルの一行と同じ数の乗算器を実装することが出来る。
【００３５】
乗算器２１０の出力は、それから、蓄積バッファ２１４に格納される要素のアレイをその入力としてとる加算器２１２に入力される。加算の結果は、それから、蓄積バッファ２１４に戻されて格納される。図示された実施形態においては、シフトされたタイルの５６個の値は、係数により乗算され、蓄積バッファ２１４に格納された対応する５６個の値と加算され、蓄積バッファ２１４に書き戻される。
【００３６】
ｉとｊが、行と列の位置として、与えられたタイル値Ｔ（ｉ，ｊ）について特に、蓄積バッファ２１４内の値Ａ（ｉ，ｊ）は、A(i,j) = A(i,j) + T(i,j)に等しく設定されることが出来る。Ａ（ｉ，ｊ）は、ｉ０を蓄積バッファ２１４内のオフセットとして、Ａ（ｉ＋ｉ０，ｊ）と置き換えることが出来ることに注意すべきである。幾つかの実施形態においては、タイルのサイズは、蓄積バッファ２１４のサイズと、等しく、又は、略等しく（例えば、その９０％）、設定されることが出来る。あるいは、蓄積バッファ２１４は、タイルのサイズより、何倍も大きくすることが出来る。
【００３７】
ゼロスキップシーケンサ２０４によって制御される水平及び垂直シフトは、乗算ステップの出力が、蓄積バッファ２１４内の適切な位置に整列されるだろうことを保証する。このように、カーネルの全ての係数が処理された後、蓄積バッファ２１４の値は、入力タイルとのカーネルの畳み込みに等しくなるだろう。
【００３８】
図３Ａを参照すると、図示されたコンポーネント２００又は汎用プロセッサは、図示された方法３００ａを実装することが出来る。特に、図示されたコンポーネント２００を用いた、相互動作と図３Ａのステップのシーケンスの制御は、コントローラによって実行されることが出来る。方法３００ａは、処理されている画像（「現在の画像」）の２Ｄ入力タイル（「現在のタイル」）を画像バッファ２０６内にロードすること３０２と、アレイ１０２内の２Ｄカーネル１０４などの次の２Ｄカーネル１０４を選択することを含むことが出来る。第１の繰り返しについては、ロード３０２されるタイルは、現在の画像における第１のタイルであることが出来、２Ｄカーネル（「現在のカーネル」）は、現在の画像に対応する、例えば、現在の画像と同一のｋｚインデックスを有する、２Ｄカーネルの列に於ける第１の２Ｄカーネル（図１参照）とすることが出来る。
【００３９】
現在のカーネルは、それから、復元され３０６、これは、それぞれが係数、列インデックス、及び行インデックスを含む、エントリのストリームとなる。あるいは、単一のインデックス値は、カーネル内の特定の列と行にマッピングする出力であることが出来る。図示された方法３００ａは、カーネルのエントリの多くがゼロの場合に特に有効であることに注意すべきである。従って、非ゼロの値のエントリのみが、圧縮カーネルに含まれ、従って、以下に記述する乗算と加算ステップは、これらの非ゼロ値について省略される。
【００４０】
カーネルのエントリは、順番に処理されることが出来る。例えば、方法３００ａは、ストリーム内のエントリ（「現在のエントリ」）を選択すること３０８を含むことが出来る。現在のタイルの値（例えば、（Ｍ−Ａ＋１）×（Ｎ−Ｂ＋１）ウィンドウ）の一部は、それから、現在のエントリの列インデックスに従って、水平方向にシフトされ３１０、現在のエントリの行インデックスに従って、垂直にシフトされる３１２ことが出来る。
【００４１】
これは、開始アドレスから始まる画像バッファ２０６から現在のタイルの行の一部を読み出し、読み出した後、各行を水平方向にシフトすることを含むことが出来る。例えば、行における全てのＮ個の値は、列インデックスの値に従って、０からＢ−１の位置へ左にシフトされることが出来る。左への値は、シフトして外され、左から始まる各行の残りのＮ−Ｂ＋１値は、以下に議論される「シフトされた値」として、後に処理されるだろう。シフトされた値は、それから、乗算器２１０へ入力され、これは、各値を、現在のエントリからの係数により乗算する３１４。上記したように、乗算ステップ３１４は、各値が個別の乗算器２１０に入力されるように、並列に実行されることが出来る。
【００４２】
乗算ステップ３１４の出力は、それから、蓄積バッファ２１４の現在のコンテンツと加算される３１６。特に、シフトされたタイルの各位置は、蓄積バッファ２１４の対応する位置の値に加算され、その位置に書き込まれることが出来る。例えば、タイル内のｉ及びｊを行及び列の位置として、タイル値Ｔ（ｉ，ｊ）は、Ａ（Ｉ，ｊ）を、蓄積バッファ３１４内のｉ及びｊの位置における値として、A(i,j) = A(i,j) + T(i,j)として、ステップ３１６において、加算されることが出来る。あるいは、Ａ（ｉ，ｊ）は、ｉ０を、蓄積バッファ内のオフセットとして、A(i + i0, j)と置き換えられることが出来る。
【００４３】
カーネル１０４の各アレイ１０２（例えば、行）は、一つの出力画像１０６を決定するために用いられることに注意するべきである。蓄積バッファは、従って、列に於ける各カーネルの値の個別の集合を含むだろう。従って、現在のカーネルとしての与えられたカーネルＫ（ｋｚ、Ｚ）について、オフセットi0 = Z*(M - A + 1)は、加算ステップ３１６で用いられる値を取得し、加算ステップ３１６の結果を書き込むことになる、蓄積バッファ２１４のアドレスを決定するために用いられることが出来る。
【００４４】
現在のカーネルに於けるエントリが、残っていると発見される３１８場合、それから、処理は、ステップ３０８において、現在のエントリとしての、現在のカーネル内の次のエントリについて、継続する。現在のカーネルにエントリが残っていないと発見された場合は、それから、方法３００は、現在の画像に対応する列に、カーネルが残っているか否かを評価する３２０ことを含むことが出来る。処理されるべきカーネルが列の中に残っている場合、処理は、ステップ３０４において、現在のカーネルとしての、列内の次のカーネルについて継続する。
【００４５】
幾つかの実施形態においては、列のカーネルは、復元され、ストリームに出力され、それによってステップ３１８及び３２０の個別の評価は実行されず、むしろ、特定の列のストリームの末端が代わりに検出されるようにすることに注意すべきである。
【００４６】
列のカーネルの全てが、処理されるべきと決定される３２０場合、それから、方法３００は、処理されていない現在の画像の残りのタイルがあるか否かを評価する３２２ことを含むことが出来る。そうならば、それから、処理は、ステップ３０２において、ステップ３０２においてロードされる現在のタイルとしての、画像の次のタイルについて継続する。そうでないなら、それから、方法は、現在の画像について終了する。
【００４７】
図３Ｂを参照すると、幾つかの実施形態においては、方法３００ｂは、３Ｄ畳み込みを実装するために、コンポーネント２００によって実装されることが出来る。この場合には、入力画像１００の集合は、カーネル１０４のアレイ１０２を用いて、単一の出力画像１０６を得るために処理され、複数のアレイ１０２は、出力画像１０６の集合を得るために用いられる。
【００４８】
この場合、現在のタイルについて、処理されるべき２Ｄカーネルがもうないと判定される３２０場合、方法３００ｂは、処理されるべき残りの２Ｄ入力画像１００があるか否かを判定する３２６ことを含む。そうであるならば、次の２Ｄ入力画像１００は、現在の画像として選択され３２８、現在の画像に対応する２Ｄカーネルの列は、また、処理のために選択される。処理は、それから、ステップ３０２において、現在の画像について継続する。
【００４９】
現在のタイル位置について、処理されるべき、残りの２Ｄ入力画像が発見されない３２６場合、方法３００ｂは、処理されるべく残っている残りのタイル位置があるか否かを評価する３３０ことを含む。そうであるならば、それから、ステップ３３２において、初期画像が、現在の画像として選択され、現在の画像に対応するカーネルの列が、処理のために選択され、次の３Ｄタイル位置が、現在のタイル位置として選択される。それから、処理は、ステップ３０２において、タイルが、現在のタイル位置からロードされ３０２、継続する。
【００５０】
方法３００ｂの最初の繰り返しについて、現在のタイル位置は、最初のタイル位置、例えば、ｍ＝０及びｎ＝０の位置から開始するＭ×Ｎタイルである。各繰り返しにおいて、タイル位置は、Ｔｈをタイルの行の数とし、Ｔｗをタイルの列の数として、ｍ＝０〜Ｔｈ−１、及び、ｎ＝０〜Ｔｗの、ｍとｎの全ての置換へ、水平に、又は、水平及び垂直に移動する。上記したように、タイルは、次のタイル位置が、前のタイルのＢ−１個の列又は、タイルの前の行のＡ−１個の行を含むように、重なることが出来る。
【００５１】
処理されるべき３Ｄタイルが残っていないと発見された３３０場合、蓄積バッファに格納されたタイルは、出力され３３４、現在のタイル位置に対応する出力画像１０６の位置において、例えば、固定格納デバイス、又は、他のメモリデバイス内の出力画像１０６に格納される。各タイル位置が完全に処理された（つまり、カーネルの全ての列が適用された）後、蓄積バッファ２１４に格納される出力タイルは、各出力画像１０６についての一つのタイルの最終値である。ステップ３３４は、更に、蓄積バッファ２１４をゼロに初期化することを含むことが出来る。
【００５２】
上記方法は、ＣＮＮアルゴリズムの適用の一部であることが出来ることに注意するべきである。従って、ＣＮＮアルゴリズムの他の処理は、方法２００の実行の前後とすることが出来る。上記方法は、また、畳み込みが実行される任意の他の画像処理技術に用いられることも出来る。方法２００は、また、特に、カーネルが大きいときなどの、行列畳み込みが必要とされるときはいつも用いられることが出来る。
【００５３】
図４は、例示的コンピューティングデバイス４００を図示するブロック図である。コンピューティングデバイス４００は、本明細書で議論したもののような、様々なプロシージャを実行するために用いられることが出来る。コンピューティングデバイス４００は、サーバ、クライアント、又は、任意の他のコンピューティングエンティティとして機能することが出来る。コンピューティングデバイスは、本明細書で開示された方法を実行する回路を組み込むことが出来、三角関数を計算する為に、本明細書で開示した方法を引き起こすアプリケーションプログラムなどの１以上のアプリケーションプログラムを実行することが出来る。コンピューティングデバイス４００は、デスクトップコンピュータ、ノートブックコンピュータ、サーバコンピュータ、ハンドヘルドコンピュータ、タブレットコンピュータなどの任意の広範な様々なコンピューティングデバイスとすることが出来る。
【００５４】
コンピューティングデバイス４００は、１以上のプロセッサ４０２、１以上のメモリデバイス４０４、１以上のインタフェース４０６、１以上のマスストレージデバイス４０８、１以上の入出力（Ｉ／Ｏ）デバイス４１０、及び、ディスプレイデバイス４３０を含み、これらすべては、バス４１２に結合される。プロセッサ４０２は、メモリデバイス４０４及び／あるいはマスストレージデバイス４０８に格納される命令を実行する１以上のプロセッサ又はコントローラを含む。プロセッサ４０２は、また、キャッシュメモリなどの、様々なタイプのコンピュータ読み取り可能な媒体を含むことが出来る。
【００５５】
メモリデバイス４０４は、揮発性メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ）４１４）及び／あるいは不揮発性メモリ（例えば、リードオンリーメモリ（ＲＯＭ）４１６）などの、様々なコンピュータ読み取り可能な媒体を含む。メモリデバイス４０４は、また、フラッシュメモリなどの、再書込み可能なＲＯＭを含むことが出来る。
【００５６】
マスストレージデバイス４０８は、磁気テープ、磁気ディスク、光ディスク、固体メモリ（例えば、フラッシュメモリ）などの、様々なコンピュータ読み取り可能な媒体を含む。図４に示されるように、特定のマスストレージデバイスは、ハードディスクドライブ４２４である。様々なドライブは、また、様々なコンピュータ読み取り可能な媒体からの読み出し、及び／あるいは、これらへの書き込みを可能とするマスストレージデバイス４０８に含まれることが出来る。マスストレージデバイス４０８は、取り外し可能な媒体４２６及び／あるいは取り外し不可能な媒体を含む。
【００５７】
Ｉ／Ｏデバイス４１０は、コンピューティングデバイス４００へ、データ及び／あるいは他の情報を入力したり、これからこれらを検索・取得したりすることを可能とする様々なデバイスを含む。例示的Ｉ／Ｏデバイス４１０は、カーソル制御デバイス、キーボード、キーパッド、マイク、モニタ又は他のディスプレイデバイス、スピーカ、プリンタ、ネットワークインタフェースカード、モデム、レンズ、ＣＣＤ又は他の画像捕捉デバイスなどを含む。
【００５８】
ディスプレイデバイス４３０は、コンピューティングデバイス４００の１以上のユーザに情報を表示することが出来る任意のタイプのデバイスを含む。ディスプレイデバイス４３０の例は、モニタ、ディスプレイ端末、ビデオ投影デバイスなどを含む。
【００５９】
グラフィック処理ユニット（ＧＰＵ）４３２は、プロセッサ４０２及び／あるいはディスプレイデバイス４３０に結合されることが出来る。ＧＰＵは、コンピュータ生成画像をレンダリングし、他のグラフィカル処理を実行するように動作することが可能である。ＧＰＵは、プロセッサ４０２のような、汎用プロセッサの幾つか又は全ての機能を含むことが出来る。ＧＰＵは、また、グラフィック処理に特有な更なる機能を含むことも出来る。ＧＰＵは、座標変換、影付け、テクスチャリング、ラスタライゼーションに関連するハードコーディングされた、及び／あるいはハードワイヤードなグラフィック機能と、コンピュータ生成画像をレンダリングするのに有効な他の機能を含むことが出来る。
【００６０】
インタフェース４０６は、コンピューティングデバイス４００が、他のシステム、デバイス、又は、コンピューティング環境と相互作用することを可能とする様々なインタフェースを含む。例示的インタフェース４０６は、ローカルエリアネットワーク（ＬＡＮ），ワイドエリアネットワーク（ＷＡＮ）、無線ネットワーク、及びインターネットへのインタフェースなど、任意の数の異なるネットワークインタフェース４２０を含む。他のインタフェースは、ユーザインタフェース４１８と周辺デバイスインタフェース４２２を含む。インタフェース４０６は、また、１以上のユーザインタフェース素子４１８を含むことも出来る。インタフェース４０６は、また、プリンタ、ポインティングデバイス（マウス、トラックパッドなど）、キーボードなどへのインタフェースなどの１以上の周辺インタフェースを含むことが出来る。
【００６１】
バス４１２は、プロセッサ４０２、メモリデバイス４０４、インタフェース４０６、マスストレージデバイス４０８、及び、Ｉ／Ｏデバイス４１０が、相互に、及びバス４１２に結合された他のデバイス又はコンポーネントとも、通信出来るようにする。バス４１２は、システムバス、ＰＣＩバス、ＩＥＥＥ１３９４バス、ＵＳＢバスなどの１以上の数タイプのバス構造を表す。
【００６２】
図示のために、プログラム及び他の実行可能なプログラムコンポーネントは、本明細書では、個別のブロックとして示されたが、そのようなプログラム及びコンポーネントは、コンピューティングデバイス４００の異なるストレージコンポーネントに様々なときに常駐することが出来、プロセッサ４０２によって実行されることが理解される。あるいは、本明細書で記述したシステム及びプロシージャは、ハードウェア、又は、ハードウェア、ソフトウェア、及び／あるいはファームウェアの組み合わせで実装されることが出来る。例えば、１以上の特定用途向け集積回路（ＡＳＩＣ）は、本明細書で記述した１以上のシステム及びプロシージャを実行するためにプログラムされることが出来る。
【００６３】
本発明は、その精神又は本質的特性から逸脱することなく、他の特定の形態で具現化されることが出来る。記述された実施形態は、全ての意味で、図示のためのみであり、限定するものではない、と考えられるべきである。本発明の範囲は、従って、前述の記述ではなくて、むしろ、添付の請求項によって示される。請求項の意味及び均等の範囲内に入る全ての変更は、それらの範囲に含まれるべきである。
【図１】
2018028908.tif 000003
【図２】
2018028908.tif 000004
【図３Ａ】
2018028908.tif 000005
【図３Ｂ】
2018028908.tif 000006
【図４】
2018028908.tif 000007
【外国語明細書】
【発明の名称】
2018028908.tif 000008
【技術分野】
【０００１】
2018028908.tif 000009
【背景技術】
【０００２】
2018028908.tif 000010
【図面の簡単な説明】
【０００３】
2018028908.tif 000011
【発明を実施するための形態】
【０００４】
2018028908.tif 000012
2018028908.tif 000013
2018028908.tif 000014
2018028908.tif 000015
2018028908.tif 000016
2018028908.tif 000017
2018028908.tif 000018
2018028908.tif 000019
2018028908.tif 000020
2018028908.tif 000021
2018028908.tif 000022
2018028908.tif 000023
2018028908.tif 000024
2018028908.tif 000025
2018028908.tif 000026
2018028908.tif 000027
2018028908.tif 000028
2018028908.tif 000029
2018028908.tif 000030
2018028908.tif 000031
2018028908.tif 000032
2018028908.tif 000033
2018028908.tif 000034
2018028908.tif 000035
2018028908.tif 000036
2018028908.tif 000037
【要約】
2018028908.tif 000038
【選択図】なし
【図１】
2018028908.tif 000039
【図２】
2018028908.tif 000040
【図３Ａ】
2018028908.tif 000041
【図３Ｂ】
2018028908.tif 000042
【図４】
2018028908.tif 000043