当前位置: 首页 > news >正文

宁波大型网站建设网站域名注册申请

宁波大型网站建设,网站域名注册申请,wordpress 如何调试,深圳网站建设类公司文章目录 前言安装安装 pytorch安装 libtorch安装 opencv#xff08;C#xff09; 准备数据集获取训练数据下载标定 编码预分析 数据集封装格式 神经网络搭建神经网络训练神经网络测试神经网络预测C 移植模型转换通过跟踪转换为 Torch Script通过注解转换为 Torch Script 编写… 文章目录 前言安装安装 pytorch安装 libtorch安装 opencvC 准备数据集获取训练数据下载标定 编码预分析 数据集封装格式 神经网络搭建神经网络训练神经网络测试神经网络预测C 移植模型转换通过跟踪转换为 Torch Script通过注解转换为 Torch Script 编写 C 代码编译环境搭建C 库管理方法一手动配置 visual studio 环境方法二cmake 配置环境 python 调用 C 程序 前言 训练和测试验证码来自中南大学教务系统登录验证码http://csujwc.its.csu.edu.cn/ 部分代码参考自该 github 项目dee1024/pytorch-captcha-recognition 标记好的训练数据 链接https://pan.baidu.com/s/1xGmvY8FuKm9jP2HW48wI3A 提取码fana 训练好的神经网络模型 TrainNetwork.py 得到的模型 链接https://pan.baidu.com/s/1-cZCLNuYs-1MOu1NI42UOw 提取码4wsv 环境 操作系统Windows 10CPUIntel i5-9300GPUGTX 1650深度学习框架pytorch 1.6libtorch 1.6CUDA 11python 3.8opencv 4.4.0Cvisual studio 2019 安装 安装 pytorch pytorch 是 torch 的 python 版本也是我们常用的深度学习框架。 首先进入官网https://pytorch.org/ 在安装栏根据自己的环境配置选择相应的 pytorch 版本获得安装指令。 例如 Windows 的 pip 安装在命令行输入 pip install torch1.6.0 torchvision0.7.0 -f https://download.pytorch.org/whl/torch_stable.html后回车等待一段时间即可完成安装。 如何查看 CUDA 版本 如果是英伟达的显卡打开英伟达显卡的控制面板。点击 系统信息 - 组件即可看到 CUDA 版本。 例如我的电脑的 CUDA 版本为 11.0.228但是安装低版本 CUDA (10.1) 的 pytorch 也同样可以使用。 安装 libtorch libtorch 是 torch 的 C 版本。libtorch 的版本必须与 pytorch 一致 同样是 pytorch 的安装栏Package 选择 libtorchLangugae 选择 C/Java。 获得如下的下载链接 我选择的是 Release version点击相应链接下载完毕后解压在合适的目录下。 安装 opencvC opencv 主要用来进行 C 程序的图像处理。 和 libtorch 安装类似在下载页面 https://opencv.org/releases/ 选择相应的操作系统。例如选择 Windows 系统跟随安装程序选择合适的安装目录即可完成安装。 准备 该项目使用到的需要额外安装的 python 库 numpyrequestsmatplotlib绘图skimage负责图像处理 新建一个目录在目录下新建 TrainImages 目录存放训练数据TestImages 目录存放检验数据Network.py神经网络定义code.py编码规则Dataset.py数据集定义TrainNetwork.py神经网络训练TestNetwork.py神经网络测试 数据集 获取训练数据 下载 采用 python 脚本进行批量下载下载的图片用时间戳命名。 提供一个下载脚本将其复制到项目的主目录再运行 import requests import timeCaptchaUrl http://csujwc.its.csu.edu.cn/verifycode.servlet root .\\TrainImages\\ #图片保存目录 DownloadNumber 0def GetOneCaptcha(time_label):global DownloadNumbertry:r requests.get(CaptchaUrl)r.raise_for_status()with open(root _ time_label .png,wb) as f:f.write(r.content)DownloadNumber DownloadNumber 1except:passdef Download(CaptchaNumber):while(DownloadNumber CaptchaNumber):GetOneCaptcha(str(int(time.time()*1000)))print(已下载 {0:4} 个.format(DownloadNumber),end \r)print(\n下载完毕)if __name__ __main__: Download(100) #下载100张标定 人工标记自己标定了600多张眼睛都要花了标记的效果大概这样 编码 预分析 经过大量验证码数据分析可以得出中南大学教务系统验证码具有如下规律 包含四个字符字符分为小写英文字母和数字数字包括 123英文字母包括 bcmnvxz 所以神经网络需要对一个字符作十分类总共四个字符输出包含四十个元素的一维特征向量。 端对端神经网络输入图片直接输出结果输出的每10个元素中最大的代表概率最大为神经网络的预测字符。 code.py 文件内容如下负责 array 类型和字符串类型的转换。 import numpy as npchar_table [1, 2, 3, b, c, m, n, v, x, z]def encode(raw_string): # 编码out_code np.zeros(40)for i, c in enumerate(raw_string):out_code[i * 10 char_table.index(c)] 1return out_codedef decode(raw_code): # 解码out_string raw_code raw_code.reshape(4, 10)raw_code np.argmax(raw_code, 1)for i in raw_code:out_string char_table[i]return out_string例程 string mn3z code encode(string) string decode(code) print(code) print(string)运行结果 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0.0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] mn3z数据集封装格式 Dataset.py 文件内容如下自己定义的数据集需要继承 pytorch 的 torch.utils.data.Dataset 类而且必须重写 __len__ 和 __getitem__ 方法。 __init__folder 参数为数据集所在的目录名称transform 参数为数据的变换方式这里为转换Tensor 类型。 train_image_file_paths 为含有目录内所有图片路径的列表。 __len__获取数据集长度。根据前面的获取的train_image_file_paths 即可知道数据集长度。 __getitem__根据索引获取数据类似于列表。返回包含 Tensor 类型数据的元组。 skimage.io.imread() 为 skimage 库的图像读取函数as_grey 参数表示是否转换为灰度图即图片三通道转单通道。 skimage.transform.resize()为 skimage 库的图像变形函数在这里图像被变形为 45x45 大小。 注意如果使用其他图像处理库例如 Pillow的图像变形函数得出的图像可能不一样最好在训练测试预测时统一使用一个图像处理库。 label 为图片的标签编码例如图片 1b13_1589636262331.png 通过 split(_)[0] 即可得到标签在经过前面提到的 encode() 函数编码。 输出的 Tensor 类型数据通过 .float() 方法全部转为浮点型。 torch.utils.data.Dataloader 为 pytorch 的数据集装载方法数据集必须经过装载才能输入进神经网络。batch_size 参数为小批量训练每批的大小pytorch 采用小批量训练shuffle 参数表示是否打乱数据集。 get_train_data_loader() 和 get_test_data_loader() 函数用来获取训练集和测试集通过 batch_size 参数定义批量大小。 import os import torch from torch.utils.data import DataLoader,Dataset import torchvision.transforms as transforms from skimage import io,transform import codeclass mydataset(Dataset):def __init__(self, folder, transformNone):self.train_image_file_paths [os.path.join(folder, image_file) for image_file in os.listdir(folder)] #获取含有目录内所有图片路径的列表self.transform transformdef __len__(self):return len(self.train_image_file_paths)def __getitem__(self, idx):image_root self.train_image_file_paths[idx] #图片路径image_name image_root.split(os.path.sep)[-1] #图片名称image io.imread(image_root,as_gray True) #读取图片并转为灰度图image transform.resize(image,(45,45)) #将图片转为 45x45 大小if self.transform is not None:image self.transform(image) #转换图片label code.encode(image_name.split(_)[0]) #编码return image.float(), torch.from_numpy(label).float()Transform transforms.Compose([transforms.ToTensor() #转换为 Tensor 类型 ])def get_train_data_loader(batch_size 16): #获取训练集dataset mydataset(.\\TrainImages, transform Transform)return DataLoader(dataset, batch_size, shuffle True)def get_test_data_loader(batch_size 1): #获取测试集dataset mydataset(.\\TestImages, transform Transform)return DataLoader(dataset, batch_size, shuffle True)神经网络搭建 神经网络的总体结构如图为典型的 CNN 网络。 该 CNN 网络部分结构与 AlexNet 相似输入N x 45 x 45N 为输入图片个数的灰度图像前向环节按照从左到右顺序分别是卷积层池化层卷积层池化层全连接层。其中图像经过卷积层后还要经过批归一化经过池化层后采用 ReLU 作为激活函数。在训练时加入了 Dropout 环节以增强神经网络的泛化能力。 输出 N x 40N 为输入图片个数one - hot 标签每 10 个元素为一组代表一个字符,这 10 个元素代表了每个类别的概率后续需要经过处理来输出最终的结果。 Network.py 文件内容如下自己定义的神经网络需要继承 pytorch 的 torch.nn.Module 类。而且必须重写 __init__ 和 forward 方法。 __init__负责神经网络的初始化num_class 和 num_char 分别为字符种类数和字符个数由上分析可知分别为 10 和 4。下面的一些方法涉及到深度学习的知识最好有相关的基础。 torch.nn.Sequential()pytorch 的一个封装神经网络环节的方法。 torch.nn.Conv2d()卷积层。 torch.nn.BatchNorm2d()批归一化层。 请参考该博客https://blog.csdn.net/vict_wang/article/details/88075861 torch.nn.Dropout(0.5) 在 Dropout 环节中神经网络将每个隐藏神经元的输出设置为零概率为 0.5。 以这种方式“脱落”的神经元不会对前向传播做出贡献也不会参与反向传播。 因此每次出现输入时神经网络都会对不同的体系结构进行采样但是所有这些体系结构都会共享权重。由于神经元不能依靠特定其他神经元的存在因此该技术减少了神经元的复杂共适应。 因此它被迫学习更强大的功能这些功能可与其他神经元的许多不同随机子集结合使用。 torch.nn.MaxPool2d() 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出最大池化函数给出相邻矩形区域内的最大值。不管采用什么样的池化函数当输入作出少量平移时池化能够帮助输入的表示近似不变。对于平移的不变性是指当我们对输入进行少量平移时经过池化函数后的大多数输出并不会发生改变。 torch.nn.RELU() 在神经网络中线性整流作为神经元的激活函数定义了该神经元在线性变换之后的非线性输出结果。换言之对于进入神经元的来自上一层神经网络的输入向量使用线性整流激活函数的神经元会输出 m a x ( 0 , w T x b ) max(0,w^Txb) max(0,wTxb) 至下一层神经元或作为整个神经网络的输出取决现神经元在网络结构中所处位置。 torch.nn.Linear 全连接层在整个卷积神经网络中起到 “分类器”的作用。全连接层连接前面卷积池化后得到的所有特征将输出值赋予分类器。 forward神经网络的前向传播正是通过该方法神经网络把输入进的图片数据转换为输出向量即识别结果。pytorch 要求输入的数据维度为 N x C x H x WN输入的图片个数C图片的通道数。 #神经网络定义import torch import torch.nn as nnclass Net(nn.Module):def __init__(self,num_class 10,num_char 4):super(Net,self).__init__()self.num_class num_class #标签个数self.num_char num_char #字符个数self.conv1 nn.Sequential(nn.Conv2d(1,16,6),nn.BatchNorm2d(16),nn.Dropout(0.5),nn.MaxPool2d(2,2),nn.ReLU())self.conv2 nn.Sequential(nn.Conv2d(16,8,3),nn.BatchNorm2d(8),nn.Dropout(0.5),nn.MaxPool2d(2,2),nn.ReLU())self.fc nn.Linear(8*9*9,self.num_class*self.num_char)def forward(self,x):x self.conv1(x)x self.conv2(x)x x.view(x.size(0),-1)x self.fc(x)return x神经网络训练 TrainNetwork.py 文件内容如下负责神经网络的训练。 num_epochs训练轮数即重复输入训练集的次数。 learning_rate学习率梯度下降法里的重要参数越小梯度下降越慢太大会导致神经网络发散。 torch.devicepytorch 的设备设置表示数据是在 CPU 上计算还是在 GPU 上计算。 通过 device torch.device(cuda if torch.cuda.is_available() else cpu) 获取电脑的可用设备。 通过 .to(device) 方法将数据或神经网络模型移动到设定好的设备上例如移动到 GPU 上就可以加快神经网络的训练速度。 训练时要将神经网络置于训练模式.train()此时神经网络的 Dropout 环节会开启。 torch.nn.MultiLabelSoftMarginLoss多标签分类损失函数参数为神经网络的预测标签和图片实际标签。通过预测出的数据和实际数据的差异计算出损失值损失值代表了神经网络预测的准确性。越小神经网络在数据集上的准确性表现得越好。 数学形式如下 l o s s ( x , y ) − ∑ i y [ i ] ∗ log ⁡ ( ( 1 e x p ( − x [ i ] ) ) − 1 ) ( 1 − y [ i ] ) ∗ log ⁡ ( e x p ( − x [ i ] ) 1 e x p ( − x [ i ] ) ) ) loss(x,y)-\sum_i{y[i]*\log{((1exp(-x[i]))^{-1})}}(1-y[i])*\log{}(\frac{exp(-x[i])}{1exp(-x[i])})) loss(x,y)−i∑​y[i]∗log((1exp(−x[i]))−1)(1−y[i])∗log(1exp(−x[i])exp(−x[i])​)) torch.optim.AdamAdam 优化算法参数为神经网络的参数 cnn.parameters() 和学习率 learning_rate pytorch 可以自动进行梯度计算。神经网络每进行一次损失值计算优化器清空保存的梯度然后执行后向传播得到新的梯度并基于此执行优化算法。 请参考该博客https://www.cnblogs.com/yifdu25/p/8183587.html torch.save(cnn.state_dict(), .\\model.pt)保存神经网络的部分数据 import torch import torch.nn as nn from torch.autograd import Variable import Dataset import code from Network import Net#训练参数 num_epochs 30 #训练轮数 learning_rate 0.001 #学习率def main():device torch.device(cuda if torch.cuda.is_available() else cpu)cnn Net() #初始化神经网络cnn.to(device) cnn.train() #训练模式print(初始化神经网络)criterion nn.MultiLabelSoftMarginLoss() #损失函数optimizer torch.optim.Adam(cnn.parameters(), lrlearning_rate) #优化器#训练神经网络train_dataloader Dataset.get_train_data_loader(batch_size16)for epoch in range(num_epochs):for i, (images, labels) in enumerate(train_dataloader):images Variable(images).to(device)labels Variable(labels.float()).to(device)predict_labels cnn(images)loss criterion(predict_labels, labels)optimizer.zero_grad()loss.backward()optimizer.step()if (i1) % 10 0:print(当前轮数, epoch, 当前步数, i, 损失值, loss.item())if (i1) % 20 0:torch.save(cnn.state_dict(), .\\model.pt)print(保存模型)torch.save(cnn.state_dict(), .\\model.pt)print(保存最后的模型)if __name__ __main__:main()运行结果 初始化神经网络 当前轮数 0 当前步数 9 损失值 0.3719463050365448 当前轮数 0 当前步数 19 损失值 0.3350425958633423 保存模型 当前轮数 0 当前步数 29 损失值 0.30613207817077637 ……………… 当前轮数 29 当前步数 9 损失值 0.006565847899764776 当前轮数 29 当前步数 19 损失值 0.002701024990528822 保存模型 当前轮数 29 当前步数 29 损失值 0.005611632019281387 保存最后的模型神经网络测试 TestNetwork.py 文件内容如下负责神经网络训练后的测试。 将神经网络的输出标签和图片实际标签比较得出神经网络的识别是否正确在比较时需要通过 code.decode(predict_label.data.numpy()) 将神经网络的输出结果Tensor 类型转换字符串形式。 测试时要将神经网络置于计算模式.eval()此时神经网络的 Dropout 环节会关闭。 import torch import Dataset from Network import Net import codedef test_network(dataloader):net Net() #初始化神经网络net.load_state_dict(torch.load(.\\model.pt)) #加载模型net.eval() #计算模式output_list [] #存放预测结果for i, (image, label) in enumerate(dataloader):predict_label net(image)label code.decode(label.data.numpy())predict_label code.decode(predict_label.data.numpy())if predict_label label:output_list.append(1)else:output_list.append(0)if (i1)%10 0:acc sum(output_list) / len(output_list)print({} 张正确率{} %.format(i1,acc*100))acc sum(output_list) / len(output_list)print(总正确率{} %.format(acc*100))if __name__ __main__:test_network(Dataset.get_test_data_loader(batch_size1))#获取测试集 运行结果 10 张正确率100.0 % 20 张正确率100.0 % 30 张正确率100.0 % ……………… 170 张正确率98.82352941176471 % 180 张正确率98.88888888888889 % 190 张正确率98.94736842105263 % 200 张正确率99.0 % 总正确率99.0 %可以看到正确率已经非常高了。 神经网络预测 由于有现成的验证码 URL所以采用在线预测。提供一个预测脚本 # pytorch 预测import torch from skimage import io,transform,color from Network import Net import matplotlib.pyplot as plt import codedef predict(img_path): net Net()net.load_state_dict(torch.load(.\\model.pt))net.eval()for i in range(25):img io.imread(img_path)plt.subplot(5,5,i1)plt.imshow(img)img color.rgb2gray(img)img transform.resize(img,(45,45))img torch.from_numpy(img).float().view(1,1,45,45)out net(img).view(1,-1).data.numpy()output code.decode(out)plt.title(output)plt.axis(off)plt.show()if __name__ __main__: predict(http://csujwc.its.csu.edu.cn/verifycode.servlet)神经网络输入单个图片时同样也要进行图像处理转换为 1 x 1 x 45 x 45 的维度。 这里调用了 matplotlib 库来同时显示图片和预测结果。 预测结果如下 C 移植 pytorch 进行神经网络的搭建和训练固然很方便但是当部署到实际中来时就显得效率一般。例如网络爬虫需要识别验证码以进行登录运行 python 程序的话光是加载 torch 库就要花一段时间这对于不需要一次进行大量图片识别的网络爬虫是一种拖累。所以需要编写 C 程序来加载神经网路模型以提高程序运行的效率。 部分来自官方教程https://pytorch.org/tutorials/advanced/cpp_export.html 模型转换 pytorch 提供了一种统一的模型描述语言 Torch Script 供其他编程语言程序加载下面介绍两种将我们训练出来的模型转换为 Torch Script 的方法也可以参考这篇博客https://blog.csdn.net/xxradon/article/details/86504906 通过跟踪转换为 Torch Script 将模型的实例以及示例输入传递给 torch.jit.trace 函数。 这个方法适用于对任意类型输入有固定格式输出的神经网络。 import torch from Network import Netnet Net() net.load_state_dict(torch.load(.\\model.pt)) example torch.rand(1, 1, 45, 45) scrpit_net torch.jit.trace(net,example) script_net.save(.\\model_script.pt)跟踪器有可能生成警告因为有就地赋值torch.rand()。 通过注解转换为 Torch Script 这个方法适用于对不同类型输入有不同格式输出的神经网络。 import torch from Network import Netnet Net() net.load_state_dict(torch.load(.\\model.pt)) scrpit_net torch.jit.script(net) script_net.save(.\\model_script.pt)编写 C 代码 源.cpp 文件内容如下调用了 opencv 库和 libtorch 库。 decode() 解码函数类似于前面 python 的解码函数。 C 程序通过主函数的入口参数 argc参数个数 和 argv[]参数集 获取传入程序的参数例如在windows 命令行中输入 program.exe arg1 arg2即可向程序传入两个参数arg1 和 arg2在程序中读取 argv[0] 和 argv[1] 即可知道这两个参数的值。 在本程序中传入的参数为前面保存的神经网络模型的路径和图片的路径。 torch::jit::script::Module module torch::jit::load(argv[1]) 通过模型路径读取模型并创建神经网络十分简便。 cv::imread() 为 opencv 的图像读取函数输入图片路径即可返回 Mat 类型的图像数据矩阵。 cv::resize() 为 opencv 的图像变形函数在这里使图片变形为 45 x 45。 cv::cvtColor() 为 opencv 的图像色域改变函数opencv 读取的图像通道和我们常见的 RGB 通道不同它是 BGR在这里我们只需要将它转变为单通道即灰度图。 image.convertTo(image, CV_32FC1); 为 Mat 类型的数据类型转换方法在这里转换为32为浮点型单通道。因为在前面的 pytorch 节我们知道输入给神经网络的 Tensor 类型的数据都经过 .float() 方法转换为了32位浮点型。 cv::vconcat() 为 opencv 的图像拼接函数在这里是在图像个数维上进行拼接。 使用 write 标记 images 变量是否已赋值因为我们要将所有的输入图片拼接成一个整体再转换为 Tensor 传给神经网络以加快程序运行速度。 torch::from_blob() 为 libtorch 提供的 Mat 类型转 Tensor 类型的函数接口我们可以看到最终输入给神经网络的数据维度为 N x 1 x 45 x 45 N 为图片个数和前面的 pytorch 输入一致。 std::vectortorch::jit::IValue inputs; inputs.push_back(input_tensors); auto outputs module.forward(inputs).toTensor(); 这三条语句为我在网上查到的一种固定写法大概是要将 Tensor 类型的数据放在一种叫向量的数据结构里才能传递给神经网络。 最总通过 std::cout 直接输出识别结果多图片时输出结果以单空格隔开。 也不知道为什么发现把模型置于计算模式时module.eval();输出结果是错误的。 /* 神经网络调用程序根据命令行参数直接输出识别结果可一次识别多张上限100张 参数顺序神经网络模型路径图片1路径……图片n路径 */#include torch/script.h #include opencv2/opencv.hpp #include iostream #include memorystd::string decode(at::Tensor code) //解码函数 {int char_num 4; //字符个数int a;std::string str ; //输出字符串std::string table[10] {1, 2, 3, b, c, m, n, v, x, z}; //编码对照表code code.view({ -1, 10 });code torch::argmax(code, 1);for (int i 0; i char_num; i){a code[i].item().toInt();str table[a];}return str; }int main(int argc, const char *argv[]) {if (argc 3 || argc 102){std::cerr 调用错误 std::endl;return -1;}try{int image_num argc - 2; //读取的图片数量bool write false;torch::jit::script::Module module torch::jit::load(argv[1]); //读取模型cv::Mat images; //保存图片数据for (int i 0; i image_num; i){cv::Mat image cv::imread(argv[i 2]); //读取图片cv::resize(image, image, cv::Size(45, 45)); //变形成为45 x 45cv::cvtColor(image, image, cv::COLOR_BGR2GRAY); //转成灰度图image.convertTo(image, CV_32FC1); //转换为32位浮点型if (!write){images image;write true;}else{cv::vconcat(images, image, images); //拼接图像}}auto input_tensors torch::from_blob(images.data, {image_num, 1, 45, 45 }); //将mat转成tensorstd::vectortorch::jit::IValue inputs;inputs.push_back(input_tensors);auto outputs module.forward(inputs).toTensor();std::cout decode(outputs[0]);for (int i 1; i image_num; i){auto result decode(outputs[i]);//解码std::cout result;}return 0;}catch (...) //捕获任意异常{std::cerr 程序执行出错 std::endl;return -1;} }编译环境搭建 下面介绍两种编译环境的搭载方法一种是直接在 visual studio 中配置一种是官方推荐的用 cmake 配置 visual studio 环境。 确保已安装 visual studio 的 C 部件下面所有方法都以 visual studio 2019 为 IDE程序编译类型为 x64 release。 C 库管理 在前面我们已安装了 libtorch 和 opencv以 libtorch 1.6.0 (release) 和 opencv 4.4.0 为例假设它们放在一个文件夹D:\CplusLib\ 程序需要的动态链接库位置 libtorchD:\CplusLib\libtorch\libopencvD:\CplusLib\opencv\build\x64\vc15\bin 接下来我们需要将这些动态链接库的路径添加进环境变量以便 C 程序通过环境变量找寻这些动态链接库。 以 Windows 10 系统为例右键 此电脑选择 属性 - 高级系统设置 - 环境变量 打开界面。 有两种环境变量用户变量和系统变量一种只针对一个用户有效另一种对所有用户都有效。 我们添加系统变量的 path 项双击 path点击 新建 输入路径 点击 确定 - 确定 方法一手动配置 visual studio 环境 直接在 visual studio 环境中配置要一个一个去写包含的库的路径和动态链接库的名称。我是采用属性表的形式直接让工程项目读取这样每创建一个新工程就不用重复配置了。 以上面的库安装路径为基础提供每个库的属性表 libtorch(release)libtorch.Cpp.x64.user.props ?xml version1.0 encodingutf-8? Project ToolsVersion4.0 xmlnshttp://schemas.microsoft.com/developer/msbuild/2003ImportGroup LabelPropertySheets /PropertyGroup LabelUserMacros /PropertyGroupIncludePathD:\CplusLib\libtorch\include;D:\CplusLib\libtorch\include\torch;$(IncludePath)/IncludePathLibraryPathD:\CplusLib\libtorch\lib;$(LibraryPath)/LibraryPath/PropertyGroupItemDefinitionGroupLinkAdditionalDependenciesasmjit.lib;c10.lib;c10_cuda.lib;caffe2_detectron_ops_gpu.lib;caffe2_module_test_dynamic.lib;caffe2_nvrtc.lib;clog.lib;cpuinfo.lib;dnnl.lib;fbgemm.lib;libprotobuf-lite.lib;libprotobuf.lib;libprotoc.lib;mkldnn.lib;torch.lib;torch_cpu.lib;torch_cuda.lib;%(AdditionalDependencies)/AdditionalDependencies/Link/ItemDefinitionGroupItemGroup / /Projectopencv (release)opencv.Cpp.x64.user.props ?xml version1.0 encodingutf-8? Project ToolsVersion4.0 xmlnshttp://schemas.microsoft.com/developer/msbuild/2003ImportGroup LabelPropertySheets /PropertyGroup LabelUserMacros /PropertyGroupIncludePathD:\CplusLib\opencv\build\include;D:\CplusLib\opencv\build\include\opencv2;$(IncludePath)/IncludePathLibraryPathD:\CplusLib\opencv\build\x64\vc15\lib;$(LibraryPath)/LibraryPath/PropertyGroupItemDefinitionGroupLinkAdditionalDependenciesopencv_world440.lib;%(AdditionalDependencies)/AdditionalDependencies/Link/ItemDefinitionGroupItemGroup / /Project其中 IncludePath 是库的包含路径LibraryPath 是链接库路径AdditionalDependencies 是链接库名称。 如何导入属性表 在 visual studio 中点击 属性管理器右键 Release|x64 - 添加现有属性表。最后效果如图 新建 C 项目将我们前面编写的 C 文件添加进来按照如图配置 点击 本地 Windows调试器 即可完成编译。 方法二cmake 配置环境 首先安装 cmakehttps://cmake.org/download/ 比如 Windows 64位系统选择 cmake-3.18.2-win64-x64.msi跟随安装程序即可完成安装。 新建一个目录 D:\CaptchaRecognize\在目录下新建 CMakeLists.txt cmake_minimum_required(VERSION 3.0 FATAL_ERROR) project(CaptchaRecognize)SET(CMAKE_BUILE_TYPE RELEASE)INCLUDE_DIRECTORIES( D:/CplusLib/libtorch/include D:/CplusLib/libtorch/include/torch D:/CplusLib/opencv/build/include D:/CplusLib/opencv/build/include/opencv2 )SET(TORCH_LIBRARIES D:/CplusLib/libtorch/lib) SET(OpenCV_LIBS D:/CplusLib/opencv/build/x64/vc15/lib)LINK_DIRECTORIES( ${TORCH_LIBRARIES} ${OpenCV_LIBS} )add_executable(CaptchaRecognize 源.cpp)target_link_libraries(CaptchaRecognize asmjit.lib c10.lib c10_cuda.lib caffe2_detectron_ops_gpu.lib caffe2_module_test_dynamic.lib caffe2_nvrtc.lib clog.lib cpuinfo.lib dnnl.lib fbgemm.lib libprotobuf-lite.lib libprotobuf.lib libprotoc.lib mkldnn.lib torch.lib torch_cpu.lib torch_cuda.lib opencv_world440.lib )set_property(TARGET CaptchaRecognize PROPERTY CXX_STANDARD 14)该文件中的一些属性和属性表的内容相似。将 源.cpp 复制到该目录下新建目录 build。 打开 Cmake 进行如下配置 点击 configure - finish然后点击 Generate 生成 visual studio 工程。 在 build 目录中找到工程文件并打开打开 解决方案资源管理器右键 CaptchaRecognize - 设为启动项目 编译属性 点击 本地 Windows调试器 即可完成编译。 python 调用 C 程序 该 C 程序的命令行调用示例 CaptchaRecognize.exe model_script.pt pic1.png pic2.png在 python 中通过 os.popen(command).read() 即可像命令行一样调用 C 程序并读取程序的输出结果。 例如 import osresult os.popen(CaptchaRecognize.exe model_script.pt pic1.png pic2.png).read() #调用 C 程序 result result.split( )由前面可知 C 程序输出的结果由单空格隔开通过 .split( ) 可得到含所有图片识别结果的列表。 这篇文章花了我很长时间如果觉得不错不妨点个赞哦
http://www.w-s-a.com/news/266517/

相关文章:

  • 衡阳商城网站制作ps做网站首页规范尺寸
  • 微信网站应用开发营销推广的方案
  • 广州做网站商城的公司制作一个app的完整流程
  • 湖南城乡建设厅网站163注册企业邮箱
  • 做网站怎么调整图片间距织梦做的网站如何去掉index
  • 凡科网免费建站步骤及视频网页设计基础教程第二版课后答案
  • 建设一个旅游网站毕业设计企业网站要更新文章吗
  • 做网站需要简介中山网站设计公司
  • 网站怎么做导航栏微信公众号官网登录
  • 1_ 掌握网站开发的基本流程 要求:熟悉网站开发与设计的基本流程.电子商城网站开发
  • 百度网站怎么建设河北省工程造价信息网官网
  • 阿里云网站模板网页设计的合适尺寸是多少
  • 做小程序和做网站哪个好让别人做网站推广需要多少钱
  • 做外贸的几个网站查询网域名解析
  • 酒泉如何做百度的网站seo研究中心好客站
  • 网站设计建设平台户县做网站
  • 一元云购网站开发wordpress博客空间
  • 深圳高端网站建设公司排名如何搭建局域网服务器
  • 照片管理网站模板高端网站开发哪家好
  • 黄冈网站制作wordpress为什么不能显示域名
  • 做网站设计怎么进企业电子商务网站建设与管理教材
  • 设计广告公司网站建设网站开发技术选择
  • 个人网站教程个人网站有必要备案吗
  • 网站建设推广好做吗黄浦企业网站制作
  • 怎样做28网站代理中山网站建设方案外包
  • vs2010做网站前台搭建小网站
  • 做视频必须知道的一些网站wordpress 标签鼠标滑过_弹出的title 代码美化
  • 怎么做室内设计公司网站电商运营培训视频课程
  • 昆明网站策划天津市建筑信息平台
  • 三亚放心游app官方网站wordpress 个人主题