1. 程式人生 > >cuda影象卷積

cuda影象卷積

#include    <wb.h>




#define wbCheck(stmt) do {                                                    \
        cudaError_t err = stmt;                                               \
        if (err != cudaSuccess) {                                             \
            wbLog(ERROR, "Failed to run stmt ", #stmt);                       \
            wbLog(ERROR, "Got CUDA error ...  ", cudaGetErrorString(err));    \
            return -1;                                                        \
        }                                                                     \
    } while(0)


#define Mask_width  5
#define Mask_radius Mask_width/2
#define O_TILE_WIDTH 12
#define BLOCK_WIDTH (O_TILE_WIDTH+4)
#define clamp(x, start, end)    min(max(x, start), end)
   
//@@ INSERT CODE HERE
__global__ void convolution_2D_kernel(float*P,float*N,int height,int width,int channels,const  float* __restrict__ M)
{
__shared__ float Ns[BLOCK_WIDTH][BLOCK_WIDTH*3];
int tx=threadIdx.x;
int ty=threadIdx.y;
int row_o=blockIdx.y*O_TILE_WIDTH+ty;
int col_o=blockIdx.x*O_TILE_WIDTH+tx;


int row_i=row_o-2;
int col_i=col_o-2;


int i=0;
int j=0;
int k=0;
if((row_i>=0)&&(row_i<height)&&(col_i>=0)&&(col_i<width))
{
   for(k=0;k<channels;++k) 
{  
Ns[ty][tx*channels+k]=P[(row_i*width+col_i)*channels+k];
}
}
else
{
 for(k=0;k<channels;++k) 
{  
Ns[ty][tx*channels+k]=0.0f;
}
}


 __syncthreads();
float output=0.0f;
if(ty<O_TILE_WIDTH&&tx<O_TILE_WIDTH)
{
for(k=0;k<channels;++k)
{
output=0.0f;
for(i=0;i<Mask_width;++i)
{
for(j=0;j<Mask_width;++j)
{
output+=M[i*Mask_width+j]*Ns[i+ty][(j+tx)*channels+k];
}
}
if(row_o<height&&col_o<width)
{
N[(row_o*width+col_o)*channels+k]=output;
}
}
}
}


int main(int argc, char* argv[]) {
    wbArg_t args;
    int maskRows;
    int maskColumns;
    int imageChannels;
    int imageWidth;
    int imageHeight;
    char * inputImageFile;
    char * inputMaskFile;
    wbImage_t inputImage;
    wbImage_t outputImage;
    float * hostInputImageData;
    float * hostOutputImageData;
    float * hostMaskData;
    float * deviceInputImageData;
    float * deviceOutputImageData;
    float * deviceMaskData;


    args = wbArg_read(argc, argv); /* parse the input arguments */


    inputImageFile = wbArg_getInputFile(args, 0);
    inputMaskFile = wbArg_getInputFile(args, 1);


    inputImage = wbImport(inputImageFile);
    hostMaskData = (float *) wbImport(inputMaskFile, &maskRows, &maskColumns);


    assert(maskRows == 5); /* mask height is fixed to 5 in this mp */
    assert(maskColumns == 5); /* mask width is fixed to 5 in this mp */


    imageWidth = wbImage_getWidth(inputImage);
    imageHeight = wbImage_getHeight(inputImage);
    imageChannels = wbImage_getChannels(inputImage);


    outputImage = wbImage_new(imageWidth, imageHeight, imageChannels);


    hostInputImageData = wbImage_getData(inputImage);
    hostOutputImageData = wbImage_getData(outputImage);


    wbTime_start(GPU, "Doing GPU Computation (memory + compute)");


    wbTime_start(GPU, "Doing GPU memory allocation");
    cudaMalloc((void **) &deviceInputImageData, imageWidth * imageHeight * imageChannels * sizeof(float));
    cudaMalloc((void **) &deviceOutputImageData, imageWidth * imageHeight * imageChannels * sizeof(float));
    cudaMalloc((void **) &deviceMaskData, maskRows * maskColumns * sizeof(float));
    wbTime_stop(GPU, "Doing GPU memory allocation");




    wbTime_start(Copy, "Copying data to the GPU");
    cudaMemcpy(deviceInputImageData,
               hostInputImageData,
               imageWidth * imageHeight * imageChannels * sizeof(float),
               cudaMemcpyHostToDevice);
    cudaMemcpy(deviceMaskData,
               hostMaskData,
               maskRows * maskColumns * sizeof(float),
               cudaMemcpyHostToDevice);
    wbTime_stop(Copy, "Copying data to the GPU");




    wbTime_start(Compute, "Doing the computation on the GPU");
    //@@ INSERT CODE HERE
    dim3 dimBlock(BLOCK_WIDTH,BLOCK_WIDTH);
    dim3 dimGrid((imageWidth-1)/O_TILE_WIDTH+1,(imageHeight-1)/O_TILE_WIDTH+1,1);
    convolution_2D_kernel<<<dimGrid,dimBlock>>>(deviceInputImageData,deviceOutputImageData,imageHeight,imageWidth,imageChannels,deviceMaskData);
    wbTime_stop(Compute, "Doing the computation on the GPU");




    wbTime_start(Copy, "Copying data from the GPU");
    cudaMemcpy(hostOutputImageData,
               deviceOutputImageData,
               imageWidth * imageHeight * imageChannels * sizeof(float),
               cudaMemcpyDeviceToHost);
    wbTime_stop(Copy, "Copying data from the GPU");


    wbTime_stop(GPU, "Doing GPU Computation (memory + compute)");


    wbSolution(args, outputImage);


    cudaFree(deviceInputImageData);
    cudaFree(deviceOutputImageData);
    cudaFree(deviceMaskData);


    free(hostMaskData);
    wbImage_delete(outputImage);
    wbImage_delete(inputImage);


    return 0;
}

相關推薦

cuda影象

#include    <wb.h> #define wbCheck(stmt) do {                                                    \         cudaError_t err = st

多通道影象基礎知識介紹

轉:https://blog.csdn.net/williamyi96/article/details/77648047 1.對於單通道影象+單卷積核做卷積 Conv layers包含了conv,pooling,relu三種層。以python版本中的VGG16模型中的faster_rcnn_

深度學習影象後的尺寸計算公式

輸入圖片大小 W×W Filter大小 F×F 步長 S padding的畫素數 P 於是我們可以得出: N = (W − F + 2P )/S+1 輸出圖片大小為 N×N 如:輸入影象為5*5*3,Filter為3*3*3,在zero pad 為1,步長 S=1 (可先忽略這條

影象、相關以及在MATLAB中的操作

原文:http://www.cnblogs.com/zjutzz/p/5661543.html 影象卷積、相關以及在MATLAB中的操作 區分卷積和相關 影象處理中常常需要用一個濾波器做空間濾波操作。空間濾波操作有時候也被叫做卷積濾波,或者乾脆叫卷積(離散的卷積,不是微

多通道影象

#1.三通道卷積 ##1.1通過設定不同filter 我們在進行影象處理的時候回遇到有色彩的影象,一般都是RGB,三個通道。 這個時候原始矩陣就變成了三維的,他們分別是原來的兩個維度寬width和高he

【Shader特效8】著色器濾鏡、影象與濾波、數字影象處理

##說在開頭: PhotoShop和特效相機中有許多特效的濾鏡。片元著色器時基於片元為單位執行的,完全可以實現特殊的濾鏡效果。要想實現這些濾鏡效果還需要簡單的瞭解《數字影象處理》中的影象卷積與濾波的一些

一維訊號影象的區別

基礎概念:   卷積神經網路(CNN):屬於人工神經網路的一種,它的權值共享的網路結構顯著降低了模型的複雜度,減少了權值的數量。卷積神經網路不像傳統的識別演算法一樣,需要對資料進行特徵提取和資料重建,可以直接將圖片作為網路的輸入,自動提取特徵,並且對圖形的變形等具有高度不變形。在語音分析和影象識

[原始碼和文件分享]基於CUDA神經網路演算法實現

摘 要 卷積神經網路是近年來人工智慧領域取得重大突破的一種重要手段,給出了影象識別、語音識別和自然語言處理領域中關鍵問題的優化解決方案,尤其適合處理影象方面的任務,如人臉識別和手寫體識別。手寫數字識別是用卷積神經網路解決的經典問題,採用一般方法訓練出來的神經網路達到了97%的識別率,幾乎與人類的

影象網路模型彙總

New weights files: NASNet, DenseNet  fchollet released this on 16 Jan Assets12 densenet121_weights_tf_dim_ordering_tf_kernels.

神經網路CNN(1)——影象與反捲(後,轉置

1.前言    傳統的CNN網路只能給出影象的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裡就詳細解釋卷積與反捲積。     對於1維的卷積,公式(離散

深度學習---影象與反捲(最完美的解釋)

動態圖1.前言   傳統的CNN網路只能給出影象的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裡就詳細解釋卷積與反捲積。    對於1維的卷積,公式(離散

【轉】影象與濾波及高斯模糊(gauss blur)的一些知識點

對非影象邊界的畫素的操作比較簡單。假設我們對I的第四個畫素3做區域性平均。也就是我們用2,3和7做平均,來取代這個位置的畫素值。也就是,平均會產生一副新的影象J,這個影象在相同位置J (4) = (I(3)+I(4)+I(5))/3 = (2+3+7)/3 = 4。同樣,我們可以得到J(3) = (I(2)+

影象操作的手動實現(基於opencv的C++編譯環境)

        opencv環境下有自帶的filter2D()函式可以實現影象的卷積,自己寫一個卷積函式函式貌似是沒事找事。。。。好吧,事實是這是我們計算機視覺課程上的一項作業。我們很多演算法過程僅僅只呼叫別人寫好的介面,即使原理我們已經清楚,但是真正編寫程式碼的時候很多細節

關於影象與caffe中實現

影象卷積及Caffe中的卷積實現   原創內容,轉載請註明出處。    本文簡單介紹了影象卷積相關的知識以及Caffe中的卷積實現方法,寫作過程中參考了很多很讚的資料,有興趣的讀者可以從【參考資料】檢視。    博文中的錯誤和不足之處還望各位讀者指正。 什麼是卷積?

OpenCV下利用傅立葉變換和逆變換實現影象演算法,並附自己對於核/模板核算子的理解!

學過訊號與系統的人都知道,卷積運算一般是轉化成頻率乘積再求逆來計算,因為這樣可以減少計算量,提高程式碼的效率。 影象卷積操作廣泛應用在影象濾波技術中。 影象卷積運算中一個重要概念是卷積核算子,它是模板核算子的一種,模板核算子實際上就是一個視窗矩陣,用這個視窗按畫素點滑動去

影象:Image Convolutions

1. Convolutions Convolutions is a technique for general signal processing. People studying electrical/electronics will tell you the n

影象的理解

本部落格談談對以下兩個問題的理解:  1. 為何影象的卷積是對應元素相乘並求和;  2 為何影象的卷積可以實現影象的模糊或銳化的作用。 問題一:            先借助別人的部落格,說明下影象卷積的操作:                     1.1 影象卷積的

opencv for python (13) 影象影象平滑(平均、高斯模糊、中值模糊、雙邊濾波)

影象卷積 卷積函式 cv2.filter2D(img,-1,kernel) 第一個引數是原影象 第二個引數目標影象的所需深度。如果是負數,則與原影象深度相同 第三個引數是卷積核心 import cv2 import numpy as np

神經網路_影象解釋

學習卷積神經網路一段時間了,記錄下關於卷積神經網路中影象卷積的原理。 互相學習交流。 1、人工神經網路 首先看下人工神經網路感知器的原理圖,這個不是重點,但是卷積神經網路由此而來,所以擷取材料如下:

影象的fft實現驗證(python)

1、Caffe的卷積操作時間主要在矩陣乘法,假設一個m*n卷積核,且輸入通道數為1,輸出特徵圖大小為h*w,則乘法個數m*n*h*w,這裡的優化僅限於對矩陣的乘法優化,因此,只要選擇適合的矩陣計算庫就