$30 off During Our Annual Pro Sale. View Details »

Softpia Japan Seminar 20190724

Softpia Japan Seminar 20190724

2019年7月24日、ソフトピアジャパンで開催された「人工知能セミナー ~クラウド・モバイル・エッジにおける機械学習~」の発表資料です。

「機械学習モデルを利用したモバイルアプリ開発の事例」について。

人工知能セミナー ~クラウド・モバイル・エッジにおける機械学習~
https://www.softopia.or.jp/events/20190724jinzai/

ARIYAMA Keiji

July 24, 2019
Tweet

More Decks by ARIYAMA Keiji

Other Decks in Technology

Transcript

  1. C-LIS CO., LTD.

    View Slide

  2. ਓ޻஌ೳηϛφʔɹʙΫϥ΢υɾϞόΠϧɾΤοδʹ͓͚Δػցֶशʙ
    ɹιϑτϐΞδϟύϯ


    ػցֶशϞσϧΛར༻ͨ͠

    ϞόΠϧΞϓϦ։ൃͷࣄྫ

    View Slide



  3. ༗ࢁܓೋʢ,FJKJ"3*:"."ʣ
    $-*4$0 -5%
    ઐ໳ɿ"OESPJEΞϓϦ։ൃ
    ػցֶशྺɿ໿̐೥
    ஶॻɿ

    ʰ"OESPJE4UVEJPͰ͸͡ΊΔ؆୯"OESPJEΞϓϦ։ൃʱʢٕज़ධ࿦ࣾʣ

    ʰ5FOTPS'MPXΛ͸͡Ί·ͨ͠ʱʢΠϯϓϨε3%ʣ

    ڞஶʰ5FOTPS'MPX׆༻ΨΠυʱʢٕज़ධ࿦ࣾʣ
    Photo : Koji MORIGUCHI (MORIGCHOWDER)

    View Slide

  4. 5FOTPS'MPXൃදʢ೥݄ʣ


    View Slide

  5. ػցֶशΛར༻ͨ͋͠Ε͜Ε


    IUUQLJWBOUJVNIBUFCMPKQFOUSZ
    TensorFlowͰΞχϝΏΔΏΓͷ੍࡞ձࣾΛࣝผ͢Δ
    IUUQCPIFNJBIBUFOBCMPHDPNFOUSZ
    σΟʔϓϥʔχϯάͰ͓ͦদ͞Μͷ࿡ͭࢠ͸ݟ෼͚ΒΕΔͷ͔ʁ
    IUUQCPIFNJBIBUFOBCMPHDPNFOUSZ
    IUUQDISJTUJOBIBUFOBCMPHDPNFOUSZ
    Deep LearningͰϥϒϥΠϒʂΩϟϥΛࣝผ͢Δ

    View Slide



  6. ؟ڸ່ͬͷΠϥετΛ

    Πϯλʔωοτ͔ΒࣗಈͰऩू͍ͨ͠ʂ

    View Slide

  7. ؟ڸ່ͬ൑ఆ


    View Slide



  8. ධՁ༻αʔόʔ
    ܇࿅ɾֶश༻αʔόʔ܈
    σʔληοτసૹ
    ʢTFRecordʣ ֶशࡁϞσϧऔಘ
    ը૾औಘ
    ը૾औಘ
    ϥϕϧ
    ෇͚
    σʔληοτ؅ཧ
    αʔόʔ
    ը૾ऩू
    ϥϕϧ
    ෇͚
    σʔληοτ

    ؅ཧΞϓϦ
    playground.megane.ai
    ֶशࡁΈϞσϧ഑ஔ
    ը૾ૹ৴
    ൑ఆ݁Ռ
    .FHBOF$P

    View Slide

  9. ͳͥϞόΠϧΞϓϦʹ૊ΈࠐΉͷ͔
    ϨΠςϯγ͕69ʹ༩͑ΔӨڹΛ࡟ݮ͢ΔͨΊ
    αʔόʔʹૹ৴͢Δʢ৺ཧతɾ๏తʣϋʔυϧ͕ߴ͍σʔλΛऔΓѻ͏ͨΊ


    View Slide

  10. ϞόΠϧΞϓϦ΁ͷػցֶशϞσϧͷ૊ΈࠐΈ
    5FOTPS'MPXGPS.PCJMF
    5FOTPS'MPX-JUF
    .-,JUʢ'JSFCBTF.-,JUʣ


    View Slide

  11. 5FOTPS'MPX-JUF
    σόΠε্Ͱͷਪ࿦ΛՄೳʹ͢ΔϑϨʔϜϫʔΫɻ
    5FOTPS'MPXͷαϒηοτϥΠϯλΠϜͰɺར༻Ͱ
    ͖ͳ͍ΦϖϨʔγϣϯ͕͋Δɻ
    "OESPJEJ04ΤοδσόΠεʹରԠɻ


    IUUQTXXXUFOTPSqPXPSHMJUF

    View Slide

  12. .-,JUCFUBʢ'JSFCBTF.-,JUʣ
    (PPHMF͕ఏڙ͢ΔαʔϏεͰɺ(PPHMF͕࡞੒ͨ͠ػցֶश
    ϞσϧΛ"OESPJEJ04ΞϓϦʹ૊ΈࠐΜͩΓɺΦϦδφϧͷ
    ΞϓϦΛ഑৴Ͱ͖Δɻ
    w7JTJPO
    w-BOHVBHF
    w$VTUPN


    IUUQTEFWFMPQFSTHPPHMFDPNNMLJU

    View Slide

  13. .-,JU7JTJPO
    #BSDPEF4DBO
    'BDF%FUFDUJPO
    *NBHF-BCFMJOH
    -BOENBSL%FUFDUJPO
    0CKFDU%FUFDUJPO5SBDLJOH
    5FYU3FDPHOJUJPO


    IUUQTEFWFMPQFSTHPPHMFDPNNMLJU

    View Slide

  14. .-,JU-BOHVBHF
    -BOHVBHF*EFOUJpDBUJPO
    0O%FWJDF5SBOTMBUJPO
    4NBSU3FQMZ


    IUUQTEFWFMPQFSTHPPHMFDPNNMLJU

    View Slide

  15. .-,JU$VTUPN
    ඞཁʹԠͨ͡Ϟσϧͷμ΢ϯϩʔυ
    ϞσϧͷࣗಈΞοϓσʔτ
    Ϟσϧͷ"#ςετ
    Ϟσϧͷಈతʢ%ZOBNJDʣͳબ୒


    IUUQTEFWFMPQFSTHPPHMFDPNNMLJU

    View Slide

  16. ػցֶशϫʔΫϑϩʔ


    σʔληοτͷ੔උ
    ϞσϧͷֶशͱධՁ
    ϞσϧͷσϓϩΠ
    ਪ࿦

    View Slide

  17. 'PPE(BMMFSZ
    ୺຤ʹอଘ͞Ε͍ͯΔࣸਅͷ৯΂෺͚ͩΛදࣔʢ৯΂෺
    Ҏ֎Λಁաͯ͠දࣔʣͯ͠Ұཡ͢ΔΞϓϦɻ


    IUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPX

    View Slide

  18. def _export_graph(sess, input_tensors, output_tensors, output_dir):
    output_path = os.path.join(output_dir, 'model.tflite')
    converter = TFLiteConverter.from_session(sess, input_tensors, output_tensors)
    # converter.post_training_quantize = True
    tflite_model = converter.convert()
    open(output_path, "wb").write(tflite_model)


    Ϟσϧͷग़ྗʢ5FOTPS'MPX-JUFʣ

    View Slide

  19. val tfInference = Interpreter(
    model,
    options)
    val resizedImageBuffer = ByteBuffer
    .allocateDirect(IMAGE_BYTES_LENGTH)
    .order(ByteOrder.nativeOrder())
    val inputBuffer = ByteBuffer
    .allocateDirect(IMAGE_BYTES_LENGTH * 4)
    .order(ByteOrder.nativeOrder())
    val resultBuffer = ByteBuffer
    .allocateDirect(4)
    .order(ByteOrder.nativeOrder())


    Ϟσϧͷ࣮ߦ
    JPLFJKJGPPEHBMMFSZ*NBHF3FDPHOJ[FSLU

    View Slide

  20. val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false)
    resizedImageBuffer.rewind()
    scaledBitmap.copyPixelsToBuffer(resizedImageBuffer)
    inputBuffer.rewind()
    for (index in (0..IMAGE_BYTES_LENGTH - 1)) {
    inputBuffer.putFloat(resizedImageBuffer[index].toInt().and(0xFF).toFloat())
    }
    inputBuffer.rewind()
    resultBuffer.rewind()
    tfInference.run(inputBuffer, resultBuffer)
    resultBuffer.rewind()
    val confidence = resultBuffer.getFloat()


    Ϟσϧͷ࣮ߦ
    JPLFJKJGPPEHBMMFSZ*NBHF3FDPHOJ[FSLU

    View Slide

  21. Ϟσϧͷ࣮ߦ


    Input Output
    Interpreter
    tfInference
    inputBuffer
    resultBuffer
    લॲཧ
    σίʔυ

    View Slide

  22. ϞσϧΛ૊ΈࠐΉ্Ͱͷ՝୊
    Ϟσϧͷେ͖͞
    ࣮ߦ଎౓
    ফඅϝϞϦ
    Ϟσϧͷอޢ
    ϢʔβʔϓϥΠόγʔ


    View Slide

  23. .#Λ௒͑ΔϞσϧ


    IUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPXSFMFBTFTUBH

    View Slide

  24. ϞσϧͷΞʔΩςΫνϟΛมߋ


    View Slide

  25. ϞσϧʢύϥϝʔλʔʣͷྔࢠԽ


    CJUුಈখ਺఺਺ΛCJU੔਺ʹม׵ʢྔࢠԽʣ

    View Slide

  26. ྔࢠԽͷબ୒ࢶ
    1PTUUSBJOJOH2VBOUJ[BUJPO
    2VBOUJ[BUJPOBXBSF5SBJOJOH


    View Slide

  27. 1PTUUSBJOJOHRVBOUJ[BUJPO


    def _export_graph(sess, input_tensors, output_tensors, output_dir):
    output_path = os.path.join(output_dir, 'model.tflite')
    converter = TFLiteConverter.from_session(sess, input_tensors, output_tensors)
    converter.post_training_quantize = True
    tflite_model = converter.convert()
    open(output_path, "wb").write(tflite_model)

    View Slide

  28. if model.QUANTIZATION:
    g = tf.get_default_graph()
    tf.contrib.quantize.create_training_graph(input_graph=g,
    quant_delay=2000000)


    IUUQTHJUIVCDPNUFOTPSqPXUFOTPSqPXUSFFSUFOTPSqPXDPOUSJCRVBOUJ[F
    2VBOUJ[BUJPOBXBSFUSBJOJOH

    View Slide

  29. ϞσϧΛྔࢠԽ


    View Slide

  30. "OESPJE/FVSBM/FUXPSLT"1*
    ϞόΠϧ୺຤্ͰػցֶशͷܭࢉॲཧΛ࣮ߦ͢ΔͨΊʹઃܭ͞Εͨɻ
    IUUQTEFWFMPQFSBOESPJEDPNOELHVJEFTOFVSBMOFUXPSLT
    "OESPJEʢ"1*ϨϕϧʣҎ߱ͰରԠɻ



    IUUQTCMPHLFJKJJPUFOTPSqPXBEWFOU@DBMFOEBSIUNM
    ͍·//"1*ʢ5FOTPS'MPX-JUFʣ͸࢖͑Δͷ͔

    View Slide

  31. ਪ࿦଎౓ͷൺֱ


    ػछ໊ NN API͋Γ NN APIͳ͠
    Essential PH-1 556,323ns 185,372,624ns
    Pixel 2 450,807ns 187,395,464ns
    Pixel 3 477,489ns 129,994,563ns
    IUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPXSFMFBTFTUBHUqJUF@OOBQJ

    View Slide

  32. ͞·͟·ͳ੍໿
    εΧϥʔͰͷԋࢉ͕Ͱ͖ͳ͍ɻʷOPSNBMJ[FE@JNBHFJNBHF@QI
    εϥΠε͕࢖͑ͳ͍ɻʷJNBHFJNBHF< >
    )ZQFSCPMJD5BOHFOU͕࢖͑ͳ͍ɻʷPVUQVUUGUBOI PVU@P⒎TFU



    IUUQTXXXUFOTPSqPXPSHMJUFHVJEFPQT@DPNQBUJCJMJUZVOTVQQPSUFE@PQFSBUJPOT

    View Slide



  33. ਫ਼౓͕ۃ୺ʹ௿Լ

    View Slide



  34. max: 14.586626
    min: -3.8083103
    ϞσϧΛߏ੒͍ͯ͠Δύϥϝʔλʔͷ࠷େɾ࠷খ஋Λ֬ೝ

    View Slide

  35. Ϟσϧઃܭͷ࣌఺Ͱʮଌఆͱௐ੔ʯ


    σʔληοτͷ੔උ
    ϞσϧͷֶशͱධՁ
    ϞσϧͷσϓϩΠ
    ਪ࿦
    Ϟσϧͷઃܭ

    View Slide

  36. ଌఆʹج͍ͮͨϞσϧͷௐ੔


    Ϟσϧͷઃܭ
    Ϟσϧͷௐ੔
    TensorFlow Lite΁ม׵
    ʢྔࢠԽʣ
    αΠζɾ࣮ߦ଎౓

    ଌఆ

    View Slide

  37. ΞϓϦଆͰͷ଎౓վળ
    /BWJFSגࣜձࣾ φϏΤʣ
    ౦ژ౎จژ۠ຊڷຊڷ࢛ஸ໨Ϗϧ'
    σΟʔϓϥʔχϯάΛ༻͍ͨը૾ม׵ٕज़ͷ։ൃ͓Αͼιϑτ΢ΣΞͷఏڙ


    IUUQTXXXOBWJFSDP
    Ϟσϧ͸มߋͤͣɺ࣮ߦ଎౓Λ̏ʙ̐ഒʹߴ଎Խ

    View Slide

  38. Ϟσϧͷอޢ
    ʰΞϓϦʹ૊ΈࠐΉʹ౰ͨͬͯɺϞσϧʢΞʔΩςΫνϟɾ
    ύϥϝʔλʔʣ͕֎෦ʹྲྀग़͠ͳ͍Α͏ʹอޢ͍ͨ͠ʱ


    View Slide

  39. Ϟσϧͷܗࣜ
    5FOTPS'MPX-JUFͷϞσϧ͸'MBU#V⒎FSTɻ
    'MBU#V⒎FST͸ɺσʔλͷల։΍ύʔεΛͤͣετϨʔδ
    ্ͷσʔλʹϝϞϦΞυϨεΛϚοϓͯ͠ΞΫηε͢Δ
    ͜ͱͰɺϝϞϦͷϑοτϓϦϯτΛ࡟ݮ͢Δ

    ʢʹ҉߸Խͨ͠'MBU#V⒎FSTͷϑΝΠϧ͸ɺಁաతʹಡΈ
    ࠐΉ͜ͱ͕Ͱ͖ͳ͍ʣɻ


    View Slide

  40. ෮߸Խͯ͠Ұ౓ϩʔΧϧϑΝΠϧʹอଘ


    assets app local
    ϑΝΠϧಡΈࠐΈ Interpreter
    ෮߸Խॲཧ

    View Slide

  41. ϢʔβʔϓϥΠόγʔ
    ػցֶशͷϞσϧΛܧଓతʹվળ͢ΔͨΊʹ͸ɺσʔλ͕ඞཁɻ
    Ϣʔβʔͷ͍ΔΞϓϦͷ৔߹ɺϢʔβʔ͔ΒσʔλΛఏڙʢૹ৴ɾอଘʣ͢Δ
    ߹ҙΛಘΔඞཁ͕͋Δɻ
    ϓϥΠόγʔσʔλͷऔΓѻ͏ମ੍Λ੔͑Δඞཁ͕͋Δɻσʔλͷ಺༰ʹΑͬ
    ͯ͸๏཯ʹΑΔن੍΋͋Δɻ


    View Slide

  42. 'FEFSBUFE-FBSOJOH
    ͢΂ͯͷσʔληοτΛαʔόʔ্Ͱॲཧ͢ΔʮूதτϨʔχϯάʯͱ͸ҟͳ
    ΓɺҰͭҰͭͷ୺຤্ͰϞσϧͷֶशͷલஈॲཧΛߦ্ͬͨͰɺαʔόʔʹૹ
    ৴ͯ͠ฏۉԽ͢Δɻ


    IUUQTEFWFMPQFSTKQHPPHMFCMPHDPNGFEFSBUFEMFBSOJOHDPMMBCPSBUJWFIUNM

    View Slide

  43. C-LIS CO., LTD.
    ຊࢿྉ͸ɺ༗ݶձࣾγʔϦεͷஶ࡞෺Ͱ͢ɻຊࢿྉͷશ෦ɺ·ͨ͸Ұ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐ୚Λಘͣʹෳ੡͢Δ͜ͱ͸ې͡ΒΕ͍ͯ·͢ɻ
    5IF"OESPJE4UVEJPJDPOJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF
    ֤੡඼໊ɾϒϥϯυ໊ɺձ໊ࣾͳͲ͸ɺҰൠʹ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻຊࢿྉதͰ͸ɺ˜ɺšɺäΛׂѪ͍ͯ͠·͢ɻ
    5IF"OESPJESPCPUJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF

    View Slide