怎么用C++提取任意一張圖片的特征(從內(nèi)存讀取數(shù)據(jù))
關(guān)于使用C++接口來提取特征,caffe官方提供了一個extract_features.cpp的例程,但是這個文件的輸入是blob數(shù)據(jù),即使輸入層使用的是ImageData,也需要在deploy.prototxt中指定圖片的位置,很不方便。
如果想要使用opencv來讀取一個圖片,然后用caffe訓(xùn)練好的model提取特征,就需要對輸入層進(jìn)行改寫。另外官方例程默認(rèn)的輸出是leveldb格式,我們也可以獲取float類型的多維特征(數(shù)組),這樣集成到我們的項(xiàng)目中更靈活。
01
首先我們需要改寫deploy.prototxt的輸入層為"MemoryData":
layer {
name: "data"
type: "MemoryData"
top: "data"
top: "label"
memory_data_param{
batch_size:1
channels:3
height:100
width:100
}
}
在之前的訓(xùn)練中可能使用的是"ImageData"、"Data"之類的,現(xiàn)在改成MemoryData不影響。
02
我準(zhǔn)備提取的層的名字是"res5_6",就是"InnerProduct"的前一層,當(dāng)我想提取"InnerProduct"全連接層的輸出時,總是報錯,提示原始參數(shù)和網(wǎng)絡(luò)參數(shù)不匹配(就是訓(xùn)練好的model和現(xiàn)在deploy的網(wǎng)絡(luò)維度不一樣),所以只好提取前一層了,并且要把全連接層屏蔽掉,屏蔽的方法是把prototxt里相應(yīng)層的名字改掉就好(相對于caffemodel里面的名字)。[以上問題暫時還沒解決,留坑]
03
下面是更改之后的 extract_features.cpp的代碼:
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "boost/algorithm/string.hpp"
#include "google/protobuf/text_format.h"
#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/net.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/io.hpp"
#include "caffe/layers/memory_data_layer.hpp"
#define NetTy float
using namespace caffe;
using std::cout;
using std::endl;
using std::string;
/* 加載模型函數(shù) */
template <typename Dtype>
caffe::Net<Dtype>* loadNet(std::string param_file, std::string pretrained_param_file, caffe::Phase phase)
{
caffe::Net<Dtype>* net(new caffe::Net<Dtype>(param_file, phase));
net->CopyTrainedLayersFrom(pretrained_param_file);
return net;
}
int main()
{
cv::Mat src;
src = cv::imread("face_example/test.jpg"); // 讀取測試圖片
cv::resize(src, src, cv::Size(100, 100)); // 這里要將圖片resize到prototxt里面的輸入層指定的大小
caffe::Net<NetTy>* _net = loadNet<NetTy>("face_example/face_deploy.prototxt", "face_example/face.caffemodel", caffe::TEST); // 加載網(wǎng)絡(luò)定義文件和參數(shù)模型
caffe::MemoryDataLayer<NetTy> *m_layer = (caffe::MemoryDataLayer<NetTy> *)_net->layers()[0].get(); // 定義個內(nèi)存數(shù)據(jù)層指針
std::vector<cv::Mat> dv = { src }; // AddMatVector(const vector<cv::Mat>& mat_vector,const vector<int>& labels)
std::vector<int> label = { 0 }; // -------------------------------------------------------------------------
m_layer->AddMatVector(dv, label); // 把圖片和標(biāo)簽,添加到 MemoryData層
std::vector<caffe::Blob<NetTy>*> input_vec; // 無意義,為了函數(shù)參數(shù)需要
_net->Forward(input_vec); // 執(zhí)行一次前向計算
boost::shared_ptr<caffe::Blob<NetTy>> layerData = _net->blob_by_name("res5_6"); // 獲得指定層的輸出
const NetTy* pstart = layerData->cpu_data(); // res5_6->cpu_data()返回的是多維數(shù)據(jù)(數(shù)組)
/*-----輸出特征-----*/
for (int i = 0; i < 30000; i++)
{
std::cout << *pstart << endl;
pstart++;
}
return 0;
}
以上所述是小編給大家介紹的怎么用C++提取任意一張圖片的特征(從內(nèi)存讀取數(shù)據(jù)),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)
欄 目:C語言
下一篇:C++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)
本文標(biāo)題:怎么用C++提取任意一張圖片的特征(從內(nèi)存讀取數(shù)據(jù))
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1615.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?


