第五期【百度大脑新品体验】一站式内容审核平台
让天涯 发布于2019-09 浏览:2560 回复:1
0
收藏
最后编辑于2022-04

一、功能介绍

通过界面化的操作,让百度内容审核服务完美契合您的业务审核需求,提升审核效率,降低人工成本。

二、应用场景

1、视频内容审核
配合关键帧抽取技术对视频帧中的图像、字幕进行审核,搭配语音识别和敏感声音检测技术,对视频内容进行全面审核。
2、电商平台内容审核
针对商家的广告宣传文本,通过图文审核判断是否符合新广告法,在双11、618、黑色星期五等购物节,通过百度内容审核,极大的弥补人力审核资源不足的问题,实时快速的对商品信息进行审核,保障平台内容安全。
3、UGC内容反垃圾
对论坛、贴吧等UGC内容中的图片、文章、评论进行合规性检查,并针对恶意推广、政治敏感、低俗辱骂、低质灌水内容进行审核,降低平台违规风险、有效提升平台内容质量、吸引更多用户与优质资源。
4、实名制社交头像审核
配合人脸识别针对用户头像进行多维度的图像、文本审核,确保图像中包含清晰人物正脸、非明星/卡通人脸,并且无色情、暴恐、政治敏感、微商广告、各类联系方式内容,保障平台使用体验。


三、使用攻略

说明:本文采用C# 语言,开发环境为.Net Core 2.1,采用在线API接口方式实现。

(1)创建策略
创建地址:https://ai.baidu.com/censoring#/strategylist

点击策略创建地址,选择“创建策略”。

填写策略名称,选择相应的APPID,并填写联系人信息,如果有时间限制,可以取消“长期有效”按钮,输入具体的策略生效时间段。

根据自己的需求,勾选需要的“图像审核规则”和“文本审核规则”,并可以点击”展开“,通过审核标签后面的滑动条调整审核的松紧度,松紧度的调整策略为:每个审核标签都有一个滑动条和两个调整审核松紧度的滑块,两个滑块将整个区域分为白色合规区、淡红色疑似区、红色违规区,红色区域越大越多的图片会落在这个区域,审核约严格,反之亦然。

配置完后,点击“生成策略”,策略创建成功。

可以点击“验证策略”,进行策略验证,或者在“策略列表”中,选择相应的策略,点击“验证”来验证策略:

验证结果:

在“策略列表”中,可以选择修改状态来“启用/停用”相应的策略,也可以通过“编辑“按钮来调整策略,更改生效时间等操作:

(1-1)自定义数据集

自定义数据集地址:https://ai.baidu.com/censoring#/datasetmanage/sensitive

功能:我们深知简单的策略配置可能无法满足您业务的审核需求,您可能已经有属于自己的图片黑库、文本黑库,以及在业务中您可能需要快速地对某些人物进行过滤,因此我们提供了自定义数据集功能,方便用户自定义额外需要拦截的人物、自定义图像、文本的黑/白名单。 所有自定义数据集的功能都在内容审核平台顶部的‘数据集中心'标签页中进行管理,完成添加后,您需要在对应策略的图像、文本黑/白名单的审核维度中添加对应数据集,从而对数据集中的内容进行拦截。

自定义人脸库
点击自定义人脸库后继续点击[+自定义人脸库],输入数据集名称(用于后期选择使用哪个数据集)、人物名称(需要识别的人物名字)后点击[上传]上传包含该人物人脸的照片。 完成上传后如果需要继续添加其他人物,可以点击[保存并新增人物]继续添加其他人物。如果不需要再添加其他人物可以点击[保存并完成]完成该数据集的创建,此时您可以在自定义人脸库页面看见该条数据集的信息。 如果后期您想继续在该数据集中添加人物,可以点击[编辑]进入添加。如果您的审核业务需要两个较为相同的数据集,可以先上传相同部分的数据,通过数据集后面的[复制],复制一个副本,并在这个副本基础上进行增加图片。 请注意:每个人物最多上传100张图片,支持直接上传图片或zip包(每个压缩包最多10 张图片),每张图片均须小于4M,最长边不超过 4096像素,图中须只包含要识别人物的人脸,且必须有一张为正脸。

自定义图像黑/白名单
首先你可以在图像、文本的黑名单中看见一条默认策略,这个便是百度官方违禁图/文本库,我们每天都会更新两个库中的图片和文本,帮助客户紧跟监管要求。 点击[+自定义图像黑名单]输入数据集名称后点击上传图片,上传完成后点击[保存]即可完成数据集创建。白名单的创建和此流程一致。 请注意:支持上传图片和Zip格式压缩包(每个压缩包最多10张图片),单独上传或压缩包中的图片小于4M,最长边不超过4096像素,并且同一张图片不能同时存在于黑白名单中。

自定义文本黑/白名单
点击自定义文本黑名单后点击[+自定义文本黑名单],输入数据集名称后点击上传文本黑名单,完成后点击保存,即可完成数据集创建。 后续需要添加词语时,可以直接在黑名单数据集列表中点击编辑进行txt文档上传或逐个增加词语。 文本白名单的使用方式和此流程一致。 请注意:单次词库上传仅支持扩展名为:.txt且文件大小不超过1M的文档。

图像自定义数据集的操作基本类似,下面简单介绍一下如何自定义图像白名单:

1、点击进入自定义图像白名单地址:https://ai.baidu.com/censoring#/datasetmanage/whitepic

2、选择“自定义图片白名单”按钮,根据要求输入“数据集名称”和图片,支持上传图片或图片ZIP格式压缩包(每个压缩包最多10张图片),单独上传或压缩包中的图片小于4M,最长边不超过4096像素,保存:

可以对添加的数据集名称进行编辑、复制、删除操作:

在编辑界面,可以添加、删除图片,并查看入库失败的图片:

自定义数据集建好后,需要在策略中心,编辑相应的策略名称,将自定义数据集启用,才能生效:https://ai.baidu.com/censoring#/strategylist

未启用“政治敏感白名单”:

启用“政治敏感白名单”:

文本自定义数据集的操作基本类似,下面简单介绍一下如何自定义文本白名单:

1、点击进入自定义文本白名单地址:https://ai.baidu.com/censoring#/datasetmanage/whitetxt

2、选择“自定义文本白名单”按钮,根据要求输入“数据集名称”和 txt 文件(文件大小不超过1M,每个词语一行),需要注意文档编码格式,经测试不支持ANSI,支持Unicode或UTF8等。查看是否正确导入,可以上传保存后,点击编辑查看,如果出现乱码,则不支持当前文档编码格式,能正确显示,则说明支持当前文档编码格式:

查看是否正确导入:

出现乱码,表示导入失败:

正确显示,则导入成功:

自定义文本白名单数据集创建后,同样需要在相应的策略名称中启用才能生效:

未启用“自定义文本白名单”时的文本审核结果:

启用“自定义文本白名单”后的文本审核结果:

 

(1-2)自定义图片审核-EasyDL

内容审核平台与EasyDL平台打通,支持用户快速定制审核模型并添加到审核策略中,下面简单介绍一下如何让内容审核平支持EasyDL定制化物体检测模型。

1、创建EasyDL定制化物体检测模型。

官方文档:https://ai.baidu.com/docs#/EasyDL_VIS_Detection_Intro/top

使用流程主要分为5步,这里简单说明一下,具体请看官方文档:

(1)创建定制化物体检测模型

创建模型:https://ai.baidu.com/easydl/app/2/models/new

 

(2)上传并标注数据

选择数据集,进行数据标注/上传:https://ai.baidu.com/easydl/app/2/datasets/annotate

创建标签、上传图片数据并对其中的图片进行标注分类,如果需要标注的图片数据很多,可以使用”智能标注“,降低标注成本,一般只用标注数据集30%左右的数据就可以训练模型,并且效果与标注所有数据后训练的模型效果几乎等同。(我原本也想试试的,只不过我每个标签的图片只有20来张(如果想得到较好的模型效果,一般一个标签的在所有图片中出现的数量要大于50,最好更多,并且相似性要小),启用“智能标注”,每次启用,要花费比较长的时间让系统筛选“优先标注”的图片,具体时间忘记了,10多分中应该要的,有这时间,我自己都标注完了,所以试了两三遍,就自己去标注了,如果每个标签有成千上万张的图片的化,启用“智能标注”就很有必要了)。

(3)训练模型

训练地址:https://ai.baidu.com/easydl/app/2/models/train

数据上传、标注好后,就可以选择模型,并进行模型训练了,由于本程序是采取在线API的方式调用,所以“应用类型”需要选择“云服务”,算法根据自己的需要选择“高精度”或者“高性能”。

(4)校验模型效果

校验地址:https://ai.baidu.com/easydl/app/2/models/verify

模型训练好后,就可以查看评估报告(如果单个标签的图片量在100张以内,这个数据基本参考意义不大 ),也可以选择图片看看训练效果如何,最后,可以“申请上线”,在线调用。

如果对模型效果不满意,可以通过扩充数据、调整标注等方法进行模型迭代。

测试效果:

(5)发布模型

发布地址:https://ai.baidu.com/easydl/app/2/models/deploy

如果都准备好了,可以选择发布,具体发布方法,可以参考官方文档:https://ai.baidu.com/docs#/EasyDL_VIS_Detection_Intro/713a57ad

 

申请发布后,通常的审核周期为T+1,即当天申请第二天可以审核完成。如果需要加急、或者遇到莫名被拒的情况,可以加入官方QQ群(群号:679517246)联系群管解决。

2、启用Easy DL定制化物体检测模型图片过滤审核

启用地址:https://ai.baidu.com/censoring#/strategylist

等模型发布审核通过后,就可以在内容审核平台编辑相应的策略名称,选择启用“自定义图片审核-EasyDL”,并添加已发布的EasyDL模型,勾选需要过滤的详细类别,选择生成策略,就完成了内容审核平台对EasyDL定制化物体检测模型的支持了。

 

 

3、定制化物体检测模型 审核测试

未启用“自定义图片审核-Easy DL”时,检测的图片为“合规”:

启用“自定义图片审核-Easy DL”后,同样的图片检测为“不合规”:

同理,对于“图像分类模型”也可以采取上述的步骤来进行添加进行审核过滤。

(1-3)多策略自动调度切换

我们深知单条策略无法满足用户日新月异的审核需求,比如在一些敏感时期、电商促销活动期,用户的审核规则都会有所调整,用户希望这个调整可以是自动的、平滑切换的,因此我们推出了单应用下多策略自动调度切换功能,用户可以为未来某个时间指定单独的审核策略,在预定的时间自动生效替换现有策略,并邮件通知相关人员,运筹帷幄,轻松掌控。 1.为未来某个时期创建单独的审核策略:在您正在使用的应用下点击[+创建策略],并对其中的图像、文本部分设置符合该时期需求的审核配置。 2.让该策略到期自动生效、失效:启用该策略,并且将该策略的生效、失效时间按需求进行调整,然后拖动该策略到最高优先级。这样操作不会影响目前生效的审核策略,因为新的策略还没有到达您设定的启用时间。 效果:当到达预定启用的时间,因为该策略为已启用的状态,并且优先级高于原有策略的优先级,则会自动替换原有策略,成为正在生效的策略,超过生效期后会该策略会自动下线,审核策略自动切换回原有策略。两次切换的过程都会有邮件通知到您在创建策略时留下的邮箱地址。 正确的配置示例如下图:

 

  (2)调用审核接口

文档地址:https://ai.baidu.com/docs#/contentcensoring/top

接口描述:百度大脑内容审核平台提供了针对图像和文本的自定义审核规则配置和一站式调用多项审核能力的功能。用户可以在平台上自助选择审核维度、审核标签,审核松紧度、自定义图像/文本黑白名单、自定义审核敏感人物。同时本接口直接返回判定结果,相比于组合服务接口无需大量解析工作。

(2-1)内容审核平台-图像

接口地址:https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined

请求方式:POST

接口说明:内容审核图像API接口。

请求参数说明:

响应参数说明:

 

 返回示例:

{
    "log_id": 15556561295920002,
    "conclusion": "合规",
    "conclusionType": 1
}

或者

{
    "log_id": 15560926651500013,
    "conclusion": "合规",
    "conclusionType": 1,
    "data": [{
        "type": 8,
        "subType": 0,
        "conclusion": "合规",
        "conclusionType": 1,
        "msg": "命中用户自定义图像白名单",
        "datasetName": "用户自定义图像白名单1"
    }]
}

 

{
    "log_id": 15656776740396212,
    "conclusion": "不合规",
    "conclusionType": 2,
    "data": [{
            "type": 0,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在百度官方违禁图不合规"
        }, {
            "type": 1,
            "subType": 9,
            "conclusion": "不合规",
            "conclusionType": 2,
            "probability": 0.995442,
            "msg": "存在女性性感不合规"
        }, {
            "type": 2,
            "subType": 1,
            "conclusion": "不合规",
            "conclusionType": 2,
            "probability": 0.9842539,
            "msg": "存在血腥不合规"
        },
        {
            "type": 3,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "probability": 0.970737,
            "msg": "存在恶心图不合规"
        }, {
            "type": 4,
            "subType": 1,
            "conclusion": "不合规",
            "conclusionType": 2,
            "codes": ["ai.baidu.com"],
            "probability": 1.0,
            "msg": "存在QR code不合规"
        },
        {
            "type": 5,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在政治敏感不合规",
            "stars": [{
                "probability": 0.78972595214844,
                "name": "习近平"
            }]
        },
        {
            "type": 5,
            "subType": 1,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在公众人物不合规",
            "stars": [{
                "probability": 0.97755790710449,
                "name": "刘德华"
            }]
        },
        {
            "type": 5,
            "subType": 2,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在自定义敏感人脸不合规",
            "stars": [{
                "name": "小度",
                "probability": 99.999992370605,
                "datasetName": "用户自定义政治敏感"
            }]
        },
        {
            "type": 6,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "probability": 0.8348787,
            "msg": "存在清晰度不合规"
        },
        {
            "type": 7,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "命中用户自定义图像黑名单",
            "datasetName": "自定黑名单A"
        }, {
            "type": 10,
            "subType": 12,
            "conclusion": "不合规",
            "conclusionType": 2,
            "completeness": 0.294912,
            "msg": "存在人脸占比不合规"
        },
        {
            "type": 12,
            "subType": 2,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在文本色情不合规",
            "hits": [{
                "probability": 1,
                "datasetName": "百度默认文本反作弊库",
                "words": [
                    "电话 找小姐"
                ]
            }]
        },
        {
            "type": 12,
            "subType": 3,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在政治敏感不合规",
            "hits": [{
                "probability": 1,
                "datasetName": "百度默认文本反作弊库",
                "words": [
                    "江泽民"
                ]
            }]
        },
        {
            "type": 12,
            "subType": 4,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在恶意推广不合规",
            "hits": [{
                "probability": 1,
                "datasetName": "百度默认文本反作弊库",
                "words": [
                    ""
                ]
            }]
        },
        {
            "type": 11,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在百度官方默认违禁词库不合规",
            "hits": [{
                "datasetName": "百度默认黑词库",
                "words": [
                    "王八朝",
                    "彭的家乡",
                    "共铲皇帝"
                ]
            }]
        },
        {
            "type": 13,
            "subType": 0,
            "conclusion": "不合规",
            "conclusionType": 2,
            "msg": "存在自定义文本黑名单不合规",
            "hits": [{
                    "datasetName": "用户自定义黑名单1",
                    "words": [
                        "他妈的",
                        "他奶奶的"
                    ]
                },
                {
                    "datasetName": "用户自定义黑名单2",
                    "words": [
                        "他爷爷的",
                        "他姥姥的"
                    ]
                }
            ]
        }, {
            "type": 15,
            "subType": 0,
            "conclution": "不合规",
            "conclutionType": 2,
            "hits": {
                "modelName": "my-fish",
                "score": 0.9908131,
                "modelId": 35759,
                "label": "label-a"
            },
            "msg": "命中easyDl自定义模型标签"
        }
    ],
    "rawData": [{
        "type": 5,
        "results": [{
            "result": [{
                "location": {
                    "top": 133,
                    "left": 362,
                    "width": 136,
                    "height": 142
                },
                "stars": [{
                        "probability": 0.98223670959473,
                        "name": "奥巴马"
                    },
                    {
                        "probability": 0.98058303833008,
                        "name": "欧巴马"
                    },
                    {
                        "probability": 0.97909065246582,
                        "name": "贝拉克·侯赛因·奥巴马"
                    }
                ]
            }],
            "log_id": 1112120429821022600,
            "include_politician": "是",
            "result_num": 1,
            "result_confidence": "确定"
        }]
    }]
}

 

{
    "log_id": 149319909347709,
    "error_code": 0,
    "error_msg":"configId error"
}

 (2-2)内容审核平台-文本

接口地址:https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined

请求方式:POST

接口说明:内容审核文本API接口。

请求参数说明:

响应参数说明:

返回示例:

{
    "log_id": 15556561295920002,
    "conclusion": "合规",
    "conclusionType": 1
}

 或者

{
    "log_id": 15572142621780024,
    "conclusion": "合规",
    "conclusionType": 1,
    "data": [{
        "type": 14,
        "subType": 0,
        "conclusion": "合规",
        "conclusionType": 1,
        "msg": "自定义文本白名单审核通过",
        "hits": [{
            "datasetName": "SLK-测试-自定义文本白名单",
            "words": ["习大大"]
        }]
    }]
}

 

{
    "log_id": 123456789,
    "conclusion": "不合规",
    "conclusionType": 2,
    "data": [{
        "type": 11,
        "subType": 0,
        "conclusion": "不合规",
        "conclusionType": 2,
        "msg": "存在百度官方默认违禁词库不合规",
        "hits": [{
            "datasetName": "百度默认黑词库",
            "words": ["免费翻墙"]
        }]
    }, {
        "type": 12,
        "subType": 2,
        "conclusion": "不合规",
        "conclusionType": 2,
        "msg": "存在文本色情不合规",
        "hits": [{
            "datasetName": "百度默认文本反作弊库",
            "probability": 1.0,
            "words": ["电话 找小姐"]
        }]
    }, {
        "type": 12,
        "subType": 3,
        "conclusion": "不合规",
        "conclusionType": 2,
        "msg": "存在政治敏感不合规",
        "hits": [{
            "probability": 1.0,
            "datasetName": "百度默认文本反作弊库",
            "words": ["敏感人物A"]
        }]
    }, {
        "type": 12,
        "subType": 4,
        "conclusion": "不合规",
        "conclusionType": 2,
        "msg": "存在恶意推广不合规",
        "hits": [{
            "probability": 1.0,
            "datasetName": "百度默认文本反作弊库",
            "words": [""]
        }]
    }, {
        "type": 13,
        "subType": 0,
        "conclusion": "不合规",
        "conclusionType": 2,
        "msg": "存在自定义文本黑名单不合规",
        "hits": [{
            "datasetName": "SLK-测试-自定义黑名单",
            "words": ["我是你爹", "他妈的"]
        }]
    }]
}

 

{
    "log_id": 149319909347709,
    "error_code": 0,
    "error_msg":"configId error"
}

 (3)源码共享

(3-1)根据 API Key 和 Secret Key 获取 AccessToken

 

        /// 
        /// 获取百度access_token
        /// 
        /// API Key
        /// Secret Key
        /// 
        public static string GetAccessToken(string clientId, string clientSecret)
        {
            string authHost = "https://aip.baidubce.com/oauth/2.0/token";
            HttpClient client = new HttpClient();
            List> paraList = new List>();
            paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
            paraList.Add(new KeyValuePair("client_id", clientId));
            paraList.Add(new KeyValuePair("client_secret", clientSecret)); 

            HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
            string result = response.Content.ReadAsStringAsync().Result;
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);

            string token = jo["access_token"].ToString();
            return token;
        }

 (3-2)调用API接口获取识别结果

(3-2-1)在Startup.cs 文件 的 Configure(IApplicationBuilder app, IHostingEnvironment env) 方法中开启虚拟目录映射功能: 

            string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目录

            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(webRootPath, "Uploads", "BaiduAIs")),
                RequestPath = "/BaiduAIs"
            });

(3-2-2) 建立Index.cshtml文件

(3-2-2-1)前台代码:

    由于html代码无法原生显示,只能简单说明一下:

    主要是一个form表单,需要设置属性enctype="multipart/form-data",否则无法上传图片;

    form表单里面有五个控件:

    一个textarea:asp-for="Text" ,输入需要审核的内容;

    一个Input:type="text",asp-for="ImageUrl" ,输入网络图片地址;

    一个Input:type="file",asp-for="FileUpload" ,上传图片用;

    一个Input:type="submit",asp-page-handler="CensorForImg" ,图像审核。

    一个Input:type="submit",asp-page-handler="CensorForText" ,文本审核。

    一个img:src="@Model.curPath",显示需要审核的图片。

    最后显示后台 msg 字符串列表信息,如果需要输出原始Html代码,则需要使用@Html.Raw()函数。

(3-2-2-2) 后台代码:

        [BindProperty]
        public IFormFile FileUpload { get; set; }
        [BindProperty]
        public string ImageUrl { get; set; }
        [BindProperty]
        public string Text { get; set; }
        private readonly IHostingEnvironment HostingEnvironment;
        public List msg = new List();
        public string curPath { get; set; }

        string BaiduAI_CensorPath="Uploads//BaiduAIs//";
        string BaiduAI_CensorUrl="/BaiduAIs/";
        string Censor_API_KEY="你的API KEY";
        string Censor_SECRET_KEY="你的SECRET KEY";

 

        public async Task OnPostCensorForImgAsync()
        {
            if (string.IsNullOrEmpty(ImageUrl) && (FileUpload is null))
            {
                ModelState.AddModelError(string.Empty, "网络图片 或 本地图片 请至少选择一项!");
            }
            if (!ModelState.IsValid)
            {
                return Page();
            }
            msg = new List();

            string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目录
            string fileDir = Path.Combine(webRootPath, BaiduAI_CensorPath);
            string imgName = Guid.NewGuid().ToString("N");

            string imgBase64 = "";

            if (string.IsNullOrEmpty(ImageUrl))
            {
                imgName = await UploadFile(FileUpload, fileDir);
                string fileName = Path.Combine(fileDir, imgName);
                imgBase64 = GetFileBase64(fileName);
                curPath = Path.Combine(BaiduAI_CensorUrl, imgName);
            }
            else
            {
                curPath = ImageUrl;
            }

            string result = GetCensorForImgJson(imgBase64, ImageUrl, Censor_API_KEY, Censor_SECRET_KEY);
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);

            try
            {
                msg.Add("图像审核结果:" + jo["conclusion"].ToString() + "\n");
                int conclusionType = int.Parse(jo["conclusionType"].ToString());
                if (!conclusionType.Equals(1) && !conclusionType.Equals(4))
                {
                    List data = jo["data"].ToList();
                    foreach (JToken jt in data)
                    {
                        msg.Add(jt["msg"].ToString());
                    }
                }
            }
            catch (Exception e)
            {
                msg.Add(result);
            }
            return Page();
        }



        public async Task OnPostCensorForTextAsync()
        {
            if (string.IsNullOrEmpty(Text))
            {
                ModelState.AddModelError(string.Empty, "请输入审核内容!");
            }
            if (!ModelState.IsValid)
            {
                return Page();
            }

            msg = new List();

            string result = GetCensorForTextJson(Text, Censor_API_KEY, Censor_SECRET_KEY);
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);

            try
            {
                msg.Add("文本审核结果:" + jo["conclusion"].ToString() + "\n");
                int conclusionType = int.Parse(jo["conclusionType"].ToString());
                if (!conclusionType.Equals(1) && !conclusionType.Equals(4))
                {
                    List data = jo["data"].ToList();
                    foreach (JToken jt in data)
                    {
                        msg.Add(jt["msg"].ToString());
                    }
                }
            }
            catch (Exception e)
            {
                msg.Add(result);
            }
            return Page();
        }

        /// 
        /// 上传文件,返回文件名
        /// 
        /// 文件上传控件
        /// 文件绝对路径
        /// 
        public static async Task UploadFile(IFormFile formFile, string fileDir)
        {
            if (!Directory.Exists(fileDir))
            {
                Directory.CreateDirectory(fileDir);
            }
            string extension = Path.GetExtension(formFile.FileName);
            string imgName = Guid.NewGuid().ToString("N") + extension;
            var filePath = Path.Combine(fileDir, imgName);

            using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                await formFile.CopyToAsync(fileStream);
            }

            return imgName;
        }

        /// 
        /// 返回图片的base64编码
        /// 
        /// 文件绝对路径名称
        /// 
        public static String GetFileBase64(string fileName)
        {
            FileStream filestream = new FileStream(fileName, FileMode.Open);
            byte[] arr = new byte[filestream.Length];
            filestream.Read(arr, 0, (int)filestream.Length);
            string baser64 =  Convert.ToBase64String(arr);
            filestream.Close();
            return baser64;
        }

        /// 
        /// 文件base64解码
        /// 
        /// 文件base64编码
        /// 生成文件路径
        public static async Task GetFileFromBase64(string base64Str, string outPath)
        {
            var contents = Convert.FromBase64String(base64Str);
            using (var fs = new FileStream(outPath, FileMode.Create, FileAccess.Write))
            {
                fs.Write(contents, 0, contents.Length);
                fs.Flush();
            }
        }

        /// 
        /// 图像审核Json字符串
        /// 
        /// 图片base64编码
        /// 图像URL地址(需要做UrlEncode)
        /// API Key
        /// Secret Key
        /// 
        public static string GetCensorForImgJson(string strbaser64, string imgUrl,string clientId, string clientSecret)
        {
            string token = GetAccessToken(clientId, clientSecret);
            string host = "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            string str = "imgType=0" ;
            if (!string.IsNullOrEmpty(strbaser64))
            {
                str += "&image=" + HttpUtility.UrlEncode(strbaser64);
            }
            if (!string.IsNullOrEmpty(imgUrl))
            {
                str += "&imgUrl=" + imgUrl;
            }
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            return result;
        }

        /// 
        /// 文本审核Json字符串
        /// 
        /// 文本内容
        /// API Key
        /// Secret Key
        /// 
        public static string GetCensorForTextJson(string text, string clientId, string clientSecret)
        {
            string token = GetAccessToken(clientId, clientSecret);
            string host = "https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            string str = "text=" + text;
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            return result;
        }

四、效果测试

1、页面:

2、识别结果:

图像审核:

默认策略下,图像审核不通过:

添加自定义图像白名单后,可以审核通过:

文本审核:

正常情况下,文本审核不通过:

 

添加自定义文本白名单后,文本审核通过:

正常情况下,文本审核通过:

 增加自定义文本黑名单后,文本审核不通过:

 

自定义图片审核-EasyDL

正常情况下,审核通过:

启用后,审核不通过:

 

五、测试结果及建议

          经过测试可知,百度的内容审核功能相当完善,不仅可以进行图片审核,还能够进行文字审核,并且审核的内容、严谨度、时间段等都可以自己进行相应的调整,自定义程度高,配置也不算复杂,只要设定好相应的策略,基本上就可以直接拿来使用了。 

           现在国家对互联网规范化使用的要求已经越来越严格了,相关的法律法规也越来越完善细致。对于一般的小网站,要保证自己平台的内容合法、不违规,需要花费相当大的人力、财力去维护。而一旦使用百度的内容审核功能,只要做好相关的策略设置,就能保证用户上传的图片、发表的言论、文章符合国家的规定,可以节省很大的维护成本。

        不过,目前图片审核还缺少版权审核,如果百度以后能加上图片版权识别功能的话,那就更加完善了,特别是对于一些正规、大型的有图片功能相关的网站,如果再加上图片版权审核功能,也就不用担心图片版权问题了。

        同理,文本审核也还缺少文章的版权审核功能,后期如果能够加上文章版权审核功能,那就更完善了,也能更好的保护作者的劳动成功。甚至可以将文章版权审核功能独立出来,做成一个文章版权查询的工具,更方便作者进行维权,降低盗版行为,提高大家的版权保护意识。

收藏
点赞
0
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#4小雨青青润无声回复于2019-10

不愧为获奖的文章,真的很好,向你学习!

0
TOP
切换版块