华为云 - 图片内容审核(涉黄涉暴涉政涉广告检测)

华为云文档地址:

https://support.huaweicloud.com/productdesc-moderation/moderation_01_0002.html

获取token和内容审核,代码示例: 

import base64
import json
import requests
from loguru import logger


def encode_to_base64(filename):
    """
    图片文件转base64编码
    :param filename:
    :return:
    """
    imgstr = ""
    with open(filename, 'rb') as file:
        imgstr = base64.b64encode(file.read())
    return imgstr


def get_token():
    """
    获取token
    """
    username = 'xxxxxx'  # 用户名
    password = 'xxxxxx'  # 密码
    domain = 'xxxxxx'  # 华为账号 account_name
    region_name = 'cn-north-1'  # 区域 例如: cn-north-1
    X_TOKEN = None

    auth_data = {
        "auth": {
            "identity": {

                "password": {
                    "user": {
                        "name": username,
                        "password": password,
                        "domain": {
                            "name": domain
                        }
                    }
                },
                "methods": [
                    "password"
                ]
            },
            "scope": {
                "project": {
                    "name": region_name
                }
            }
        }
    }

    _url = 'https://iam.myhuaweicloud.com/v3/auth/tokens'
    headers = {'Content-Type': 'application/json'}
    resp = requests.post(url=_url, headers=headers, data=json.dumps(auth_data))
    logger.info(f"resp = {resp}")
    status_code = resp.status_code
    logger.info(f"-- get_token - resp.status_code = {resp.status_code}")
    logger.info(f"-- get_token - resp.json() = {resp.json()}")
    try:
        X_TOKEN = resp.headers['X-Subject-Token']
    except:
        X_TOKEN = None
    return status_code, X_TOKEN


def moderation_image(token, image, url):
    """
    图片审核
    :param token: token
    :param image: 图片base64
    :param url: 图片地址
    检测场景:
        politics:是否涉及政治人物的检测。
        terrorism:是否包含涉政暴恐元素的检测。
        porn:是否包含涉黄内容元素的检测。
        ad:是否包含广告图文的检测。
    """
    _url = 'https://moderation.cn-north-4.myhuaweicloud.com/v1.0/moderation/image'
    categories = ['porn', 'politics', 'terrorism',
                  # 'ad'
                  ]
    threshold = None
    moderation_rule = "default"
    contents = None

    if image:
        image = image.decode("utf-8")

    _data = {
        "image": image,
        "url": url,
        "categories": categories,
        "threshold": threshold,
        "moderation_rule": moderation_rule
    }

    _headers = {
        "Content-Type": "application/json",
        "X-Auth-Token": token
    }

    data = bytes(json.dumps(_data), 'utf8')
    resp = requests.post(url=_url, headers=_headers, data=data)
    logger.info(f"resp = {resp}")
    status_code = resp.status_code
    logger.info(f"-- moderation_image - resp.status_code = {resp.status_code}")
    logger.info(f"-- moderation_image - resp.json() = {resp.json()}")
    contents = resp.json()
    return status_code, contents


def deal_moderation_image_resp(contents):
    """
    处理图片审核接口响应结果
    :return:
    """
    # result 调用失败时无此字段。
    if 'result' not in contents:
        return False, "图片审核接口调用失败"
    logger.info(f"contents = {json.dumps(contents, indent=4)}")
    result_info = contents['result']
    # 审核结果是否通过 - block:包含敏感信息,不通过 pass:不包含敏感信息,通过 review:需要人工复检
    suggestion_result = result_info['suggestion']
    if suggestion_result == 'pass':
        return True, '审核通过'
    else:
        check_result_str = ''
        # 具体每个场景的检测结果 block:包含敏感信息,不通过 pass:不包含敏感信息,通过 review:需要人工复检
        category_suggestions_info = result_info['category_suggestions']
        politics_result = category_suggestions_info.get('politics', None)  # politics:是否涉及政治人物的检测。
        # ad_result = category_suggestions_info.get('ad', None)  # ad:是否包含广告图文的检测。
        terrorism_result = category_suggestions_info.get('terrorism', None)  # terrorism:是否包含涉政暴恐元素的检测。
        porn_result = category_suggestions_info.get('porn', None)  # porn:是否包含涉黄内容元素的检测。
        if politics_result and politics_result != 'pass':
            if politics_result == 'block':
                check_result_str += '涉政'
            if politics_result == 'review':
                check_result_str += '疑似涉政'

        if terrorism_result and terrorism_result != 'pass':
            if terrorism_result == 'block':
                check_result_str = f"{check_result_str};涉暴" if check_result_str else f"{check_result_str}涉暴"
            if terrorism_result == 'review':
                check_result_str = f"{check_result_str};疑似涉暴" if check_result_str else f"{check_result_str}疑似涉暴"

        if porn_result and porn_result != 'pass':
            if porn_result == 'block':
                check_result_str = f"{check_result_str};涉黄" if check_result_str else f"{check_result_str}涉黄"
            if porn_result == 'review':
                check_result_str = f"{check_result_str};疑似涉黄" if check_result_str else f"{check_result_str}疑似涉黄"
        # 广告不检测 pass
        return False, check_result_str


if __name__ == '__main__':
    # TODO Token有效期为24小时,可以建立token缓存机制,或者存mongo也可以
    # 测试图片url
    # demo_data_url = 'https://sdk-obs-source-save.obs.cn-north-4.myhuaweicloud.com/terrorism.jpg'  # 正常
    demo_data_url = 'https://img0.baidu.com/it/u=2147892510,3124659829&fm=26&fmt=auto&gp=0.jpg'  # 毛主席
    #  泳装动漫
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.tuwandata.com%2Fv2%2Fthumb%2Fall%2FNjI3ZCw4MDEsMjAwLDQsMywxLC0xLDEs%2Fu%2Fimg.tuwan.com%2Fstatic%2Fdefault%2F201409%2F1-1409130933545.jpg&refer=http%3A%2F%2Fimg.tuwandata.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365708&t=3772ef952ebea91dc83a57bdfd90bc09'
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.81.cn%2Fjfjbmap%2Fattachment%2F1%2F1%2F2018-01%2F28%2F08%2Fres01_attpic_brief.jpg&refer=http%3A%2F%2Fwww.81.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365650&t=f53988db9c324dfb6bb383c546051e06'  # 毛主席端起枪
    # 真人
    # demo_data_url = 'https://img1.baidu.com/it/u=4210503503,1536203928&fm=26&fmt=auto&gp=0.jpg'
    # 希特勒
    # demo_data_url = 'https://img1.baidu.com/it/u=671407126,81369699&fm=26&fmt=auto&gp=0.jpg'
    # 习和希
    # demo_data_url = 'http://resource.shenshangtech.com/temp/1.jpeg'
    # 习
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimages.china.cn%2Fattachement%2Fjpg%2Fsite1000%2F20150818%2Fd02788e9b72d173d38e730.jpg&refer=http%3A%2F%2Fimages.china.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629366083&t=0c2b935f9987f8700d782f695dcd0ada'
    # 枪
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp2.itc.cn%2Fq_70%2Fimages03%2F20200606%2F64fd5c3334b048d38f12cf26cbbf19cf.jpeg&refer=http%3A%2F%2Fp2.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365975&t=795fd26e6578f9b10ddcdcdb59d63c3c'
    # 刀
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fnimg.ws.126.net%2F%3Furl%3Dhttp%253A%252F%252Fdingyue.ws.126.net%252F2021%252F0720%252F9dd57b73j00qwj46t000sc000u000k0c.jpg%26thumbnail%3D650x2147483647%26quality%3D80%26type%3Djpg&refer=http%3A%2F%2Fnimg.ws.126.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365928&t=f1f02b52410dd61da63ceb8fb2be10cc'
    # 真人
    # demo_data_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fvsd-picture.cdn.bcebos.com%2F43b738b388231566891ba4df80a64b5b7c3c553d.jpg&refer=http%3A%2F%2Fvsd-picture.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629365867&t=cefaab87cd21b3ddbe0686cafae808f0'
    # 获取token
    status_code, token = get_token()
    logger.info(f"图片审核获取token | status_code = {status_code} | token = {token}")

    # 读取图片文件base64进行图片审核
    # result = moderation_image(token, encode_to_base64('./temp.png'), url=None,
    #                           categories=['porn', 'politics', 'terrorism', 'ad'],
    #                           threshold=None, moderation_rule="default")

    # 通过image_url审核图片
    status_code, contents = moderation_image(token, image="", url=demo_data_url)
    logger.info(f"图片审核接口 | status_code = {status_code} | contents = {type(contents)} | {contents}")

    # contents = {
    #     "result": {
    #         "suggestion": "block",
    #         "category_suggestions": {
    #             "politics": "block",
    #             "terrorism": "review",
    #             "porn": "block"
    #         }
    #     }
    # }

    # 处理图片审核接口响应结果
    result = deal_moderation_image_resp(contents)
    logger.info(f"审核结果: {result}")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值