改为json未成功
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了改为json未成功,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11037字,纯文字阅读大概需要16分钟。
内容图文
![改为json未成功](/upload/InfoBanner/zyjiaocheng/1048/3ae96032bc6e44d79173d20c45cff084.jpg)
// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <include/ocr_rec.h>
namespace PaddleOCR {
std::string ocrsts;
void CRNNRecognizer::Run(std::vector<std::vector<std::vector<int>>> boxes,
cv::Mat &img) {
cv::Mat srcimg;
img.copyTo(srcimg);
cv::Mat crop_img;
cv::Mat resize_img;
std::cout << "The predicted text is :" << std::endl;
int index = 0;
for (int i = boxes.size() - 1; i >= 0; i--) {
//根据位置框定字符区域
crop_img = GetRotateCropImage(srcimg, boxes[i]);
//长宽比例
float wh_ratio = float(crop_img.cols) / float(crop_img.rows);
//获取调整大小后的区域
this->resize_op_.Run(crop_img, resize_img, wh_ratio);
//规范化
this->normalize_op_.Run(&resize_img, this->mean_, this->scale_,
this->is_scale_);
//创建一维vector
std::vector<float> input(1 * 3 * resize_img.rows * resize_img.cols, 0.0f);
//数据由mat导入vector(1)
this->permute_op_.Run(&resize_img, input.data());
//创建copytensor,输入数据类型
auto input_names = this->predictor_->GetInputNames();
//声明输入数据首地址
auto input_t = this->predictor_->GetInputTensor(input_names[0]);
//数据类型变形[1,3,rows,cols]
input_t->Reshape({1, 3, resize_img.rows, resize_img.cols});
//获取cpu内的数据
input_t->copy_from_cpu(input.data());
//运行推理模型,对输入数据推理
this->predictor_->ZeroCopyRun();
//========================传出推理后的数据=======================
std::vector<int64_t> rec_idx;
//定义输出数据
auto output_names = this->predictor_->GetOutputNames();
auto output_t = this->predictor_->GetOutputTensor(output_names[0]);
auto rec_idx_lod = output_t->lod();
auto shape_out = output_t->shape();
//积累
int out_num = std::accumulate(shape_out.begin(), shape_out.end(), 1,
std::multiplies<int>());
rec_idx.resize(out_num);
output_t->copy_to_cpu(rec_idx.data());
std::vector<int> pred_idx;
for (int n = int(rec_idx_lod[0][0]); n < int(rec_idx_lod[0][1]); n++) {
pred_idx.push_back(int(rec_idx[n]));
}
if (pred_idx.size() < 1e-3)
continue;
//输出格式:1 T高 score: 0.126404
//对应参量:index label_list_[pred_idx[n]] "\tscore: " score
index += 1;
std::cout << index << "\t";
for (int n = 0; n < pred_idx.size(); n++) {
std::cout << label_list_[pred_idx[n]];
//赋值给输出数据
}
std::vector<float> predict_batch;
auto output_t_1 = this->predictor_->GetOutputTensor(output_names[1]);
auto predict_lod = output_t_1->lod();
auto predict_shape = output_t_1->shape();
int out_num_1 = std::accumulate(predict_shape.begin(), predict_shape.end(),
1, std::multiplies<int>());
predict_batch.resize(out_num_1);
output_t_1->copy_to_cpu(predict_batch.data());
int argmax_idx;
int blank = predict_shape[1];
float score = 0.f;
int count = 0;
float max_value = 0.0f;
//输出概率数值
for (int n = predict_lod[0][0]; n < predict_lod[0][1] - 1; n++) {
argmax_idx =
int(Utility::argmax(&predict_batch[n * predict_shape[1]],
&predict_batch[(n + 1) * predict_shape[1]]));
max_value =
float(*std::max_element(&predict_batch[n * predict_shape[1]],
&predict_batch[(n + 1) * predict_shape[1]]));
if (blank - 1 - argmax_idx > 1e-5) {
score += max_value;
count += 1;
}
}
score /= count;
std::cout << "\tscore: " << score << std::endl;
}
}
std::string CRNNRecognizer::Runone(std::vector<std::vector<std::vector<int>>> boxes,
cv::Mat &img) {
cv::Mat srcimg;
img.copyTo(srcimg);
cv::Mat crop_img;
cv::Mat resize_img;
//std::cout << "The predicted text is :" << std::endl;
int index = 0;
//输出字符串
std::string ocrstring;
ocrstring += "{";
for (int i = boxes.size() - 1; i >= 0; i--) {
//根据位置框定字符区域
string stricount = "1";
crop_img = GetRotateCropImage(srcimg, boxes[i]);
ocrstring += "\""+stricount+"\":{";
ocrstring += "\"Position\": {";
ocrstring += "\"Topleftcorner\": {";
ocrstring += "\"X\": \"";
ocrstring += to_string(boxes[i][0][0]); // 左上角X
ocrstring += "\",";
ocrstring += "\"Y\": \"";
ocrstring += to_string(boxes[i][0][1]);
ocrstring += "\"";
ocrstring += "},";
ocrstring += "\"Lowerrightcorner\": {";
ocrstring += "\"X\": \"";
ocrstring += to_string(boxes[i][3][0]);
ocrstring += "\",";
ocrstring += "\"Y\": \"";
ocrstring += to_string(boxes[i][3][1]);
ocrstring += "\"";
ocrstring += "}";
ocrstring += "},";
//长宽比例
float wh_ratio = float(crop_img.cols) / float(crop_img.rows);
//获取调整大小后的区域
this->resize_op_.Run(crop_img, resize_img, wh_ratio);
//规范化
this->normalize_op_.Run(&resize_img, this->mean_, this->scale_,
this->is_scale_);
//创建一维vector
std::vector<float> input(1 * 3 * resize_img.rows * resize_img.cols, 0.0f);
//数据由mat导入vector(1)
this->permute_op_.Run(&resize_img, input.data());
//创建copytensor,输入数据类型
auto input_names = this->predictor_->GetInputNames();
//声明输入数据首地址
auto input_t = this->predictor_->GetInputTensor(input_names[0]);
//数据类型变形[1,3,rows,cols]
input_t->Reshape({ 1, 3, resize_img.rows, resize_img.cols });
//获取cpu内的数据
input_t->copy_from_cpu(input.data());
//运行推理模型,对输入数据推理
this->predictor_->ZeroCopyRun();
//========================传出推理后的数据=======================
std::vector<int64_t> rec_idx;
//定义输出数据
auto output_names = this->predictor_->GetOutputNames();
auto output_t = this->predictor_->GetOutputTensor(output_names[0]);
auto rec_idx_lod = output_t->lod();
auto shape_out = output_t->shape();
//积累
int out_num = std::accumulate(shape_out.begin(), shape_out.end(), 1,
std::multiplies<int>());
rec_idx.resize(out_num);
output_t->copy_to_cpu(rec_idx.data());
std::vector<int> pred_idx;
for (int n = int(rec_idx_lod[0][0]); n < int(rec_idx_lod[0][1]); n++) {
pred_idx.push_back(int(rec_idx[n]));
}
if (pred_idx.size() < 1e-3) {
ocrstring += "}";
continue;
}
//输出格式:1 T高 score: 0.126404
//对应参量:index label_list_[pred_idx[n]] "\tscore: " score
index += 1;
//sstd::cout << index << "\t";
ocrstring += " \"Content\": \" ";
for (int n = 0; n < pred_idx.size(); n++) {
//std::cout << label_list_[pred_idx[n]];
//赋值给输出数据
//words.push_back(label_list_[pred_idx[n]]);
std::string word = label_list_[pred_idx[n]];
ocrstring += word;
ocrsts = word;
}
ocrstring += " \",";
//words.push_back("\n");
//ocrstring += "/t";
//words.push_back(ocrstring);
std::vector<float> predict_batch;
auto output_t_1 = this->predictor_->GetOutputTensor(output_names[1]);
auto predict_lod = output_t_1->lod();
auto predict_shape = output_t_1->shape();
int out_num_1 = std::accumulate(predict_shape.begin(), predict_shape.end(),
1, std::multiplies<int>());
predict_batch.resize(out_num_1);
output_t_1->copy_to_cpu(predict_batch.data());
int argmax_idx;
int blank = predict_shape[1];
float score = 0.f;
int count = 0;
float max_value = 0.0f;
//输出概率数值
for (int n = predict_lod[0][0]; n < predict_lod[0][1] - 1; n++) {
argmax_idx =
int(Utility::argmax(&predict_batch[n * predict_shape[1]],
&predict_batch[(n + 1) * predict_shape[1]]));
max_value =
float(*std::max_element(&predict_batch[n * predict_shape[1]],
&predict_batch[(n + 1) * predict_shape[1]]));
if (blank - 1 - argmax_idx > 1e-5) {
score += max_value;
count += 1;
}
}
score /= count;
/* ostringstream oss;
oss << score;
string str(oss.str());*/
ocrstring += " \"Probability\" : \"";
ocrstring += to_string(score);
ocrstring += "\" ";
ocrstring += "}";
//scores.push_back( score);
//std::cout << words[1][1]<<"\n";
//std::cout << "=========================" << "\n";
//std::cout << scores[i]<<"\n";
//std::cout << "******************************" << "\n";
//std::cout << "string=" << ocrstring << "\n";
//std::cout << "++++++++++++++++++++++++++++++" << "\n";
//std::cout << "\tscore: " << score << std::endl;
ocrstring += ocrsts;
}
//std::cout <<"string="<< ocrstring.c_str()<<"\n";
ocrstring += "}";
return ocrstring;
}
void CRNNRecognizer::LoadModel(const std::string &model_dir) {
AnalysisConfig config;
config.SetModel(model_dir + "/model", model_dir + "/params");
if (this->use_gpu_) {
config.EnableUseGpu(this->gpu_mem_, this->gpu_id_);
} else {
config.DisableGpu();
if (this->use_mkldnn_) {
config.EnableMKLDNN();
}
config.SetCpuMathLibraryNumThreads(this->cpu_math_library_num_threads_);
}
// false for zero copy tensor
config.SwitchUseFeedFetchOps(false);
// true for multiple input
config.SwitchSpecifyInputNames(true);
config.SwitchIrOptim(true);
config.EnableMemoryOptim();
config.DisableGlogInfo();
this->predictor_ = CreatePaddlePredictor(config);
}
cv::Mat CRNNRecognizer::GetRotateCropImage(const cv::Mat &srcimage,
std::vector<std::vector<int>> box) {
cv::Mat image;
srcimage.copyTo(image);
std::vector<std::vector<int>> points = box;
int x_collect[4] = {box[0][0], box[1][0], box[2][0], box[3][0]};
int y_collect[4] = {box[0][1], box[1][1], box[2][1], box[3][1]};
int left = int(*std::min_element(x_collect, x_collect + 4));
int right = int(*std::max_element(x_collect, x_collect + 4));
int top = int(*std::min_element(y_collect, y_collect + 4));
int bottom = int(*std::max_element(y_collect, y_collect + 4));
cv::Mat img_crop;
image(cv::Rect(left, top, right - left, bottom - top)).copyTo(img_crop);
for (int i = 0; i < points.size(); i++) {
points[i][0] -= left;
points[i][1] -= top;
}
int img_crop_width = int(sqrt(pow(points[0][0] - points[1][0], 2) +
pow(points[0][1] - points[1][1], 2)));
int img_crop_height = int(sqrt(pow(points[0][0] - points[3][0], 2) +
pow(points[0][1] - points[3][1], 2)));
cv::Point2f pts_std[4];
pts_std[0] = cv::Point2f(0., 0.);
pts_std[1] = cv::Point2f(img_crop_width, 0.);
pts_std[2] = cv::Point2f(img_crop_width, img_crop_height);
pts_std[3] = cv::Point2f(0.f, img_crop_height);
cv::Point2f pointsf[4];
pointsf[0] = cv::Point2f(points[0][0], points[0][1]);
pointsf[1] = cv::Point2f(points[1][0], points[1][1]);
pointsf[2] = cv::Point2f(points[2][0], points[2][1]);
pointsf[3] = cv::Point2f(points[3][0], points[3][1]);
cv::Mat M = cv::getPerspectiveTransform(pointsf, pts_std);
cv::Mat dst_img;
cv::warpPerspective(img_crop, dst_img, M,
cv::Size(img_crop_width, img_crop_height),
cv::BORDER_REPLICATE);
if (float(dst_img.rows) >= float(dst_img.cols) * 1.5) {
cv::Mat srcCopy = cv::Mat(dst_img.rows, dst_img.cols, dst_img.depth());
cv::transpose(dst_img, srcCopy);
cv::flip(srcCopy, srcCopy, 0);
return srcCopy;
} else {
return dst_img;
}
}
} // namespace PaddleOCR
原文:https://www.cnblogs.com/qq2806933146xiaobai/p/13385242.html
内容总结
以上是互联网集市为您收集整理的改为json未成功全部内容,希望文章能够帮你解决改为json未成功所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。