基于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 output
int num_outputs = output_blobs[0]->count();
//turn to new
dlib::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=