|
|
@@ -26,7 +26,7 @@ std::map<std::string, int> interpolations = {{"LINEAR", cv::INTER_LINEAR},
|
|
|
{"CUBIC", cv::INTER_CUBIC},
|
|
|
{"LANCZOS4", cv::INTER_LANCZOS4}};
|
|
|
|
|
|
-bool Normalize::Run(cv::Mat* im, ImageBlob* data) {
|
|
|
+bool Normalize::Run(cv::Mat* im){
|
|
|
for (int h = 0; h < im->rows; h++) {
|
|
|
for (int w = 0; w < im->cols; w++) {
|
|
|
im->at<cv::Vec3f>(h, w)[0] =
|
|
|
@@ -40,7 +40,7 @@ bool Normalize::Run(cv::Mat* im, ImageBlob* data) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-bool CenterCrop::Run(cv::Mat* im, ImageBlob* data) {
|
|
|
+bool CenterCrop::Run(cv::Mat* im) {
|
|
|
int height = static_cast<int>(im->rows);
|
|
|
int width = static_cast<int>(im->cols);
|
|
|
if (height < height_ || width < width_) {
|
|
|
@@ -51,30 +51,30 @@ bool CenterCrop::Run(cv::Mat* im, ImageBlob* data) {
|
|
|
int offset_y = static_cast<int>((height - height_) / 2);
|
|
|
cv::Rect crop_roi(offset_x, offset_y, width_, height_);
|
|
|
*im = (*im)(crop_roi);
|
|
|
- data->new_im_size_[0] = im->rows;
|
|
|
- data->new_im_size_[1] = im->cols;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
|
|
|
-bool Resize::Run(cv::Mat* im, ImageBlob* data) {
|
|
|
- if (width_ <= 0 || height_ <= 0) {
|
|
|
- std::cerr << "[Resize] width and height should be greater than 0"
|
|
|
- << std::endl;
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (interpolations.count(interp_) <= 0) {
|
|
|
- std::cerr << "[Resize] Invalid interpolation method: '" << interp_ << "'"
|
|
|
- << std::endl;
|
|
|
- return false;
|
|
|
+float ResizeByShort::GenerateScale(const cv::Mat& im) {
|
|
|
+ int origin_w = im.cols;
|
|
|
+ int origin_h = im.rows;
|
|
|
+ int im_size_max = std::max(origin_w, origin_h);
|
|
|
+ int im_size_min = std::min(origin_w, origin_h);
|
|
|
+ float scale =
|
|
|
+ static_cast<float>(short_size_) / static_cast<float>(im_size_min);
|
|
|
+ if (max_size_ > 0) {
|
|
|
+ if (round(scale * im_size_max) > max_size_) {
|
|
|
+ scale = static_cast<float>(max_size_) / static_cast<float>(im_size_max);
|
|
|
+ }
|
|
|
}
|
|
|
- data->im_size_before_resize_.push_back({im->rows, im->cols});
|
|
|
- data->reshape_order_.push_back("resize");
|
|
|
+ return scale;
|
|
|
+}
|
|
|
|
|
|
- cv::resize(
|
|
|
- *im, *im, cv::Size(width_, height_), 0, 0, interpolations[interp_]);
|
|
|
- data->new_im_size_[0] = im->rows;
|
|
|
- data->new_im_size_[1] = im->cols;
|
|
|
+bool ResizeByShort::Run(cv::Mat* im) {
|
|
|
+ float scale = GenerateScale(*im);
|
|
|
+ int width = static_cast<int>(scale * im->cols);
|
|
|
+ int height = static_cast<int>(scale * im->rows);
|
|
|
+ cv::resize(*im, *im, cv::Size(width, height), 0, 0, cv::INTER_LINEAR);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -96,8 +96,8 @@ std::shared_ptr<Transform> Transforms::CreateTransform(
|
|
|
return std::make_shared<Normalize>();
|
|
|
} else if (transform_name == "CenterCrop") {
|
|
|
return std::make_shared<CenterCrop>();
|
|
|
- } else if (transform_name == "Resize") {
|
|
|
- return std::make_shared<Resize>();
|
|
|
+ } else if (transform_name == "ResizeByShort") {
|
|
|
+ return std::make_shared<ResizeByShort>();
|
|
|
} else {
|
|
|
std::cerr << "There's unexpected transform(name='" << transform_name
|
|
|
<< "')." << std::endl;
|
|
|
@@ -105,7 +105,7 @@ std::shared_ptr<Transform> Transforms::CreateTransform(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool Transforms::Run(cv::Mat* im, Blob::ptr data) {
|
|
|
+bool Transforms::Run(cv::Mat* im, Blob::Ptr blob) {
|
|
|
// 按照transforms中预处理算子顺序处理图像
|
|
|
if (to_rgb_) {
|
|
|
cv::cvtColor(*im, *im, cv::COLOR_BGR2RGB);
|
|
|
@@ -113,7 +113,7 @@ bool Transforms::Run(cv::Mat* im, Blob::ptr data) {
|
|
|
(*im).convertTo(*im, CV_32FC3);
|
|
|
|
|
|
for (int i = 0; i < transforms_.size(); ++i) {
|
|
|
- if (!transforms_[i]->Run(im, data)) {
|
|
|
+ if (!transforms_[i]->Run(im)) {
|
|
|
std::cerr << "Apply transforms to image failed!" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
@@ -121,7 +121,7 @@ bool Transforms::Run(cv::Mat* im, Blob::ptr data) {
|
|
|
|
|
|
// 将图像由NHWC转为NCHW格式
|
|
|
// 同时转为连续的内存块存储到Blob
|
|
|
- SizeVector blobSize = data_->getTensorDesc().getDims();
|
|
|
+ SizeVector blobSize = blob->getTensorDesc().getDims();
|
|
|
const size_t width = blobSize[3];
|
|
|
const size_t height = blobSize[2];
|
|
|
const size_t channels = blobSize[1];
|
|
|
@@ -132,7 +132,7 @@ bool Transforms::Run(cv::Mat* im, Blob::ptr data) {
|
|
|
for (size_t h = 0; h < height; h++) {
|
|
|
for (size_t w = 0; w < width; w++) {
|
|
|
blob_data[c * width * height + h * width + w] =
|
|
|
- im.at<cv::Vec3f>(h, w)[c];
|
|
|
+ im->at<cv::Vec3f>(h, w)[c];
|
|
|
}
|
|
|
}
|
|
|
}
|