OpenCV--性別年齡預測(附源碼)

環境:VS2017+OpenCV3.3+C++

   當我們接觸一個全新的caffe.model文件,如何快速應用的,今天我將通過一個預測性別和年齡的實例來說明這個問題,首先來下載模型文件,保存到我們指定的自定義的目錄,首先我們應該查看模型的描述文件(.prototxt),確定模型需要的輸入和輸出部分。

name: "CaffeNet"
input: "data" //輸入層
input_dim: 10 //數據增廣
input_dim: 3 //通道數
input_dim: 227//長寬
input_dim: 227

輸出:

layers {
  name: "prob" //名稱
  type: SOFTMAX //特徵層
  bottom: "fc8"
  top: "prob"
}

   本圖爲CVPR論文中對年齡的label講解,用於後續輸出。

 我們可以知道,輸入數據的格式,接下來我們可以通過之前講過的級聯分類器作爲圖像輸入,然後就可以進行性別和年齡的預測了。

1、模型定義

//替換成你的對應位置	
String model_age_file = "D:/new_cv/opencv/sources/samples/data/age_net.caffemodel";
String model_age_txt = "D:/new_cv/opencv/sources/samples/data/age_deploy.prototxt";

String model_gender_bin ="D:/new_cv/opencv/sources/samples/data/gender_net.caffemodel";
String model_gender_txt ="D:/new_cv/opencv/sources/samples/data/gender_deploy.prototxt";

2、年齡預測

在進行年齡預測之前,我們先對label進行保存

vector<String> get_age_label()
{
	vector<String> age_labels;
	age_labels.push_back("0-2");
	age_labels.push_back("4-6");
	age_labels.push_back("8-13");
	age_labels.push_back("15-20");
	age_labels.push_back("25-32");
	age_labels.push_back("38-43");
	age_labels.push_back("48-53");
	age_labels.push_back("60-");
	return age_labels;
}

年齡預測代碼:

void predict_age(Mat &src)
{
	Net net = readNetFromCaffe(model_age1_txt, model_age1_file);
	if (net.empty())
	{
		cout << "load net error" << endl;
		exit(-1);
	}
	Mat blobImg = blobFromImage(src, 1.0, Size(227, 227));
	net.setInput(blobImg, "data");
	Mat probMat = net.forward("prob");
	probMat.reshape(1, 1);//1行1通道
	Point index;//座標信息
	double objvalue;//最大檢測值
	minMaxLoc(probMat, NULL, &objvalue, NULL, &index);//忽略最小值,取最大值
	size_t objindex = index.x;//label 下標
	vector<String>labels = get_age_label();
	putText(src, format("age:%s", labels[objindex].c_str()), Point(2, 20), FONT_HERSHEY_PLAIN, 0.7, Scalar(1, 12, 3), 1, 8);
}

3、性別預測

void predict_gender(Mat &src)
{
	Net net = readNetFromCaffe(model_age1_txt, model_age1_file);
	if (net.empty())
	{
		cout << "load net error" << endl;
		exit(-1);
	}
	Mat blobImg = blobFromImage(src, 1.0, Size(227, 227));
	net.setInput(blobImg, "data");
	Mat probMat = net.forward("prob");
	probMat.reshape(1, 1);//1行1通道
	putText(src, format("gender:%s", (probMat.size[0] > probMat.size[1] ? "M" : "F")), Point(2, 10), FONT_HERSHEY_PLAIN, 0.7, Scalar(2, 2, 3), 1, 8);
}

4、結果展示

源代碼:https://github.com/haiqiang2017/open-dnn/blob/master/DNN/net_cas.cpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章