最近在作一款圖牀服務,關注公號的小夥伴必定記得小柒曾說過,會在週末放出的,很差意思放你們鴿子了。之因此一直沒敢放出,是由於鑑黃接口一直沒調試好,雖然我對公號的小夥伴百分之百信任,奈何互聯網魚龍混雜,萬一上傳了什麼不雅的圖片,而後不巧被某部門發現了,我包括個人服務器域名可就完全玩完了!html
如圖,先聊一下圖牀的架構:java
Nginx
代理那是必備神器了。git
lua
限流是必定的了,雖然前期沒啥子流量,後期可能也沒有。github
限量限制大小也是必須的了,否則帶寬受不了。docker
接入鑑黃,畢竟咱是合法備案網站。ubuntu
文件多重備份,OSS、分佈式文件、本地文件各一份,防止走丟。api
爲了查詢方便,最後落庫。bash
SpringBoot,一個簡化Spring
開發的框架。服務器
WebUploader,一個簡單的以HTML5
爲主,FLASH
爲輔的現代文件上傳組件。網絡
Python,加持各類開源第三方庫處理圖片。
nsfw_data_scraper,一個近1w
星標的珍藏數據資源。
docker_nsfw_data_scraper,用於收集訓練數據。
TensorFlow,開源機器學習庫。
ResNet,圖像分類的預訓練模型。
TensorFlow-serving,部署tensorflow
模型,並提供服務。
訓練以前,先介紹一個名詞 NSFW
,以前我也不知道啥意思,畢竟是村裏來的,什麼瀧澤蘿拉、鬆島楓、小澤瑪利亞、吉澤明步、波多野結衣、天海翼、櫻井莉亞、飯島愛、蒼井空、麻生希、橘梨紗、武藤蘭、澤井芽衣.....是一律不知道的。
NSFW:不適合在工做場合出現的內容(英語:Not Safe/Suitable For Work,縮寫:NSFW)是一個網絡用語,多指裸露、暴力、色情或冒犯等不適宜公衆場合的內容。在給出含有上述內容的超連接旁標註 NSFW,用於警告觀看者。
在 nsfw_data_scraper
上傳存放了成千上萬張圖片地址,並對圖片進行了分類,以供訓練:
同時,官方也提供了收集方法:
$ docker build . -t docker_nsfw_data_scraper Sending build context to Docker daemon 426.3MB Step 1/3 : FROM ubuntu:18.04 ---> 775349758637 Step 2/3 : RUN apt update && apt upgrade -y && apt install wget rsync imagemagick default-jre -y ---> Using cache ---> b2129908e7e2 Step 3/3 : ENTRYPOINT ["/bin/bash"] ---> Using cache ---> d32c5ae5235b Successfully built d32c5ae5235b Successfully tagged docker_nsfw_data_scraper:latest $ # Next command might run for several hours. It is recommended to leave it overnight $ docker run -v $(pwd):/root docker_nsfw_data_scraper /root/scripts/runall.sh Getting images for class: neutral ... ... $ ls data test train $ ls data/train/ drawings hentai neutral porn sexy $ ls data/test/ drawings hentai neutral porn sexy
如何訓練模型,後面也很貼心的附上了訓練方法,不過這裏借用了 TensorFlow
的 ResNet
的模型,稍做修改。訓練過程太過煎熬、痛苦,已經被湮滅在有限的帶寬和無盡的小黃圖中。
模型數據訓練好之後就是搭建服務了,這裏咱們直接使用TensorFlow
的 TensorFlow-serving
對外提供服務,爲了安裝方便,咱們使用Docker
安裝部署。
NSFWDATA="/home/nsfw" docker run -d --rm -p 8501:8501 \ --name nsfw \ -v "$NSFWDATA/models:/models/nsfw" \ -e MODEL_NAME=nsfw \ tensorflow/serving
serving
鏡像提供了兩種調用方式:gRPC
和HTTP
請求。gRPC
默認端口是8500
,HTTP
請求的默認端口是8501
,serving鏡像中的程序會自動加載鏡像內/models
下的模型,經過MODEL_NAME
指定/models
下的哪一個模型。
HTTP調用API
地址:http://ip:port/v1/models/nsfw:predict
接口返回參數:
{ "classes": "porn", "probabilities": { "drawings": 0.0000170060648, "hentai": 0.00108581863, "neutral": 0.000101140722, "porn": 0.816358209, "sexy": 0.182437778 } }
完事具有,只欠圖牀,剛好,最近新域名也備案成功了,那就趕忙上線吧。麻溜的開始小範圍內測,內測期間各位小夥伴能夠多多踢出寶貴意見,2019年12月31日內測結束將清空全部數據,請悉知!
這篇案例醞釀了許久,還差點致使其難產,其實各類雲上都有鑑黃服務,好比阿里雲,50w
次請求,810RMB
,一年有效期,算下來也就不到2分錢
。可是肉疼啊,若是省錢的同時又能學習知識,何樂而不爲呢?
https://github.com/tensorflow/serving
https://www.tensorflow.org/serving/api_rest
https://www.tensorflow.org/tfx/serving/docker
https://github.com/alexkimxyz/nsfw_data_scraper
https://github.com/tensorflow/models/tree/master/official
http://www.javashuo.com/article/p-huigjumg-kv.html
https://github.com/tensorflow/models/tree/master/research/slim
https://github.com/tensorflow/models/tree/master/official/vision/image_classification#resnet
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/java