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

有害视频检測程序的策略

本文地址: 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-12-20 13:18:58

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

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

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

Memory Leak检測神器--LeakCanary初探

??在之前的文章Android内存泄露的几种情形中提到过在开发中常见的内存泄露问题,可是过于草率.因为刚开年,工作还没正式展开,就看了一下Github开源大户Square的LeakCanary,并用公司项目的測试环境来练手.试图找出项目中存在的内存泄露.与上一篇不同,这一篇我会先说一下Java的内存区域以及垃圾回收机制,然后再讲LeakCanary的应用.而且会用一个在项目中遇到的真实案例来结尾. Java的内存模型 ??在对于LeakCanary来说,我们主要关心Java程序执行时的堆和栈.

server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh

宕机监控报警程序 一.   需求来源 宕机对运维人员来说,最痛苦了.怎样检測一台server是否还在正常执行,假设该server宕机,怎样在第一时间监測到并通知一线运维人员进行维护,最大化降低损失. 二.   程序功能 对指定server进行宕机监測,假设确实宕机,则发送email到139邮箱(绑定手机,实现短信报警) 三.源程序 #!/bin/bash #author longxibendi #blog http://blog.csdn.net/longxibendi #function pi

人脸检測中几种框框大小的选择~

人脸检測应用极为广泛,内部细节也偏多,尤其是涉及到几种类型的框,这几种框的大小之前有着千丝万缕的联系,对检測性能的好坏影响程度大小不一.本篇文章基于自己在人脸检測方面的经验,说说对这些框之间关系的一些理解. 如今大部分人脸检測效果都已adaboost+LBP(各种改进)的方式实现,adaboost由N个强分类器组成,每一个强分类器由M个弱分类器组成,而每一个弱分类器事实上就是一个特征. 本文以LBP特征为例,人脸检測共涉及到例如以下几类框: 1. LBP特征矩形框大小(极为重要) 2. 检測框大

HDFS怎样检測并删除多余副本块

前言 在HDFS中,每时每刻都在进行着大量block块的创建和删除操作,这些庞大的block块构建起了这套复杂的分布式系统.普通block的读写删除操作一般人都或多或少了解过一些,可是过量的副本清理机制是否有人知道呢,就是overReplicatedBlock的处理,针对过量的副本块,HDFS怎么处理,何时处理,处理的策略机制怎样,本文就给大家分享HDFS在这方面的知识. 过量副本块以及发生的场景 过量副本块的意思通俗解释就是集群中有A副本3个,满足标准的3副本策略,可是此时发生了某种场景后,A

iOS开发实践之网络检測Reachability

在网络应用开发中.有时须要对用户设备的网络状态进行实时监控.以至于对用户进行友好提示 或者依据不同网络状态处理不一样的逻辑(如视频播放app,依据当前的网络情况自己主动切换视频清晰度等等).用Reachability实现网络的检測. 苹果官方提供了Reachability的演示样例程序,便于开发人员检測网络状态 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip 1. 网络状态枚举Net

OpenCV人脸检測(完整源代码+思路)

本博文IDE为vs2013 OpenCV2.49 话不多说,先看视频演示(20S演示): 例如以下: https://v.youku.com/v_show/id_XMjYzMzkxMTYyMA==.html?spm=a2h0w.8278793.2736843.4#paction 程序截图例如以下: 怎样来用OpenCV来实现能. 以下给出OpenCV实现人脸检測的一般步骤: 1.载入人脸检測器 2.开启摄像头 3.对图片进行灰度处理(事实上能够不处理,上图中原图的标题栏就是未进行灰度处理进行的检

LeakCanary:简单粗暴的内存泄漏检測工具

差点儿每一个程序猿在开发的过程中都会遇到内存泄漏.那么我们怎样检測到app是否哪里出现内存泄漏呢?square公司推出了一款简单粗暴的检測内存泄漏的工具-- LeakCanary 什么是内存泄漏? 内存泄漏是指因为疏忽或者错误造成程序未能释放已经不再使用的内存,内存泄漏不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误失去了对于这段内存的控制.因而造成内存的浪费. 内存泄漏和内存溢出是两码事,不要混淆,内存溢出通俗的讲就是内存不够用,如今的仅仅能手机内存越来越大,内存溢出的情况不

图像处理之霍夫变换(直线检測算法)

图像处理之霍夫变换(直线检測算法) 霍夫变换是图像变换中的经典手段之中的一个,主要用来从图像中分离出具有某种同样特征的几何 形状(如,直线,圆等).霍夫变换寻找直线与圆的方法相比与其他方法能够更好的降低噪 声干扰.经典的霍夫变换经常使用来检測直线,圆,椭圆等. 霍夫变换算法思想: 以直线检測为例,每一个像素坐标点经过变换都变成都直线特质有贡献的统一度量,一个简单 的样例例如以下:一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式, 能够表达出直线的离散点几何等式例如以下: X *