模式识别 - 有害视频检测程序的策略

有害视频检测程序的策略

本文地址: http://blog.csdn.net/caroline_wendy/article/details/26346831

有害(色情\恐怖\暴力)视频, 严重危害网络的健康, 需要进行检测和过滤.

检测色情\恐怖视频, 通过检测程序, 检测出多个场景的概率, 然后进行排序, 当场景多余6个时, 只取最大的6个场景;

返回的概率值是前3个最大检测值场景的概率的均值;

色情\恐怖汇总时, 首先检测色情, 如果为色情视频, 则不进行恐怖的检测, 否则继续检测恐怖, 如果都不时, 则为未知视频.

代码:

#include "stdafx.h"

#include "VideoDetector.h"

using namespace std;

double detectPornVideo(
	std::vector<PornSceneInfo>& infosSet,
	const std::string _fileName,
	const std::string _imagePath,
	const std::string _imageName,
	const std::string _modelPath)
{
	struct bigger {
		bool operator() (PornSceneInfo i, PornSceneInfo j) { return (i.prop>j.prop); }
	} mybigger;

	double finalResult(0.0);
	const int FirstNum(3); //计算最大3个的概率
	const int MaxImageNum(6); //最多返回6个结构体
	std::vector<PornSceneInfo> vResults;

	const std::string fileName(_fileName);
	const std::string imagePath(_imagePath); //提前新建文件夹
	const std::string imageName(_imageName);
	const std::string modelPath(_modelPath);
	const std::size_t shotInterval(100);
	const std::size_t  sceneShotNum(20);

	std::size_t  num = PornVideoSceneNum(fileName.c_str(), shotInterval, sceneShotNum);

	PornSceneInfo* resultSet = new PornSceneInfo[num];

	if (PornVideoDetector_Info(resultSet, imagePath.c_str(), fileName.c_str(), imageName.c_str(),
		modelPath.c_str(), shotInterval, sceneShotNum))
	{
		for (std::size_t  i=0; i<num; ++i) {
			vResults.push_back(resultSet[i]);
		}
	} else {
		std::cout << " Failed to detect the video! " << std::endl;
	}

	delete[] resultSet;
	resultSet = nullptr;

	if (num > MaxImageNum) {
		std::sort(vResults.begin(), vResults.end(), mybigger);
		for(int i=0; i<MaxImageNum; ++i) {
			infosSet.push_back(vResults[i]); //从大到小排列, 最多包涵MaxImageNum个
		}
	} else {
		std::sort(vResults.begin(), vResults.end(), mybigger);
		infosSet = vResults;
	}

	if (num > FirstNum) {
		std::sort(vResults.begin(), vResults.end(), mybigger);

		for(int i=0; i<FirstNum; ++i) {
			finalResult += vResults[i].prop; //大于3个只取前3个
		}

		finalResult /= FirstNum;
	} else {
		for(std::size_t i=0; i<num; ++i) {
			finalResult += vResults[i].prop;
		}
		finalResult /= num;
	}

	return finalResult;
}

double detectHorrorVideo(
	std::vector<HorrorSceneInfo>& infosSet,
	const std::string _fileName,
	const std::string _imagePath,
	const std::string _imageName,
	const std::string _modelPath)
{
	struct bigger {
		bool operator() (HorrorSceneInfo i, HorrorSceneInfo j) { return (i.prop>j.prop); }
	} mybigger;

	double finalResult(0.0);
	const int FirstNum(3); //计算最大3个的概率
	const int MaxImageNum(6); //最多返回6个结构体
	std::vector<HorrorSceneInfo> vResults;

	const std::string fileName(_fileName);
	const std::string imagePath(_imagePath); //提前新建文件夹
	const std::string imageName(_imageName);
	const std::string modelPath(_modelPath);
	const std::size_t shotInterval(100);
	const std::size_t  sceneShotNum(20);

	std::size_t  num = HorrorVideoSceneNum(fileName.c_str(), shotInterval, sceneShotNum);

	HorrorSceneInfo* resultSet = new HorrorSceneInfo[num];

	if (HorrorVideoDetector_Info(resultSet, imagePath.c_str(), fileName.c_str(),
			imageName.c_str(), modelPath.c_str(), shotInterval, sceneShotNum))
	{
		for (std::size_t  i=0; i<num; ++i) {
			vResults.push_back(resultSet[i]);
		}
	} else {
		std::cout << " Failed to detect the video! " << std::endl;
	}

	delete[] resultSet;
	resultSet = nullptr;

	if (num > MaxImageNum) {
		std::sort(vResults.begin(), vResults.end(), mybigger);
		for(int i=0; i<MaxImageNum; ++i) {
			infosSet.push_back(vResults[i]);
		}
	} else {
		std::sort(vResults.begin(), vResults.end(), mybigger);
		infosSet = vResults;
	}

	if (num > FirstNum) {
		std::sort(vResults.begin(), vResults.end(), mybigger);

		for(int i=0; i<FirstNum; ++i) {
			finalResult += vResults[i].prop;
		}

		finalResult /= FirstNum;
	} else {
		for(std::size_t i=0; i<num; ++i) {
			finalResult += vResults[i].prop;
		}
		finalResult /= num;
	}

	return finalResult;
}

void videoDetector(
	const char* const _fileName, /*文件名*/
	const char* const _imagePath, /*图片路径*/
	const char* const _imageName, /*图片名称*/
	int& _signal, /*标志位, 0未知, 1色情, 2恐怖*/
	double& _prop, /*概率*/
	std::vector<SceneInfo>& _infosSet
)
{
	_signal = 0;
	_prop = 0.0;

	const std::string fileName(_fileName);
	const std::string imagePath(_imagePath); //提前新建文件夹
	const std::string imageName(_imageName);
	const std::string modelPath("./models");

	double pornResult(-1.0);
	double horrorResult(-1.0);
	std::vector<PornSceneInfo> pornInfosSet;
	std::vector<HorrorSceneInfo> horrorInfosSet;

	try {
		pornResult = detectPornVideo(pornInfosSet, fileName, imagePath, imageName, modelPath);
	} catch (std::exception ex) {
		std::cout << ex.what() << std::endl;
	}

	std::vector<SceneInfo> infosSet(pornInfosSet.size());

	for (std::size_t  i=0; i<pornInfosSet.size(); ++i)
	{
		std::cout << " Scene[" << i << "] Prop : " << pornInfosSet[i].prop << std::endl;
		std::cout << " Scene[" << i << "] Image Path : " << pornInfosSet[i].imagePath << std::endl;
		std::cout << " Scene[" << i << "] Begin Time : " << pornInfosSet[i].btime << std::endl;
		std::cout << " Scene[" << i << "] End Time : " << pornInfosSet[i].etime << std::endl;
		std::cout << " Scene[" << i << "] Begin Pos : " << pornInfosSet[i].bpos << std::endl;
		std::cout << " Scene[" << i << "] End Pos : " << pornInfosSet[i].epos << std::endl;

		infosSet[i].prop = pornInfosSet[i].prop;
		strcpy(infosSet[i].imagePath, pornInfosSet[i].imagePath);
		infosSet[i].btime = pornInfosSet[i].btime;
		infosSet[i].etime = pornInfosSet[i].etime;
		infosSet[i].bpos = pornInfosSet[i].bpos;
		infosSet[i].epos = pornInfosSet[i].epos;
	}

	if (pornResult > 0.7) { //返回色情
		std::cout << "Porn Result = " << pornResult << std::endl;
		_signal = 1;
		_prop = pornResult;
		_infosSet = infosSet;
		return;
	}

	try {
		horrorResult = detectHorrorVideo(horrorInfosSet, fileName, imagePath, imageName, modelPath);
	} catch (std::exception ex) {
		std::cout << ex.what() << std::endl;
	}

	for (std::size_t i=0; i<horrorInfosSet.size(); ++i)
	{
		std::cout << " Scene[" << i << "] Prop : " << horrorInfosSet[i].prop << std::endl;
		std::cout << " Scene[" << i << "] Image Path : " << horrorInfosSet[i].imagePath << std::endl;
		std::cout << " Scene[" << i << "] Begin Time : " << horrorInfosSet[i].btime << std::endl;
		std::cout << " Scene[" << i << "] End Time : " << horrorInfosSet[i].etime << std::endl;
		std::cout << " Scene[" << i << "] Begin Pos : " << horrorInfosSet[i].bpos << std::endl;
		std::cout << " Scene[" << i << "] End Pos : " << horrorInfosSet[i].epos << std::endl;

		infosSet[i].prop = horrorInfosSet[i].prop;
		strcpy(infosSet[i].imagePath,horrorInfosSet[i].imagePath);
		infosSet[i].btime = horrorInfosSet[i].btime;
		infosSet[i].etime = horrorInfosSet[i].etime;
		infosSet[i].bpos = horrorInfosSet[i].bpos;
		infosSet[i].epos = horrorInfosSet[i].epos;
	}

	if (horrorResult > 0.6) { //返回恐怖
		std::cout << "Horror Result = " << horrorResult << std::endl;
		_signal = 2;
		_prop = horrorResult;
		_infosSet = infosSet;
		return;
	}

	_infosSet = infosSet;
	std::cout << "Porn Result = " << pornResult << std::endl;
	std::cout << "Horror Result = " << horrorResult << std::endl;

	return;
}

模式识别 - 有害视频检测程序的策略,布布扣,bubuko.com

时间: 2024-10-14 19:00:25

模式识别 - 有害视频检测程序的策略的相关文章

模式识别 - 有害视频检測程序的策略

有害视频检測程序的策略 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26346831 有害(色情\恐怖\暴力)视频, 严重危害网络的健康, 须要进行检測和过滤. 检測色情\恐怖视频, 通过检測程序, 检測出多个场景的概率, 然后进行排序, 当场景多余6个时, 仅仅取最大的6个场景; 返回的概率值是前3个最大检測值场景的概率的均值; 色情\恐怖汇总时, 首先检測色情, 假设为色情视频, 则不进行恐怖的检測, 否则继续检測恐怖,

基于opencv和QT的瞳孔精确检测程序

本文为作者为毕业设计所写的瞳孔精确检测程序,谢绝任何形式的转载. 本篇博客是在作者的前两篇博客 <基于QT和opencv的摄像头(本地图片)读取并输出程序>和< 基于opencv和QT的人脸(人眼)检测程序>的基础上进行开发的.主要原理是:针对已经检测到的人眼区域图像,利用边缘检测和Hough变换实现瞳孔的精确检测. 首先建立一个图像处理类,对每一帧图像进行处理. class ImgProcess { private: Mat inimg;//输入图像 Mat outimg;//输

《结对-英文词频检测程序-需求分析》

英文词频检测程序 原理:利用分隔符分词存入列表,然后从列表读出存入字典,键为词,值存放词的数量中文统计词频的话,得先分词后再进 统计一篇英文文章各个单词出现的词频 统计英文文章词频是很常见的需求,利用python实现.过滤掉除了 A-Z , a-z , ' 和 - 以外的符号结果输出为__CSV__格式

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

结对-结对英文词频检测程序-需求分析

英文词频检测程序 本软件具有以下功能:1.检测一个文档中出现过的所有单词及词频数2.检测一个文档中停用部分词后所有的单词数及词频数3.检测一个文档中和另外一个词表对比之后超纲的词及词频数,本功能可用于英语试卷的智能分析4.检测一个文档中各种词的变化形式,包括复数.不规则.过去分词.现在分词.比较级和最高级5.将词和词频导出为Excel及文本文件6.词典工具具有超强功能:提取某个长度的词.删除首字符串含某字符串的词.提取尾字符串为某字符串的词.删除尾字符含某字符串的词.提取出首字符串为某字符串的词

C#检测程序重复运行的函数(可以在多用户登录情况下检测)

上文是在网上找的检测程序重复运行的类,但是感觉不是很好用,而且还使用了API,似乎完全没有必要,于是晚上自己写了一个函数,经过测试,在多用户下仍然可以检测到程序的多次运行.当然,如果程序改了名字还是可以再次运行,不过这种方式只怕没有什么太好的办法来,除非是在.NET环境或注册表中写入一些标志,但似乎也没有必要. if (AppInstance()) { MessageBox.Show("警告:程序正在运行中! 请不要重复打开程序!", "系统提示", Message

最新微信号码检测程序 是否有微信器

说到微信,我们就会想到微商,微商任何时候都觉得很火,为什么自己做起来好难啊,就是因为你没有找对方法,,什么好的方法最好?没有,小编做微商最直接的办法,就是加人,那么要怎么知道号码是否开通微信呢?我们要用到易哥微信开通检测软件了! 最新微信号码检测程序 是否有微信器 在这里要说到微信开通检测软件与微信的联系,那就离不开它们沟通的桥梁微商,这是一款适合微商的软件,它给微商带来的作用体现在:可以帮助微商寻找精准粉丝客户的需求,从而实现快速的微信网络销售.可是,作为新研发推广的软件产品应该要想到如何可持

INNO:检测程序是否已经安装,是则弹出卸载提示。

INNO:检测程序是否已经安装,是则弹出卸载提示. 作者:少轻狂 | 发布:2010-08-05 | 更新:2013-09-05 | 分类:部署 | Disposition | 热度:2816 ℃ 实现原理: 探测注册表HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall(即“添加/删除程序”)中的卸载项目,若检测到则启动卸载确认对话框. 在实际应用的时候,各位需要将上面代码中“{86D79F54-E48

inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效

inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效 inno setup 安装卸载时检测程序是佛正在运行卸载完成后自动打开网页-代码无效 --------------------------代码如下--------------------------- [Code]varErrorCode: Integer;IsRunning: Integer; // 安装时判断客户端是否正在运行function InitializeSetup(): Boolean;beginResult