国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

怎么用C++提取任意一張圖片的特征(從內存讀取數據)

2020-01-26 14:10:27
字體:
來源:轉載
供稿:網友

  關于使用C++接口來提取特征,caffe官方提供了一個extract_features.cpp的例程,但是這個文件的輸入是blob數據,即使輸入層使用的是ImageData,也需要在deploy.prototxt中指定圖片的位置,很不方便。

如果想要使用opencv來讀取一個圖片,然后用caffe訓練好的model提取特征,就需要對輸入層進行改寫。另外官方例程默認的輸出是leveldb格式,我們也可以獲取float類型的多維特征(數組),這樣集成到我們的項目中更靈活。

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 }}

  在之前的訓練中可能使用的是"ImageData"、"Data"之類的,現在改成MemoryData不影響。

02

  我準備提取的層的名字是"res5_6",就是"InnerProduct"的前一層,當我想提取"InnerProduct"全連接層的輸出時,總是報錯,提示原始參數和網絡參數不匹配(就是訓練好的model和現在deploy的網絡維度不一樣),所以只好提取前一層了,并且要把全連接層屏蔽掉,屏蔽的方法是把prototxt里相應層的名字改掉就好(相對于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;/* 加載模型函數 */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); // 加載網絡定義文件和參數模型 caffe::MemoryDataLayer<NetTy> *m_layer = (caffe::MemoryDataLayer<NetTy> *)_net->layers()[0].get(); // 定義個內存數據層指針 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); // 把圖片和標簽,添加到 MemoryData層 std::vector<caffe::Blob<NetTy>*> input_vec; // 無意義,為了函數參數需要 _net->Forward(input_vec);     // 執行一次前向計算 boost::shared_ptr<caffe::Blob<NetTy>> layerData = _net->blob_by_name("res5_6"); // 獲得指定層的輸出 const NetTy* pstart = layerData->cpu_data(); // res5_6->cpu_data()返回的是多維數據(數組) /*-----輸出特征-----*/ for (int i = 0; i < 30000; i++) {  std::cout << *pstart << endl;  pstart++; } return 0;}

以上所述是小編給大家介紹的怎么用C++提取任意一張圖片的特征(從內存讀取數據),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 霍山县| 康定县| 台东市| 会理县| 柏乡县| 安达市| 萨迦县| 苍山县| 凤城市| 宿州市| 依安县| 夏津县| 郑州市| 莱州市| 茂名市| 遂川县| 霍邱县| 留坝县| 克拉玛依市| 清流县| 河东区| 上虞市| 贞丰县| 涟水县| 普洱| 新乐市| 嵊泗县| 桦川县| 临朐县| 庄河市| 六安市| 西藏| 通许县| 介休市| 施甸县| 长春市| 嘉峪关市| 马关县| 拉萨市| 乐业县| 余庆县|