2019年7月24日、ソフトピアジャパンで開催された「人工知能セミナー ~クラウド・モバイル・エッジにおける機械学習~」の発表資料です。
「機械学習モデルを利用したモバイルアプリ開発の事例」について。
人工知能セミナー ~クラウド・モバイル・エッジにおける機械学習~ https://www.softopia.or.jp/events/20190724jinzai/
C-LIS CO., LTD.
View Slide
ਓೳηϛφʔɹʙΫϥυɾϞόΠϧɾΤοδʹ͓͚ΔػցֶशʙɹιϑτϐΞδϟύϯػցֶशϞσϧΛར༻ͨ͠ ϞόΠϧΞϓϦ։ൃͷࣄྫ
༗ࢁܓೋʢ,FJKJ"3*:"."ʣ$-*4$0 -5%ઐɿ"OESPJEΞϓϦ։ൃػցֶशྺɿ̐ஶॻɿ ʰ"OESPJE4UVEJPͰ͡ΊΔ؆୯"OESPJEΞϓϦ։ൃʱʢٕज़ධࣾʣ ʰ5FOTPS'MPXΛ͡Ί·ͨ͠ʱʢΠϯϓϨε3%ʣ ڞஶʰ5FOTPS'MPX׆༻ΨΠυʱʢٕज़ධࣾʣPhoto : Koji MORIGUCHI (MORIGCHOWDER)
5FOTPS'MPXൃදʢ݄ʣ
ػցֶशΛར༻ͨ͋͠Ε͜ΕIUUQLJWBOUJVNIBUFCMPKQFOUSZTensorFlowͰΞχϝΏΔΏΓͷ੍࡞ձࣾΛࣝผ͢ΔIUUQCPIFNJBIBUFOBCMPHDPNFOUSZσΟʔϓϥʔχϯάͰ͓ͦদ͞Μͷͭࢠݟ͚ΒΕΔͷ͔ʁIUUQCPIFNJBIBUFOBCMPHDPNFOUSZIUUQDISJTUJOBIBUFOBCMPHDPNFOUSZDeep LearningͰϥϒϥΠϒʂΩϟϥΛࣝผ͢Δ
؟ڸ່ͬͷΠϥετΛ Πϯλʔωοτ͔ΒࣗಈͰऩू͍ͨ͠ʂ
؟ڸ່ͬఆ
ධՁ༻αʔόʔ܇࿅ɾֶश༻αʔόʔ܈σʔληοτసૹʢTFRecordʣ ֶशࡁϞσϧऔಘը૾औಘը૾औಘϥϕϧ͚σʔληοτཧαʔόʔը૾ऩूϥϕϧ͚σʔληοτ ཧΞϓϦplayground.megane.aiֶशࡁΈϞσϧஔը૾ૹ৴ఆ݁Ռ.FHBOF$P
ͳͥϞόΠϧΞϓϦʹΈࠐΉͷ͔ϨΠςϯγ͕69ʹ༩͑ΔӨڹΛݮ͢ΔͨΊαʔόʔʹૹ৴͢Δʢ৺ཧతɾ๏తʣϋʔυϧ͕ߴ͍σʔλΛऔΓѻ͏ͨΊ
ϞόΠϧΞϓϦͷػցֶशϞσϧͷΈࠐΈ5FOTPS'MPXGPS.PCJMF5FOTPS'MPX-JUF.-,JUʢ'JSFCBTF.-,JUʣ
5FOTPS'MPX-JUFσόΠε্ͰͷਪΛՄೳʹ͢ΔϑϨʔϜϫʔΫɻ5FOTPS'MPXͷαϒηοτϥΠϯλΠϜͰɺར༻Ͱ͖ͳ͍ΦϖϨʔγϣϯ͕͋Δɻ"OESPJEJ04ΤοδσόΠεʹରԠɻIUUQTXXXUFOTPSqPXPSHMJUF
.-,JUCFUBʢ'JSFCBTF.-,JUʣ(PPHMF͕ఏڙ͢ΔαʔϏεͰɺ(PPHMF͕࡞ͨ͠ػցֶशϞσϧΛ"OESPJEJ04ΞϓϦʹΈࠐΜͩΓɺΦϦδφϧͷΞϓϦΛ৴Ͱ͖Δɻw7JTJPOw-BOHVBHFw$VTUPNIUUQTEFWFMPQFSTHPPHMFDPNNMLJU
.-,JU7JTJPO#BSDPEF4DBO'BDF%FUFDUJPO*NBHF-BCFMJOH-BOENBSL%FUFDUJPO0CKFDU%FUFDUJPO5SBDLJOH5FYU3FDPHOJUJPOIUUQTEFWFMPQFSTHPPHMFDPNNMLJU
.-,JU-BOHVBHF-BOHVBHF*EFOUJpDBUJPO0O%FWJDF5SBOTMBUJPO4NBSU3FQMZIUUQTEFWFMPQFSTHPPHMFDPNNMLJU
.-,JU$VTUPNඞཁʹԠͨ͡ϞσϧͷμϯϩʔυϞσϧͷࣗಈΞοϓσʔτϞσϧͷ"#ςετϞσϧͷಈతʢ%ZOBNJDʣͳબIUUQTEFWFMPQFSTHPPHMFDPNNMLJU
ػցֶशϫʔΫϑϩʔσʔληοτͷඋϞσϧͷֶशͱධՁϞσϧͷσϓϩΠਪ
'PPE(BMMFSZʹอଘ͞Ε͍ͯΔࣸਅͷ৯͚ͩΛදࣔʢ৯Ҏ֎Λಁաͯ͠දࣔʣͯ͠Ұཡ͢ΔΞϓϦɻIUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPX
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 = Truetflite_model = converter.convert()open(output_path, "wb").write(tflite_model)Ϟσϧͷग़ྗʢ5FOTPS'MPX-JUFʣ
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
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
Ϟσϧͷ࣮ߦInput OutputInterpretertfInferenceinputBufferresultBufferલॲཧσίʔυ
ϞσϧΛΈࠐΉ্Ͱͷ՝Ϟσϧͷେ͖࣮͞ߦফඅϝϞϦϞσϧͷอޢϢʔβʔϓϥΠόγʔ
.#Λ͑ΔϞσϧIUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPXSFMFBTFTUBH
ϞσϧͷΞʔΩςΫνϟΛมߋ
ϞσϧʢύϥϝʔλʔʣͷྔࢠԽCJUුಈখΛCJUʹมʢྔࢠԽʣ
ྔࢠԽͷબࢶ1PTUUSBJOJOH2VBOUJ[BUJPO2VBOUJ[BUJPOBXBSF5SBJOJOH
1PTUUSBJOJOHRVBOUJ[BUJPOdef _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 = Truetflite_model = converter.convert()open(output_path, "wb").write(tflite_model)
if model.QUANTIZATION:g = tf.get_default_graph()tf.contrib.quantize.create_training_graph(input_graph=g,quant_delay=2000000)IUUQTHJUIVCDPNUFOTPSqPXUFOTPSqPXUSFFSUFOTPSqPXDPOUSJCRVBOUJ[F2VBOUJ[BUJPOBXBSFUSBJOJOH
ϞσϧΛྔࢠԽ
"OESPJE/FVSBM/FUXPSLT"1*ϞόΠϧ্ͰػցֶशͷܭࢉॲཧΛ࣮ߦ͢ΔͨΊʹઃܭ͞ΕͨɻIUUQTEFWFMPQFSBOESPJEDPNOELHVJEFTOFVSBMOFUXPSLT"OESPJEʢ"1*ϨϕϧʣҎ߱ͰରԠɻIUUQTCMPHLFJKJJPUFOTPSqPXBEWFOU@DBMFOEBSIUNM͍·//"1*ʢ5FOTPS'MPX-JUFʣ͑Δͷ͔
ਪͷൺֱػछ໊ NN API͋Γ NN APIͳ͠Essential PH-1 556,323ns 185,372,624nsPixel 2 450,807ns 187,395,464nsPixel 3 477,489ns 129,994,563nsIUUQTHJUIVCDPNLFJKJGPPE@HBMMFSZ@XJUI@UFOTPSqPXSFMFBTFTUBHUqJUF@OOBQJ
͞·͟·ͳ੍εΧϥʔͰͷԋࢉ͕Ͱ͖ͳ͍ɻʷOPSNBMJ[FE@JNBHFJNBHF@QIεϥΠε͕͑ͳ͍ɻʷJNBHFJNBHF< >)ZQFSCPMJD5BOHFOU͕͑ͳ͍ɻʷPVUQVUUGUBOI PVU@P⒎TFUIUUQTXXXUFOTPSqPXPSHMJUFHVJEFPQT@DPNQBUJCJMJUZVOTVQQPSUFE@PQFSBUJPOT
ਫ਼͕ۃʹԼ
max: 14.586626min: -3.8083103ϞσϧΛߏ͍ͯ͠Δύϥϝʔλʔͷ࠷େɾ࠷খΛ֬ೝ
Ϟσϧઃܭͷ࣌ͰʮଌఆͱௐʯσʔληοτͷඋϞσϧͷֶशͱධՁϞσϧͷσϓϩΠਪϞσϧͷઃܭ
ଌఆʹج͍ͮͨϞσϧͷௐϞσϧͷઃܭϞσϧͷௐTensorFlow LiteมʢྔࢠԽʣαΠζɾ࣮ߦ ଌఆ
ΞϓϦଆͰͷվળ/BWJFSגࣜձࣾ φϏΤʣ౦ژจژ۠ຊڷຊڷ࢛ஸϏϧ'σΟʔϓϥʔχϯάΛ༻͍ͨը૾มٕज़ͷ։ൃ͓ΑͼιϑτΣΞͷఏڙIUUQTXXXOBWJFSDPϞσϧมߋͤͣɺ࣮ߦΛ̏ʙ̐ഒʹߴԽ
ϞσϧͷอޢʰΞϓϦʹΈࠐΉʹͨͬͯɺϞσϧʢΞʔΩςΫνϟɾύϥϝʔλʔʣ͕֎෦ʹྲྀग़͠ͳ͍Α͏ʹอޢ͍ͨ͠ʱ
Ϟσϧͷܗࣜ5FOTPS'MPX-JUFͷϞσϧ'MBU#V⒎FSTɻ'MBU#V⒎FSTɺσʔλͷల։ύʔεΛͤͣετϨʔδ্ͷσʔλʹϝϞϦΞυϨεΛϚοϓͯ͠ΞΫηε͢Δ͜ͱͰɺϝϞϦͷϑοτϓϦϯτΛݮ͢Δ ʢʹ҉߸Խͨ͠'MBU#V⒎FSTͷϑΝΠϧɺಁաతʹಡΈࠐΉ͜ͱ͕Ͱ͖ͳ͍ʣɻ
෮߸Խͯ͠ҰϩʔΧϧϑΝΠϧʹอଘassets app localϑΝΠϧಡΈࠐΈ Interpreter෮߸Խॲཧ
ϢʔβʔϓϥΠόγʔػցֶशͷϞσϧΛܧଓతʹվળ͢ΔͨΊʹɺσʔλ͕ඞཁɻϢʔβʔͷ͍ΔΞϓϦͷ߹ɺϢʔβʔ͔ΒσʔλΛఏڙʢૹ৴ɾอଘʣ͢Δ߹ҙΛಘΔඞཁ͕͋ΔɻϓϥΠόγʔσʔλͷऔΓѻ͏ମ੍Λ͑Δඞཁ͕͋Δɻσʔλͷ༰ʹΑͬͯ๏ʹΑΔن੍͋Δɻ
'FEFSBUFE-FBSOJOHͯ͢ͷσʔληοτΛαʔόʔ্Ͱॲཧ͢ΔʮूதτϨʔχϯάʯͱҟͳΓɺҰͭҰͭͷ্ͰϞσϧͷֶशͷલஈॲཧΛߦ্ͬͨͰɺαʔόʔʹૹ৴ͯ͠ฏۉԽ͢ΔɻIUUQTEFWFMPQFSTKQHPPHMFCMPHDPNGFEFSBUFEMFBSOJOHDPMMBCPSBUJWFIUNM
C-LIS CO., LTD.ຊࢿྉɺ༗ݶձࣾγʔϦεͷஶ࡞Ͱ͢ɻຊࢿྉͷશ෦ɺ·ͨҰ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐΛಘͣʹෳ͢Δ͜ͱې͡ΒΕ͍ͯ·͢ɻ5IF"OESPJE4UVEJPJDPOJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF໊֤ɾϒϥϯυ໊ɺձ໊ࣾͳͲɺҰൠʹ֤ࣾͷඪ·ͨొඪͰ͢ɻຊࢿྉதͰɺɺɺäΛׂѪ͍ͯ͠·͢ɻ5IF"OESPJESPCPUJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF