1. 程式人生 > >Caffe 原始碼的修改(用於車輛的定位)

Caffe 原始碼的修改(用於車輛的定位)

  1 #include <stdio.h>  // for snprintf
  2 #include <string>
  3 #include <vector>
  4 
  5 #include "boost/algorithm/string.hpp"
  6 #include "google/protobuf/text_format.h"
  7 #include "leveldb/db.h"
  8 #include "leveldb/write_batch.h"
  9 
 10 #include "caffe/blob.hpp"
 11 #include "caffe/common.hpp"
12 #include "caffe/net.hpp" 13 #include "caffe/proto/caffe.pb.h" 14 #include "caffe/util/io.hpp" 15 #include "caffe/vision_layers.hpp" 16 17 // liu 18 #include <opencv2/core/core.hpp> 19 #include <opencv2/highgui/highgui.hpp> 20 #include <opencv2/highgui/highgui_c.h> 21 #include <opencv2/imgproc/imgproc.hpp>
22 #include <opencv2/opencv.hpp> 23 #include <sys/stat.h> // for mkdir 24 25 using namespace caffe; // NOLINT(build/namespaces) 26 27 template<typename Dtype> 28 int feature_extraction_pipeline(int argc, char** argv); 29 30 int main(int argc, char** argv) { 31 return feature_extraction_pipeline
<float>(argc, argv); 32 // return feature_extraction_pipeline<double>(argc, argv); 33 } 34 35 template<typename Dtype> 36 int feature_extraction_pipeline(int argc, char** argv) { 37 ::google::InitGoogleLogging(argv[0]); 38 const int num_required_args = 5; 39 if (argc < num_required_args) { 40 LOG(ERROR)<< 41 "This program takes in a trained network and an input data layer, and then" 42 " extract features of the input data produced by the net.\n" 43 "Usage: test_det_net pretrained_net_param" 44 " feature_extraction_proto_file num_mini_batches" 45 " output_dir" 46 " [CPU/GPU] [DEVICE_ID=0]\n" 47 "Note: the feature blob names is fixed as 'fc_8_det' in code\n"; 48 return 1; 49 } 50 int arg_pos = num_required_args; 51 52 arg_pos = num_required_args; 53 if (argc > arg_pos && strcmp(argv[arg_pos], "GPU") == 0) { 54 LOG(ERROR)<< "Using GPU"; 55 uint device_id = 0; 56 if (argc > arg_pos + 1) { 57 device_id = atoi(argv[arg_pos + 1]); 58 CHECK_GE(device_id, 0); 59 } 60 LOG(ERROR) << "Using Device_id=" << device_id; 61 Caffe::SetDevice(device_id); 62 Caffe::set_mode(Caffe::GPU); 63 } else { 64 LOG(ERROR) << "Using CPU"; 65 Caffe::set_mode(Caffe::CPU); 66 } 67 Caffe::set_phase(Caffe::TEST); 68 69 arg_pos = 0; // the name of the executable 70 string pretrained_binary_proto(argv[++arg_pos]); 71 72 string feature_extraction_proto(argv[++arg_pos]); 73 shared_ptr<Net<Dtype> > feature_extraction_net( 74 new Net<Dtype>(feature_extraction_proto)); 75 feature_extraction_net->CopyTrainedLayersFrom(pretrained_binary_proto); 76 // to get image_paths 77 const vector<shared_ptr<Layer<float> > > layers = feature_extraction_net->layers(); 78 const caffe::ImageDataLayer<float> *image_layer = dynamic_cast<caffe::ImageDataLayer<float>* >(layers[0].get()); 79 CHECK(image_layer); 80 81 const string blob_name = "fc_8_det"; 82 83 CHECK(feature_extraction_net->has_blob(blob_name)) \ 84 << "Unknown feature blob name " << blob_name \ 85 << " in the network " << feature_extraction_proto; 86 87 88 int num_mini_batches = atoi(argv[++arg_pos]); 89 string output_dir = argv[++arg_pos]; 90 CHECK_EQ(mkdir(output_dir.c_str(),0744), 0) << "mkdir " << output_dir << " failed"; 91 92 LOG(ERROR)<< "Extracting Features"; 93 94 vector<Blob<float>*> input_vec; 95 int image_index=0; 96 for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { 97 feature_extraction_net->Forward(input_vec); 98 99 const shared_ptr<Blob<Dtype> > feature_blob = feature_extraction_net->blob_by_name(blob_name); 100 101 int batch_size = feature_blob->num(); 102 103 int dim_features = feature_blob->count() / batch_size; 104 CHECK_EQ(dim_features, 4) << "the dim of feature is not equal to 4"; 105 106 Dtype* feature_blob_data; 107 int x1, y1, x2, y2; 108 for (int n = 0; n < batch_size; ++n) { 109 feature_blob_data = feature_blob->mutable_cpu_data() + feature_blob->offset(n); 110 111 x1 = feature_blob_data[0]; 112 y1 = feature_blob_data[1]; 113 x2 = feature_blob_data[2]; 114 y2 = feature_blob_data[3]; 115 116 string image_path = image_layer->lines_[image_index].first; 117 //LOG(ERROR) << "image_index " << image_index << " " << image_path \ 118 << " x1 " << feature_blob_data[0] << " y1 " << feature_blob_data[1] \ 119 << " x2 " << feature_blob_data[2] << " y2 " << feature_blob_data[3]; 120 121 cv::Mat img_origin = cv::imread(image_path); 122 123 std::vector<string> part_names; 124 boost::split(part_names, image_path, boost::is_any_of("/")); 125 string subname = part_names[part_names.size()-1]; // the last element is the image name. 126 string out_path(output_dir + "/" + subname); 127 128 //LOG(ERROR) << subname; 129 line(img_origin, cv::Point(x1, y1), cv::Point(x2, y1), cv::Scalar(0, 0, 255), 3); 130 line(img_origin, cv::Point(x2, y1), cv::Point(x2, y2), cv::Scalar(0, 0, 255), 3); 131 line(img_origin, cv::Point(x2, y2), cv::Point(x1, y2), cv::Scalar(0, 0, 255), 3); 132 line(img_origin, cv::Point(x1, y2), cv::Point(x1, y1), cv::Scalar(0, 0, 255), 3); 133 CHECK_EQ(imwrite(output_dir + "/" + subname, img_origin), true) << "write image " + out_path + " failed"; 134 135 image_index ++ ; 136 if (image_index>=image_layer->lines_.size()){ 137 LOG(ERROR) << "Restarting data prefetching from start."; 138 image_index = 0; 139 } 140 // (image_index>image_layer->lines_.size()-1)?(image_index=0):(image_index++); 141 } 142 143 } // for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) 144 // write the last batch 145 146 LOG(ERROR)<< "Successfully extracted the features!"; 147 return 0; 148 }

相關推薦

Caffe 原始碼修改用於車輛定位

1 #include <stdio.h> // for snprintf 2 #include <string> 3 #include <vector> 4 5 #include "boost/algorithm/string.hpp" 6 #

Caffe原始碼解讀Caffe視覺化工具

從網路結構視覺化、caffemodel的視覺化、特徵圖視覺化、視覺化loss和accurary曲線等四個方面講視覺化 網路結構視覺化 有兩種辦法:draw_net.py工具和線上視覺化工具,推薦後者,靈活簡便。 1、使用draw_net.py工具

Jmeter httpSampler取樣器修改用於http請求自動拼接簽名

前言:出於安全性考慮,一般公司的框架都有簽名驗證,簡單說就是在請求中拼接按一定規則生成的字串,用於伺服器校驗請求是否合法,jmeter原生方法傳送的請求肯定是不帶這個簽名的,所以,如果我們打算用jmeter做線上巡檢,則需要修改jmeter的http取樣器 ,在請求中自動拼

Android原始碼修改自動獲取usb許可權基於Android5.1定製版系統

自動獲取usb許可權 這篇文章參考了這個得到的解決方案 http://blog.csdn.net/hubbybob1/article/details/50263925 這個博主已經寫得很清楚啦,但是還有一些同學通過私信來問我問題,所以我就把我當時(去年的時候),筆記放上來

Caffe原始碼解讀caffe.proto

caffe.proto檔案位於 ..\caffe-fast-rcnn\src\caffe\proto檔案目錄下 ,根目錄為 py_faster_rcnn資料夾 syntax = "proto2"; package caffe; //  repeated  require

caffe原始碼剖析--整體目錄結構

從今天開始,我們來細緻的分析一下caffe的原始碼。(此係列僅分析caffe原始版本,對於caffe2不涉及,並且只分析各類實現的cpu版,對於gpu實現筆者精力和能力有限,暫不作分析) 分析原始碼之前,我們需要對caffe的程式碼結構有一定的瞭解,只有充分了解了原始碼的組

caffe源碼未完待續

樣本 源碼解析 單元 最小 size 傳遞 strong 統一 news caffe源碼閱讀雜記 準備 一些參考網頁 Neural Networks and Deep Learning TUTORIAL ON DEEP LEARNING FOR VISION Deep

Android App解決卡頓慢之內存抖動及內存泄漏發現和定位

頻率 其他 直觀 工具使用 nts and article 退出 大小 內存抖動是指在短時間內有大量的對象被創建或者被回收的現象,內存抖動出現原因主要是頻繁(很重要)在循環裏創建對象(導致大量對象在短時間內被創建,由於新對象是要占用內存空間的而且是頻繁,如果一次或者兩次在

secureCRT無操作自動登出時間修改親測可用

目錄 tin 機器 color nbsp 一段時間 操作 for 登錄 轉自:http://blog.sina.com.cn/s/blog_6bcf42010102vlt9.html secureCRT連接機器經常會因為一段時間無操作就退出了,提示timed out wai

菜鳥帶你看原始碼——看不懂你打我ArrayList原始碼分析基於java 8

文章目錄 看原始碼並不難 軟體環境 成員變數: 構造方法 核心方法 get方法 remove方法 add方法 結束 看原始碼並不難 如何學好程式設計?如何寫出優質的程式碼?如

centos7中安裝wdcp管理系統用於網站搭設

首先我們進入官網看下安裝方法https://www.wdlinux.cn/wdcp/install.html 可以看到,實際上有兩張安裝方式,一種是原始碼進行安裝,還有一種是RPM包安裝,顯然第二種安裝方式會更快,更適合新手,燃鵝,這個安裝包並不支援centos7版本。安裝說明下面有寫。 我們使用的是

LinkedHashMap及其原始碼分析基於JDK1.7

LinkedHashMap及其原始碼分析 閱讀目錄 什麼是LinkedHashMap LinkedHashMap補充說明 LinkedHashMap的陣列結構 LinkedHashMap繼承的類與實現的介面 LinkedHashMap原始碼中雙向連結串列的

自動化docker部署私有IPFS網路用於本地debug

在上一篇中,總結了部署私有IPFS網路的具體步驟。後來覺得可以把整個流程做成自動化的部署工具,以後用起來會比較方便。 閒言少敘,直接上程式碼。要用的話直接copy到一個start.sh檔案,然後執行就可以了。引數只有一個peerNumber,用於指定IPFS網路的容量。比如:./star

詳解Linux下auto工具製作Makefile原始碼工具安裝篇

收藏於 2012-03-25 遷移自個人的百度空間 ------------------------------- 一、引子 咱們都知道make好用,但是大型的軟體make是很麻煩的,為了解決這個問題,先人們就發明了autoconf與automake工具,用這些工具可以非常方便的製作

laravel5.5原始碼筆記四、路由

今天這篇博文來探索一下laravel的路由。在第一篇講laravel入口檔案的博文裡,我們就提到過laravel的路由是在application物件的初始化階段,通過provider來載入的。這個路由服務提供者註冊於vendor\laravel\framework\src\Illuminate\Foundat

nginx-原始碼安裝李作強

nginx能做靜態和動態的網頁。 nginx 並結合 tomcat 反向代理,動靜分離,負載均衡 動靜分離:動態的放到tomcat裡解析 靜態的放到nginx裡解析 CDN:內容分發網路,靜態的檔案快取在CDN上。 傳統CDN廠商:藍汛,網宿,帝聯,世紀互聯 雲CDN

squid-原始碼安裝李作強

Squid是一個高效能的代理快取伺服器,Squid支援FTP、gopher、HTTPS和HTTP協議。和一般的代理快取軟體不同,Squid用一個單獨的、非模組化的、I/O驅動的程序來處理所有的客戶端請求。 下載安轉包: wget http://www.squi

java集合之----ArrayList原始碼分析基於jdk1.8

一、ArrayList 1、ArrayList是什麼: ArrayList就是動態陣列,用MSDN中的說法,就是Array的複雜版本,它提供了動態的增加和減少元素,實現了ICollection和IList介面,靈活的設定陣列的大小等好處,實現了Randomaccess介面,支援快速隨

CryEnging5.5原始碼編譯2018-9-30

為了寫這篇部落格,我把自己以前已經編譯好的CE全刪除了,從頭開始來一遍,以便幫助大家,從頭開始編譯一個完整的CryEngine。 目錄 編譯時間:2018年9月30日 從github獲取CryEngine最新原始碼 CryEngine的github地址:

eos原始碼賞析二十一:EOS智慧合約之區塊簽名的天龍八“步”

在上篇文章中我們提到了,由使用者操作會產生各種事務,事務的鏈上執行是由push_transaction來完成的,我們簡單的劃分了下,具體可參考eos原始碼賞析(二十):EOS智慧合約之push_transaction的天龍八“步” 。我們知道,在區塊生產或者打包