基于caffe的鉴黄图片分类c++代码
来源:互联网 发布:如何复制知乎的文字 编辑:程序博客网 时间:2024/05/02 18:23
基于caffe的鉴黄图片分类c++代码
icity.cpp:
#include <cstring>#include <map>#include <string>#include <vector>#include "caffe/caffe.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/core/core.hpp"#include "sys/time.h"#include <dlib/dir_nav.h>#include <iostream>#include <fstream>#include <string>#include<unistd.h>#include<stdlib.h>#include<sys/stat.h>#include<fcntl.h>using caffe::Blob;using caffe::Caffe;using caffe::Net;using caffe::Layer;using caffe::vector;int copyfile(std::string original,std::string destination){int length=0;char originalname[100];length=original.copy(originalname, original.size());originalname[length]='\0';int length2=0;char destinationname[100];length2=destination.copy(destinationname, destination.size());destinationname[length2]='\0';char c = '\0'; int in = -1, out = -1; //以只读方式打开数据文件 in = open(originalname, O_RDONLY); //以只写方式创建文件,如果文件不存在就创建一个新的文件 //文件属主具有读和写的权限 out = open(destinationname, O_WRONLY|O_CREAT, S_IRUSR| S_IWUSR); while(read(in, &c, 1) == 1)//读一个字节的数据 write(out, &c, 1);//写一个字节的数据 //关闭文件描述符 close(in); close(out); return 0; }int main(int argc, char** argv) {std::string FLAGS_weights;std::string net_config;int model_tag=0;for(int model=0;model<=1;model++){std::cout<<"print model"<<model<<std::endl;if(model==0){std::cout<<"AAA"<<std::endl;//定义模型FLAGS_weights = "nsfw.caffemodel";//网络定义net_config="deploy.prototxt";model_tag=0;}else{//定义模型std::cout<<"BBB"<<std::endl;FLAGS_weights = "jianhuang.caffemodel";//网络定义net_config="deploy_my.prototxt";model_tag=1;}//获取现在的时间timeval start,end; gettimeofday(&start, NULL);Net<float> net(net_config, caffe::TEST);net.CopyTrainedLayersFrom(FLAGS_weights);vector<Blob<float>* > input_blobs = net.input_blobs();vector<Blob<float>* > output_blobs = net.output_blobs();//define the map from labels to outputint num_outputs = output_blobs[0]->count();//turn to newdlib::directory test("/opt/jiangjiangchu/jianhuang/test_picture/");std::vector<dlib::directory> dirs= test.get_dirs();sort(dirs.begin(),dirs.end());int num_class= dirs.size();//统计下有多少个文件夹可以读图片std::string fname;std::string filename;int ttotal=0;int tcorr = 0;for(int i=0;i<dirs.size();i++){int total=0;int correct=0;std::vector<dlib::file> files = dirs[i].get_files();for(int j=0; j<files.size();j++)//读取每个文件夹下的图片{total = total + 1;timeval start,end;gettimeofday(&start, NULL);//读取每张图片预处理fname = files[j].full_name();filename=files[j].name();cv::Mat src= cv::imread(fname); std::cout<<"fname:"<<fname<<std::endl;int widthOrigin = src.cols;int heightOrigin = src.rows;if(widthOrigin==0 || heightOrigin==0)continue;cv::resize(src, src, cv::Size(224,224),0,0);src.convertTo(src, CV_32FC3);cv::Mat cv_data_mean(224, 224, CV_32FC3, cv::Scalar(104.00698793, 116.66876762, 122.67891434));src -= cv_data_mean;vector<cv::Mat> mat_vec;split(src, mat_vec);float* dst_data = input_blobs[0]->mutable_cpu_data();float* src_data;//for (int k = 0; k < mat_vec.size(); ++k){for (int y = 0; y<mat_vec[k].rows; y++){src_data = mat_vec[k].ptr<float>(y);memcpy(dst_data, src_data, sizeof(float)*mat_vec[k].cols);dst_data += mat_vec[k].cols;}}vector<int> test_score_output_id;vector<float> test_score;float loss = 0;//计算const vector<Blob<float>*>& result =net.Forward(input_blobs);int my_class=0;for (int j = 0; j < result.size(); ++j) {int maxind=0;float maxval=-100;const float* result_vec = result[j]->cpu_data();for(int k=0; k<result[j]->count(); k++){//打印每个值std::cout<<k<<"\t"<<result_vec[k]<<std::endl;//求最大值的坐标if(result_vec[k] > maxval){maxval = result_vec[k];maxind = k;}}//std::cout<<"model :"<<model_tag<<std::endl;std::cout<<"Image is classified as class:"<<maxind<<std::endl;my_class=maxind;}std::string original_name=fname;//"./dbNudeDetection/"+filename;std::string imagename=filename;//std::fstream f;//f.open(original_name.c_str());std::cout<<"original_name:"<<original_name<<std::endl;std::cout<<" total: "<<total<<std::endl;std::string jpgname=imagename;//int length=0;if(model_tag==0){std::cout<<"model_1:"<<model_tag<<std::endl;if(my_class==2){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass2/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass2/"+ jpgname;//std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}else if(my_class==1){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass1/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass1/"+ jpgname;//std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}else if(my_class==0){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass0/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass0/"+ jpgname;///std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}}else if(model_tag==1){std::cout<<"model_2:"<<model_tag<<std::endl;if(my_class==2){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/ourclass2/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass2/"+ jpgname;//std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}else if(my_class==1){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/ourclass1/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass1/"+ jpgname;//std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}else if(my_class==0){std::string destination="/opt/jiangjiangchu/jianhuang/classfy_pic/ourclass0/"+ jpgname;copyfile(original_name,destination);//std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass0/"+ jpgname;//std::cout<<"comand:"<<str<<std::endl;//char comand[100];//length=str.copy(comand, str.size());//comand[length]='\0';//system(comand);}}}}//计算耗时gettimeofday(&end, NULL); int t=(end.tv_sec - start.tv_sec)*1000000 +(end.tv_usec - start.tv_usec); std::cout<<"elapsed time:"<<t<<std::endl; }}
make
makefile:
CXX=g++
jianhuang: icity.cpp
$(CXX) -Ofast -std=c++11 -DCPU_ONLY -DUSE_MKL -I./dlib-19.3 -I./include -I/opt/jiangjiangchu/intelcaffe/mkl/include icity.cpp -L./lib -lcaffe -lopencv_highgui -lopencv_imgproc -lopencv_core -lprotobuf ./lib/libgflags.a -lboost_system -lhdf5 -lhdf5_hl -L./lib/ -lcaffe -lopencv_highgui -lopencv_core -lmkldnn ./dlib-19.3/examples/build/dlib_build/libdlib.a -o jianhuang
./run.sh >out.log 2>&1
run.sh:
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
export PATH=./lib:$PATH
./jianhuang
------------------ 附 -------------------------------------------------------
linux 下C++没有copyfile类似的函数,上面是加入的自己的复制函数,下面调用系统调用system(),复制图片分类:
#include <cstring>#include <map>#include <string>#include <vector>#include "caffe/caffe.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/core/core.hpp"#include "sys/time.h"#include <dlib/dir_nav.h>#include <iostream>#include <fstream>#include <string>#include<unistd.h>#include<stdlib.h>using caffe::Blob;using caffe::Caffe;using caffe::Net;using caffe::Layer;using caffe::vector;//int copyfile(std::string original,std::string destination){//char c = '\0'; // int in = -1, out = -1; //以只读方式打开数据文件 // in = open(original, std::O_RDONLY); //以只写方式创建文件,如果文件不存在就创建一个新的文件 //文件属主具有读和写的权限 // out = open(destination, std::O_WRONLY|std::O_CREAT, std::S_IRUSR|std::S_IWUSR); // while(read(in, &c, 1) == 1)//读一个字节的数据 // write(out, &c, 1);//写一个字节的数据 //关闭文件描述符 // close(in); // close(out); // return 0; //}int main(int argc, char** argv) {std::string FLAGS_weights;std::string net_config;int model_tag=0;for(int model=0;model<=1;model++){std::cout<<"print model"<<model<<std::endl;if(model==0){std::cout<<"AAA"<<std::endl;//定义模型FLAGS_weights = "nsfw.caffemodel";//网络定义net_config="deploy.prototxt";model_tag=0;}else{//定义模型std::cout<<"BBB"<<std::endl;FLAGS_weights = "jianhuang.caffemodel";//网络定义net_config="deploy_my.prototxt";model_tag=1;}//获取现在的时间timeval start,end; gettimeofday(&start, NULL);Net<float> net(net_config, caffe::TEST);net.CopyTrainedLayersFrom(FLAGS_weights);vector<Blob<float>* > input_blobs = net.input_blobs();vector<Blob<float>* > output_blobs = net.output_blobs();//define the map from labels to outputint num_outputs = output_blobs[0]->count();//turn to newdlib::directory test("/opt/jiangjiangchu/jianhuang/test_picture/");std::vector<dlib::directory> dirs= test.get_dirs();sort(dirs.begin(),dirs.end());int num_class= dirs.size();//统计下有多少个文件夹可以读图片std::string fname;std::string filename;int ttotal=0;int tcorr = 0;for(int i=0;i<dirs.size();i++){int total=0;int correct=0;std::vector<dlib::file> files = dirs[i].get_files();for(int j=0; j<files.size();j++)//读取每个文件夹下的图片{total = total + 1;timeval start,end;gettimeofday(&start, NULL);//读取每张图片预处理fname = files[j].full_name();filename=files[j].name();cv::Mat src= cv::imread(fname); std::cout<<"fname:"<<fname<<std::endl;int widthOrigin = src.cols;int heightOrigin = src.rows;cv::resize(src, src, cv::Size(224,224),0,0);src.convertTo(src, CV_32FC3);cv::Mat cv_data_mean(224, 224, CV_32FC3, cv::Scalar(104.00698793, 116.66876762, 122.67891434));src -= cv_data_mean;vector<cv::Mat> mat_vec;split(src, mat_vec);float* dst_data = input_blobs[0]->mutable_cpu_data();float* src_data;//for (int k = 0; k < mat_vec.size(); ++k){for (int y = 0; y<mat_vec[k].rows; y++){src_data = mat_vec[k].ptr<float>(y);memcpy(dst_data, src_data, sizeof(float)*mat_vec[k].cols);dst_data += mat_vec[k].cols;}}vector<int> test_score_output_id;vector<float> test_score;float loss = 0;//计算const vector<Blob<float>*>& result =net.Forward(input_blobs);int my_class=0;for (int j = 0; j < result.size(); ++j) {int maxind=0;float maxval=-100;const float* result_vec = result[j]->cpu_data();for(int k=0; k<result[j]->count(); k++){//打印每个值std::cout<<k<<"\t"<<result_vec[k]<<std::endl;//求最大值的坐标if(result_vec[k] > maxval){maxval = result_vec[k];maxind = k;}}std::cout<<"model :"<<model_tag<<std::endl;std::cout<<"Image is classified as class:"<<maxind<<std::endl;my_class=maxind;}std::string original_name=fname;//"./dbNudeDetection/"+filename;std::string imagename=filename;//std::fstream f;//f.open(original_name.c_str());std::cout<<"original_name:"<<original_name<<std::endl;std::string jpgname=imagename;int length=0;if(model_tag==0){std::cout<<"model_1:"<<model_tag<<std::endl;if(my_class==2){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass2/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}else if(my_class==1){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass1/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}else if(my_class==0){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/nsfwclass0/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}}else if(model_tag==1){std::cout<<"model_2:"<<model_tag<<std::endl;if(my_class==2){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass2/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}else if(my_class==1){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass1/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}else if(my_class==0){std::string str="cp "+original_name +" /opt/jiangjiangchu/jianhuang/classfy_pic/ourclass0/"+ jpgname;std::cout<<"comand:"<<str<<std::endl;char comand[200];length=str.copy(comand, str.size());comand[length]='\0';system(comand);}}}}//计算耗时gettimeofday(&end, NULL); int t=(end.tv_sec - start.tv_sec)*1000000 +(end.tv_usec - start.tv_usec); std::cout<<"elapsed time:"<<t<<std::endl; }}
- 基于caffe的鉴黄图片分类c++代码
- python代码:图片鉴黄
- 使用现有的基于caffe训练好的imagenet model进行图片分类
- caffe + win10基于CaffeNet网络框架训练自己的图片进行分类(实践篇)
- caffe训练自己的图片分类模型
- 基于tensorflow实现AI图片鉴黄(NSFW)
- 图片鉴黄的原理和应用
- 用caffe对自己的图片进行分类,包含详细代码
- Caffe图片分类
- caffe入门----pycaffe图片分类
- 使用Caffe进行图片分类
- Windows+caffe+libsvm对图片数据集的分类
- Windows+caffe+libsvm对图片数据集的分类
- caffe训练自己的图片进行分类预测
- 基于Overfeat的图片分类、定位、检测
- 基于Overfeat的图片分类、定位、检测
- 基于文本和图片的商品分类
- caffe实战三:自己手写数字图片通过mnist的caffe模型进行分类
- 分布式调用跟踪与监控实战
- Swift: 获取目录结构
- 基于Basys 2的VGA视频游戏——Running man
- 关于线程死锁的了解(LIUNX)
- FT(IG)显著+分割+Surf识别笔记(一)
- 基于caffe的鉴黄图片分类c++代码
- Qt的Model/View Framework解析
- C++/CLI:第一流的CLI语言
- 设计模式用前须知
- 2017年华为软件精英挑战赛初赛解题思路
- java汉子转拼音
- 十一、NG Validation表单验证插件
- Android Studio project和module的区别
- 1017 乘积最大