1. 程式人生 > >Caffe實戰系列:實現自己Caffe網路層

Caffe實戰系列:實現自己Caffe網路層

#include "caffe/layers/image_scale_layer.hpp"
#include "caffe/util/math_functions.hpp"
#include <opencv2/opencv.hpp>
namespace caffe {
template <typename Dtype>
void ImageScaleLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  // get parameters
  const ImageScaleParameter& param = this->layer_param_.image_scale_param();
  // get the output size
  out_height_ = param.out_height();
  out_width_ = param.out_width();
  visualize_ = param.visualize();
 
  // get the input size
  num_images_ = bottom[0]->num();
  height_ = bottom[0]->height();
  width_ = bottom[0]->width();
  num_channels_ = bottom[0]->channels();
  // check the channels must be images
  // channel must be 1 or 3, gray image or color image
  CHECK_EQ( (num_channels_==3) || (num_channels_ == 1), true);
  // check the output size
  CHECK_GT(out_height_, 0);
  CHECK_GT(out_height_, 0);
 
}
template <typename Dtype>
void ImageScaleLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  // reshape the outputs
  top[0]->Reshape(num_images_, num_channels_, out_height_, out_width_);
}
template <typename Dtype>
void ImageScaleLayer<Dtype>::Forward_cpu(
    const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
  const Dtype* bottom_data = bottom[0]->cpu_data();
  Dtype * top_data = top[0]->mutable_cpu_data();
  cv::Mat srcimage, dstimage;
 
  // precompurte the index
  const int srcimagesize = width_ * height_;
  const int dstimagesize = out_width_ *  out_height_;
  const int srcchimagesize = srcimagesize * num_channels_;
  const int dstchimagesize = dstimagesize * num_channels_;
  for  ( int idx_img = 0; idx_img < num_images_; idx_img++ )
  {
        // zeros source images and scaled images
        srcimage = cv::Mat::zeros(height_, width_, CV_32FC1);
        dstimage = cv::Mat::zeros(out_height_, out_width_, CV_32FC1);
        // read from bottom[0]
        for  ( int idx_ch = 0; idx_ch < num_channels_; idx_ch++ )
        {
                for  (int i = 0; i < height_; i++)
                {
                        for ( int j=0; j < width_; j++ )
                        {
                                int image_idx = idx_img * srcchimagesize + srcimagesize * idx_ch + height_ *i + j;
                                srcimage.at<float>(i,j) = (float)bottom_data[image_idx];
                        }
                }
        }
        // resize to specified size
        // here we use linear interpolation
        cv::resize(srcimage, dstimage, dstimage.size());
        // store the resized image to top[0]
        for (int idx_ch = 0; idx_ch < num_channels_; idx_ch++)
        {
                for (int i = 0; i < out_height_; i++)
                {
                        for (int j = 0; j < out_width_; j++)
                        {
                                int image_idx = idx_img * dstchimagesize + dstimagesize * idx_ch + out_height_*i + j;
                                top_data[image_idx] = dstimage.at<float>(i,j);
                        }
                }
        }
        if (visualize_)
        {
                cv::namedWindow("src image", CV_WINDOW_AUTOSIZE);
                cv::namedWindow("dst image", CV_WINDOW_AUTOSIZE);
                cv::imshow("src image", srcimage);
                cv::imshow("dst image", dstimage);
                cv::waitKey(0);
        }
  }
}
#ifdef CPU_ONLY
STUB_GPU(ImageScaleLayer);
#endif
INSTANTIATE_CLASS(ImageScaleLayer);
REGISTER_LAYER_CLASS(ImageScale);
}  // namespace caffe


相關推薦

Caffe實戰系列實現自己Caffe網路

#include "caffe/layers/image_scale_layer.hpp" #include "caffe/util/math_functions.hpp" #include <opencv2/opencv.hpp> namespace caffe { template <t

caffe 實戰系列proto檔案格式以及含義解析如何定義網路,如何設定網路引數(以AlexNet為例) 2016.3.30

(0)前言: 初學者往往不知道如何配置網路,或者面對這些引數卻無從下手不知道是什麼含義,下面我根據分析原始碼的經驗給出AlexNet的具體解釋,希望能夠給初學者一些定義網路上面的幫助此外還能夠知道如何找網路的引數,這些引數是如何設定的。 以AlexNet為例: 首先給出配

caffe 實戰系列如何寫自己的資料(以Deep Spatial Net為例)

一、前言 想寫自己的層,首先必須得在caffe.proto中定義自己層的引數,以便於在proto配置檔案中對引數進行配置啦什麼的,其次你還要在caffe.proto宣告你的層的引數是可選的,然後你得在caffe的include目錄下新增你自己層的hpp標頭檔案,以及在c

caffe學習系列訓練自己的圖片集(超詳細教程)

    學習的caffe的目的,不是簡單的做幾個練習,而是最終落實到自己的專案或科研中去。因此,本文介紹一下,從自己的原始圖片到lmdb資料,再到訓練和測試的整個流程。 一、資料的準備     有條件的同學,可以去ImageNet的官網點選開啟連結,下載ImageNet圖片

Caffe實戰系列最簡潔的Caffe安裝教程(以ubuntu14.04為例)

網上充斥各種安裝方法,但是都很繁瑣,特別是安裝顯示卡驅動以及依賴項,對於初學者不是很方便。我覺得采用包管理工具更方便因此寫下本文。 (1)首先安裝ssh,這樣能夠使用winscp和putty或者secure crt進行遠端連線,方便在windows下載東西傳到linu

TensorFlow實戰4實現簡單的多神經網路案例

這篇文章記錄一下使用TensorFlow實現卷積神經網路的過程,資料集採用的還是MNIST資料集,使用了兩層的卷積來進行計算,整個過程在jupyter notebook中完成,具體步驟和程式碼展示如下: 1.環境設定 import numpy as np

Android RxJava 實戰系列優雅實現 網路請求巢狀回撥

轉自-----http://blog.csdn.net/carson_ho/article/details/78315696,請為大神打call 前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android

【12】Caffe學習系列訓練和測試自己的圖片

一、準備資料 有條件的同學,可以去imagenet的官網http://www.image-net.org/download-images,下載imagenet圖片來訓練。驗證碼始終出不來需要翻牆(是google網站的驗證碼)。但是我沒有下載,原因是資料太大了。。。 我去網上找了一些其它的圖片

詳解C# 網路程式設計系列實現類似QQ的即時通訊程式

https://www.jb51.net/article/101289.htm   引言: 前面專題中介紹了UDP、TCP和P2P程式設計,並且通過一些小的示例來讓大家更好的理解它們的工作原理以及怎樣.Net類庫去實現它們的。為了讓大家更好的理解我們平常中常見的軟體QQ的工作原理,所以在本專題

【14】Caffe學習系列計算圖片資料的均值

圖片減去均值後,再進行訓練和測試,會提高速度和精度。因此,一般在各種模型中都會有這個操作。 那麼這個均值怎麼來的呢,實際上就是計算所有訓練樣本的平均值,計算出來後,儲存為一個均值檔案,在以後的測試中,就可以直接使用這個均值來相減,而不需要對測試圖片重新計算。 一、二進位制格式的均值計算

【13】Caffe學習系列資料視覺化環境(python介面)配置

caffe程式是由c++語言寫的,本身是不帶資料視覺化功能的。只能藉助其它的庫或介面,如opencv, python或matlab。更多人會使用python介面來進行視覺化,因為python出了個比較強大的東西:ipython notebook, 現在的最新版本改名叫jupyter notebook

【11】Caffe學習系列影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(leveldb/lmdb)

【10】Caffe學習系列命令列解析

caffe的執行提供三種介面:c++介面(命令列)、python介面和matlab介面。本文先對命令列進行解析,後續會依次介紹其它兩個介面。其實大部分情況下我們會使用python介面進行呼叫,當然caffe提供了C++命令列介面,還是有必要了解一下。命令列引數有個優點是支援多GPU執行。 caf

【9】Caffe學習系列執行caffe自帶的兩個簡單例子

為了程式的簡潔,在caffe中是不帶練習資料的,因此需要自己去下載。但在caffe根目錄下的data資料夾裡,作者已經為我們編寫好了下載資料的指令碼檔案,我們只需要聯網,執行這些指令碼檔案就行了。 注意:在caffe中執行所有程式,都必須在根目錄下進行,即/caffe,否則會出錯,因為指令碼檔案

【8】Caffe學習系列solver優化方法

上文提到,到目前為止,caffe總共提供了六種優化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"),

【7】Caffe學習系列solver及其配置

solver算是caffe的核心的核心,它協調著整個模型的運作。caffe程式執行必帶的一個引數就是solver配置檔案。執行程式碼一般為 $ caffe train --solver=*_slover.prototxt 在Deep Learning中,往往loss function是非凸的

【6】Caffe學習系列Blob,Layer and Net以及對應配置檔案的編寫

深度網路(net)是一個組合模型,它由許多相互連線的層(layers)組合而成。Caffe就是組建深度網路的這樣一種工具,它按照一定的策略,一層一層的搭建出自己的模型。它將所有的資訊資料定義為blobs,從而進行便利的操作和通訊。Blob是caffe框架中一種標準的陣列,一種統一的記憶體介面,它詳細

【5】Caffe學習系列其它常用及引數

本文講解一些其它的常用層,包括:softmax_loss層,Inner Product層,accuracy層,reshape層和dropout層及其它們的引數配置。 1、softmax-loss softmax-loss層和softmax層計算大致是相同的。softmax是一個分類器,計算的

【4】Caffe學習系列啟用(Activiation Layers)及引數

在啟用層中,對輸入資料進行啟用操作(實際上就是一種函式變換),是逐元素進行運算的。從bottom得到一個blob資料輸入,運算後,從top輸入一個blob資料。在運算過程中,沒有改變資料的大小,即輸入和輸出的資料大小是相等的。 輸入:n*c*h*w 輸出:n*c*h*w 常用的啟用函式有

【3】Caffe學習系列視覺(Vision Layers)及引數

所有的層都具有的引數,如name, type, bottom, top和transform_param. 本文只講解視覺層(Vision Layers)的引數,視覺層包括Convolution, Pooling, Local Response Normalization (LRN),