使用函數(shù)計(jì)算實(shí)現(xiàn)OSS圖片增量檢測
如果需要實(shí)時檢測上傳到OSS Bucket的圖片是否存在違規(guī)內(nèi)容,且根據(jù)檢測結(jié)果決定如何處理圖片,例如是否對外公開、轉(zhuǎn)存后人工復(fù)核等問題,可以通過函數(shù)計(jì)算調(diào)用內(nèi)容安全的圖片審核增強(qiáng)版服務(wù)。本文介紹如何使用函數(shù)計(jì)算實(shí)現(xiàn)OSS Bucket增量圖片數(shù)據(jù)的檢測。
方案架構(gòu)
方案優(yōu)勢
與內(nèi)容安全OSS違規(guī)檢測1.0版本功能相比,使用函數(shù)計(jì)算的方案具備如下優(yōu)勢:
支持配置多個函數(shù)以實(shí)現(xiàn)不同OSS Bucket采用不同的檢測配置。
檢測日志寫入日志服務(wù)SLS對應(yīng)的Project中,更方便查詢和分析檢測結(jié)果。
函數(shù)計(jì)算對事件和請求能實(shí)時動態(tài)伸縮,實(shí)現(xiàn)增量圖片檢測能力接近毫秒級。
虛擬機(jī)級別隔離運(yùn)行,更靈活也更安全地處理OSS Bucket文件。
如需定期或者批量檢測OSS Bucket圖片數(shù)據(jù),請參見批量檢測OSS存儲圖片數(shù)據(jù)。
費(fèi)用說明
使用函數(shù)計(jì)算實(shí)現(xiàn)OSS Bucket增量圖片數(shù)據(jù)的檢測,會產(chǎn)生以下幾部分費(fèi)用:
類別 | 說明 |
內(nèi)容審核服務(wù)費(fèi)用 | 調(diào)用圖片審核增強(qiáng)版API服務(wù)的費(fèi)用。具體信息,請參見圖片審核增強(qiáng)版介紹及計(jì)費(fèi)說明。 |
OSS訪問和流量費(fèi)用 | 訪問OSS Bucket文件過程會產(chǎn)生請求費(fèi)用。具體信息,請參見請求費(fèi)用。 同地域下調(diào)用審核API使用OSS內(nèi)網(wǎng)地址為內(nèi)網(wǎng)流量傳輸,跨地域或者調(diào)用審核API使用公網(wǎng)地址會產(chǎn)生外網(wǎng)流量費(fèi)用。具體信息,請參見流量費(fèi)用。 |
函數(shù)計(jì)算調(diào)用和資源費(fèi)用 | 使用函數(shù)計(jì)算觸發(fā)OSS事件并調(diào)用函數(shù)會產(chǎn)生相應(yīng)的資源和調(diào)用費(fèi)用。具體信息,請參見計(jì)費(fèi)概述。 |
圖片審核增強(qiáng)版服務(wù)支持接入的地域
地域 | 外網(wǎng)接入地址 | 內(nèi)網(wǎng)接入地址 |
華東2(上海) | green-cip.cn-shanghai.aliyuncs.com | green-cip-vpc.cn-shanghai.aliyuncs.com |
華北2(北京) | green-cip.cn-beijing.aliyuncs.com | green-cip-vpc.cn-beijing.aliyuncs.com |
華東1(杭州) | green-cip.cn-hangzhou.aliyuncs.com | green-cip-vpc.cn-hangzhou.aliyuncs.com |
華南1(深圳) | green-cip.cn-shenzhen.aliyuncs.com | 暫無 |
西南1(成都) | green-cip.cn-chengdu.aliyuncs.com | 暫無 |
新加坡 | green-cip.ap-southeast-1.aliyuncs.com | green-cip-vpc.ap-southeast-1.aliyuncs.com |
前提條件
已開通阿里云內(nèi)容安全服務(wù)。具體操作,請參見開通與收費(fèi)。
已開通阿里云OSS對象存儲并創(chuàng)建存儲空間。具體操作,請參見開通OSS服務(wù)、控制臺創(chuàng)建存儲空間。
本文以創(chuàng)建的存儲空間
osstest-20
為例。已開通阿里云函數(shù)計(jì)算服務(wù)。具體操作,請參見開通函數(shù)計(jì)算服務(wù)。
操作步驟
登錄函數(shù)計(jì)算控制臺,選擇服務(wù)地域,創(chuàng)建服務(wù)和函數(shù)。具體操作,請參見管理服務(wù)、管理函數(shù)。
創(chuàng)建函數(shù)時,選擇使用內(nèi)置運(yùn)行時創(chuàng)建的方式,核心字段配置如下:
在基本設(shè)置區(qū)域,選擇請求處理程序類型為處理事件請求。
在函數(shù)代碼區(qū)域,根據(jù)實(shí)際業(yè)務(wù)選擇運(yùn)行環(huán)境,設(shè)置代碼上傳方式為使用示例代碼方式,并選擇對象存儲OSS觸發(fā)函數(shù)。
在觸發(fā)器配置區(qū)域,選擇觸發(fā)器類型為對象存儲OSS,指定Bucket名稱為
osstest-20
、文件前綴為img
、文件后綴為png
,觸發(fā)事件選擇oss:ObjectCreated:PutObject
和oss:ObjectCreated:PostObject
事件,角色名稱為AliyunOSSEventNotificationRole
。首次創(chuàng)建函數(shù)時,您可以根據(jù)頁面提示授予事件源訪問函數(shù)計(jì)算權(quán)限。更多內(nèi)容,請參見授予事件源訪問函數(shù)計(jì)算的權(quán)限。
關(guān)于OSS觸發(fā)器事件的詳細(xì)信息,請參見OSS觸發(fā)器概述。
通過函數(shù)調(diào)用內(nèi)容安全圖片審核增強(qiáng)版服務(wù)。
創(chuàng)建函數(shù)后會跳轉(zhuǎn)到函數(shù)代碼界面,在編輯器頁面中即可編輯調(diào)用內(nèi)容安全的示例代碼。詳細(xì)參數(shù)說明,請參見圖片審核增強(qiáng)版API。
關(guān)于函數(shù)代碼編輯介紹,請參見代碼開發(fā)概述。
以下為您展示圖片審核增強(qiáng)版Python代碼示例。在調(diào)用以下代碼示例前,您需要先將AccessKey ID和AccessKey Secret寫入到配置文件config.ini中。
# -*- coding: utf-8 -*- import json, uuid import configparser from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest def handler(event, context): config = configparser.ConfigParser() config.read("config.ini", encoding="GB18030") # AccessKey ID和AccessKey Secret寫入的配置文件。 evt = json.loads(event) evt = evt['events'][0] bucket_name = evt['oss']['bucket']['name'] object_name = evt['oss']['object']['key'] # 公網(wǎng)地址,需要公共讀且會產(chǎn)生OSS公網(wǎng)流量費(fèi)用。 objecturl = "https://" + bucket_name + ".oss-cn-hangzhou.aliyuncs.com/" + object_name client = AcsClient(config.get("config", "accessKeyId"), config.get("config", "accessSecret"), 'cn-shanghai') request = CommonRequest() request.set_read_timeout(6000) # 讀取超時時間配置。 request.set_connect_timeout(3000) # 連接超時時間配置。 request.set_accept_format('json') request.set_method('POST') request.set_protocol_type('https') # https | http request.set_domain('green-cip.cn-shanghai.aliyuncs.com') request.set_version('2022-03-02') request.set_action_name('ImageModeration') request.add_query_param("Service", "baselineCheck") request.add_query_param("ServiceParameters", { 'imageUrl': objecturl, 'dataId': str(uuid.uuid4()) }) response = client.do_action_with_exception(request) print(str(response, encoding='utf-8')) response_json = json.loads(response) if response_json.get("Code") == 200: for item in response_json.get("Data", {}).get("Result", []): if item["Label"] == "nonLabel": print("nonLabel 無命中標(biāo)簽") elif "pornographic" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有色情內(nèi)容") elif "political" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有涉政內(nèi)容") elif "violent" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有暴恐內(nèi)容") elif "fraud" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有風(fēng)險(xiǎn)內(nèi)容") else: print("請求失敗,錯誤碼:", response_json.get("Code"))
如果是華東2(cn-shanghai)或者華北2(cn-beijing)區(qū)域的OSS圖片,支持使用OSS圖片內(nèi)網(wǎng)地址調(diào)用同區(qū)域的審核服務(wù)。使用前須使用阿里云賬號(即主賬號)訪問云資源訪問授權(quán)頁面進(jìn)行授權(quán)。更詳細(xì)的參數(shù)信息,請參考圖片審核增強(qiáng)版API 。
# -*- coding: utf-8 -*- import json, uuid import configparser from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest def handler(event, context): config = configparser.ConfigParser() config.read("config.ini", encoding="GB18030") # AccessKey ID和AccessKey Secret寫入的配置文件。 evt = json.loads(event) evt = evt['events'][0] bucket_name = evt['oss']['bucket']['name'] object_name = evt['oss']['object']['key'] client = AcsClient(config.get("config", "accessKeyId"), config.get("config", "accessSecret"), 'cn-shanghai') request = CommonRequest() request.set_read_timeout(6000) # 讀取超時時間配置。 request.set_connect_timeout(3000) # 連接超時時間配置。 request.set_accept_format('json') request.set_method('POST') request.set_protocol_type('https') # https | http request.set_domain('green-cip.cn-shanghai.aliyuncs.com') request.set_version('2022-03-02') request.set_action_name('ImageModeration') request.add_query_param("Service", "baselineCheck") request.add_query_param("ServiceParameters", { 'ossRegionId': 'cn-shanghai', 'ossBucketName': bucket_name, 'ossObjectName': object_name, 'dataId': str(uuid.uuid4()) }) response = client.do_action_with_exception(request) print(str(response, encoding='utf-8')) response_json = json.loads(response) if response_json.get("Code") == 200: for item in response_json.get("Data", {}).get("Result", []): if item["Label"] == "nonLabel": print("nonLabel 無命中標(biāo)簽") elif "pornographic" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有色情內(nèi)容") elif "political" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有涉政內(nèi)容") elif "violent" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有暴恐內(nèi)容") elif "fraud" in item["Label"] and int(item["Confidence"]) > 80: print("疑似含有風(fēng)險(xiǎn)內(nèi)容") else: print("請求失敗,錯誤碼:", response_json.get("Code"))
進(jìn)行圖片增量檢測。
通過OSS PostObject或者OSS PutObject接口上傳圖片文件時,即可觸發(fā)該函數(shù)執(zhí)行。檢測完成后,您可以在調(diào)用日志中查看檢測結(jié)果。具體操作,請參見查看調(diào)用日志。
如果您需要進(jìn)一步處理OSS文件,比如凍結(jié)或者刪除文件等操作,請參見管理文件。