圖片審核服務(wù)設(shè)計(jì)方案(一)

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ù)。

架構(gòu)圖
  • 后臺(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)表
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容