【嚴肅臉】使用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層:
程式碼:
為了表示的更為明顯,可以用line函式進行畫線:波動越大,表示當前圖片越...
caffe_predefine.h:
#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;
}
}
}
效果:
使用了某預告片來做顯示:
相關文章
- React 實現圖片識別AppReactAPP
- 妙招:使用Python實現圖片在人臉識別並顯示Python
- 圖片文字識別怎麼實現
- 實現圖片文字識別的方法有哪些
- AI大模型實現圖片OCR識別AI大模型
- Java 實現OCR掃描/識別圖片文字Java
- “嚴肅”的遊戲遊戲
- 使用Tesseract進行圖片文字識別
- Tesseract 圖片識別
- 圖片文字識別工具怎樣進行批次識別圖片?
- Python實現人臉識別功能,face_recognition的使用 | 機器學習Python機器學習
- 利用百度AI OCR圖片識別,Java實現PDF中的圖片轉換成文字AIJava
- 用canvas實現一個自動識別兩張圖片差異(圖片找不同)的功能Canvas
- 基於Android平臺實現人臉識別Android
- paddleocr圖片文字識別
- 如何用Excel 9步實現CNN人臉識別ExcelCNN
- matlab實現人臉識別(數學基礎原理)Matlab
- Java如何使用Tessdata做OCR圖片文字識別Java
- 機器學習實戰-SVM模型實現人臉識別機器學習模型
- 如何免費識別圖片文字?圖片文字識別軟體怎麼用
- WebView實現長按儲存圖片 長按識別二維碼WebView
- 分享:識別圖片文字方法
- Tesseract OCR 圖片文字識別
- 【326】PIL 截圖及圖片識別
- 【ROS】OpenCV+ROS 實現人臉識別(Ubantu16.04)ROSOpenCV
- 手把手教你實現人臉識別,有手就行
- 64行程式碼實現簡單人臉識別行程
- 虹軟人臉識別ArcSoft3.0NodeJs 版本實現NodeJS
- 手寫的文字圖片怎樣使用OCR軟體識別?
- 鴻蒙專案實戰(六):識別本地圖片鴻蒙地圖
- Java也能做OCR!SpringBoot 整合 Tess4J 實現圖片文字識別JavaSpring Boot
- PDF 轉換圖片然後識別圖片內容
- 如何將圖片識別成文字?
- 手動輸入圖片識別
- 圖片裁剪-文字識別-文字新增
- 圖片識別文字具體操作
- 圖片識別文字,分享給你!
- 【opencv3】 svm實現手寫體與人臉識別OpenCV
- 基於二哈實現多人人臉學習和識別