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
150
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
230
DroidKaigi 2023
keiji
0
1.9k
TechFeed Conference 2022
keiji
0
300
Android Bazaar and Conference Diverse 2021 Winter
keiji
0
900
ci-cd-conference-2021
keiji
1
1.3k
Android Bazaar and Conference 2021 Spring
keiji
3
850
TFUG KANSAI 20190928
keiji
0
140
Softpia Japan Seminar 20190724
keiji
1
190
pixiv App Night 20190611
keiji
1
610
Other Decks in Technology
See All in Technology
Deno・Bunの標準機能やElysiaJSを使ったWebSocketサーバー実装 / ラーメン屋を貸し切ってLT会! IoTLT 2026新年会
you
PRO
0
290
Databricks Free Edition講座 データサイエンス編
taka_aki
0
290
なぜ今、コスト最適化(倹約)が必要なのか? ~AWSでのコスト最適化の進め方「目的編」~
htan
1
110
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
170
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
190
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
530
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
11
4.6k
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
Mosaic AI Gatewayでコーディングエージェントを配るための運用Tips / JEDAI 2026 新春 Meetup! AIコーディング特集
genda
0
150
Agile Leadership Summit Keynote 2026
m_seki
1
340
Context Engineeringの取り組み
nutslove
0
280
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
130
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
120
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
240
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
97
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
Bash Introduction
62gerente
615
210k
Git: the NoSQL Database
bkeepers
PRO
432
66k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
What's in a price? How to price your products and services
michaelherold
247
13k
The Curious Case for Waylosing
cassininazir
0
230
BBQ
matthewcrist
89
10k
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