You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by jx...@apache.org on 2017/11/15 04:16:25 UTC
[incubator-mxnet] branch vision updated: [WIP][vision]fix (#8657)
This is an automated email from the ASF dual-hosted git repository.
jxie pushed a commit to branch vision
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/vision by this push:
new 59b7f12 [WIP][vision]fix (#8657)
59b7f12 is described below
commit 59b7f1220c43df3f37619f47d6cd603aacfb42f8
Author: Hu Shiwen <ya...@gmail.com>
AuthorDate: Wed Nov 15 12:16:23 2017 +0800
[WIP][vision]fix (#8657)
* fix
* lint
---
src/operator/image/image_random-inl.h | 118 ++++++++++++++++++++++++----------
src/operator/image/image_random.cc | 32 +++++++++
src/operator/mxnet_op.h | 6 ++
3 files changed, 122 insertions(+), 34 deletions(-)
diff --git a/src/operator/image/image_random-inl.h b/src/operator/image/image_random-inl.h
index 1281a71..fa1d6dc 100644
--- a/src/operator/image/image_random-inl.h
+++ b/src/operator/image/image_random-inl.h
@@ -31,6 +31,7 @@
#include <opencv2/core/mat.hpp>
#include "../mxnet_op.h"
#include "image_common.h"
+#include "operator/operator_common.h"
namespace mxnet {
@@ -41,32 +42,32 @@ enum ImageRandomResource { kRandom };
template<typename xpu>
static void RandomFlip(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
template<typename xpu>
static void ToTensor(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
template<typename xpu>
static void Normalize(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
struct RandomBrightnessParam : public dmlc::Parameter<RandomBrightnessParam> {
float max_brightness;
DMLC_DECLARE_PARAMETER(RandomBrightnessParam) {
DMLC_DECLARE_FIELD(max_brightness)
- .set_default(0.0)
- .describe("Max Brightness.");
+ .set_default(0.0)
+ .describe("Max Brightness.");
}
};
@@ -88,7 +89,7 @@ static void RandomBrightness(const nnvm::NodeAttrs &attrs,
const RandomBrightnessParam ¶m = nnvm::get<RandomBrightnessParam>(attrs.parsed);
float alpha_b = 1.0 + std::uniform_real_distribution<float>(-param.max_brightness, param.max_brightness)(prnd->GetRndEngine());
MSHADOW_TYPE_SWITCH(outputs[0].type_flag_, DType, {
- MXNET_ASSIGN_REQ_SWITCH(req[0], Req,{
+ MXNET_ASSIGN_REQ_SWITCH(req[0], Req, {
mxnet_op::Kernel<mxnet_op::op_with_req<mshadow::op::mul, Req>, xpu>::Launch(
s, inputs[0].Size(), outputs[0].dptr<DType>(), inputs[0].dptr<DType>(), DType(alpha_b));
});
@@ -100,8 +101,8 @@ struct RandomContrastParam : public dmlc::Parameter<RandomContrastParam> {
float max_contrast;
DMLC_DECLARE_PARAMETER(RandomContrastParam) {
DMLC_DECLARE_FIELD(max_contrast)
- .set_default(0.0)
- .describe("Max Contrast.");
+ .set_default(0.0)
+ .describe("Max Contrast.");
}
};
@@ -139,7 +140,7 @@ static void RandomContrast(const nnvm::NodeAttrs &attrs,
static const float coeffs0[] = { R2YF, G2YF, B2YF };
MSHADOW_TYPE_SWITCH(outputs[0].type_flag_, DType, {
- auto input_3d = input.FlatTo3D<xpu, DType>(s);
+ auto input_3d = input.get<xpu, 3, DType>(s);
DType sum = (DType)0.0;
for (int c = 0; c < channel; ++c) {
for (int h = 0; h < hight; ++h) {
@@ -160,36 +161,85 @@ static void RandomContrast(const nnvm::NodeAttrs &attrs,
}
+struct RandomSaturationParam : public dmlc::Parameter<RandomSaturationParam> {
+ float max_saturation;
+ DMLC_DECLARE_PARAMETER(RandomSaturationParam) {
+ DMLC_DECLARE_FIELD(max_saturation)
+ .set_default(0.0)
+ .describe("Max Saturation.");
+ }
+};
+
template<typename xpu>
static void RandomSaturation(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
+ using namespace mshadow;
+ auto input = inputs[0];
+ auto output = outputs[0];
+ int channel = input.shape_[0];
+ int hight = input.shape_[1];
+ int weight = input.shape_[2];
+ Stream<xpu> *s = ctx.get_stream<xpu>();
+ Random<xpu> *prnd = ctx.requested[kRandom].get_random<xpu, real_t>(s);
+ const RandomSaturationParam ¶m = nnvm::get<RandomSaturationParam>(attrs.parsed);
+ float alpha_s = 1.0 + std::uniform_real_distribution<float>(-param.max_saturation, param.max_saturation)(prnd->GetRndEngine());
+ float alpha_o = 1 - alpha_s;
+ const float R2YF = 0.299f;
+ const float G2YF = 0.587f;
+ const float B2YF = 0.114f;
+ static const float coeffs0[] = { R2YF, G2YF, B2YF };
+
+
+ MSHADOW_TYPE_SWITCH(outputs[0].type_flag_, DType, {
+ MXNET_ASSIGN_REQ_SWITCH(req[0], Req, {
+ auto input_3d = input.get<xpu, 3, DType>(s);
+ auto output_3d = output.get<xpu, 3, DType>(s);
+ switch (channel) {
+ case 1:
+ Assign(output_3d, Req, input_3d)
+ break;
+ case 3:
+ for (int h = 0; h < hight; ++h) {
+ for (int w = 0; w < weight; ++w) {
+ float gray = input_3d[0][h][w] * R2YF + input_3d[1][h][w] * G2YF + input_3d[2][h][w] * B2YF;
+ Assign(output_3d[0][h][w], Req, DType(gray * alpha_s + input_3d[0][h][w] * alpha_o))
+ }
+ }
+ break;
+ default:
+ LOG(FATAL) << "not support channel" << channel;
+
+ }
+ });
+ });
+
}
template<typename xpu>
static void RandomHue(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
template<typename xpu>
static void RandomColorJitter(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
template<typename xpu>
static void RandomLighting(const nnvm::NodeAttrs &attrs,
- const OpContext &ctx,
- const std::vector<TBlob> &inputs,
- const std::vector<OpReqType> &req,
- const std::vector<TBlob> &outputs) {
+ const OpContext &ctx,
+ const std::vector<TBlob> &inputs,
+ const std::vector<OpReqType> &req,
+ const std::vector<TBlob> &outputs) {
}
diff --git a/src/operator/image/image_random.cc b/src/operator/image/image_random.cc
index ade43d8..32648bb 100644
--- a/src/operator/image/image_random.cc
+++ b/src/operator/image/image_random.cc
@@ -49,5 +49,37 @@ NNVM_REGISTER_OP(_image_random_brightness)
.add_argument("data", "NDArray-or-Symbol", "The input.")
.add_arguments(RandomBrightnessParam::__FIELDS__());
+DMLC_REGISTER_PARAMETER(RandomContrastParam);
+NNVM_REGISTER_OP(_image_random_contrast)
+.describe(R"code()code" ADD_FILELINE)
+.set_num_inputs(1)
+.set_num_outputs(1)
+.set_attr_parser(ParamParser<RandomContrastParam>)
+.set_attr<FResourceRequest>("FResourceRequest", [](const NodeAttrs& attrs) {
+ return std::vector<ResourceRequest>{ResourceRequest::kRandom};
+})
+.set_attr<nnvm::FInferShape>("FInferShape", ElemwiseShape<1, 1>)
+.set_attr<nnvm::FInferType>("FInferType", ElemwiseType<1, 1>)
+.set_attr<FCompute>("FCompute<cpu>", RandomContrast<cpu>)
+.set_attr<nnvm::FGradient>("FGradient", ElemwiseGradUseNone{ "_copy" })
+.add_argument("data", "NDArray-or-Symbol", "The input.")
+.add_arguments(RandomContrastParam::__FIELDS__());
+
+DMLC_REGISTER_PARAMETER(RandomSaturationParam);
+NNVM_REGISTER_OP(_image_random_saturation)
+.describe(R"code()code" ADD_FILELINE)
+.set_num_inputs(1)
+.set_num_outputs(1)
+.set_attr_parser(ParamParser<RandomSaturationParam>)
+.set_attr<FResourceRequest>("FResourceRequest", [](const NodeAttrs& attrs) {
+ return std::vector<ResourceRequest>{ResourceRequest::kRandom};
+})
+.set_attr<nnvm::FInferShape>("FInferShape", ElemwiseShape<1, 1>)
+.set_attr<nnvm::FInferType>("FInferType", ElemwiseType<1, 1>)
+.set_attr<FCompute>("FCompute<cpu>", RandomSaturation<cpu>)
+.set_attr<nnvm::FGradient>("FGradient", ElemwiseGradUseNone{ "_copy" })
+.add_argument("data", "NDArray-or-Symbol", "The input.")
+.add_arguments(RandomSaturationParam::__FIELDS__());
+
}
}
diff --git a/src/operator/mxnet_op.h b/src/operator/mxnet_op.h
index e5c3b51..584ca0f 100644
--- a/src/operator/mxnet_op.h
+++ b/src/operator/mxnet_op.h
@@ -313,6 +313,12 @@ struct op_with_req {
KERNEL_ASSIGN(out[i], req, OP::Map(in[i], value));
}
+ /*! \brief input is tensor and two scalar value */
+ template<typename DType>
+ MSHADOW_XINLINE static void Map(int i, DType *out, const DType *in, const DType value_1, const DType value_2) {
+ KERNEL_ASSIGN(out[i], req, OP::Map(in[i], value_1, value_2));
+ }
+
/*! \brief No inputs (ie fill to constant value) */
template<typename DType>
MSHADOW_XINLINE static void Map(int i, DType *out) {
--
To stop receiving notification emails like this one, please contact
['"commits@mxnet.apache.org" <co...@mxnet.apache.org>'].