| 2195 | } |
| 2196 | |
| 2197 | void ExtractPriorBoxParameters(const caffe::LayerParameter& src, XGraph& graph) |
| 2198 | { |
| 2199 | // Map the Caffe layer type to anonymoX layer type |
| 2200 | caffe::PriorBoxParameter src_parameter = src.prior_box_param(); |
| 2201 | mapStrStr::const_iterator it_type = CaffeLayerMap.find(src.type()); |
| 2202 | string xlayerType = it_type->second; |
| 2203 | |
| 2204 | // Parse the input/output connections |
| 2205 | checkNumberOfTopAndBottom(src, 2, 1); |
| 2206 | |
| 2207 | // Create new XLayer |
| 2208 | XLayer* dst = new XLayer(src.name(), xlayerType, src.top(0)); |
| 2209 | |
| 2210 | // min_size [MANDATORY] TODO : Currently one & only-one value of min_size is allowed |
| 2211 | ASSERT( src_parameter.min_size_size() > 0, EP043, "min_size is not specified for PriorBox Layer: " << src.name()) |
| 2212 | std::copy(src_parameter.min_size().begin(), src_parameter.min_size().end(), std::back_inserter(dst->priorbox_params->min_size)); |
| 2213 | |
| 2214 | // max_size [OPIONAL as per SSDv3. MANDATORY as per SSDv4]. What TODO? |
| 2215 | // ASSERT( src_parameter.max_size_size() > 0, EP044, "max_size is not specified for PriorBox Layer: " << src.name()) |
| 2216 | std::copy(src_parameter.max_size().begin(), src_parameter.max_size().end(), std::back_inserter(dst->priorbox_params->max_size)); |
| 2217 | |
| 2218 | // aspect_ratio [OPTIONAL] |
| 2219 | if(src_parameter.aspect_ratio_size() > 0) |
| 2220 | { |
| 2221 | std::copy(src_parameter.aspect_ratio().begin(), src_parameter.aspect_ratio().end(), std::back_inserter(dst->priorbox_params->aspect_ratio)); |
| 2222 | } |
| 2223 | |
| 2224 | // flip [OPTIONAL, default = true] |
| 2225 | dst->priorbox_params->flip = src_parameter.has_flip() ? src_parameter.flip() : true; |
| 2226 | |
| 2227 | // clip [OPTIONAL, default = false] |
| 2228 | dst->priorbox_params->clip = src_parameter.has_clip() ? src_parameter.clip() : false; |
| 2229 | |
| 2230 | // step [OPTIONAL as per SSDv3] |
| 2231 | ELOG( src_parameter.has_step() && (src_parameter.has_step_h() || src_parameter.has_step_w()), EP103, |
| 2232 | "Please specify either step or step_h/step_w for PriorBox Layer: " << src.name() << ". Not both.") |
| 2233 | // #. Check if only one of step_h and step_w is provided. |
| 2234 | ELOG( (src_parameter.has_step_h() != src_parameter.has_step_w()), EP104, |
| 2235 | "Please specify both step_h and step_w for PriorBox Layer: " << src.name()) |
| 2236 | ELOG( src_parameter.has_step() && src_parameter.step() <= 0, EP108, "step should be >0 for PriorBox Layer: " << src.name()) |
| 2237 | ELOG( src_parameter.has_step_h() && src_parameter.step_h() <= 0, EP109, "step_h should be >0 for PriorBox Layer: " << src.name()) |
| 2238 | ELOG( src_parameter.has_step_w() && src_parameter.step_w() <= 0, EP110, "step_w should be >0 for PriorBox Layer: " << src.name()) |
| 2239 | |
| 2240 | if(src_parameter.has_step()) |
| 2241 | { |
| 2242 | dst->priorbox_params->step = src_parameter.step(); |
| 2243 | dst->priorbox_params->step_h = src_parameter.step(); |
| 2244 | dst->priorbox_params->step_w = src_parameter.step(); |
| 2245 | } |
| 2246 | else if(src_parameter.has_step_h() && src_parameter.has_step_w()) |
| 2247 | { |
| 2248 | dst->priorbox_params->step = 0; |
| 2249 | dst->priorbox_params->step_h = src_parameter.step_h(); |
| 2250 | dst->priorbox_params->step_w = src_parameter.step_w(); |
| 2251 | } |
| 2252 | else |
| 2253 | { |
| 2254 | dst->priorbox_params->step = 0; |
no test coverage detected