背景
随着网络监管越来越严格,UGC网站都需要针对用户生产的内容,进行审核。
目前大家一般是机器和人工审核的双重过滤。针对大型的UGC网站,如果全部人工审核是不现实的,需要花费大量的人工成本,所以机器审核尤其重要。
废话不多说,给大家介绍下怎么利用python进行鉴黄。
思路
下面给大家说明下图片审核的思路。
视频审核与图片审核是通用的。视频内容实则由音频内容、视频画面内容两个对象组成,视频画面内容的机器审核,业界目前常采用截取画面帧上传识别,最终复用的是图片识别通道对场景、人物、物品进行判断是否违规。
1、遍历图片每一个像素,进行颜色分区、并记录是否为肤色;
2、皮肤区域小于 3 个,不是色情;
3、如果皮肤区域与整个图像的比值小于 15%,那么不是色情图片;
4、如果最大皮肤区域小于总皮肤面积的 45%,不是色情图片;
5、皮肤区域数量超过 60个,不是色情图片;
6、其它情况为色情图片。
关键代码
# 分析区域
def _analyse_regions(self):
# 如果皮肤区域小于3个,不是色情
iflen(self.skin_regions) <3:
self.message ="Less than 3 skin regions ({_skin_regions_size})".format(
_skin_regions_size=len(self.skin_regions))
self.result = False
returnself.result
# 为皮肤区域排序
self.skin_regions = sorted(self.skin_regions, key=lambda s: len(s),
reverse=True)
# 计算皮肤总像素数
total_skin = float(sum([len(skin_region)forskin_regioninself.skin_regions]))
# 如果皮肤区域与整个图像的比值小于15%,那么不是色情图片
iftotal_skin /self.total_pixels *100<15:
self.message ="Total skin percentage lower than 15 ({:.2f})".format(total_skin /self.total_pixels *100)
self.result = False
returnself.result
# 如果最大皮肤区域小于总皮肤面积的45%,不是色情图片
iflen(self.skin_regions[0]) / total_skin *100<45:
self.message ="The biggest region contains less than 45 ({:.2f})".format(len(self.skin_regions[0]) / total_skin *100)
self.result = False
returnself.result
# 皮肤区域数量超过60个,不是色情图片
iflen(self.skin_regions) >60:
self.message ="More than 60 skin regions ({})".format(len(self.skin_regions))
self.result = False
returnself.result
# 其它情况为色情图片
self.message ="色情图片"
self.result = True
returnself.result
运行效果
image