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,這裡的優化僅限於對矩陣的乘法優化,因此,只要選擇適合的矩陣計算庫就