CV-CUDA の pillow resize を試す¶
CV-CUDA の pillow resize を試してみた。pillow, resizer, cvcuda の 3 で画像のリサイズを行い、処理時間を比較してみた。
CV-CUDA とは¶
CV-CUDA は、NVIDIA が提供する機械学習向けの画像処理およびコンピュータビジョン(CV)アプリケーション向けのオープンソースプロジェクト。C++、C、Python の API が公開されている。GPU アクセラレーションを活用することで、開発者は効率性の高い前処理・後処理パイプラインを構築可能。これにより、スループットを 10 倍以上向上させながら、クラウドコンピューティングコストを削減できる。バッチ処理や PyTorch へのゼロコピーにも対応。
多くのオペレーターがサポートされており、次のような機能が提供されている。
Pre/Post-Processing Operators Definition Adaptive Thresholding Chooses threshold based on smaller regions in the neighborhood of each pixel. Advanced Color Format Conversions Performs color conversion from interleaved RGB/BGR <-> YUV/YVU and semi planar. Supported standards: BT.601. BT.709. BT.2020 AverageBlur Reduces image noise using an average filter BilateralFilter Reduces image noise while preserving strong edges Bounding Box Draws an rectangular border using the X-Y coordinates and dimensions typically to define the location and size of an object in an image Box Blurring Overlays a blurred rectangle using the X-Y coordinates and dimensions that define the location and size of an object in an image Brightness_Contrast Adjusts brightness and contrast of an image CenterCrop Crops an image at its center ChannelReorder Shuffles the order of image channels Color_Twist Adjusts the hue saturation brightness and contrast of an image Composite Composites two images together Conv2D Convolves an image with a provided kernel CopyMakeBorder Creates a border around an image CustomCrop Crops an image with a given region-of-interest CvtColor Converts an image from one color space to another DataTypeConvert Converts an image’s data type, with optional scaling Erase Erases image regions Flip Flips a 2D image around its axis GammaContrast Adjusts image contrast Gaussian Applies a gaussian blur filter to the image Gaussian Noise Generates a statistical noise with a normal (Gaussian) distribution Histogram Provides a grayscale value distribution showing the frequency of occurrence of each gray value. Histogram Equalizer Allows effective spreading out the intensity range of the image typically used to improve contrast HqResize Performs advanced resizing supporting 2D and 3D data, tensors, tensor batches, and varshape image batches (2D only). Supports nearest neighbor, linear, cubic, Gaussian and Lanczos interpolation, with optional antialiasing when down-sampling Inpainting Performs inpainting by replacing a pixel by normalized weighted sum of all the known pixels in the neighborhood Joint Bilateral Filter Reduces image noise while preserving strong edges based on a guidance image Label Labels connected regions in an image using 4-way connectivity for foreground and 8-way for background pixels Laplacian Applies a Laplace transform to an image MedianBlur Reduces an image’s salt-and-pepper noise MinArea Rect Finds the minimum area rotated rectangle typically used to draw bounding rectangle with minimum area MinMaxLoc Finds the maximum and minimum values in a given array Morphology Performs morphological erode and dilate transformations Morphology (close) Performs morphological operation that involves dilation followed by erosion on an image Morphology (open) Performs morphological operation that involves erosion followed by dilation on an image Non-Maximum Suppression Enables selecting a single entity out of many overlapping ones typically used for selecting from multiple bounding boxes during object detection Normalize Normalizes an image pixel’s range OSD (Polyline Line Text Rotated Rect Segmented Mask) Displays an overlay on the image of different forms including polyline line text rotated rectangle segmented mask PadStack Stacks several images into a tensor with border extension PairwiseMatcher Matches features computed separately (e.g. via the SIFT operator) in two images, e.g. using the brute force method PillowResize Changes the size and scale of an image using python-pillow algorithm RandomResizedCrop Crops a random portion of an image and resizes it to a specified size. Reformat Converts a planar image into non-planar and vice versa Remap Maps pixels in an image with one projection to another projection in a new image. Resize Changes the size and scale of an image ResizeCropConvertReformat Performs fused Resize-Crop-Convert-Reformat sequence with optional channel reordering Rotate Rotates a 2D array in multiples of 90 degrees SIFT Identifies and describes features in images that are invariant to scale rotation and affine distortion. Thresholding Chooses a global threshold value that is the same for all pixels across the image. WarpAffine Applies an affine transformation to an image WarpPerspective Applies a perspective transformation to an image
setup¶
github release にインストーラーや whl、圧縮ファイルが公開されている。これらを使って cv-cuda をインストールできる。 ここでは、Python 向けに whl からインストールしてみる。
resizer¶
cykooz.resizer は、画像のリサイズを行うための Python パッケージ。Rust crate の fast_image_resize を pyo3 を使ってバインディングしており、SIMD を活用することで高速に画像のリサイズを実現。
公式のベンチマークによると、Pillow を使ったリサイズに比べて、約 10 倍高速にリサイズできるとのこと。
benchmark¶
pillow, resizer, cvcuda の 3 で画像のリサイズを行い、処理時間を比較してみた。ベンチマークで利用したコードはこちら にある。
環境¶
ベンチマーク結果¶
結果を見るに、tensor まで事前に変換しておくと、cv-cuda の処理時間が短いことがわかる。Pillow 形式の画像を cv-cuda で処理しようとすると変換に時間がかかるため、処理時間が長くなる。resizer は、Pillow に比べて高速にリサイズでき、Pillow 形式で処理をするなら cv-cuda を使わずに resizer で行っても良さそう。今回は cv-cuda のバッチ処理を試していないが、バッチ処理を行うとさらに高速に処理できると思われる。CPU, メモリ, GPU 間のデータ転送によるオーバーヘッドがあるため、これを効率良くできれば全体的なスループットを改善できるのではないか。
links¶
- https://developer.nvidia.com/cv-cuda
- https://developer.nvidia.com/blog/increasing-throughput-and-reducing-costs-for-computer-vision-with-cv-cuda/
- https://zenn.dev/nishikoh/articles/fe3111b52ede22#%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C
- https://developer.nvidia.com/blog/cucim-rapid-n-dimensional-image-processing-and-i-o-on-gpus/