77static void uri_dpm_on_model_string (void * context , char * string );
88static 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+
1015static 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 {
4656typedef 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
5464static 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 {
0 commit comments