生活随笔
收集整理的這篇文章主要介紹了
faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載自:faster rcnn的源碼理解(一)SmoothL1LossLayer論文與代碼的結(jié)合理解 - 野孩子的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/u010668907/article/details/51456928
源碼:
[python]?view plaincopy print?
//?------------------------------------------------------------------?? //?Fast?R-CNN?? //?Copyright?(c)?2015?Microsoft?? //?Licensed?under?The?MIT?License?[see?fast-rcnn/LICENSE?for?details]?? //?Written?by?Ross?Girshick?? //?------------------------------------------------------------------?? ?? ?? ?? namespace?caffe?{?? ?? template?<typename?Dtype>?? __global__?void?SmoothL1Forward(const?int?n,?const?Dtype*?in,?Dtype*?out,?? ????Dtype?sigma2)?{?? ??//?f(x)?=?0.5?*?(sigma?*?x)^2??????????if?|x|?<?1?/?sigma?/?sigma?? ??//????????|x|?-?0.5?/?sigma?/?sigma????otherwise?? ??CUDA_KERNEL_LOOP(index,?n)?{?? ????Dtype?val?=?in[index];?? ????Dtype?abs_val?=?abs(val);?? ????if?(abs_val?<?1.0?/?sigma2)?{?? ??????out[index]?=?0.5?*?val?*?val?*?sigma2;?? ????}?else?{?? ??????out[index]?=?abs_val?-?0.5?/?sigma2;?? ????}?? ??}?? }?? ?? template?<typename?Dtype>?? void?SmoothL1LossLayer<Dtype>::Forward_gpu(const?vector<Blob<Dtype>*>&?bottom,?? ????const?vector<Blob<Dtype>*>&?top)?{?? ??int?count?=?bottom[0]->count();?? ??caffe_gpu_sub(?? ??????count,?? ??????bottom[0]->gpu_data(),?? ??????bottom[1]->gpu_data(),?? ??????diff_.mutable_gpu_data());????//?d?:=?b0?-?b1?? ??if?(has_weights_)?{?? ????//?apply?"inside"?weights?? ????caffe_gpu_mul(?? ????????count,?? ????????bottom[2]->gpu_data(),?? ????????diff_.gpu_data(),?? ????????diff_.mutable_gpu_data());??//?d?:=?w_in?*?(b0?-?b1)?? ??}?? ??SmoothL1Forward<Dtype><<<CAFFE_GET_BLOCKS(count),?CAFFE_CUDA_NUM_THREADS>>>(?? ??????count,?diff_.gpu_data(),?errors_.mutable_gpu_data(),?sigma2_);?? ??CUDA_POST_KERNEL_CHECK;?? ?? ??if?(has_weights_)?{?? ????//?apply?"outside"?weights?? ????caffe_gpu_mul(?? ????????count,?? ????????bottom[3]->gpu_data(),?? ????????errors_.gpu_data(),?? ????????errors_.mutable_gpu_data());??//?d?:=?w_out?*?SmoothL1(w_in?*?(b0?-?b1))?? ??}?? ?? ??Dtype?loss;?? ??caffe_gpu_dot(count,?ones_.gpu_data(),?errors_.gpu_data(),?&loss);?? ??top[0]->mutable_cpu_data()[0]?=?loss?/?bottom[0]->num();?? }?? ?? template?<typename?Dtype>?? __global__?void?SmoothL1Backward(const?int?n,?const?Dtype*?in,?Dtype*?out,?? ????Dtype?sigma2)?{?? ??//?f'(x)?=?sigma?*?sigma?*?x?????????if?|x|?<?1?/?sigma?/?sigma?? ??//???????=?sign(x)???????????????????otherwise?? ??CUDA_KERNEL_LOOP(index,?n)?{?? ????Dtype?val?=?in[index];?? ????Dtype?abs_val?=?abs(val);?? ????if?(abs_val?<?1.0?/?sigma2)?{?? ??????out[index]?=?sigma2?*?val;?? ????}?else?{?? ??????out[index]?=?(Dtype(0)?<?val)?-?(val?<?Dtype(0));?? ????}?? ??}?? }?? ?? template?<typename?Dtype>?? void?SmoothL1LossLayer<Dtype>::Backward_gpu(const?vector<Blob<Dtype>*>&?top,?? ????const?vector<bool>&?propagate_down,?const?vector<Blob<Dtype>*>&?bottom)?{?? ??//?after?forwards,?diff_?holds?w_in?*?(b0?-?b1)?? ??int?count?=?diff_.count();?? ??SmoothL1Backward<Dtype><<<CAFFE_GET_BLOCKS(count),?CAFFE_CUDA_NUM_THREADS>>>(?? ??????count,?diff_.gpu_data(),?diff_.mutable_gpu_data(),?sigma2_);?? ??CUDA_POST_KERNEL_CHECK;?? ??for?(int?i?=?0;?i?<?2;?++i)?{?? ????if?(propagate_down[i])?{?? ??????const?Dtype?sign?=?(i?==?0)???1?:?-1;?? ??????const?Dtype?alpha?=?sign?*?top[0]->cpu_diff()[0]?/?bottom[i]->num();?? ??????caffe_gpu_axpby(?? ??????????count,???????????????????????????//?count?? ??????????alpha,???????????????????????????//?alpha?? ??????????diff_.gpu_data(),????????????????//?x?? ??????????Dtype(0),????????????????????????//?beta?? ??????????bottom[i]->mutable_gpu_diff());??//?y?? ??????if?(has_weights_)?{?? ????????//?Scale?by?"inside"?weight?? ????????caffe_gpu_mul(?? ????????????count,?? ????????????bottom[2]->gpu_data(),?? ????????????bottom[i]->gpu_diff(),?? ????????????bottom[i]->mutable_gpu_diff());?? ????????//?Scale?by?"outside"?weight?? ????????caffe_gpu_mul(?? ????????????count,?? ????????????bottom[3]->gpu_data(),?? ????????????bottom[i]->gpu_diff(),?? ????????????bottom[i]->mutable_gpu_diff());?? ??????}?? ????}?? ??}?? }?? ?? INSTANTIATE_LAYER_GPU_FUNCS(SmoothL1LossLayer);?? ?? }??//?namespace?caffe??
SmoothL1LossLayer?計(jì)算一張圖片的損失函數(shù),對(duì)應(yīng)于下圖的加號(hào)右邊部分
?
i是mini-batch的anchor的索引。
Pi是目標(biāo)的預(yù)測(cè)概率。
有物體時(shí)pi*為1,否則為0
ti是一個(gè)向量,預(yù)測(cè)坐標(biāo)
ti*是一個(gè)向量,是gt包圍盒的坐標(biāo)
?
bottom[0]預(yù)測(cè)坐標(biāo),對(duì)應(yīng)于下圖的ti
bottom[1]target坐標(biāo),對(duì)應(yīng)于下圖的ti*
bottom[2]inside,有物體(fg)時(shí)為1,否則為0,對(duì)應(yīng)于下圖的pi*
bottom[3]outside,沒(méi)有前景(fg)也沒(méi)有后景(bg)的為0,其他為1/(bg+fg),對(duì)應(yīng)于加號(hào)右邊的系數(shù)部分(但其實(shí)這個(gè)地方我本人還是不懂,因?yàn)檎撐纳险f(shuō)的系數(shù)都是一些固定的值,如入=10。初始代碼一直在更新,估計(jì)又換了別的方法。不論如何,在現(xiàn)在的代碼中outside是乘以了后面的結(jié)果)
?
Lreg的公式就是下圖,另x=ti?-?ti*
?
?
Pi*Leg(ti,?ti*)表明只有有fg(20個(gè)物體類別)的才有回歸損失
總結(jié)
以上是生活随笔為你收集整理的faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。