Upgrade to Pro — share decks privately, control downloads, hide ads and more …

画像フィルタリング高速化するよ@iOS

 画像フィルタリング高速化するよ@iOS

Tomoki Kobayashi

July 30, 2016
Tweet

More Decks by Tomoki Kobayashi

Other Decks in Programming

Transcript

  1. ը૾ϑΟϧλϦϯά
    ߴ଎Խ͢ΔΑˏJ04
    !UFNPLJ

    View Slide

  2. ը૾ϑΟϧλϦϯάͬͯԿʁ
    ը૾ϑΟϧλϦϯάͷ࣮૷
    ը૾ϑΟϧλϦϯάΛߴ଎Խʂ

    View Slide

  3. ը૾ϑΟϧλϦϯάͬͯԿʁ
    ը૾ϑΟϧλϦϯάͷ࣮૷
    ը૾ϑΟϧλϦϯάΛߴ଎Խʂ

    View Slide

  4. ͜ͷϨφ͞ΜࣸਅΛ

    View Slide

  5. ΅͔ͨ͠Γ

    View Slide

  6. ྠֲͱΓͩͨ͠Γ

    View Slide

  7. ϞβΠΫ
    ͔͚ͨΓ
    ͢Δ΍ͭͰ͢
    ը૾αϯϓϧʮϨφʯͷਖ਼ମ͸ʮ1-":#0:ʯࢽͷ
    ࠷ଟൢച෦਺Λه࿥ͨ͠ϓϨΠϝΠτ
    IUUQHJHB[[email protected]

    View Slide

  8. ը૾ϑΟϧλϦϯάͬͯԿʁ
    ը૾ϑΟϧλϦϯάͷ࣮૷
    ը૾ϑΟϧλϦϯάΛߴ଎Խʂ

    View Slide

  9. Ұൠతͳը૾σʔλ

    View Slide

  10. QJYFM
    3(#"

    View Slide

  11. QJYFM
    3FE(SFFO#MVF"MQIB
    νϟϯωϧʹόΠτʹdͷ஋
    ܭνϟϯωϧʹόΠτ

    View Slide

  12. ը૾શମ
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"
    3(#"3(#"3(#"3(#"3(#"3(#"3(#"3(#"

    View Slide

  13. ৞ΈࠐΈԋࢉ

    View Slide

  14. ৞ΈࠐΈΧʔωϧ



    ೖྗը૾





    ग़ྗ

    ººººººººº
    ×
    º

    View Slide

  15. ৞ΈࠐΈΧʔωϧ
    $POWPMVUJPO,FSOFM

    View Slide

  16. ྫ͑͹ɺ

    View Slide

  17. ΅͔͠ʢҠಈฏۉʣ



    View Slide

  18. ΅͔͠ʢՙॏฏۉʣ



    View Slide

  19. Τοδநग़ʢਫฏʣ



    View Slide

  20. Τοδநग़ʢਨ௚ʣ



    View Slide

  21. ઌӶԽ



    View Slide

  22. αΠζ΋͍Ζ͍Ζ

    View Slide

  23. Ψ΢γΞϯΧʔωϧº



    ˞ઌ΄Ͳͷʮ΅͔͠ʢՙॏฏۉʣʯͱಉ͡

    View Slide

  24. Ψ΢γΞϯΧʔωϧº





    View Slide

  25. Ψ΢γΞϯΧʔωϧº







    View Slide

  26. ܭࢉྔ

    View Slide

  27. for ( x of image ) {
    for ( y of image ) {
    for ( x of kernel ) {
    for ( y of kernel ) {
    for ( channel ) {
    operation
    }
    }
    }
    }
    }

    View Slide

  28. ສճͷԋࢉ
    w ೖྗը૾ɿ3(#"Y
    w ΧʔωϧɿΨ΢γΞϯΧʔωϧº
    w ºººº

    View Slide

  29. ॲཧ࣌ؒ

    View Slide

  30. ͜ΜͳΞϓϦ
    ͭͬͯ͘ݕূ

    View Slide

  31. ໿'14
    w σόΠεɿJ1IPOF
    w ೖྗը૾ɿ3(#"Y
    w ΧʔωϧɿΨ΢γΞϯΧʔωϧº

    View Slide

  32. ࢖͑ͨ΋Μ͡Όͳ͍ʜ

    View Slide

  33. ը૾ϑΟϧλϦϯάͬͯԿʁ
    ը૾ϑΟϧλϦϯάͷ࣮૷
    ը૾ϑΟϧλϦϯάΛߴ଎Խʂ

    View Slide

  34. ߴ଎Խ
    w ΞϧΰϦζϜͷ޻෉ͰܭࢉྔΛݮΒ͢
    w σόΠεͷܭࢉࢿݯΛ࠷େݶʹར༻

    View Slide

  35. ߴ଎Խ
    w ΞϧΰϦζϜͷ޻෉ͰܭࢉྔΛݮΒ͢
    w σόΠεͷܭࢉࢿݯΛ࠷େݶʹར༻
    ˠͪ͜Β͕͜ͷεϥΠυͷςʔϚͰ͢ɻ

    View Slide

  36. ϚϧνίΞ
    w ը૾Λෳ਺ͷΤϦΞʹ෼ׂ͢Δ

    ʢྫʣը૾ͷࠨ൒෼ͷӈ൒෼
    w σόΠεͷίΞ਺෼εϨουΛ࡞੒͠

    ֤εϨουʹΤϦΞΛׂΓ౰ͯΔ

    View Slide

  37. ˣ'14ˣ
    w J1IPOF͸ίΞˠεϨου
    w εϨουॲཧ͸($%Ͱ؆୯ʹ
    w εϨουͷΦʔόʔϔου͕େ͖͍ʁ

    ΋ͬͱ͕Μ͹ΕΔ͸ͣʜ
    w ͞ΕͲίΞͰ͸خ͠͞͸ബ͍

    View Slide

  38. 4*.%
    w 4JOHMF*OTUSVDUJPO.VMUJQMF%BUB
    w ౓ͷ໋ྩͰෳ਺ͷσʔλΛԋࢉ
    w ϕΫτϧԋࢉɺύοΫυԋࢉ
    w $16ͷ֦ு໋ྩͱͯ͠

    Yͷ..944&౳ "3.ͷ/&0/

    View Slide

  39. ී௨ͷ৐ࢉ
    int a[4] = { 1, 2, 3, 4 };
    int b[4] = { 5, 6, 7, 8 };
    int c[4];
    for ( int i=0; i<4; i++) {
    c[i] = a[i] * b[i];
    }

    View Slide

  40. "3./&0/Ͱ৐ࢉ
    ʢίϯύΠϥ૊ΈࠐΈؔ਺ʣ
    int32_t a = { 1, 2, 3, 4 };
    int32_t b = { 5, 6, 7, 8 };
    int32_t c;
    c = vmulq_s32( a, b );
    IUUQXXXBSNDPNKBQSPEVDUTQSPDFTTPSTUFDIOPMPHJFTOFPOQIQ

    View Slide

  41. ˢ'14ˢ
    w গ͠଎͘ͳͬͨʁ
    w ॲཧΛ࠷దԽ͢Ε͹΋ͬͱ͍͚Δʁ

    View Slide

  42. ͦͯ͠ɺϝχʔίΞ΁

    View Slide

  43. ϚϧνίΞ
    $PSF $PSF
    $PSF $PSF
    γϯάϧίΞ
    $PSF
    ϝχʔίΞ

    View Slide

  44. ϝχʔίΞ
    w େྔͷίΞΛ࣋ͭϓϩηοαͰܭࢉ
    w (16/7*%*" ".% *OUFM *NBHJOBUJPO
    w *OUFM9FPO1IJ

    View Slide

  45. (16Ͱը૾ॲཧ!J04
    w J1IPOFͷ(16͸1PXFS73
    w $PSF*NBHFGSBNFXPSLͷ$*'JMUFS
    w "DDFMFSBUFGSBNFXPSLͷW*NBHF
    w 0QFO$-ʢJ04Ͱ͸࢖͍෺ʹͳΒͳ͍ʣ
    w 0QFO(-(-4-Ͱ͕Μ͹Δʢ໘౗ʜʣ
    6*&WPMVUJPOதౡ૱ࢯͷ7JEFP4IBEFSΞϓϦ΍(16*NBHFϥΠϒϥϦ͸(-4-Ͱ͕Μ͹ͬͯ·͢

    View Slide

  46. $*'JMUFS
    ˢˢ'14ˢˢ
    ௒଎ʂ
    CIImage * src = [CIImage imageWithCVPixelBuffer:imageBuffer];
    CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:src forKey:@"inputImage"];
    [filter setValue:[NSNumber numberWithFloat:1.f] forKey:@"inputRadius"];
    CIImage * dst = filter.outputImage;
    ˞ΧʔωϧαΠζ͕ෆ໌ͷͨΊຊདྷൺֱ͢΂͖Ͱ͸ͳ͍͕ʜ

    View Slide

  47. W*NBHF
    ˢˢˢ'14ˢˢˢ
    ര଎ʂ
    const vImage_Buffer src = {
    CVPixelBufferGetBaseAddress(buffer), height, width, bytesPerRow };
    const vImage_Buffer dst = {
    malloc(bufferSize), height, width, bytesPerRow };
    Pixel_8888 backgroundColor = {0,0,0,0};
    vImageConvolve_ARGB8888(&src, &dst, NULL, 0, 0,
    gaussianKernel, 7, 7, divisor,
    backgroundColor, kvImageCopyInPlace);

    View Slide

  48. (16࢖͏Ͱ͠ΐʂ

    View Slide

  49. ͪͳΈʹ0QFO$7
    ˠ'14
    w ී௨ʹ$16Ͱԋࢉ
    w $6%"࣮૷͕͋ΔΒ͍͠HQV(QV.BU
    w 0QFO$-࣮૷͕͋ΔΒ͍͠PDM.BU
    cv::Mat src = cv::Mat(height, width, CV_8UC4, baseAddress);
    cv::Mat dst = cv::Mat(height, width, CV_8UC4);
    cv::Size kernelSize(7, 7);
    cv::GaussianBlur(src, dst, kernelSize, 1.f);

    View Slide

  50. ͓ΘΓ

    View Slide