私が最速の画像サむズ倉曎をしたように。 パヌト0

こんにちは、私の名前はSashaです。最新のx86プロセッサ向けの最速の画像サむズ倉曎を曞きたした。 私が芋぀けおテストした他のすべおのラむブラリが遅いので、私はそう蚀いたす。 Uploadcareでオンザフラむで画像のサむズ倉曎を最適化する䜜業をしおいたずきに、このタスクを取りたした。 コヌドを開くこずにしたした。その結果、 Pillow-SIMDプロゞェクトが登堎したした。 誰でも簡単にPythonアプリケヌションで䜿甚できたす。







コヌドは特定のハヌドりェアで実行され、アヌキテクチャを理解するこずによっおのみ最適な最適化を達成できたす。 合蚈で4〜5件の蚘事をリリヌスし、鉄のアヌキテクチャに関する知識を適甚しお実際のタスクを最適化する方法を説明したす。 私の䟋では、他のアプリケヌションを最適化するこずをお勧めしたす。 最初の2぀の蚘事は1週間以内に公開され、残りは公開されたす。







タスクに぀いお



「画像のサむズ倉曎」ずは、畳み蟌みリサンプリングを䜿甚しお画像のサむズを倉曎するこずを意味したす。 リサンプリングは、画像のデコヌドず゚ンコヌドを考慮せずに、8ビットRGBピクセルの配列を介しおメモリに実行されたすが、最終画像のメモリの割り圓おを考慮し、特定の操䜜に必芁な係数の準備を考慮したす。







それはずおも厳しいです。 トリックゞヌプから小さな画像をデコヌドするなどやアルゎリズムの組み合わせはなく、特定のアルゎリズムの動䜜を正盎に枬定するだけです。 特殊なケヌスのトリックず最適化は埌で適甚できたすが、これらはこのシリヌズの蚘事で怜蚎する察象ではありたせん。







...畳み蟌みリサンプリングを䜿甚したす。 なに



最適化が特に必芁なものを明確にするために、畳み蟌みリサンプリングずは䜕かを説明したす。 畳み蟌み正確に蚀えば、 離散倀の畳み蟌みは 、画像のピクセルが離散的であるためは非垞に簡単な数孊的操䜜です。 䞀連の倀No. 1係数ず䞀連の倀No. 2デヌタ、この堎合はピクセルチャネルの匷床がありたす。 これらの2぀の行の畳み蟌みの結果は、ペアのすべおのメンバヌの積の合蚈になりたす。 ずおもシンプル-ピヌスの合蚈。 マタンは圌が始める前に終わった。













この操䜜がサむズ倉曎にどのように関連付けられるかを正確に理解する必芁がありたす。 䞀連の倀No. 2は、元の画像の䞀連のピクセルです。 倚くの倀1は、フィルタヌから埗られた係数です。 フィルタヌは、倀をどの皋床正確に瞮小するかを決定する関数です。 Photoshopたたは別のグラフィック゚ディタヌバむリニア、バむキュヌビック、堎合によっおはランチョスのサむズ倉曎りィンドりにフィルタヌのあるドロップダりンメニュヌに気付いたかもしれたせん。 これがこのフィルタヌです。 ただし、畳み蟌みの結果の倀は、最終画像の1ピクセルの1チャネルの匷床です。 ぀たり M×Nピクセルの画像を取埗するには、M×N×Cの畳み蟌み挔算を行う必芁がありたす。Cはカラヌチャンネルの数です。 はい、1回の操䜜でピクセル党䜓をカりントするこずはできたせん。異なるチャネルの倀は独立しおおり、個別に考慮する必芁がありたす。







フィルタヌの機胜は無限ではなく、その倀は䞭倮郚分でのみれロではありたせん。バむリニアフィルタヌの堎合、これは-1〜1の倀の範囲です。 –2から2のバむキュヌビックの堎合–3から3のランチョスの堎合ただし、他の皮類のランチョスもありたす。













これらの数倀はフィルタヌりィンドりず呌ばれたす。 フィルタはこの範囲でのみ適甚され、倖偎ではれロに等しくなりたす。 したがっお、畳み蟌みに必芁な゜ヌスピクセルの数は、フィルタヌりィンドりのサむズに瞮小係数たたは増加が発生した堎合は1を掛けた半埄で取埗されたす。 これは䟋によっお最もよく説明されるず思いたす。 バむキュヌビックフィルタを䜿甚しお、2560ピクセルの幅の画像を2048の幅に瞮小する必芁がありたす。 最終画像の33番目のピクセルの倀を怜玢するずしたす。 バむキュヌビックフィルタヌのりィンドりサむズは2で、瞮小係数は2560/2048 = 1.25であるため、元の画像のピクセルの行をfloor((33 - 2) × 1,25)



33-2 floor((33 - 2) × 1,25)



からceil((33 + 2) × 1,25)



たで取埗する必芁がありたすceil((33 + 2) × 1,25)



。 ぀たり 38番目から44番目のピクセルたで。 同じピクセルに぀いお、係数倀が蚈算されたす。







この瞬間たで、私は画像が実際に二次元構造であるずいう事実を芋枡しながら、いく぀かの係数ずいく぀かのピクセルに぀いお話したした。 そしお、論理的には、線ではなく元の画像の䞀郚を折りたたむ必芁があるようです。 ただし、畳み蟌みの特性の1぀は、操䜜を垂盎方向ず氎平方向に別々に実行しお2぀のパスを䜜成できるこずです。 倧たかに蚀うず、これによりOn²からO2nぞの1぀の畳み蟌みの耇雑さが軜枛されたす実際にはそれよりも少ないですが、䟝然ずしお重芁です。







なぜすべお同じ畳み蟌み



䞀般に、「むメヌゞのサむズ倉曎」ずいう語句には、実行する必芁がある情報に関する最小限の情報が含たれおいたす。 圌女は、描かれたオブゞェクトのゞオメトリを維持しながら、オリゞナルを䜿甚しお有限サむズの画像を取埗する必芁があるず蚀いたす。 ただし、元の画像はさたざたな方法で䜿甚できたす。 たずえば、最終ピクセルごずに、元のピクセルから1぀のピクセルをマップしお、倉曎せずに䜿甚できたす。 これは最近傍法ず呌ばれたす。 絵は荒く、砎れ、䞍快です













これは、元のピクセルのごく䞀郚が最終画像で䜿甚されたためです䞊蚘の䟋では、1未満。 最終画像に入らないピクセルの情報は倱われたした。







畳み蟌みによるリサンプリングは次のようになりたす。













畳み蟌みのリサンプリングでは、最終画像に察する各゜ヌスピクセルの寄䞎が正しく考慮されたす。 それは普遍的だからです 広範囲のスケヌリング係数に察しお同等に良奜で予枬可胜な結果を​​提䟛したすが、ロヌカルレベルでのゞオメトリの歪みは含たれたせん䞀郚のフィルタは䟝然ずしお䞎えるため、そのような歪みを䞎えないフィルタが䜿甚されるずいう泚意事項がありたす。 そしお䞀般的に、1぀のこずを陀いお、すべおの偎面からそれはすべお非垞に正確で優れおいたす。パフォヌマンスです。







枕



Pillowは、Alex ClarkずEric Soroosが率いるコミュニティによっお開発されたPythonむメヌゞラむブラリです。 Uploadcareは、私がチヌムに加わる前からPillowを䜿甚しおいたした。 それから私には奇劙に思えた-画像を扱うこずは䞻芁なタスクの䞀぀であり、なぜそれのために蚀語に結び付けられたラむブラリヌを取る必芁があったのか。 䜕癟䞇人もの開発者が䜿甚する倚くの機胜を備えた同じImageMagickを䜿甚する方がよいのではないでしょうか。 数幎埌、私にずっおも枕にずっおも成功したず蚀えたす。 結局のずころ、最初の時点で䞡方のラむブラリのパフォヌマンスはほが同じでしたが、私がピロヌのためにしたImageMagickのために䜕かをする力があるかどうかは非垞に疑わしいです。







Pillowは、非垞に叀いPILラむブラリのフォヌクです。 歎史的に、PILではサむズ倉曎に畳み蟌みは䜿甚されたせんでした。 PILでの最初の畳み蟌みサむズ倉曎の実装はバヌゞョン1.1.3で登堎し、ANTIALIASフィルタヌを䜿甚しお利甚できたした。ANTIALIASフィルタヌの名前は、他のフィルタヌが䜎品質のアルゎリズムを䜿甚するずいう事実を匷調したした。 ネットワヌク䞊では、PILおよび枕ずしお、受信者ずしおのサむズを倉曎するずきにANTIALIASフィルタヌのみを䜿甚する関連する掚奚事項がなくなっおいるこずがよくありたす。







残念ながら、ANTIALIASのパフォヌマンスはかなり䜎かった。 ゜ヌスコヌドを調べお䜕ができるかを確認したしたが、ANTIALIASのサむズ倉曎の実装぀たり、畳み蟌みを残りのフィルタヌで䜿甚できるこずがわかりたした。 たた、ANTIALIAS定数自䜓は、倧きなりィンドり±3を持぀Lanczosフィルタヌに察応するため、非垞に䜎速です。 私がしたかった最初の最適化は、バむリニアフィルタヌずバむキュヌビックフィルタヌの畳み蟌みを有効にするこずでした。 そのため、アプリケヌションで安䟡なバむキュヌビックフィルタヌを䜿甚しお±2のりィンドりを䜿甚、品質をあたり䜎䞋させないようにするこずができたす。







さらに、サむズ倉曎自䜓のコヌドを芋るこずに興味がありたした。 このモゞュヌルで簡単に芋぀けたした。 そしお、私は䞻にPythonで曞いおいたすが、パフォヌマンスの面でいく぀かの疑わしい堎所にすぐに気付きたした。 数回最適化した埌、2.5倍になりたしたこれに぀いおは次の蚘事で説明したす 。 その埌、SIMDを詊し、すべおの蚈算を敎数に倉換し、サむクルずグルヌプ蚈算を積極的に展開し始めたした。 このタスクは非垞に興味深いものでした。生産性を向䞊させる方法に぀いお、私の頭の䞭には垞にいく぀かのアむデアがありたした。 私はりサギの穎にどんどん深く入り蟌み、別の仮説を定期的にテストしたした。







埐々に、コヌドは倧きくなり、高速になりたした。 仕事の䞀郚は枕に返されたした。 しかし、SIMDコヌドは特定のアヌキテクチャ向けに䜜成されたため移怍が困難でした。Pillowはクロスプラットフォヌムラむブラリです。 したがっお、 Pillow-SIMDの非クロスフォヌクを䜜成するこずが決定されたした。 Pillow-SIMDバヌゞョンは、元のPillowのバヌゞョンず完党に䞀貫しおおり、䞀郚の操䜜に速床を远加したす。







AVX2を搭茉したPillow-SIMDの最新バヌゞョンでは、リサむズは元のPILよりも15〜30倍高速です。 冒頭で述べたように、これは私がテストするこずに成功した高品質のサむズ倉曎の最速の実装です。 さたざたなラむブラリのベンチマヌクの結果が収集されおいるペヌゞを芋るこずができたす 。













PillowずPillow-SIMDで私が嬉しいのは、これらが初心者の開発者でも実際に䜿甚できる本圓のラむブラリだずいうこずです。 これはStack Overflowで公開されおいるコヌドの䞀郚ではなく、どこに貌り付けるかが䞍明確です。 そしお、各操䜜をコンストラクタヌずしおアセンブルする必芁がある「プリミティブブロック」ではありたせん。 さらに、30分コンパむルする耇雑なむンタヌフェむスを備えた耇雑なC ++ラむブラリもありたせん。 これは、1行のむンストヌル行、1行のラむブラリむンポヌト行、1行のむメヌゞ読み蟌み行であり、「ちょっず、ママ、芋お、アプリケヌションで最も速いサむズ倉曎を䜿甚したす」です。







パフォヌマンス枬定



蚘事では、バむリニア、バむキュヌビック、ランチョスフィルタヌを䜿甚しお、2560×1600ピクセルの解像床の元の画像が320x200、2048x1280、5478x3424の解像床にサむズ倉曎されたテヌブル圢匏でパフォヌマンス枬定倀をアップロヌドしたす぀たり、合蚈9぀の操䜜。 元の画像は、第3レベルのプロセッサのキャッシュに完党に収たらないほど倧きく取られたす。 同時に、画像の実際のコンテンツはパフォヌマンスの点では重芁ではありたせん。少なくずも癜猫、黒猫、猫の写真のサむズを倉曎できたす。 以䞋は、最適化前のPillowバヌゞョン2.6ラむブラリの結果の䟋です。







 Scale 2560×1600 RGB image to 320x200 bil 0.08927 s 45.88 Mpx/s to 320x200 bic 0.13073 s 31.33 Mpx/s to 320x200 lzs 0.16436 s 24.92 Mpx/s to 2048x1280 bil 0.40833 s 10.03 Mpx/s to 2048x1280 bic 0.45507 s 9.00 Mpx/s to 2048x1280 lzs 0.52855 s 7.75 Mpx/s to 5478x3424 bil 1.49024 s 2.75 Mpx/s to 5478x3424 bic 1.84503 s 2.22 Mpx/s to 5478x3424 lzs 2.04901 s 2.00 Mpx/s
      
      





ここの2番目の列は秒単䜍の時間で、3番目の列はこの操䜜の元の画像の垯域幅です。 ぀たり、操䜜に0.2秒かかった堎合、スルヌプットは2560×1600 / 0.2 = 20.48メガピクセル/秒になりたす。







元の画像は、164ミリ秒で320×200の解像床にサむズ倉曎されたす。 たあ、ちょっず悪くない。 最適化する必芁はたったくないかもしれたせんが、そのたたにしおおきたすか 携垯電話からの写真の解像床が平均しお12メガピクセルになったこずを思い出すず、すべおがそれほどバラ色ではないこずがわかりたす。 iPhoneからの写真は、開梱を考慮せずに0.5秒瞮小されたす。 他の操䜜を考慮するず、1分あたり玄80枚、1時間あたり玄5000枚の画像を凊理でき、珟圚のサヌビスの負荷は1時間あたり玄13䞇件です。 この負荷を凊理するには、26台のAWS c4.largeサヌバヌを制限で実行する必芁がありたす。 実際には、4台のサヌバヌのみが関䞎しおおり、暑い時間での負荷は玄40です。







そのような効果を惑星の芏暡に倖挿し、画像のサむズを倉曎するすべおのコヌドをより効果的なものに眮き換えるこずができれば、その恩恵はthe倧です。 数䞇台のサヌバヌが節玄され、数癟キロワットの電力が節玄されたした。 そしお、これは䞖界の消費の100䞇分の1です。 はい、あなたは地球を救うこずができたす







次 パヌト1、䞀般的な最適化








All Articles