1、背景
用戶通過(guò)制作平臺(tái),每天會(huì)有上萬(wàn)作品產(chǎn)生,在微信端每天有上百萬(wàn)作品在傳播,節(jié)假日當(dāng)天累計(jì)訪問(wèn)量會(huì)過(guò)億,如果內(nèi)容中存在涉政、涉黃等信息,很快就會(huì)被網(wǎng)監(jiān)部門(mén)點(diǎn)名;公司業(yè)務(wù)的拓展必然會(huì)帶來(lái)訪問(wèn)量的線性增長(zhǎng),但人力成本不能線性增長(zhǎng);為了助力人工審核,智能審核服務(wù)的構(gòu)建成了必然。
2、一期目標(biāo)
a、提供審核效果檢測(cè)功能、審核日志統(tǒng)計(jì)功能。
b、將第三方審核接口與自有模型審核接口融合,形成統(tǒng)一對(duì)外接口服務(wù),打通圖片送審流程。
c、基于深度學(xué)習(xí)構(gòu)建涉政人物圖片分類模型。
d、提供違禁圖片管理功能、搭建自有違禁圖片樣本庫(kù)。
e、提供模型管理功能。
3、流程介紹
一期主要以基礎(chǔ)框架搭建、服務(wù)流程打通為主;針對(duì)某一圖片審核場(chǎng)景,技術(shù)通過(guò)管理后臺(tái)為接口配置該場(chǎng)景下需要用到的模型單元,并為每個(gè)模型單元指定不同判斷閾值(閾值分三段:通過(guò)、不通過(guò)、無(wú)法識(shí)別),多個(gè)模型單元組層模型pipline,確認(rèn)提交后會(huì)為該pipline生成一個(gè)token,后期用戶只需要在送審接口中帶上該參數(shù),便可進(jìn)入正常服務(wù)。
每條送審的圖片審核完畢后都會(huì)生成一條審核日志,基于這些日志,構(gòu)建了效果監(jiān)測(cè)與日志統(tǒng)計(jì)等功能,審核團(tuán)隊(duì)可以通過(guò)效果監(jiān)測(cè)實(shí)時(shí)查看到每一張圖片審核狀態(tài)和審核詳情(最近30天),審核人員也可將違規(guī)的圖片導(dǎo)入到樣本庫(kù);日志統(tǒng)計(jì)提供了模型每天的準(zhǔn)確度與召回率統(tǒng)計(jì),以及與人工審核的對(duì)比數(shù)據(jù)。

后臺(tái)配置流程
后臺(tái)配置主要分為兩個(gè)部分,模型管理、配置模型pipline
1、模型管理:用戶通過(guò)該功能新增模型或者修改久的模型(當(dāng)模型pipline中還在引用模型時(shí),該模型不允許被刪除)。
2、模型pipline:針對(duì)某一使用場(chǎng)景,選擇需要用到的模型,并為每個(gè)模型配置對(duì)應(yīng)的閾值,多個(gè)模型組合成一個(gè)pipline list,提交保存后生成該pipline的調(diào)用token。需要注意的是,自建模型的圖片輸入應(yīng)該是網(wǎng)絡(luò)圖片加載后的字節(jié)對(duì)象,避免網(wǎng)絡(luò)圖片被多個(gè)模型多次加載影響性能。模型訓(xùn)練流程
使用遷移學(xué)習(xí),加速模型構(gòu)建;如果是從頭訓(xùn)練一個(gè)模型成本太高,可選用Vgg16、GoogleLeNet等開(kāi)源模型在自己的數(shù)據(jù)集上進(jìn)行微調(diào);
至于數(shù)據(jù)集的構(gòu)建可參看cifar-100圖像分類模型,它有100個(gè)分類,每個(gè)分類下600張圖片,其中500張訓(xùn)練集和100張測(cè)試集;在100個(gè)類別之上又被劃分為20個(gè)大類,每個(gè)大類包含5個(gè)左右小類,圖片分類結(jié)果會(huì)包含一個(gè)小類標(biāo)簽和一個(gè)大類標(biāo)簽。圖片送審流程
1、用戶從后臺(tái)配置使用場(chǎng)景,構(gòu)建模型pipline獲取token
2、通過(guò)接口api將token與圖片地址發(fā)送給服務(wù)器
3、服務(wù)器校驗(yàn)token有效性,根據(jù)token獲取對(duì)應(yīng)的模型pipline
4、根據(jù)pipline中各模型識(shí)別結(jié)果,匯總得出最終結(jié)果,返回調(diào)用并記錄日志效果監(jiān)測(cè)流程
支持機(jī)器審核、人工審核信息查看,支持圖片入樣本庫(kù)操作。
用戶圖片請(qǐng)求日志實(shí)時(shí)寫(xiě)入數(shù)據(jù)庫(kù),通過(guò)前端日志管理功能可實(shí)時(shí)查看每張送審圖片的狀態(tài),審核同事可通過(guò)該頁(yè)面對(duì)圖片進(jìn)行二次確認(rèn)審核,也可點(diǎn)擊【入庫(kù)】將圖片加入審核庫(kù)。(需要注意的是,如果機(jī)器判斷為reject的數(shù)據(jù),審核人員沒(méi)有在當(dāng)日進(jìn)行二次確認(rèn)審核,那么次日人工審核狀態(tài)會(huì)變成auto_reject)、數(shù)據(jù)也會(huì)自動(dòng)入樣本庫(kù)。
4、接口API
-
HTTP_GET:
該接口需要有緩存,緩存有效期內(nèi),同一張圖片多次調(diào)用將不做二次審核。
http(s)://host/verify/img?token=abcd32位字符串&img_url=encoder('http://imghost')
- dubbo
public String verifyImg(String token, String imgUrl)
| 參數(shù) | 是否必須 | 說(shuō)明 |
|---|---|---|
| token | 是 | 用來(lái)進(jìn)行接口請(qǐng)求驗(yàn)證和獲取模型pipline,只有有效的token才會(huì)返回結(jié)果,token從管理后臺(tái)配置模型時(shí)申請(qǐng) |
| img_url | 是 | 目標(biāo)圖片地址,需要進(jìn)行encoder處理,因?yàn)閳D片都在七牛云,可以在圖片地址后面加參數(shù)控制清晰度,以降低響應(yīng)時(shí)間 |
- 返回值格式:
{
"timing": 1227,
"code": 200,
"msg": "success",
"request_id": "1556153748009-0eb0e50fc1de",
"image_url": "http://res.eqh5.com/C5BC2989-93D1-4267-AF5D-EE277F691723.jpg",
"suggest": "reject",
"suggest_msg": "圖像涉黃",
"pipline": [{
"model": "porn",
"label": "色情",
"suggest": "reject",
"policy":">0.9",
"rate": 0.9022,
"label_details": [{
"rate": 0.9022,
"label": "敏感位"
}, {
"rate": 0.8781,
"label": "穿著暴露"
}]
}]
}
| 字段 | 描述 |
|---|---|
| timing | 當(dāng)前請(qǐng)求處理時(shí)間,單位ms |
| code | 請(qǐng)求響應(yīng)狀態(tài),具體參見(jiàn) response code |
| msg | 對(duì)應(yīng) response code 說(shuō)明 |
| request_id | 服務(wù)器接收到請(qǐng)求后生成的唯一Id,由13位時(shí)間戳+圖片地址md5值組成 |
| image_url | 目標(biāo)圖片地址 |
| suggest | reject 、normal 、 fuzzy |
| suggest_msg | 審核結(jié)果描述 |
| pipline.model | 審核模型:porn、terrorism、illegal、politic、ocr 、ad |
| pipline.label | model審核結(jié)果描述 |
| pipline.policy | model審核結(jié)果閾值判定描述,例如:>0.9 reject , <0.3 normal ,(0.3,0.9) fuzzy |
| pipline.suggest | model判定結(jié)果描述 |
| pipline.rate | model 最大label的置信度 (0-1) |
| pipline.label_details.rate | model中單個(gè)label的置信度 (0-1) |
| pipline.label_details.label | model中單個(gè)label描述 |
- response code
| code | msg |
|---|---|
| 200 | success |
| 421 | 認(rèn)證相關(guān):token無(wú)效,或未開(kāi)通相關(guān)服務(wù) |
| 400 | 認(rèn)證相關(guān):傳入?yún)?shù)不對(duì) |
| 500 | 服務(wù)器相關(guān):服務(wù)器內(nèi)部錯(cuò)誤 |
| 510 | 服務(wù)器相關(guān):請(qǐng)求太頻繁 |
5、模型pipline
pipline是針對(duì)具體的使用場(chǎng)景設(shè)立的,內(nèi)部組合多個(gè)自有模型和第三方模型協(xié)同處理;
輸入:針對(duì)自有模型統(tǒng)一圖片變量,避免一張圖片多次加載。
輸出:整合多模型判定結(jié)果,形成統(tǒng)一的輸出格式。
并行還是串行?
并行:執(zhí)行效率高,可結(jié)合多個(gè)審核模型結(jié)果選出最優(yōu)判斷結(jié)果賦值給suggest_msg,但會(huì)占用過(guò)度的計(jì)算資源。
串行:開(kāi)發(fā)難度低、占用資源少,但執(zhí)行相對(duì)耗時(shí),拿不到所有模型判定結(jié)果(當(dāng)遇到模型reject時(shí)可進(jìn)行截?cái)鄟?lái)加速判定)
結(jié)論:模型穿行執(zhí)行。
6、數(shù)據(jù)庫(kù)
- Cassandra審核日志數(shù)據(jù)庫(kù)
CREATE TABLE verify_log (
product text , # 產(chǎn)品線名稱
day text ,
scene_id text ,
req_id text,
img_url text ,
img_del text , #如果圖片被刪除 img_url中存放的是copy后的地址,否則存放原地址
scene_code text ,
req_time text , #圖片請(qǐng)求時(shí)間
verify_time text , #機(jī)器審核時(shí)間
confirm_time text , #人工審核時(shí)間
suggest text , #機(jī)器審核結(jié)果
suggest_msg text , #機(jī)器審核結(jié)果描述
pipline text , #模型結(jié)果詳細(xì)說(shuō)明 json
result text , #最終判定結(jié)果,人工操作必填項(xiàng):人工(reject 、normal);自動(dòng)(auto_reject)
result_class text , #判定具體原因,來(lái)自下拉框選擇,人工操作必填項(xiàng)
result_label text , #判定具體原因,來(lái)自下拉框選擇,人工操作必填項(xiàng)
result_tag text , #判定具體原因,來(lái)自下拉框選擇,可不填
operate_user text , #操作人
operate_time text #操作時(shí)間
PRIMARY KEY (product, day,scene_code,req_id)
) WITH CLUSTERING ORDER BY (day DESC,scene_code,req_id)
需要注意的是,日志應(yīng)在請(qǐng)求code=200的情況下入庫(kù),入庫(kù)時(shí)指定ttl,數(shù)據(jù)在Cassandra端保留1個(gè)月
-
Cassandra審核樣本數(shù)據(jù)庫(kù)
1、用戶標(biāo)記或自動(dòng)標(biāo)記為違規(guī)的數(shù)據(jù)會(huì)自動(dòng)加入樣本庫(kù)
2、用戶可以批量上傳、補(bǔ)充樣本庫(kù)
3、用戶可以刪除、修改樣本庫(kù)數(shù)據(jù)
CREATE TABLE train_data (
day text ,
class text,
img_id text, #圖片地址md5
label text,
label_tag text ,
img_url text , #為圖片copy后的新地址
img_size text , #圖片大小
img_shape text , #圖片規(guī)格
operate_user text , #操作人
operate_time text , #操作時(shí)間
operate_mark text #操作記錄
PRIMARY KEY (day,class,img_id)
)
此數(shù)據(jù)永久保存
7、日志統(tǒng)計(jì)
-
日志歸檔
日志每天從Cassandra庫(kù)歸檔到HDFS,歸檔后的數(shù)據(jù)格式為parquet、并使用snappy壓縮,目錄規(guī)則如下:
/data/verify/img/yyyy/MM/dd
-
模型日志統(tǒng)計(jì)
基于歸檔后的日志,使用spark_shell腳本每天凌晨定時(shí)計(jì)算,并將計(jì)算后的結(jié)果存入mysql。
統(tǒng)計(jì)報(bào)表
