コンピュータ ビジョン アプリケーションで発生する最適化問題を解決するために、Google ceres ソルバーを使用しています。残差を評価するためにAutoDiffCostFunctionを使用しています。密な QR ソルバーは関数を最適化し、適切な最小値を見つけることができます。しかし、fmax、fmin、relu (または残差内の if/else) のような滑らかでない関数を使用することは、悪い習慣と見なされるのでしょうか。
私たちの残差には、いくつかの滑らかでない操作が含まれています。
// compute the area of intersection rectangle
T interArea = fmax(T(0.0), xB - xA) * fmax(T(0.0), yB - yA);
ゼロで微分不可能な別のスニペット:
// Generalized Intersection over Union
T g_iou = (a_c > T(0.0)) ? (iou - (a_c - u) / a_c) : T(0.0);
たとえば、fmax を Smooth-approximation に置き換えることができます。
(1) fmax(x, y; k) = log( exp(kx) + exp(ky) ) / k
問題は、密な QR が意図したとおりに機能している場合でも、非滑らかさの残差を体系的に削除する必要があるかどうかです。