5クラスを持つ画像(224,224,5)=(H, W, depth)
の行列があります。
その画像の5つの位置にアクセスして、一次元の行列を作り、その中から最も大きい値のindexを取得するしたいです。
[1, HW+1, (HW2)+1, (HW3)+1, (HW*4)+1]
自分で書いたコード
c++
1//PostProc()の中 2std::vector<float> segment; 3for (int r=0; r<height; r++) { //loop over rows 4 for (int c=0; c<width; c++) { //loop over columns 5 for (int d=0; d<depth; d++) { //loop over depth (classes) 6 segment = result[d*width*height+r*width+c]; 7 posit = max_element(segment.bigin(), segment.end()); 8 } 9 } 10}
ProstProc()のmax_element()
で得たpositはクラス数=5なので、0〜4の範囲になると想定してます。
自分でコードを書いたのですが、いまいち自信がないので、教えてください。よろしくお願いします。
工程
1.CalSoftmak()でnew演算子のresultに画像を入れる
3.ProtProc()でresultの上の場所にアクセスして行列を作り、maxの値のindexを取得する
main flow
c++
1float *softmax = new float[outWidth*outHeight*outChannel]; 2float *outTensor = new float[outWidth*outHeight*outChannel]; //画像を格納しているtensor 3 4// Calculate softmax on CPU 5int outHeight=224; 6int outWidth=224; 7int outChannel=5; 8CPUCalcSoftmax(outTensor, outHeight, outWidth, outChannel, softmax)); 9 10PostProc(outHeight, outWidth, outChannel, softmax)
関数
c++
1/* Calculate softmax.*/ 2void CPUCalcSoftmax(const float *data, int height, int width, int depth, float *result) 3{ 4 assert(data && result); 5 6 float *local_res = new float [height*width*depth]; 7 for (int r=0; r<height; r++) { //loop over rows 8 for (int c=0; c<width; c++) { //loop over columns 9 double sum = 0.0f; 10 for (int d=0; d<depth; d++) { //loop over depth (classes) 11 local_res[d] = exp(data[d*width*height+r*width +c]); 12 sum=sum+local_res[d]; 13 } 14 for (int d=0; d<depth; d++) { //loop over depth (classes) 15 local_res[d] = local_res[d]/sum; 16 result[d*width*height+r*width+c] = local_res[d]; 17 } 18 } 19 } 20 cout << "output file name : in CPUsoftmax = " << OUTPUT_DIR + output_filenames << endl; 21 delete[] local_res; 22} 23 24// post process 25void PostProc(int height, int width, int depth, float *result){ 26 assert(result); 27 28 std::vector<float> segment; 29 for (int r=0; r<height; r++) { //loop over rows 30 for (int c=0; c<width; c++) { //loop over columns 31 for (int d=0; d<depth; d++) { //loop over depth (classes) 32 segment = result[d*width*height+r*width+c]; 33 posit = max_element(segment.bigin(), segment.end()); 34 // positは0~4のはず 35 cout << "max value index" << posit << endl; 36}
回答1件
あなたの回答
tips
プレビュー