Skip to content

Commit db72ed2

Browse files
committed
add max_dimension to REST interface
1 parent 6145cba commit db72ed2

File tree

6 files changed

+151
-80
lines changed

6 files changed

+151
-80
lines changed

bin/image-net.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,10 +409,10 @@ int main(int argc, char** argv)
409409
for (i = 0; i < 13; i++)
410410
{
411411
layer_params[i].w.decay = 0.0005;
412-
layer_params[i].w.learn_rate = 0.00001;
412+
layer_params[i].w.learn_rate = 0.01;
413413
layer_params[i].w.momentum = 0.9;
414414
layer_params[i].bias.decay = 0;
415-
layer_params[i].bias.learn_rate = 0.00001;
415+
layer_params[i].bias.learn_rate = 0.01;
416416
layer_params[i].bias.momentum = 0.9;
417417
}
418418
layer_params[10].dor = 0.5;

lib/cuda/cwc_convnet.cu

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,8 +1701,8 @@ static void _cwc_convnet_batch_formation(gsl_rng* rng, ccv_array_t* categorizeds
17011701
ccv_dense_matrix_t* input = 0;
17021702
if (image->cols != dim.width || image->rows != dim.height)
17031703
{
1704-
int x = rng ? gsl_rng_uniform_int(rng, image->cols - dim.width + 1) : (image->cols - dim.width + 1) / 2;
1705-
int y = rng ? gsl_rng_uniform_int(rng, image->rows - dim.height + 1) : (image->rows - dim.height + 1) / 2;
1704+
int x = (image->cols - dim.width + 1) / 2;
1705+
int y = (image->rows - dim.height + 1) / 2;
17061706
assert(x == 0 || y == 0);
17071707
ccv_slice(image, (ccv_matrix_t**)&input, CCV_32F, y, x, dim.height, dim.width);
17081708
} else

serve/bbf.c

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,38 @@
77
static void uri_bbf_on_model_string(void* context, char* string);
88
static void uri_bbf_on_source_blob(void* context, ebb_buf data);
99

10+
typedef struct {
11+
ccv_bbf_param_t params;
12+
int max_dimension;
13+
} ccv_bbf_uri_param_t;
14+
1015
static const param_dispatch_t param_map[] = {
1116
{
1217
.property = "accurate",
1318
.type = PARAM_TYPE_BOOL,
14-
.offset = offsetof(ccv_bbf_param_t, accurate),
19+
.offset = offsetof(ccv_bbf_uri_param_t, params) + offsetof(ccv_bbf_param_t, accurate),
1520
},
1621
{
1722
.property = "interval",
1823
.type = PARAM_TYPE_INT,
19-
.offset = offsetof(ccv_bbf_param_t, interval),
24+
.offset = offsetof(ccv_bbf_uri_param_t, params) + offsetof(ccv_bbf_param_t, interval),
25+
},
26+
{
27+
.property = "max_dimension",
28+
.type = PARAM_TYPE_INT,
29+
.offset = offsetof(ccv_bbf_uri_param_t, max_dimension),
2030
},
2131
{
2232
.property = "min_neighbors",
2333
.type = PARAM_TYPE_INT,
24-
.offset = offsetof(ccv_bbf_param_t, min_neighbors),
34+
.offset = offsetof(ccv_bbf_uri_param_t, params) + offsetof(ccv_bbf_param_t, min_neighbors),
2535
},
2636
{
2737
.property = "model",
2838
.type = PARAM_TYPE_STRING,
2939
.on_string = uri_bbf_on_model_string,
3040
.offset = 0,
3141
},
32-
{
33-
.property = "size",
34-
.type = PARAM_TYPE_INT,
35-
.offset = offsetof(ccv_bbf_param_t, min_neighbors),
36-
},
3742
{
3843
.property = "source",
3944
.type = PARAM_TYPE_BODY,
@@ -50,15 +55,16 @@ typedef struct {
5055
typedef struct {
5156
param_parser_t param_parser;
5257
bbf_context_t* context;
53-
ccv_bbf_param_t params;
58+
ccv_bbf_uri_param_t params;
5459
ccv_bbf_classifier_cascade_t* cascade;
5560
ebb_buf source;
5661
} bbf_param_parser_t;
5762

5863
static void uri_bbf_param_parser_init(bbf_param_parser_t* parser)
5964
{
6065
param_parser_init(&parser->param_parser, param_map, sizeof(param_map) / sizeof(param_dispatch_t), &parser->params, parser);
61-
parser->params = ccv_bbf_default_params;
66+
parser->params.params = ccv_bbf_default_params;
67+
parser->params.max_dimension = 0;
6268
parser->cascade = 0;
6369
parser->source.data = 0;
6470
}
@@ -108,10 +114,10 @@ void* uri_bbf_detect_objects_init(void)
108114
assert(param_parser_map_alphabet(param_map, sizeof(param_map) / sizeof(param_dispatch_t)) == 0);
109115
context->desc = param_parser_map_http_body(param_map, sizeof(param_map) / sizeof(param_dispatch_t),
110116
"[{"
111-
"\"x\":\"integer\","
112-
"\"y\":\"integer\","
113-
"\"width\":\"integer\","
114-
"\"height\":\"integer\","
117+
"\"x\":\"number\","
118+
"\"y\":\"number\","
119+
"\"width\":\"number\","
120+
"\"height\":\"number\","
115121
"\"confidence\":\"number\""
116122
"}]");
117123
return context;
@@ -158,8 +164,16 @@ int uri_bbf_detect_objects(const void* context, const void* parsed, ebb_buf* buf
158164
free(parser);
159165
return -1;
160166
}
161-
ccv_array_t* seq = ccv_bbf_detect_objects(image, &parser->cascade, 1, parser->params);
162-
ccv_matrix_free(image);
167+
ccv_dense_matrix_t* resize = 0;
168+
if (parser->params.max_dimension > 0 && (image->rows > parser->params.max_dimension || image->cols > parser->params.max_dimension))
169+
{
170+
ccv_resample(image, &resize, 0, ccv_max(parser->params.max_dimension, (int)(image->rows * (float)parser->params.max_dimension / image->cols + 0.5)), ccv_max(parser->params.max_dimension, (int)(image->cols * (float)parser->params.max_dimension / image->rows + 0.5)), CCV_INTER_AREA);
171+
ccv_matrix_free(image);
172+
} else
173+
resize = image;
174+
ccv_array_t* seq = ccv_bbf_detect_objects(resize, &parser->cascade, 1, parser->params.params);
175+
float width = resize->cols, height = resize->rows;
176+
ccv_matrix_free(resize);
163177
if (seq == 0)
164178
{
165179
free(parser);
@@ -176,7 +190,7 @@ int uri_bbf_detect_objects(const void* context, const void* parsed, ebb_buf* buf
176190
{
177191
char cell[128];
178192
ccv_comp_t* comp = (ccv_comp_t*)ccv_array_get(seq, i);
179-
snprintf(cell, 128, "{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":%f}", comp->rect.x, comp->rect.y, comp->rect.width, comp->rect.height, comp->classification.confidence);
193+
snprintf(cell, 128, "{\"x\":%f,\"y\":%f,\"width\":%f,\"height\":%f,\"confidence\":%f}", comp->rect.x / width, comp->rect.y / height, comp->rect.width / width, comp->rect.height / height, comp->classification.confidence);
180194
size_t len = strnlen(cell, 128);
181195
while (buf->written + len + 1 >= buf->len)
182196
{

serve/dpm.c

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,26 @@
77
static void uri_dpm_on_model_string(void* context, char* string);
88
static void uri_dpm_on_source_blob(void* context, ebb_buf data);
99

10+
typedef struct {
11+
ccv_dpm_param_t params;
12+
int max_dimension;
13+
} ccv_dpm_uri_param_t;
14+
1015
static const param_dispatch_t param_map[] = {
1116
{
1217
.property = "interval",
1318
.type = PARAM_TYPE_INT,
14-
.offset = offsetof(ccv_dpm_param_t, interval),
19+
.offset = offsetof(ccv_dpm_uri_param_t, params) + offsetof(ccv_dpm_param_t, interval),
20+
},
21+
{
22+
.property = "max_dimension",
23+
.type = PARAM_TYPE_INT,
24+
.offset = offsetof(ccv_dpm_uri_param_t, max_dimension),
1525
},
1626
{
1727
.property = "min_neighbors",
1828
.type = PARAM_TYPE_INT,
19-
.offset = offsetof(ccv_dpm_param_t, min_neighbors),
29+
.offset = offsetof(ccv_dpm_uri_param_t, params) + offsetof(ccv_dpm_param_t, min_neighbors),
2030
},
2131
{
2232
.property = "model",
@@ -33,7 +43,7 @@ static const param_dispatch_t param_map[] = {
3343
{
3444
.property = "threshold",
3545
.type = PARAM_TYPE_FLOAT,
36-
.offset = offsetof(ccv_dpm_param_t, threshold),
46+
.offset = offsetof(ccv_dpm_uri_param_t, params) + offsetof(ccv_dpm_param_t, threshold),
3747
},
3848
};
3949

@@ -46,15 +56,16 @@ typedef struct {
4656
typedef struct {
4757
param_parser_t param_parser;
4858
dpm_context_t* context;
49-
ccv_dpm_param_t params;
59+
ccv_dpm_uri_param_t params;
5060
ccv_dpm_mixture_model_t* mixture_model;
5161
ebb_buf source;
5262
} dpm_param_parser_t;
5363

5464
static void uri_dpm_param_parser_init(dpm_param_parser_t* parser)
5565
{
5666
param_parser_init(&parser->param_parser, param_map, sizeof(param_map) / sizeof(param_dispatch_t), &parser->params, parser);
57-
parser->params = ccv_dpm_default_params;
67+
parser->params.params = ccv_dpm_default_params;
68+
parser->params.max_dimension = 0;
5869
parser->mixture_model = 0;
5970
parser->source.data = 0;
6071
}
@@ -107,16 +118,16 @@ void* uri_dpm_detect_objects_init(void)
107118
assert(param_parser_map_alphabet(param_map, sizeof(param_map) / sizeof(param_dispatch_t)) == 0);
108119
context->desc = param_parser_map_http_body(param_map, sizeof(param_map) / sizeof(param_dispatch_t),
109120
"[{"
110-
"\"x\":\"integer\","
111-
"\"y\":\"integer\","
112-
"\"width\":\"integer\","
113-
"\"height\":\"integer\","
121+
"\"x\":\"number\","
122+
"\"y\":\"number\","
123+
"\"width\":\"number\","
124+
"\"height\":\"number\","
114125
"\"confidence\":\"number\","
115126
"\"parts\":[{"
116-
"\"x\":\"integer\","
117-
"\"y\":\"integer\","
118-
"\"width\":\"integer\","
119-
"\"height\":\"integer\","
127+
"\"x\":\"number\","
128+
"\"y\":\"number\","
129+
"\"width\":\"number\","
130+
"\"height\":\"number\","
120131
"\"confidence\":\"number\""
121132
"}]"
122133
"}]");
@@ -165,8 +176,16 @@ int uri_dpm_detect_objects(const void* context, const void* parsed, ebb_buf* buf
165176
free(parser);
166177
return -1;
167178
}
168-
ccv_array_t* seq = ccv_dpm_detect_objects(image, &parser->mixture_model, 1, parser->params);
169-
ccv_matrix_free(image);
179+
ccv_dense_matrix_t* resize = 0;
180+
if (parser->params.max_dimension > 0 && (image->rows > parser->params.max_dimension || image->cols > parser->params.max_dimension))
181+
{
182+
ccv_resample(image, &resize, 0, ccv_max(parser->params.max_dimension, (int)(image->rows * (float)parser->params.max_dimension / image->cols + 0.5)), ccv_max(parser->params.max_dimension, (int)(image->cols * (float)parser->params.max_dimension / image->rows + 0.5)), CCV_INTER_AREA);
183+
ccv_matrix_free(image);
184+
} else
185+
resize = image;
186+
ccv_array_t* seq = ccv_dpm_detect_objects(resize, &parser->mixture_model, 1, parser->params.params);
187+
float width = resize->cols, height = resize->rows;
188+
ccv_matrix_free(resize);
170189
if (seq == 0)
171190
{
172191
free(parser);
@@ -183,7 +202,7 @@ int uri_dpm_detect_objects(const void* context, const void* parsed, ebb_buf* buf
183202
{
184203
char cell[128];
185204
ccv_root_comp_t* comp = (ccv_root_comp_t*)ccv_array_get(seq, i);
186-
snprintf(cell, 128, "{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":%f,\"parts\":[", comp->rect.x, comp->rect.y, comp->rect.width, comp->rect.height, comp->classification.confidence);
205+
snprintf(cell, 128, "{\"x\":%f,\"y\":%f,\"width\":%f,\"height\":%f,\"confidence\":%f,\"parts\":[", comp->rect.x / width, comp->rect.y / height, comp->rect.width / width, comp->rect.height / height, comp->classification.confidence);
187206
size_t len = strnlen(cell, 128);
188207
while (buf->written + len >= buf->len)
189208
{
@@ -194,7 +213,7 @@ int uri_dpm_detect_objects(const void* context, const void* parsed, ebb_buf* buf
194213
buf->written += len;
195214
for (j = 0; j < comp->pnum; j++)
196215
{
197-
snprintf(cell, 128, "{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":%f}", comp->part[j].rect.x, comp->part[j].rect.y, comp->part[j].rect.width, comp->part[j].rect.height, comp->part[j].classification.confidence);
216+
snprintf(cell, 128, "{\"x\":%f,\"y\":%f,\"width\":%f,\"height\":%f,\"confidence\":%f}", comp->part[j].rect.x / width, comp->part[j].rect.y / height, comp->part[j].rect.width / width, comp->part[j].rect.height / height, comp->part[j].classification.confidence);
198217
len = strnlen(cell, 128);
199218
while (buf->written + len + 3 >= buf->len)
200219
{

serve/icf.c

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,26 @@
77
static void uri_icf_on_model_string(void* context, char* string);
88
static void uri_icf_on_source_blob(void* context, ebb_buf data);
99

10+
typedef struct {
11+
ccv_icf_param_t params;
12+
int max_dimension;
13+
} ccv_icf_uri_param_t;
14+
1015
static const param_dispatch_t param_map[] = {
1116
{
1217
.property = "interval",
1318
.type = PARAM_TYPE_INT,
14-
.offset = offsetof(ccv_icf_param_t, interval),
19+
.offset = offsetof(ccv_icf_uri_param_t, params) + offsetof(ccv_icf_param_t, interval),
20+
},
21+
{
22+
.property = "max_dimension",
23+
.type = PARAM_TYPE_INT,
24+
.offset = offsetof(ccv_icf_uri_param_t, max_dimension),
1525
},
1626
{
1727
.property = "min_neighbors",
1828
.type = PARAM_TYPE_INT,
19-
.offset = offsetof(ccv_icf_param_t, min_neighbors),
29+
.offset = offsetof(ccv_icf_uri_param_t, params) + offsetof(ccv_icf_param_t, min_neighbors),
2030
},
2131
{
2232
.property = "model",
@@ -33,7 +43,7 @@ static const param_dispatch_t param_map[] = {
3343
{
3444
.property = "step_through",
3545
.type = PARAM_TYPE_INT,
36-
.offset = offsetof(ccv_icf_param_t, step_through),
46+
.offset = offsetof(ccv_icf_uri_param_t, params) + offsetof(ccv_icf_param_t, step_through),
3747
},
3848
};
3949

@@ -45,15 +55,16 @@ typedef struct {
4555
typedef struct {
4656
param_parser_t param_parser;
4757
icf_context_t* context;
48-
ccv_icf_param_t params;
58+
ccv_icf_uri_param_t params;
4959
ccv_icf_classifier_cascade_t* cascade;
5060
ebb_buf source;
5161
} icf_param_parser_t;
5262

5363
static void uri_icf_param_parser_init(icf_param_parser_t* parser)
5464
{
5565
param_parser_init(&parser->param_parser, param_map, sizeof(param_map) / sizeof(param_dispatch_t), &parser->params, parser);
56-
parser->params = ccv_icf_default_params;
66+
parser->params.params = ccv_icf_default_params;
67+
parser->params.max_dimension = 0;
5768
parser->cascade = 0;
5869
parser->source.data = 0;
5970
}
@@ -103,10 +114,10 @@ void* uri_icf_detect_objects_init(void)
103114
assert(param_parser_map_alphabet(param_map, sizeof(param_map) / sizeof(param_dispatch_t)) == 0);
104115
context->desc = param_parser_map_http_body(param_map, sizeof(param_map) / sizeof(param_dispatch_t),
105116
"[{"
106-
"\"x\":\"integer\","
107-
"\"y\":\"integer\","
108-
"\"width\":\"integer\","
109-
"\"height\":\"integer\","
117+
"\"x\":\"number\","
118+
"\"y\":\"number\","
119+
"\"width\":\"number\","
120+
"\"height\":\"number\","
110121
"\"confidence\":\"number\""
111122
"}]");
112123
return context;
@@ -153,8 +164,16 @@ int uri_icf_detect_objects(const void* context, const void* parsed, ebb_buf* buf
153164
free(parser);
154165
return -1;
155166
}
156-
ccv_array_t* seq = ccv_icf_detect_objects(image, &parser->cascade, 1, parser->params);
157-
ccv_matrix_free(image);
167+
ccv_dense_matrix_t* resize = 0;
168+
if (parser->params.max_dimension > 0 && (image->rows > parser->params.max_dimension || image->cols > parser->params.max_dimension))
169+
{
170+
ccv_resample(image, &resize, 0, ccv_max(parser->params.max_dimension, (int)(image->rows * (float)parser->params.max_dimension / image->cols + 0.5)), ccv_max(parser->params.max_dimension, (int)(image->cols * (float)parser->params.max_dimension / image->rows + 0.5)), CCV_INTER_AREA);
171+
ccv_matrix_free(image);
172+
} else
173+
resize = image;
174+
ccv_array_t* seq = ccv_icf_detect_objects(resize, &parser->cascade, 1, parser->params.params);
175+
float width = resize->cols, height = resize->rows;
176+
ccv_matrix_free(resize);
158177
if (seq == 0)
159178
{
160179
free(parser);
@@ -171,7 +190,7 @@ int uri_icf_detect_objects(const void* context, const void* parsed, ebb_buf* buf
171190
{
172191
char cell[128];
173192
ccv_comp_t* comp = (ccv_comp_t*)ccv_array_get(seq, i);
174-
snprintf(cell, 128, "{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":%f}", comp->rect.x, comp->rect.y, comp->rect.width, comp->rect.height, comp->classification.confidence);
193+
snprintf(cell, 128, "{\"x\":%f,\"y\":%f,\"width\":%f,\"height\":%f,\"confidence\":%f}", comp->rect.x / width, comp->rect.y / height, comp->rect.width / width, comp->rect.height / height, comp->classification.confidence);
175194
size_t len = strnlen(cell, 128);
176195
while (buf->written + len + 1 >= buf->len)
177196
{

0 commit comments

Comments
 (0)