【严肃脸】使用caffe实现色情图片的识别
前言
前几天看到了雅虎开源了一个色情图片的识别模型新闻,上Github一看,是基于caffe的。试了试,模型效果很赞。Github地址:https://github.com/yahoo/open_nsfw
至于测试的数据集,就自行找图吧(逃
关于在程序中使用caffe可以戳我的这一篇博客:http://blog.csdn.net/mr_curry/article/details/52443126
(如何在程序中像使用OpenCV一样使用caffe)
准备
下载好模型和配置文件,观察网络结构。
输入的图片需为彩色图片,尺寸为224*224(Vgg的网络也是224*224).根据最后一层,Softmax将会输出一个概率(图片有多色?)
再打开压缩包中的.py文件,我们可以观察到图像的均值:
我们对网络结构做如下修改,使用MemoryData层:
代码:
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include <iostream>
#include "caffe/caffe.hpp"
#include <opencv.hpp>
#include <caffe/layers/memory_data_layer.hpp>
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
#include <caffe/layers/batch_norm_layer.hpp>
#include <caffe/layers/scale_layer.hpp>
#include <caffe/layers/eltwise_layer.hpp>
#include <caffe/layers/bias_layer.hpp>
caffe::MemoryDataLayer<float> *memory_layer;
caffe::Net<float>* net;
DrawLine.h:
#include <opencv.hpp>
using namespace cv;
using namespace std;
void DrawLine(Mat T,vector<Point> point_array);
load_model.h:
#include <opencv.hpp>
using namespace cv;
using namespace std;
void Caffe_Predefine();
float getProb(Mat source);
load_model.cpp:
#include <caffe_predefine.h>
#include <load_model.h>
namespace caffe
{
extern INSTANTIATE_CLASS(InputLayer);
extern INSTANTIATE_CLASS(InnerProductLayer);
extern INSTANTIATE_CLASS(DropoutLayer);
extern INSTANTIATE_CLASS(ConvolutionLayer);
REGISTER_LAYER_CLASS(Convolution);
extern INSTANTIATE_CLASS(ReLULayer);
REGISTER_LAYER_CLASS(ReLU);
extern INSTANTIATE_CLASS(PoolingLayer);
REGISTER_LAYER_CLASS(Pooling);
extern INSTANTIATE_CLASS(LRNLayer);
REGISTER_LAYER_CLASS(LRN);
extern INSTANTIATE_CLASS(SoftmaxLayer);
REGISTER_LAYER_CLASS(Softmax);
extern INSTANTIATE_CLASS(MemoryDataLayer);
extern INSTANTIATE_CLASS(BatchNormLayer);
extern INSTANTIATE_CLASS(ScaleLayer);
extern INSTANTIATE_CLASS(EltwiseLayer);
extern INSTANTIATE_CLASS(BiasLayer);
}
template <typename Dtype>
caffe::Net<Dtype>* Net_Init_Load(std::string param_file, std::string pretrained_param_file, caffe::Phase phase)
{
caffe::Net<Dtype>* net(new caffe::Net<Dtype>(param_file, caffe::TEST));
net->CopyTrainedLayersFrom(pretrained_param_file);
return net;
}
void Caffe_Predefine()//when our code begining run must add it
{
caffe::Caffe::set_mode(caffe::Caffe::CPU);
net = Net_Init_Load<float>("open_nsfw_memorydata.prototxt", "resnet_50_1by2_nsfw.caffemodel", caffe::TEST);
memory_layer = (caffe::MemoryDataLayer<float> *)net->layers()[0].get();
}
float getProb(Mat source)
{
vector<Mat> test;
vector<int> label;
test.push_back(source);
label.push_back(0);
memory_layer->AddMatVector(test, label);// memory_layer and net , must be define be a global variable.
std::vector<caffe::Blob<float>*> input_vec;
net->Forward(input_vec);
boost::shared_ptr<caffe::Blob<float> > prob = net->blob_by_name("prob");
return prob->data_at(0, 0, 1, 0);
}
DrawLine.cpp:
#include <DrawLine.h>
void DrawLine(Mat T, vector<Point> point_array)
{
for (int i = 1; i < point_array.size();i++)
line(T, point_array[i-1], point_array[i], Scalar(0, 0, 255), 3);
}
Main.cpp:
#include <load_model.h>
#include <DrawLine.h>
#define X 0
#define Y 200
int main()
{
Caffe_Predefine();
VideoCapture cap("test.mp4");
Mat frame;
float x = 1, y;
vector<Point> point_array;
Point T_s(X, Y);
point_array.push_back(T_s);
while (true)
{
cap >> frame;
if (!frame.empty())
{
y = getProb(frame);
cout <<"当前概率为"<< y << endl;
Point T_l(X+x++, (Y-100*y));//*100为了更为明显显示
point_array.push_back(T_l);
DrawLine(frame, point_array);
imshow("NSFW", frame);
waitKey(1);
}
else
{
break;
}
}
}
效果:
【严肃脸】使用caffe实现色情图片的识别的更多相关文章
- Python 3 实现色情图片识别
Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...
- 利用python检测色情图片简易实例
import sys import os import _io from collections import namedtuple from PIL import Image class Nude( ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- Android实现OCR扫描识别数字图片之图片扫描识别
[Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...
- pytesser图片文本识别
python图片文本识别使用的工具是PIL和pytesser.因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxy,这个工具的介绍可参考baidu. pytess ...
- 小试Office OneNote 2010的图片文字识别功能(OCR)
原文:小试Office OneNote 2010的图片文字识别功能(OCR) 自Office 2003以来,OneNote就成为了我电脑中必不可少的软件,它集各种创新功能于一身,可方便的记录下各种类型 ...
- 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)
通过: 手写数字识别 ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别 ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...
- 一篇文章搞定百度OCR图片文字识别API
一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104
- Python图像处理之图片文字识别(OCR)
OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同 ...
随机推荐
- Javascript和jquery事件--事件监听器
之前看完了js和jq的冒泡捕获和事件对象event,这里看看同时使用js和jq后我最容易混淆的监听器的绑定. (1) js的监听器绑定解绑 绑定监听器有两种方式: a.on-事件type,比如oncl ...
- JS错误记录 - fgm练习 - 函数传参
<script> window.onload = function() { var oBtn = document.getElementsByTagName('button')[0]; v ...
- 驱动学习3-make
在向内核中添加驱动的时候要完成3项工作 (1)在Kconfig中添加新代码对应项目的编译条件(下面Makefile文件中需要用到它定义的的宏变量) (2)将驱动源码添加到对应的目录中 (3)在目录Ma ...
- JAVA一些基础概念
Java (计算机编程语言) Java是一门面向对象编程语言,不仅吸收了C++语言的各种长处,还摒弃了C++里难以理解的多继承.指针等概念.因此Java语言具有功能强大和简单易用两个特征. Java语 ...
- C语言深度剖析-----C语言中的字符串
S1字符数组 S2字符串,存在于栈空间 S3最常规的写字符串的方法,malloc是堆空间,存在于只读存储区,我们不能够改变指向S3的数据 S4堆空间 S4 字符串的长度 判断字符串长度,assert ...
- malloc和realloc
malloc函数: extern void *malloc(unsigned int num_bytes); malloc 向系统申请分配指定size个字节的内存空间. 如果分配成功则返回指向被分配内 ...
- [Nuxt] Load Data from APIs with Nuxt and Vuex
In a server-rendered application, if you attempt to load data before the page renders and the data f ...
- 数据库中暂时表,表变量和CTE使用优势极其差别
1 在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势: 1. 暂时表:分为局部暂时表和全局暂时表. 1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接 ...
- Oracle-18-select语句初步&SQL中用算术表达式&别名的使用&连接运算符%distinct&where子句
一.一般SELECT语句的格式例如以下: 1.查询指定表的全部列 select * from 表名 [where 条件] [group by 分组列名] [having 聚合函数] [order by ...
- Qt浅谈之一:内存泄露(总结),对于QWidget可以setAttribute(Qt::WA_DeleteOnClose),而且绝对不能手动删除栈上的对象
一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除 ...