perf: improved performance in various methods in Image and ImageList#879
perf: improved performance in various methods in Image and ImageList#879lars-reimann merged 15 commits intomainfrom
Image and ImageList#879Conversation
…List` refactor: changed `Image.blur` to use box blur algorithm instead of gaussian blur as box blur is more performant
…age_image_list # Conflicts: # src/safeds/data/labeled/containers/_image_dataset.py # tests/safeds/data/labeled/containers/test_image_dataset.py
🦙 MegaLinter status: ✅ SUCCESS
See detailed report in MegaLinter reports |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #879 +/- ##
==========================================
+ Coverage 97.67% 97.71% +0.04%
==========================================
Files 120 120
Lines 6234 6478 +244
==========================================
+ Hits 6089 6330 +241
- Misses 145 148 +3 ☔ View full report in Codecov by Sentry. |
Image and ImageListImage and ImageList
|
Do you have benchmarks to quantify the performance improvement? |
…eList.adjust_contrast` perf: improved performance of `ImageList.crop` if used on a `MultiSizeImageList` perf: improved performance of `ImageList.convert_to_grayscale` if `ImageList` contains only one channel
…dlib into perf_image_image_list # Conflicts: # src/safeds/data/image/containers/_multi_size_image_list.py
…age_image_list
…brightness` with a factor of 0
…dlib into perf_image_image_list
@lars-reimann I included the benchmarks in the description of this pr |
lars-reimann
left a comment
There was a problem hiding this comment.
Nice performance improvements, great work.
## [0.27.0](v0.26.0...v0.27.0) (2024-07-19) ### Features * join ([#870](#870)) ([5764441](5764441)), closes [#745](#745) * activation function for forward layer ([#891](#891)) ([5b5bb3f](5b5bb3f)), closes [#889](#889) * add `ImageDataset.split` ([#846](#846)) ([3878751](3878751)), closes [#831](#831) * add FunctionalTableTransformer ([#901](#901)) ([37905be](37905be)), closes [#858](#858) * add InvalidFitDataError ([#824](#824)) ([487854c](487854c)), closes [#655](#655) * add KNearestNeighborsImputer ([#864](#864)) ([fcdfecf](fcdfecf)), closes [#743](#743) * add moving average plot ([#836](#836)) ([abcf68a](abcf68a)) * add RobustScaler ([#874](#874)) ([62320a3](62320a3)), closes [#650](#650) [#873](#873) * add SequentialTableTransformer ([#893](#893)) ([e93299f](e93299f)), closes [#802](#802) * add temporal operations ([#832](#832)) ([06eab77](06eab77)) * added 'histogram_2d' in TablePlotter ([#903](#903)) ([4e65ba9](4e65ba9)), closes [#869](#869) [#798](#798) * added from_str_to_temporal and continues prediction ([#767](#767)) ([35f468a](35f468a)), closes [#806](#806) [#765](#765) [#740](#740) [#773](#773) * added GRU layer ([#845](#845)) ([d33cb5d](d33cb5d)) * Adds Dropout Layer ([#868](#868)) ([a76f0a1](a76f0a1)), closes [#848](#848) * dark mode for plots ([#911](#911)) ([5447551](5447551)), closes [#798](#798) * easily create a baseline model ([#811](#811)) ([8e1b995](8e1b995)), closes [#710](#710) * get first cell with value other than `None` ([#904](#904)) ([5a0cdb3](5a0cdb3)), closes [#799](#799) * hyperparameter optimization for fnn models ([#897](#897)) ([c1f66e5](c1f66e5)), closes [#861](#861) * implement violin plots ([#900](#900)) ([9f5992a](9f5992a)), closes [#867](#867) * plot decision tree ([#876](#876)) ([d3f81dc](d3f81dc)), closes [#856](#856) * prediction no longer takes a time series dataset only table ([#838](#838)) ([762e5c2](762e5c2)), closes [#837](#837) * raise if `remove_colums` is called with unknown column by default ([#852](#852)) ([8f78163](8f78163)), closes [#807](#807) * regularization strength for logistic classifier ([#866](#866)) ([9f74e92](9f74e92)), closes [#750](#750) * reorders parameters of RangeScaler and makes them keyword-only ([#847](#847)) ([2b82db7](2b82db7)), closes [#809](#809) * replace seaborn with matplotlib for box_plot ([#863](#863)) ([4ef078e](4ef078e)), closes [#805](#805) [#849](#849) * replaced seaborn with matplotlib for correlation_heatmap ([#850](#850)) ([d4680d4](d4680d4)), closes [#800](#800) [#849](#849) ### Bug Fixes * **deps:** bump urllib3 from 2.2.1 to 2.2.2 ([#842](#842)) ([b81bcd6](b81bcd6)), closes [#3122](https://github.com/Safe-DS/Library/issues/3122) [#3363](https://github.com/Safe-DS/Library/issues/3363) [#3122](https://github.com/Safe-DS/Library/issues/3122) [#3363](https://github.com/Safe-DS/Library/issues/3363) [#3406](https://github.com/Safe-DS/Library/issues/3406) [#3398](https://github.com/Safe-DS/Library/issues/3398) [#3399](https://github.com/Safe-DS/Library/issues/3399) [#3396](https://github.com/Safe-DS/Library/issues/3396) [#3394](https://github.com/Safe-DS/Library/issues/3394) [#3391](https://github.com/Safe-DS/Library/issues/3391) [#3316](https://github.com/Safe-DS/Library/issues/3316) [#3387](https://github.com/Safe-DS/Library/issues/3387) [#3386](https://github.com/Safe-DS/Library/issues/3386) * labels of correlation heatmap ([#894](#894)) ([a88a609](a88a609)), closes [#871](#871) * make multi-processing in baseline models more consistent ([#909](#909)) ([fa24560](fa24560)), closes [#907](#907) ### Performance Improvements * improved performance in various methods in `Image` and `ImageList` ([#879](#879)) ([134e7d8](134e7d8))
|
🎉 This PR is included in version 0.27.0 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
Summary of Changes
Imageconvert_to_grayscaleadjust_brightnessadd_noiseadjust_contrastadjust_color_balancefind_edgesImageListfrom_imagesadd_imageadd_imagesremove_image_by_indexremove_duplicate_imagesconvert_to_grayscaleresizecropadjust_brightnessadd_noiseadjust_contrastadjust_color_balancefind_edgesbluralgorithm inImageandImageListfrom Gaussian blur to box blurblurandsharpen, that they could not work with Tensors of size greater than 2**31Details to the performance upgrades:
These details will explain the performance upgrades in the
ImageList. All performance upgrades and changes inImageare made according to the changes inImageListEarly stopping
convert_to_grayscalereturnsselfwhen it has only one channel (in this case, theImageListis already in grayscale)remove_duplicate_imagesreturnsselfif the unique image tensor has the same size as the original (in this case, there are no duplicates)adjust_brightnessreturnsImageListwith complete black images if factor is 0adjust_color_balancereturnsImageList.convert_to_grayscaleif factor is 0General changes
If a float Tensor is used during the computation, it will be
float16instead offloat32Improved the order of Tensor allocations, so that there will be fewer problems with tensors not being completely on the VRAM
Benchmark
Only the transformation methods have benchmarks for the runtime. Their benchmark includes only changes over/under a change factor of 0.25, rounded to one decimal point, as runtime depends on multiple factors and fluctuates heavily with changes of only a few milliseconds in most cases.
All differences are measured as a factor compared to the original results. That means a factor below 1 is worse, while a factor above 1 is a better result. For readability, all factors equal to 1 are not included.
Due to the bug fix mentioned above for
blurandsharpenthe performance of these methods decreased in most cases.Benchmark with RGB images of size 250×250
from_imagesremove_image_by_indexadjust_brightnessadd_noiseadjust_contrastadjust_color_balanceblursharpenfind_edgesBenchmark with RGBA images (RGB images with transparent layer) of size 256×256
from_imagesremove_image_by_indexadjust_brightnessadd_noiseadjust_contrastadjust_color_balanceblursharpenBenchmark with RGB images of multiple different sizes
from_imagesadd_imagesremove_image_by_indexresizecropadjust_brightnessadd_noiseadjust_contrastadjust_color_balanceblursharpenfind_edges