Skip to content

Commit e9f8dfb

Browse files
authored
[cherry-pick] fix yolox cpp infer (#5805)
* fix yolox cpp infer * fix cpp infer order, test=document_fix
1 parent 1ee341b commit e9f8dfb

File tree

6 files changed

+55
-68
lines changed

6 files changed

+55
-68
lines changed

configs/yolox/_base_/yolox_reader.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ TrainReader:
2727
EvalReader:
2828
sample_transforms:
2929
- Decode: {}
30-
- Resize: {target_size: 640, keep_ratio: True}
31-
- Pad: {size: 640, fill_value: [114., 114., 114.]}
30+
- Resize: {target_size: [640, 640], keep_ratio: True, interp: 1}
31+
- Pad: {size: [640, 640], fill_value: [114., 114., 114.]}
3232
- Permute: {}
3333
batch_size: 4
3434

@@ -38,7 +38,7 @@ TestReader:
3838
image_shape: [3, 640, 640]
3939
sample_transforms:
4040
- Decode: {}
41-
- Resize: {target_size: 640, keep_ratio: True}
42-
- Pad: {size: 640, fill_value: [114., 114., 114.]}
41+
- Resize: {target_size: [640, 640], keep_ratio: True, interp: 1}
42+
- Pad: {size: [640, 640], fill_value: [114., 114., 114.]}
4343
- Permute: {}
4444
batch_size: 1

configs/yolox/yolox_nano_300e_coco.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ TrainReader:
6464
EvalReader:
6565
sample_transforms:
6666
- Decode: {}
67-
- Resize: {target_size: 416, keep_ratio: True}
68-
- Pad: {size: 416, fill_value: [114., 114., 114.]}
67+
- Resize: {target_size: [416, 416], keep_ratio: True, interp: 1}
68+
- Pad: {size: [416, 416], fill_value: [114., 114., 114.]}
6969
- Permute: {}
7070
batch_size: 8
7171

@@ -75,7 +75,7 @@ TestReader:
7575
image_shape: [3, 416, 416]
7676
sample_transforms:
7777
- Decode: {}
78-
- Resize: {target_size: 416, keep_ratio: True}
79-
- Pad: {size: 416, fill_value: [114., 114., 114.]}
78+
- Resize: {target_size: [416, 416], keep_ratio: True, interp: 1}
79+
- Pad: {size: [416, 416], fill_value: [114., 114., 114.]}
8080
- Permute: {}
8181
batch_size: 1

configs/yolox/yolox_tiny_300e_coco.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ TrainReader:
5252
EvalReader:
5353
sample_transforms:
5454
- Decode: {}
55-
- Resize: {target_size: 416, keep_ratio: True}
56-
- Pad: {size: 416, fill_value: [114., 114., 114.]}
55+
- Resize: {target_size: [416, 416], keep_ratio: True, interp: 1}
56+
- Pad: {size: [416, 416], fill_value: [114., 114., 114.]}
5757
- Permute: {}
5858
batch_size: 8
5959

@@ -63,7 +63,7 @@ TestReader:
6363
image_shape: [3, 416, 416]
6464
sample_transforms:
6565
- Decode: {}
66-
- Resize: {target_size: 416, keep_ratio: True}
67-
- Pad: {size: 416, fill_value: [114., 114., 114.]}
66+
- Resize: {target_size: [416, 416], keep_ratio: True, interp: 1}
67+
- Pad: {size: [416, 416], fill_value: [114., 114., 114.]}
6868
- Permute: {}
6969
batch_size: 1

deploy/cpp/include/preprocess_op.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,20 @@ class WarpAffine : public PreprocessOp {
161161
int pad_ = 31;
162162
};
163163

164+
class Pad : public PreprocessOp {
165+
public:
166+
virtual void Init(const YAML::Node& item) {
167+
size_ = item["size"].as<std::vector<int>>();
168+
fill_value_ = item["fill_value"].as<std::vector<float>>();
169+
}
170+
171+
virtual void Run(cv::Mat* im, ImageBlob* data);
172+
173+
private:
174+
std::vector<int> size_;
175+
std::vector<float> fill_value_;
176+
};
177+
164178
void CropImg(cv::Mat& img,
165179
cv::Mat& crop_img,
166180
std::vector<int>& area,
@@ -203,6 +217,8 @@ class Preprocessor {
203217
return std::make_shared<TopDownEvalAffine>();
204218
} else if (name == "WarpAffine") {
205219
return std::make_shared<WarpAffine>();
220+
}else if (name == "Pad") {
221+
return std::make_shared<Pad>();
206222
}
207223
std::cerr << "can not find function of OP: " << name
208224
<< " and return: nullptr" << std::endl;

deploy/cpp/src/preprocess_op.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,23 @@ void WarpAffine::Run(cv::Mat* im, ImageBlob* data) {
229229
};
230230
}
231231

232+
void Pad::Run(cv::Mat* im, ImageBlob* data) {
233+
int h = size_[0];
234+
int w = size_[1];
235+
int rh = im->rows;
236+
int rw = im->cols;
237+
if (h == rh && w == rw){
238+
data->in_net_im_ = im->clone();
239+
return;
240+
}
241+
cv::copyMakeBorder(
242+
*im, *im, 0, h - rh, 0, w - rw, cv::BORDER_CONSTANT, cv::Scalar(114));
243+
data->in_net_im_ = im->clone();
244+
data->in_net_shape_ = {
245+
static_cast<float>(im->rows), static_cast<float>(im->cols),
246+
};
247+
}
248+
232249
// Preprocessor op running order
233250
const std::vector<std::string> Preprocessor::RUN_ORDER = {"InitInfo",
234251
"TopDownEvalAffine",
@@ -237,6 +254,7 @@ const std::vector<std::string> Preprocessor::RUN_ORDER = {"InitInfo",
237254
"WarpAffine",
238255
"NormalizeImage",
239256
"PadStride",
257+
"Pad",
240258
"Permute"};
241259

242260
void Preprocessor::Run(cv::Mat* im, ImageBlob* data) {

deploy/python/preprocess.py

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -247,77 +247,30 @@ def __call__(self, im, im_info):
247247

248248

249249
class Pad(object):
250-
def __init__(self,
251-
size=None,
252-
size_divisor=32,
253-
pad_mode=0,
254-
offsets=None,
255-
fill_value=(127.5, 127.5, 127.5)):
250+
def __init__(self, size, fill_value=[114.0, 114.0, 114.0]):
256251
"""
257-
Pad image to a specified size or multiple of size_divisor.
252+
Pad image to a specified size.
258253
Args:
259-
size (int, Sequence): image target size, if None, pad to multiple of size_divisor, default None
260-
size_divisor (int): size divisor, default 32
261-
pad_mode (int): pad mode, currently only supports four modes [-1, 0, 1, 2]. if -1, use specified offsets
262-
if 0, only pad to right and bottom. if 1, pad according to center. if 2, only pad left and top
263-
offsets (list): [offset_x, offset_y], specify offset while padding, only supported pad_mode=-1
264-
fill_value (bool): rgb value of pad area, default (127.5, 127.5, 127.5)
254+
size (list[int]): image target size
255+
fill_value (list[float]): rgb value of pad area, default (114.0, 114.0, 114.0)
265256
"""
266257
super(Pad, self).__init__()
267258
if isinstance(size, int):
268259
size = [size, size]
269-
270-
assert pad_mode in [
271-
-1, 0, 1, 2
272-
], 'currently only supports four modes [-1, 0, 1, 2]'
273-
if pad_mode == -1:
274-
assert offsets, 'if pad_mode is -1, offsets should not be None'
275-
276260
self.size = size
277-
self.size_divisor = size_divisor
278-
self.pad_mode = pad_mode
279261
self.fill_value = fill_value
280-
self.offsets = offsets
281-
282-
def apply_image(self, image, offsets, im_size, size):
283-
x, y = offsets
284-
im_h, im_w = im_size
285-
h, w = size
286-
canvas = np.ones((h, w, 3), dtype=np.float32)
287-
canvas *= np.array(self.fill_value, dtype=np.float32)
288-
canvas[y:y + im_h, x:x + im_w, :] = image.astype(np.float32)
289-
return canvas
290262

291263
def __call__(self, im, im_info):
292264
im_h, im_w = im.shape[:2]
293-
if self.size:
294-
h, w = self.size
295-
assert (
296-
im_h <= h and im_w <= w
297-
), '(h, w) of target size should be greater than (im_h, im_w)'
298-
else:
299-
h = int(np.ceil(im_h / self.size_divisor) * self.size_divisor)
300-
w = int(np.ceil(im_w / self.size_divisor) * self.size_divisor)
301-
265+
h, w = self.size
302266
if h == im_h and w == im_w:
303267
im = im.astype(np.float32)
304268
return im, im_info
305269

306-
if self.pad_mode == -1:
307-
offset_x, offset_y = self.offsets
308-
elif self.pad_mode == 0:
309-
offset_y, offset_x = 0, 0
310-
elif self.pad_mode == 1:
311-
offset_y, offset_x = (h - im_h) // 2, (w - im_w) // 2
312-
else:
313-
offset_y, offset_x = h - im_h, w - im_w
314-
315-
offsets, im_size, size = [offset_x, offset_y], [im_h, im_w], [h, w]
316-
im = self.apply_image(im, offsets, im_size, size)
317-
318-
if self.pad_mode == 0:
319-
return im, im_info
320-
270+
canvas = np.ones((h, w, 3), dtype=np.float32)
271+
canvas *= np.array(self.fill_value, dtype=np.float32)
272+
canvas[0:im_h, 0:im_w, :] = im.astype(np.float32)
273+
im = canvas
321274
return im, im_info
322275

323276

0 commit comments

Comments
 (0)