前言

前几天看到了雅虎开源了一个色情图片的识别模型新闻,上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层:

代码:

为了表示的更为明显,可以用line函数进行画线:波动越大,表示当前图片越...
caffe_predefine.h:
  1. #include "caffe/layers/input_layer.hpp"
  2. #include "caffe/layers/inner_product_layer.hpp"
  3. #include "caffe/layers/dropout_layer.hpp"
  4. #include "caffe/layers/conv_layer.hpp"
  5. #include "caffe/layers/relu_layer.hpp"
  6. #include <iostream>
  7. #include "caffe/caffe.hpp"
  8. #include <opencv.hpp>
  9. #include <caffe/layers/memory_data_layer.hpp>
  10. #include "caffe/layers/pooling_layer.hpp"
  11. #include "caffe/layers/lrn_layer.hpp"
  12. #include "caffe/layers/softmax_layer.hpp"
  13. #include <caffe/layers/batch_norm_layer.hpp>
  14. #include <caffe/layers/scale_layer.hpp>
  15. #include <caffe/layers/eltwise_layer.hpp>
  16. #include <caffe/layers/bias_layer.hpp>
  17. caffe::MemoryDataLayer<float> *memory_layer;
  18. caffe::Net<float>* net;

DrawLine.h:

  1. #include <opencv.hpp>
  2. using namespace cv;
  3. using namespace std;
  4. void DrawLine(Mat T,vector<Point> point_array);

load_model.h:

  1. #include <opencv.hpp>
  2. using namespace cv;
  3. using namespace std;
  4. void Caffe_Predefine();
  5. float getProb(Mat source);

load_model.cpp:

  1. #include <caffe_predefine.h>
  2. #include <load_model.h>
  3. namespace caffe
  4. {
  5. extern INSTANTIATE_CLASS(InputLayer);
  6. extern INSTANTIATE_CLASS(InnerProductLayer);
  7. extern INSTANTIATE_CLASS(DropoutLayer);
  8. extern INSTANTIATE_CLASS(ConvolutionLayer);
  9. REGISTER_LAYER_CLASS(Convolution);
  10. extern INSTANTIATE_CLASS(ReLULayer);
  11. REGISTER_LAYER_CLASS(ReLU);
  12. extern INSTANTIATE_CLASS(PoolingLayer);
  13. REGISTER_LAYER_CLASS(Pooling);
  14. extern INSTANTIATE_CLASS(LRNLayer);
  15. REGISTER_LAYER_CLASS(LRN);
  16. extern INSTANTIATE_CLASS(SoftmaxLayer);
  17. REGISTER_LAYER_CLASS(Softmax);
  18. extern INSTANTIATE_CLASS(MemoryDataLayer);
  19. extern INSTANTIATE_CLASS(BatchNormLayer);
  20. extern INSTANTIATE_CLASS(ScaleLayer);
  21. extern INSTANTIATE_CLASS(EltwiseLayer);
  22. extern INSTANTIATE_CLASS(BiasLayer);
  23. }
  24. template <typename Dtype>
  25. caffe::Net<Dtype>* Net_Init_Load(std::string param_file, std::string pretrained_param_file, caffe::Phase phase)
  26. {
  27. caffe::Net<Dtype>* net(new caffe::Net<Dtype>(param_file, caffe::TEST));
  28. net->CopyTrainedLayersFrom(pretrained_param_file);
  29. return net;
  30. }
  31. void Caffe_Predefine()//when our code begining run must add it
  32. {
  33. caffe::Caffe::set_mode(caffe::Caffe::CPU);
  34. net = Net_Init_Load<float>("open_nsfw_memorydata.prototxt", "resnet_50_1by2_nsfw.caffemodel", caffe::TEST);
  35. memory_layer = (caffe::MemoryDataLayer<float> *)net->layers()[0].get();
  36. }
  37. float getProb(Mat source)
  38. {
  39. vector<Mat> test;
  40. vector<int> label;
  41. test.push_back(source);
  42. label.push_back(0);
  43. memory_layer->AddMatVector(test, label);// memory_layer and net , must be define be a global variable.
  44. std::vector<caffe::Blob<float>*> input_vec;
  45. net->Forward(input_vec);
  46. boost::shared_ptr<caffe::Blob<float> > prob = net->blob_by_name("prob");
  47. return prob->data_at(0, 0, 1, 0);
  48. }

DrawLine.cpp:

  1. #include <DrawLine.h>
  2. void DrawLine(Mat T, vector<Point> point_array)
  3. {
  4. for (int i = 1; i < point_array.size();i++)
  5. line(T, point_array[i-1], point_array[i], Scalar(0, 0, 255), 3);
  6. }

Main.cpp:

  1. #include <load_model.h>
  2. #include <DrawLine.h>
  3. #define X 0
  4. #define Y 200
  5. int main()
  6. {
  7. Caffe_Predefine();
  8. VideoCapture cap("test.mp4");
  9. Mat frame;
  10. float x = 1, y;
  11. vector<Point> point_array;
  12. Point T_s(X, Y);
  13. point_array.push_back(T_s);
  14. while (true)
  15. {
  16. cap >> frame;
  17. if (!frame.empty())
  18. {
  19. y = getProb(frame);
  20. cout <<"当前概率为"<< y << endl;
  21. Point T_l(X+x++, (Y-100*y));//*100为了更为明显显示
  22. point_array.push_back(T_l);
  23. DrawLine(frame, point_array);
  24. imshow("NSFW", frame);
  25. waitKey(1);
  26. }
  27. else
  28. {
  29. break;
  30. }
  31. }
  32. }

效果:

使用了某预告片来做显示:


【严肃脸】使用caffe实现色情图片的识别的更多相关文章

  1. Python 3 实现色情图片识别

    Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...

  2. 利用python检测色情图片简易实例

    import sys import os import _io from collections import namedtuple from PIL import Image class Nude( ...

  3. 字符型图片验证码识别完整过程及Python实现

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  4. Android实现OCR扫描识别数字图片之图片扫描识别

    [Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...

  5. pytesser图片文本识别

    python图片文本识别使用的工具是PIL和pytesser.因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxy,这个工具的介绍可参考baidu. pytess ...

  6. 小试Office OneNote 2010的图片文字识别功能(OCR)

    原文:小试Office OneNote 2010的图片文字识别功能(OCR) 自Office 2003以来,OneNote就成为了我电脑中必不可少的软件,它集各种创新功能于一身,可方便的记录下各种类型 ...

  7. 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)

    通过: 手写数字识别  ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别  ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...

  8. 一篇文章搞定百度OCR图片文字识别API

    一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104

  9. Python图像处理之图片文字识别(OCR)

    OCR与Tesseract介绍   将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同 ...

随机推荐

  1. Project Euler 363 Bézier Curves(几何+二分)

    题目链接: https://projecteuler.net/problem=363 题目: A cubic Bézier curve is defined by four points: \(P_0 ...

  2. Linux下开启关闭防火墙

    一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off   2) 即时生效,重 ...

  3. UVA 10603 - Fill BFS~

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...

  4. 10.14 android输入系统_多点触摸驱动测试及Reader线程、InputStage分析

    21. 多点触摸_电容屏驱动程序_实践_tiny4412 tiny4412触摸屏: 分辨率为800 x 480http://wiki.friendlyarm.com/wiki/index.php/LC ...

  5. Codeforces Round #Pi (Div. 2) B Berland National Library

    B. Berland National Library time limit per test1 second memory limit per test256 megabytes inputstan ...

  6. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效

     1 类图组织 2 实例 CCSprite * spr = CCSprite::create("HelloWorld.png"); spr->setPosition(cc ...

  7. [Vue] Build Vue.js Apps with the Vue-CLI and Nuxt.js

    The vue-cli allows you to easily start up Vue projects from the command line while Nuxt.js enables a ...

  8. linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定

    背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[root@test vhost]# ps auxUSER  ...

  9. acdream 1430 SETI 后缀数组+height分组

    这题昨天比赛的时候逗了,后缀想不出来,由于n^2的T了,就没往后缀数组想--并且之后解题的人又说用二分套二分来做.然后就更不会了-- 刚才看了题解,唉--原来题讲解n^2的也能够过,然后就--这样了! ...

  10. Deepin系统更新apt-get源

    1.复制原文件备份sudo cp /etc/apt/source.list /etc/apt/source.list.bak2.编辑源列表文件sudo vim /etc/apt/source.list ...