5月29日にクックパッド株式会社で開催されたML Ops Study #2の発表資料です。
C-LIS CO., LTD.
View Slide
.-0QT4UVEZBUΫοΫύουגࣜձࣾ5FOTPS'MPXͷ܇࿅ࡁΈϞσϧΛ "OESPJEΞϓϦʹࡌͤΔͱ͖ʹ ۤ࿑ͨ͠5FOTPS'MPXͰझຯͷը૾ऩूαʔόʔΛ࡞Δ݄߸
C-LIS CO., LTD.༗ࢁܓೋʢ,FJKJ"3*:"."ʣ$-*4$0 -5%Photo : Koji MORIGUCHI (MORIGCHOWDER)"OESPJEΞϓϦ։ൃνϣοτσΩϧػցֶशͪΐͬͱͬͨ͜ͱ͋Γ·͢
C-LIS CO., LTD.ͬ
ຊ൪ڥͷೖܦݧ͕ඞཁͳΒೖͯ͠͠·͍͍͑͡Όͳ͍
؟ڸ່ͬࠜઇΕ͍
Έͷ؟ڸ່ͬը૾Λ ࣗಈͰऩू͍ͨ͠
̎Ϋϥεྨ1 0
ݱࡏͷγεςϜ
ධՁ༻αʔόʔ܇࿅ɾֶश༻αʔόʔσʔληοτసૹʢTFRecordʣֶशࡁΈύϥϝʔλʔऔಘը૾औಘը૾औಘϥϕϧ͚σʔληοτཧαʔόʔσʔλऩूݩαʔϏεը૾औಘϥϕϧ͚Android ΞϓϦ
σʔληοτཧαʔόʔ$16"UISPO/FP()[.FNPSZ(#4UPSBHF44%(# )%%5# 3"*%
σʔληοτཧαʔόʔͷׂը૾σʔλͷऩूϝλσʔλʢΞϊςʔγϣϯɾϥϕϧʣͷཧ"1*ͷఏڙֶश༻σʔλʢ5'3FDPSEʣͷੜ
ը૾σʔλͷऩू
ϝλσʔλͷཧ
ϝλσʔλͷཧlabel: 2left: 283top: 190right: 435bottom:301= 1.0
ϥϕϧͷछྨPSJHJOBM@BSUOTGXGBWPSJUFQIPUPJMMVTUDPNJDGBDFGFNBMFNFHBOFTDISPPM@VOJGPSNCMB[FS@VOJGPSNTBJMPS@VOJGPSNHMLFNPOPNBMFCMDBUEPHGPPEEJTMJLF
"1*ͷఏڙը૾Ϧετͷऔಘը૾ͷऔಘը૾ͷݕࡧʢϥϕϧʣϥϕϧͷઃఆϥϕϧະઃఆը૾ͷϦετΛऔಘσʔλऔಘݩ5XJUUFS*%ͷՃɾআ
ֶश༻σʔλͷੜ5'3FDPSEܗࣜPS+1&($47ܗࣜը૾ͷϦαΠζ͜ͷஈ֊Ͱߦ͏ʢτϥϑΟοΫΛݮ$ python ./create_dataset.py \--base_dir /dataset/source/ \--output_dir ~/tfrecords_classifier \--image_size 256 \--tag_names megane,nsfw,favorite,illust
σʔλͷάϧʔϓԽ0 1 2 3 4 5 6 7 8 9σʔληοτςετσʔληοτ
ֶश༻αʔόʔ
{"tag_name": "megane","train_catalog_numbers": "0,1,2,3,4,5,6,7,8","eval_catalog_numbers": "9","data_augmentation": {"random_crop": false,"random_colorize": true}}ֶश༻ͷઃఆϑΝΠϧ
ֶशͱݕূͷ࣮ߦ$ CUDA_VISIBLE_DEVICES=0,1 python ./train.py \--learning_config config_megane.json \--tfrecords_dir ~/tfrecords_classifier \--train_dir ~/train_single_discriminator \--summary_dir ~/summary_single_discriminator \--batch_size 64 \--learning_rate 0.0001 \--num_gpus 2 \--max_step 100000$ CUDA_VISIBLE_DEVICES=2 python ./eval.py \--learning_config config_megane.json \--tfrecords_dir ~/tfrecords_classifier \--train_dir ~/train_single_discriminator \--summary_dir ~/summary_single_discriminator$ tensorboard \--logdir ~/summary_single_discriminator/megane/
ධՁ༻αʔόʔ
ධՁͷ࣮ߦ$ python3 client.py \--tag_name megane \--train_base_path ~/train_single_discriminator \--train_file_name precision-0.956463/megane.ckpt-294000 \--batch_size 16 \--limit_batch 100
"OESPJEΞϓϦ
ۙͷ՝
ෆదը૾͕ଟ͗͢Δ
ෆదʢ/4'8ʣը૾ͱ؟ڸը૾/4'8 positive: 36,083 → 7.17% negative: 466,738؟ڸ positive: 23,559 → 2.44% negative: 938,563
ෆదը૾ϑΟϧλʔΛΞϓϦʹΈࠐΉ
NPEFMNSFWpositive: 5,628negative: 17,253
NPEFMֶशࡁΈύϥϝʔλʔϑΝΠϧֶशࡁΈϞσϧ.pb170MB
NPEFM@MJUFֶशࡁΈύϥϝʔλʔϑΝΠϧֶशࡁΈϞσϧ.pb10.7MB
NPEFM@MJUF
Ϟσϧͷߏ.pbinput result128x128x3 1
private val IMAGE_WIDTH = 128private val IMAGE_HEIGHT = 128private val IMAGE_CHANNEL = 3private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNELval imageByteBuffer: ByteBuffer = ByteBuffer.allocate(IMAGE_BYTES_LENGTH)val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false)scaledBitmap.copyPixelsToBuffer(imageByteBuffer)ը૾ΛόοϑΝʹ֨ೲ
val resultArray = FloatArray(1)fun recognize(imageByteArray: ByteArray): Float {val start = Debug.threadCpuTimeNanos()tfInference.feed("input", imageByteArray, imageByteArray.size.toLong())tfInference.run(arrayOf("result"))tfInference.fetch("result", resultArray)val elapsed = Debug.threadCpuTimeNanos() - startLog.d(TAG, "Elapsed: %d ns".format(elapsed))return resultArray[0]}GFFESVOGFUDI
private val IMAGE_WIDTH = 128private val IMAGE_HEIGHT = 128private val IMAGE_CHANNEL = 3private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNELval imageByteBuffer: ByteBuffer = ByteBuffer.allocate(IMAGE_BYTES_LENGTH)val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false)scaledBitmap.copyPixelsToBuffer(imageByteBuffer)scaledBitmap.recycle()ݪҼΒ͖͠ͷˢ"MQIBνϟϯωϧ͕ೖ͍ͬͯΔ
Ϟσϧͷߏ.pbinput result128x128x4 1
with tf.Graph().as_default() as g:image_ph = tf.placeholder(tf.uint8,[model.IMAGE_SIZE * model.IMAGE_SIZE * 4],name='input')image = tf.cast(image_ph, tf.float32)image = tf.reshape(image,[model.IMAGE_SIZE, model.IMAGE_SIZE, 4])image = image[:, :, :3]QCग़ྗ࣌ʹDIΛड͚ೖΕΔΑ͏ʹάϥϑΛมߋ
σϞ
'PPE(BMMFSZhttps://github.com/keiji/food_gallery_with_tensorflowΪϟϥϦʔʹอଘ͞Ε͍ͯΔ৯ͷը૾Λදࣔhttp://techlife.cookpad.com/entry/2017/09/14/161756ΫοΫύου։ൃऀϒϩάྉཧ͖Ζ͘ʹ͓͚ΔྉཧʗඇྉཧผϞσϧͷৄࡉ
ΈࠐΜͰΈ͚ͨΕͲɺਫ਼͋·Γߴ͘ͳ͍ʜʜ
ࠓޙͷ՝5FOTPS'MPX-JUFͷҠߦߴਫ਼ͷϞσϧͷѹॖʢল༰ྔԽʣ1SVOJOH2VBOUJ[BUJPO%JTUJMMBUJPOML Kit: Machine Learning SDK for mobile developers (Google I/O '18)https://youtu.be/Z-dqGRSsaBs?t=32m10s
ࠓޙͷ՝ֶशαΠΫϧΛࣗಈԽ͍͖͍ͯͨ͠ɻʢఆظతʹֶशσʔλͷੜͱసૹΛߦ͍ɺ࠶ֶश͢ΔͳͲʣσʔλϕʔεͷߴԽ ɹϥϕϧݕࡧ͕ඇৗʹ͍ͷ͕՝ɻઃܭΛݟ͢ඞཁ͋Γ ɹݕࡧΠϯσοΫεͷ(PPHMF$MPVE4UPSFҠߦΛݕ౼
ࠓޙͷ՝σʔληοτཧαʔόʔͷߋ৽5FOTPS'MPXΑΓɺ$16ʹ*OUFM"79͕ඞਢʹͳͬͨʢQJQ൛ʣ
C-LIS CO., LTD.ຊࢿྉɺ༗ݶձࣾγʔϦεͷஶ࡞Ͱ͢ɻຊࢿྉͷશ෦ɺ·ͨҰ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐΛಘͣʹෳ͢Δ͜ͱې͡ΒΕ͍ͯ·͢ɻ5IF"OESPJE4UVEJPJDPOJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF໊֤ɾϒϥϯυ໊ɺձ໊ࣾͳͲɺҰൠʹ֤ࣾͷඪ·ͨొඪͰ͢ɻຊࢿྉதͰɺɺɺäΛׂѪ͍ͯ͠·͢ɻ5IF"OESPJESPCPUJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF