OpenCV部署CRNN文字识别

一、参考链接
1.模型获取及训练
2.github解答

二、模型转化(pytorch 转 ONNX)

import torch
import models.crnn as crnn

model = crnn.CRNN(32, 1, 37, 256)
model.load_state_dict(torch.load("crnn.pth"))

dummy_input = torch.randn(1, 1, 32, 100)
torch.onnx.export(model, dummy_input, "crnn.onnx")

import cv2
import numpy as np
net = cv2.dnn.readNet("crnn.onnx")
inp = np.random.standard_normal([1, 1, 32, 100]).astype(np.float32)
net.setInput(inp)
out = net.forward()
print(out.shape)

三、Opencv部署代码

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    dnn::Net net = dnn::readNet("crnn.onnx");
    Mat in = imread("test.jpg",0);
    in.convertTo(in,CV_32F,1.0/255);
    in -= 0.5;
    in /= 0.5;
    resize(in,in,Size(100, 32)); // fixed !
    Mat blob = dnn::blobFromImage(in);
    net.setInput(blob);
    Mat res = net.forward(); // 26 x 1 x 37
    string alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"; // 10 nums + 26 letters + 1 = 37

    for (size_t r = 0; r < res.size[0]; r++) {
        Mat slice = Mat(1,res.size[2],CV_32F,res.ptr<float>(r)); // 37 one-hot encoded pins
        Point p; double m;
        minMaxLoc(slice, 0, &m, 0, &p);
        char c = p.x>0 ? alphabet[p.x-1] : '-'; // '-' == no detection
        cout << r << "\t" << c << "\t" << p << "\t" << m << endl;
    }
    
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值