Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ML Ops Study 2
Search
ARIYAMA Keiji
May 29, 2018
Technology
0
130
ML Ops Study 2
5月29日にクックパッド株式会社で開催されたML Ops Study #2の発表資料です。
ARIYAMA Keiji
May 29, 2018
Tweet
Share
More Decks by ARIYAMA Keiji
See All by ARIYAMA Keiji
Build with AI
keiji
0
180
DroidKaigi 2023
keiji
0
1.7k
TechFeed Conference 2022
keiji
0
270
Android Bazaar and Conference Diverse 2021 Winter
keiji
0
860
ci-cd-conference-2021
keiji
1
1.2k
Android Bazaar and Conference 2021 Spring
keiji
3
780
TFUG KANSAI 20190928
keiji
0
110
Softpia Japan Seminar 20190724
keiji
1
160
pixiv App Night 20190611
keiji
1
590
Other Decks in Technology
See All in Technology
勝手に!深堀り!Cloud Run worker pools / Deep dive Cloud Run worker pools
iselegant
3
470
Automatically generating types by running tests
sinsoku
2
3.5k
Spring Bootで実装とインフラをこれでもかと分離するための試み
shintanimoto
7
870
Making a MIDI controller device with PicoRuby/R2P2 (RubyKaigi 2025 LT)
risgk
1
300
4/16/25 - SFJug - Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
2
120
React ABC Questions
hirotomoyamada
0
520
意思決定を支える検索体験を目指してやってきたこと
hinatades
PRO
0
230
JPOUG Tech Talk #12 UNDO Tablespace Reintroduction
nori_shinoda
2
150
より良い開発者体験を実現するために~開発初心者が感じた生成AIの可能性~
masakiokuda
0
210
ブラウザのレガシー・独自機能を愛でる-Firefoxの脆弱性4選- / Browser Crash Club #1
masatokinugawa
1
500
Dynamic Reteaming And Self Organization
miholovesq
3
610
“パスワードレス認証への道" ユーザー認証の変遷とパスキーの関係
ritou
1
610
Featured
See All Featured
Making Projects Easy
brettharned
116
6.1k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.4k
Into the Great Unknown - MozCon
thekraken
37
1.7k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Navigating Team Friction
lara
184
15k
Unsuck your backbone
ammeep
670
57k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
How to Think Like a Performance Engineer
csswizardry
23
1.5k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Transcript
C-LIS CO., LTD.
.-0QT4UVEZ BUΫοΫύουגࣜձࣾ 5FOTPS'MPXͷ܇࿅ࡁΈϞσϧΛ "OESPJEΞϓϦʹࡌͤΔͱ͖ʹ ۤ࿑ͨ͠ 5FOTPS'MPXͰझຯͷը૾ऩूαʔόʔΛ࡞Δ݄߸
C-LIS CO., LTD. ༗ࢁܓೋʢ,FJKJ"3*:"."ʣ $-*4$0 -5% Photo :
Koji MORIGUCHI (MORIGCHOWDER) "OESPJEΞϓϦ։ൃνϣοτσΩϧ ػցֶशͪΐͬͱͬͨ͜ͱ͋Γ·͢
C-LIS CO., LTD.
C-LIS CO., LTD. ͬ
ຊ൪ڥͷೖܦݧ͕ඞཁͳΒ ೖͯ͠͠·͍͍͑͡Όͳ͍
؟ ڸ ͬ ່ ࠜઇΕ͍
Έͷ؟ڸ່ͬը૾Λ ࣗಈͰऩू͍ͨ͠
̎Ϋϥεྨ 1 0
ݱࡏͷγεςϜ
ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ
ը૾औಘ ϥϕϧ ͚ σʔληοτཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ͚ Android ΞϓϦ
σʔληοτཧαʔόʔ $16"UISPO/FP()[ .FNPSZ(# 4UPSBHF44%(# )%%5# 3"*%
σʔληοτཧαʔόʔͷׂ ը૾σʔλͷऩू ϝλσʔλʢΞϊςʔγϣϯɾϥϕϧʣͷཧ "1*ͷఏڙ ֶश༻σʔλʢ5'3FDPSEʣͷੜ
ը૾σʔλͷऩू
ϝλσʔλͷཧ
ϝλσʔλͷཧ label: 2 left: 283 top: 190 right:
435 bottom:301 = 1.0
ϥϕϧͷछྨ PSJHJOBM@BSU OTGX GBWPSJUF QIPUP JMMVTU DPNJD GBDF
GFNBMF NFHBOF TDISPPM@VOJGPSN CMB[FS@VOJGPSN TBJMPS@VOJGPSN HM LFNPOP NBMF CM DBU EPH GPPE EJTMJLF
"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 σʔληοτ ςετσʔληοτ
ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ
ը૾औಘ ϥϕϧ ͚ σʔληοτཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ͚ Android ΞϓϦ
ֶश༻αʔόʔ
{ "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/
ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ
ը૾औಘ ϥϕϧ ͚ σʔληοτཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ͚ Android ΞϓϦ
ධՁ༻αʔόʔ
ධՁͷ࣮ߦ $ 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
ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ
ը૾औಘ ϥϕϧ ͚ σʔληοτཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ͚ Android ΞϓϦ
"OESPJEΞϓϦ
ۙͷ՝
ෆదը૾͕ଟ͗͢Δ
ෆదʢ/4'8ʣը૾ͱ؟ڸը૾ /4'8 positive: 36,083 → 7.17% negative:
466,738 ؟ڸ positive: 23,559 → 2.44% negative: 938,563
ෆదը૾ϑΟϧλʔΛ ΞϓϦʹΈࠐΉ
NPEFM NSFW positive: 5,628 negative: 17,253
NPEFM ֶशࡁΈύϥϝʔλʔϑΝΠϧ ֶशࡁΈϞσϧ .pb 170MB
NPEFM@MJUF ֶशࡁΈύϥϝʔλʔϑΝΠϧ ֶशࡁΈϞσϧ .pb 10.7MB
NPEFM@MJUF
Ϟσϧͷߏ .pb input result 128x128x3 1
private val IMAGE_WIDTH = 128 private val IMAGE_HEIGHT = 128
private val IMAGE_CHANNEL = 3 private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNEL val 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() - start Log.d(TAG, "Elapsed: %d ns".format(elapsed)) return resultArray[0] } GFFESVOGFUDI
private val IMAGE_WIDTH = 128 private val IMAGE_HEIGHT = 128
private val IMAGE_CHANNEL = 3 private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNEL val imageByteBuffer: ByteBuffer = ByteBuffer.allocate(IMAGE_BYTES_LENGTH) val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false) scaledBitmap.copyPixelsToBuffer(imageByteBuffer) scaledBitmap.recycle() ݪҼΒ͖͠ͷ ˢ"MQIBνϟϯωϧ͕ೖ͍ͬͯΔ
Ϟσϧͷߏ .pb input result 128x128x4 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(BMMFSZ https://github.com/keiji/food_gallery_with_tensorflow ΪϟϥϦʔʹอଘ͞Ε͍ͯΔ৯ͷը૾Λදࣔ http://techlife.cookpad.com/entry/2017/09/14/161756 ΫοΫύου։ൃऀϒϩά ྉཧ͖Ζ͘ʹ͓͚ΔྉཧʗඇྉཧผϞσϧͷৄࡉ
ΈࠐΜͰΈ͚ͨΕͲɺ ਫ਼͋·Γߴ͘ͳ͍ʜʜ
ࠓޙͷ՝ 5FOTPS'MPX-JUFͷҠߦ ߴਫ਼ͷϞσϧͷѹॖʢল༰ྔԽʣ 1SVOJOH 2VBOUJ[BUJPO %JTUJMMBUJPO ML 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