Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
20171209 Sakura ML Night
Search
ARIYAMA Keiji
December 09, 2017
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20171209 Sakura ML Night
2017年12月9日に大阪で開催された「さくらの機械学習ナイト」の発表資料です。
「TensorFlowによるNSFW(職場で不適切な)画像検出」について。
ARIYAMA Keiji
December 09, 2017
More Decks by ARIYAMA Keiji
See All by ARIYAMA Keiji
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
140
Build with AI
keiji
0
290
DroidKaigi 2023
keiji
0
2.1k
TechFeed Conference 2022
keiji
0
350
Android Bazaar and Conference Diverse 2021 Winter
keiji
0
930
ci-cd-conference-2021
keiji
1
1.3k
Android Bazaar and Conference 2021 Spring
keiji
3
970
TFUG KANSAI 20190928
keiji
0
180
Softpia Japan Seminar 20190724
keiji
1
220
Other Decks in Technology
See All in Technology
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
300
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
110
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
180
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
250
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
170
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
820
OpenSharing について熱く語る〜AI アセットの共有について〜
kameitomohiro
0
150
Incremental HTTP
kazuho
5
2k
20260930_Gemma4_Hands-on
tsho
0
210
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
210
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
6
2k
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
230
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
340
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
GitHub's CSS Performance
jonrohan
1033
470k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Designing for humans not robots
tammielis
254
26k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
610
Transcript
C-LIS CO., LTD.
C-LIS CO., LTD. ༗ࢁܓೋʢ,FJKJ"3*:"."ʣ $-*4$0 -5% "OESPJEΞϓϦ։ൃνϣοτσΩϧ Photo by
Koji MORIGUCHI (MORIGCHOWDER) ػցֶशͪΐͬͱͬͨ͜ͱ͋Γ·͢ Twitterͬͯ·ͤΜ
͘͞ΒͷػցֶशφΠτ 5FOTPS'MPXͰ /4'8ը૾ݕग़
5FOTPS'MPXʢ݄ൃදʣ ػցೳ͚ܭࢉϑϨʔϜϫʔΫ ࠷৽όʔδϣϯʢ݄ʣ
ษڧձΖ͏ͥ
(PPHMF%FWFMPQFS(SPVQ
IUUQTHEHLPCFEPPSLFFQFSKQFWFOUT
Πϯλʔωοτ͔Β Έͷը૾ΛࣗಈͰऩू͍ͨ͠
© ࠜઇΕ͍ ؟ ڸ ͬ ່
؟ڸ່ͬఆ 1 0
σʔληοτʢ݄࣌ʣ ؟ڸ່ͬɹຕ ඇ؟ڸ່ͬຕ ؟ڸ່ͬ ඇ؟ڸ່ͬ ޡݕग़ ؟ڸ່ͬ ඇ؟ڸ່ͬ
{ "generator": "Region Cropper", "file_name": "haruki_g17.png", "regions": [ { "probability":
1.0, "label": 2, "rect": { "left": 97.0, "top": 251.0, "right": 285.0, "bottom": 383.0 } }, { "probability": 1.0, "label": 2, "rect": { "left": 536.0, "top": 175.0, "right": 730.0, "bottom": 321.0 } } ] } Region Cropper: https://github.com/keiji/region_cropper
ߏ Downloader σʔληοτ Region + Label ઃఆ rsync
ཧͷߏ Downloader Face Detection Megane Detection ֬ೝɾमਖ਼ ೝࣝ݁Ռ ֶशʢ܇࿅ʣ
λΠϜϥΠϯ ϝσΟΞ σʔληοτ ֶशʢ܇࿅ʣ TensorFlow rsync
ઓͷաఔΛಉਓࢽʹ
͞·͟·ͳ՝ σʔληοτ͕(#Λ͑ͨ͋ͨΓ͔ΒϩʔΧϧͷಉظ͕ࠔʹɻ ྖҬʢ3FHJPOʣͷઃఆͱϥϕϧͷ༩૾Ҏ্ʹෛՙ͕ߴ͍ɻ
ը૾͕ສຕΛಥഁ σʔλཧ͕ࢸٸͷ՝ʹ
ඪΛ࠶֬ೝ
Πϯλʔωοτ͔Β Έͷ؟ڸ່ͬը૾ΛࣗಈͰऩू͍ͨ͠
Ҏલͷߏ Downloader σʔληοτ Region + Label ઃఆ rsync
ྖҬʴϥϕϧ
৽͍͠ߏ Downloader σʔληοτ Tagઃఆ
λά megane girl
؟ڸ່ͬผϞσϧ Ϟσϧ 1.00 0.00
%BUBTFU.BOBHFSGPS"OESPJE
σϞ
https://twitter.com/35s_00/status/930366666973757441
https://twitter.com/_meganeco
/4'8ʢ/PU4BGF'PS8PSLʣ
/4'8ը૾
͞·͟·ͳϦεΫ ࡞ۀͷϊΠζ ਫ਼ਆతͳෛՙ ๏తϦεΫ
/4'8ը૾ͷݕग़
ֶश༻σʔληοτʢ/4'8ʣ ਖ਼ྫɿ ෛྫɿ ← NSFWը૾
܇࿅ɾֶश
ڭࢣ༗Γֶश ◦ × Ϟσϧ 1.00 0.00
Ϟσϧͷߏ conv 3x3x64 stride 1 conv 3x3x64 stride 1
ReLU ReLU conv 3x3x128 stride 1 conv 3x3x128 stride 1 ReLU conv 3x3x256 stride 1 conv 3x3x256 stride 1 ReLU output 1 256x256x1 max_pool 2x2 stride 2 max_pool 2x2 stride 2 ReLU ReLU Sigmoid max_pool 2x2 stride 2 conv 3x3x64 stride 1 ReLU fc 768 ReLU bn bn bn
Sigmoid
# モデル定義 NUM_CLASSES = 1 NAME = 'model3' IMAGE_SIZE =
256 CHANNELS = 3 def prepare_layers(image, training=False): with tf.variable_scope('inference'): conv1 = tf.layers.conv2d(image, 64, [3, 3], [1, 1], padding='SAME', activation=tf.nn.relu, use_bias=False, trainable=training, name='conv1_1') conv1 = tf.layers.conv2d(conv1, 64, [3, 3], [1, 1], padding='VALID', activation=tf.nn.relu, use_bias=False, trainable=training, name='conv1_2') conv1 = tf.layers.batch_normalization(conv1, trainable=training, name='bn_1')
conv2 = tf.layers.conv2d(pool1, 128, [3, 3], [1, 1], padding='VALID', activation=tf.nn.relu,
use_bias=False, trainable=training, name='conv2_1') conv2 = tf.layers.conv2d(conv2, 128, [3, 3], [1, 1], padding='VALID', activation=tf.nn.relu, use_bias=False, trainable=training, name='conv2_2') conv2 = tf.layers.batch_normalization(conv2, trainable=training, name='bn_2') pool2 = tf.layers.max_pooling2d(conv2, [2, 2], [2, 2])
conv3 = tf.layers.conv2d(pool2, 256, [3, 3], [1, 1], padding='VALID', activation=tf.nn.relu,
use_bias=False, trainable=training, name='conv4_1') conv3 = tf.layers.conv2d(conv3, 256, [3, 3], [1, 1], padding='VALID', activation=tf.nn.relu, use_bias=False, trainable=training, name='conv4_2') conv3 = tf.layers.batch_normalization(conv3, trainable=training, name='bn_4') pool3 = tf.layers.max_pooling2d(conv3, [2, 2], [2, 2]) conv = tf.layers.conv2d(pool3, 64, [1, 1], [1, 1], padding='VALID', activation=tf.nn.relu, use_bias=True, trainable=training, name='conv') return conv
def output_layers(prev, batch_size, keep_prob=0.8, training=False): flatten = tf.reshape(prev, [batch_size, -1])
fc1 = tf.layers.dense(flatten, 768, trainable=training, activation=tf.nn.relu, name='fc1') fc1 = tf.layers.dropout(fc1, rate=keep_prob, training=training) output = tf.layers.dense(fc1, NUM_CLASSES, trainable=training, activation=None, name='output') return output
def _loss(logits, labels, batch_size, positive_ratio): cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits( labels=labels, logits=logits)
loss = tf.reduce_mean(cross_entropy) return loss def _init_optimizer(learning_rate): return tf.train.AdamOptimizer(learning_rate=learning_rate) ޡࠩؔͱ࠷దԽΞϧΰϦζϜ
ֶशΛ্ख͘ਐΊΔ
ਖ਼ྫɾෛྫͷൺ ਖ਼ྫɿ ෛྫɿ ← NSFWը૾ NSFW
def _hard_negative_mining(loss, labels, batch_size): positive_count = tf.reduce_sum(labels) positive_count = tf.reduce_max((positive_count,
1)) negative_count = positive_count * HARD_SAMPLE_MINING_RATIO negative_count = tf.reduce_max((negative_count, 1)) negative_count = tf.reduce_min((negative_count, batch_size)) positive_losses = loss * labels negative_losses = loss - positive_losses top_negative_losses, _ = tf.nn.top_k(negative_losses, k=tf.cast(negative_count, tf.int32)) loss = (tf.reduce_sum(positive_losses / positive_count) + tf.reduce_sum(top_negative_losses / negative_count)) return loss )BSE/FHBUJWF.JOJOH
ֶशڥʢ͘͞ΒͷߴՐྗίϯϐϡʔςΟϯάʣ $169FPO$PSFʷ .FNPSZ(# 44%(# (F'PSDF(595*5"/9ʢ1BTDBMΞʔΩςΫνϟʣ(#ʷ (F'PSDF(595Jʢ1BTDBMΞʔΩςΫνϟʣ(#ʷ
ֶश݅ ޡࠩؔަࠩΤϯτϩϐʔ ࠷దԽΞϧΰϦζϜ"EBN ֶश όοναΠζ
طଘͷσʔληοτʹਪʢJOGFSFODFʣΛ࣮ߦ Downloader σʔληοτ Tagઃఆ inference trainer ֶशࡁΈϞσϧ ֶश༻σʔληοτ
ਪ݁Ռ /4'8 Ұൠը૾ NSFW 8.6%
ֶश༻σʔληοτʢ/4'8ʣ ਖ਼ྫɿ ɹˠɹ ෛྫɿ ɹˠɹ
܇࿅ɾֶशʹ͔͔Δܭࢉ࣌ؒ
σϞ (16ɾ$16ͷൺֱ
$16ɾ(16ͷൺֱʢCBUDI4J[Fʣ 5*5"/9 TFDTUFQ 9FPO$PSF TFDTUFQ ࠓճͷϞσϧͷֶशʹ͍ͭͯ 5*5"/9ͷํ͕ഒ͍ʂ
$16ɾ(16ͷൺֱʢCBUDI4J[F ʣ 5*5"/9 (595J TFDTUFQ 9FPO$PSF TFDTUFQ
ࠓճͷϞσϧͷֶशʹ͍ͭͯ (16ʷͷํ͕ഒ͍ʂ
ࠓޙͷ՝
σʔληοταʔόʔͷ৴པੑ্
JOGFSFODFʢਪʣͷͨΊͷܭࢉࢿݯͷ֬อ Downloader σʔληοτ Tagઃఆ inference trainer ֶशࡁΈϞσϧ ֶश༻σʔληοτ
TAGS = [ 'original_art', 'nsfw', 'like', 'photo', 'illust', 'comic', 'face',
'girl', 'megane', ϥϕϧʢλάʣ 'school_uniform', 'blazer_uniform', 'sailor_uniform', 'gl', 'kemono', 'boy', 'bl', 'cat', 'dog', 'food', 'dislike', ]
.PWJEJVT
ਪΛ.PWJEJVTҠߦ Downloader σʔληοτ Tagઃఆ trainer ֶशࡁΈϞσϧ ֶश༻σʔληοτ inference
ΫϥεఆϞσϧ conv 3x3x64 stride 1 conv 3x3x64 stride 1
ReLU ReLU conv 3x3x128 stride 1 conv 3x3x128 stride 1 ReLU conv 3x3x256 stride 1 conv 3x3x256 stride 1 ReLU output 20 256x256x1 max_pool 2x2 stride 2 max_pool 2x2 stride 2 ReLU ReLU Sigmoid max_pool 2x2 stride 2 conv 3x3x64 stride 1 ReLU fc 768 ReLU bn bn bn
C-LIS CO., LTD. ຊࢿྉɺ༗ݶձࣾγʔϦεͷஶ࡞Ͱ͢ɻຊࢿྉͷશ෦ɺ·ͨҰ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐΛಘͣʹෳ͢Δ͜ͱې͡ΒΕ͍ͯ·͢ɻ 5IF"OESPJE4UVEJPJDPOJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF ໊֤ɾϒϥϯυ໊ɺձ໊ࣾͳͲɺҰൠʹ֤ࣾͷඪ·ͨొඪͰ͢ɻຊࢿྉதͰɺɺɺäΛׂѪ͍ͯ͠·͢ɻ 5IF"OESPJESPCPUJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF https://speakerdeck.com/keiji/20171209-sakura-ml-night