范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

利用pytorchCNN手写字母识别神经网络模型识别多手写字母(AZ)

  往期的文章,我们分享了手写字母的训练与识别
  使用EMNIST数据集训练第一个pytorch CNN手写字母识别神经网络
  利用pytorch CNN手写字母识别神经网络模型识别手写字母
  哪里的文章,我们只是分享了单个字母的识别,如何进行多个字母的识别,其思路与多数字识别类似,首先对图片进行识别,并进行每个字母的轮廓识别,然后进行字母的识别,识别完成后,直接在图片上进行多个字母识别结果的备注
  Pytorch利用CNN卷积神经网络进行多数字(0-9)识别
  搭建神经网络
  根据上期文章的分享,我们搭建一个手写字母识别的神经网络import torch import torch.nn as nn from PIL import Image  # 导入图片处理工具 import PIL.ImageOps import numpy as np from torchvision import transforms import cv2 import matplotlib.pyplot as plt # #####设置参数####################### widthImg = 640 heightImg = 480 kernal = np.ones((5, 5)) minArea = 800 # 定义神经网络 class CNN(nn.Module):     def __init__(self):         super(CNN, self).__init__()         self.conv1 = nn.Sequential(  # input shape (1, 28, 28)             nn.Conv2d(                 in_channels=1,  # 输入通道数                 out_channels=16,  # 输出通道数                 kernel_size=5,   # 卷积核大小                 stride=1,  #卷积步数                 padding=2,  # 如果想要 con2d 出来的图片长宽没有变化,                              # padding=(kernel_size-1)/2 当 stride=1             ),  # output shape (16, 28, 28)             nn.ReLU(),  # activation             nn.MaxPool2d(kernel_size=2),  # 在 2x2 空间里向下采样, output shape (16, 14, 14)         )         self.conv2 = nn.Sequential(  # input shape (16, 14, 14)             nn.Conv2d(16, 32, 5, 1, 2),  # output shape (32, 14, 14)             nn.ReLU(),  # activation             nn.MaxPool2d(2),  # output shape (32, 7, 7)         )         self.out = nn.Linear(32 * 7 * 7, 37)  # 全连接层,A/Z,a/z一共37个类      def forward(self, x):         x = self.conv1(x)         x = self.conv2(x)         x = x.view(x.size(0), -1)  # 展平多维的卷积图成 (batch_size, 32 * 7 * 7)         output = self.out(x)         return output
  第一层,我们输入Eminist的数据集,Eminist的数据图片是一维 28*28的图片,所以第一层的输入(1,28,28),高度为1,设置输出16通道,使用5*5的卷积核对图片进行卷积运算,每步移动一格,为了避免图片尺寸变化,设置pading为2,则经过第一层卷积就输出(16,28,28)数据格式
  再经过relu与maxpooling (使用2*2卷积核)数据输出(16,14,14)
  第二层卷积层是简化写法nn.Conv2d(16, 32, 5, 1, 2)的第一个参数为输入通道数in_channels=16,其第二个参数是输出通道数out_channels=32, # n_filters(输出通道数),第三个参数为卷积核大小,第四个参数为卷积步数,最后一个为pading,此参数为保证输入输出图片的尺寸大小一致        self.conv2 = nn.Sequential(  # input shape (16, 14, 14)             nn.Conv2d(16, 32, 5, 1, 2),  # output shape (32, 14, 14)             nn.ReLU(),  # activation             nn.MaxPool2d(2),  # output shape (32, 7, 7)         )
  全连接层,最后使用nn.linear()全连接层进行数据的全连接数据结构(32*7*7,37)以上便是整个卷积神经网络的结构,
  大致为:input-卷积-Relu-pooling-卷积
  -Relu-pooling-linear-output
  卷积神经网络建完后,使用forward()前向传播神经网络进行输入图片的识别step 2:图片预处理# 预处理函数  def preProccessing(img):     imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)     imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)     imgCanny = cv2.Canny(imgBlur, 200, 200)     imgDial = cv2.dilate(imgCanny, np.ones((5, 5)), iterations=2)  # 膨胀操作     imgThres = cv2.erode(imgDial, np.ones((5, 5)), iterations=1)  # 腐蚀操作     return imgThres
  这里我们使用腐蚀,膨胀操作对图片进行一下预处理操作,方便神经网络的识别,当然,我们往期的字母数字识别也可以添加此预处理操作,方便神经网络进行预测,提高精度step 3:图片轮廓检测获取每个数字的坐标位置def getContours(img):     x, y, w, h, xx, yy, ss = 0, 0, 10, 10, 20, 20, 10  # 因为图像大小不能为0     imgGet = np.array([[], []])  # 不能为空     contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 检索外部轮廓     for cnt in contours:           area = cv2.contourArea(cnt)         if area > 800:  # 面积大于800像素为封闭图形             cv2.drawContours(imgCopy, cnt, -1, (255, 0, 0), 3)               peri = cv2.arcLength(cnt, True)  # 计算周长             approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)  # 计算有多少个拐角             x, y, w, h = cv2.boundingRect(approx)  # 得到外接矩形的大小             a = (w + h) // 2             dd = abs((w - h) // 2)  # 边框的差值             imgGet = imgProcess[y:y + h, x:x + w]             if w <= h:  # 得到一个正方形框,边界往外扩充20像素,黑色边框                 imgGet = cv2.copyMakeBorder(imgGet, 20, 20, 20 + dd, 20 + dd, cv2.BORDER_CONSTANT, value=[0, 0, 0])                 xx = x - dd - 10                 yy = y - 10                 ss = h + 20                 cv2.rectangle(imgCopy, (x - dd - 10, y - 10), (x + a + 10, y + h + 10), (0, 255, 0),                               2)  # 看看框选的效果,在imgCopy中                 print(a + dd, h)             else:  # 边界往外扩充20像素值                 imgGet = cv2.copyMakeBorder(imgGet, 20 + dd, 20 + dd, 20, 20, cv2.BORDER_CONSTANT, value=[0, 0, 0])                 xx = x - 10                 yy = y - dd - 10                 ss = w + 20                 cv2.rectangle(imgCopy, (x - 10, y - dd - 10), (x + w + 10, y + a + 10), (0, 255, 0), 2)                 print(a + dd, w)             Temptuple = (imgGet, xx, yy, ss)  # 将图像及其坐标放在一个元组里面,然后再放进一个列表里面就可以访问了             Borderlist.append(Temptuple)      return Borderlist
  getContours函数主要是进行图片中数字区域的区分,把每个数字的坐标检测出来,这样就可以 把每个字母进行CNN卷积神经网络的识别,进而实现多个字母识别的目的step 4模型处理Borderlist = []  # 不同的轮廓图像及坐标 Resultlist = []  # 识别结果 img = cv2.imread("55.png")  imgCopy = img.copy() imgProcess = preProccessing(img) Borderlist = getContours(imgProcess)  train_transform = transforms.Compose([     transforms.ToPILImage(),     transforms.Grayscale(),     transforms.Resize((28, 28)),     transforms.ToTensor(), ])  model = CNN() model.load_state_dict(torch.load("./model/Eminist.pth", map_location="cpu")) model.eval()
  首先,输入一张需要检测的图片,通过preProccessing图片预处理与getContours函数获取图片中的每个字母的轮廓位置
  transforms.Compose此函数可以 把输入图片进行pytorch相关的图片操作,包括转换到torch,灰度空间转换,resize,缩放等等操作
  然后加载我们前期训练好的模型step 5 UTF8字符转换def get_mapping(num, with_type="letters"):     """     根据 mapping,由传入的 num 计算 UTF8 字符。     """     if with_type == "byclass":         if num <= 9:             return chr(num + 48)  # 数字         elif num <= 35:             return chr(num + 55)  # 大写字母         else:             return chr(num + 61)  # 小写字母     elif with_type == "letters":         return chr(num + 64)   # 大写/小写字母     elif with_type == "digits":         return chr(num + 96)     else:         return num
  由于神经网络识别完成后,反馈给程序的是字母的UTF-8编码,我们通过查表来找到对应的字母
  字符编码表(UTF-8)
  step 6 神经网络识别if len(Borderlist) != 0:  # 不能为空     for (imgRes, x, y, s) in Borderlist:         cv2.imshow("imgCopy", imgRes)         cv2.waitKey(0)         imgRes = cv2.flip(imgRes,1)         (h, w) = imgRes.shape[:2]          (cX,cY) = (w // 2, h // 2)          M = cv2.getRotationMatrix2D((cX,cY), 90, 1.0)          cos = np.abs(M[0, 0])         sin = np.abs(M[0, 1])         nW = int((h * sin) + (w * cos))         nH = int((h * cos) + (w * sin))         M[0, 2] += (nW / 2) - cX         M[1, 2] += (nH / 2) - cY         imgRes = cv2.warpAffine(imgRes, M, (nW, nH))          cv2.imshow("imgThres",imgRes)         cv2.waitKey(0)                 img = train_transform(imgRes)         img = torch.unsqueeze(img, dim=0)         with torch.no_grad():             pre = model(img)             output = torch.squeeze(pre)             predict = torch.softmax(output, dim=0)             predict_cla = torch.argmax(predict).numpy()             print(get_mapping(predict_cla), predict[predict_cla].numpy())             result = get_mapping(predict_cla)          cv2.rectangle(imgCopy, (x, y), (x + s, y + s), color=(0, 255, 0), thickness=1)         cv2.putText(imgCopy, result, (x + s // 2 - 5, y + s // 2 - 5), cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 0, 255), 2) cv2.imshow("imgCopy", imgCopy) cv2.waitKey(0)
  通过上面的操作,我们已经识别出了图片中包括的字母轮廓,我们遍历每个字母轮廓,获取单个字母图片数据,这里需要特殊提醒一下:我们知道EMNIST数据库左右翻转图片后,又进行了图片的逆时针旋转90度
  这里我们使用cv2.flip(imgRes,1)函数,进行图片的镜像,并使用getRotationMatrix2D函数与warpAffine函数配合来进行图片的旋转操作,这里就没有PIL来的方便些				imgRes = cv2.flip(imgRes,1)         (h, w) = imgRes.shape[:2]          (cX,cY) = (w // 2, h // 2)          M = cv2.getRotationMatrix2D((cX,cY), 90, 1.0)          cos = np.abs(M[0, 0])         sin = np.abs(M[0, 1])         nW = int((h * sin) + (w * cos))         nH = int((h * cos) + (w * sin))         M[0, 2] += (nW / 2) - cX         M[1, 2] += (nH / 2) - cY         imgRes = cv2.warpAffine(imgRes, M, (nW, nH))
  然后,我们对图片数据进行torch转换train_transform(imgRes),并传递给神经网络进行识别
  待识别完成后,就可以把结果备注在原始图片上

你家的240Hz电视真的有用吗?自2021年起,高刷游戏电视就成了选购电视机的热点,这主要是因为游戏和电竞画面均需要更高的刷新率才能够满足消费者们更高层次的游戏体验,尤其对于特效和虚拟渲染的画面,高刷新的电视往往LCD党永不为奴!华星光电全新LCD屏曝光最低屏幕刷新率可达15Hz对于护眼党来说,OLED屏幕一直让人无法接受。虽然它拥有到了更高的对比度更为通透的视觉效果,但是由于PWM调光的关系,相较于使用DC调光的LCD屏幕来说,无疑更加伤眼,长时间的使用国产厂商刚搞定UFS3。1规格,三星马上推出UFS4。0,速度提升100上个月,中国存储巨头长江存储,正式推出UFS3。1通用闪存UC023,而UFS3。1也是当前最高的闪存规格。当时很多人表示,接下来国产手机厂商们,可高兴了,因为不必再依赖三星美光S苹果不送充电器被判赔一用户近7000元!苹果抗辩不一定要用苹果原装充电器,重申为了环保中国经济周刊经济网讯巴西戈亚尼亚市一家法院裁定,苹果公司必须赔偿一名没有获得充电插头的iPhone买家5000巴西雷亚尔(约合6943元)。苹果方面在庭上的抗辩意见是,用户没有被强如何用一句话描述寂寞是怎样的感觉?空灵的世界空灵的我!!!我一袋洽洽瓜子,我一个人磕完了,一共1854颗,26颗是空的,混进来9颗带虫的,有6颗没炒开,是连在一起的,还有4个是苦的。中间喝了7杯水。没错,这就是孤独测核酸用的棉签含致癌物是无稽之谈随着北京抗疫攻坚战的打响,在大规模核酸筛查过程中,关于新冠核酸检测的新谣言也趁机冒出来蹭热度。比如,做新冠抗原检测前不能吃橙子或者喝可乐,会改变口腔内的酸碱度,进而导致检测结果变成红米note12变成note11T,或将搭载天玑8000,又是一款千元机皇大家好,我是三月。现在大家买手机时最关注的应该还是手机销量吧,从四月份的手机销量来看,红米依旧还是大赢家,尤其是红米的note系列,每一款的销量都不差,基本上都是千万级别。从not友商新款骁龙870手机,三星E4屏80W闪充0IS防抖,售价1999元起骁龙870是去年高通在1月份发布的处理器,这颗芯片是近年来高通发布的骁龙8处理器中,口碑最好的一款了,自然是堪称一代神U了,尽管性能跑分不敌最新的骁龙8Gen1,但功耗表现依旧十分直降1600元送100W无线充电套装,小米彻底爆发12256GB全面屏您在阅读前请点击上面的关注二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。进入2022年,国内手机销售市场惨淡,各大手机品牌纷纷降价促销,有的手机价格下调了几百元,2022什么手机值得买?给妈妈买手机需要考虑哪些?妈妈正在用什么手机?临近母亲节,有媒体推出了2022什么手机值得买母亲节专题视频,根据不同价位段不同机型的优缺点,整理出了一些值得给妈妈购买的手机,很有参考意义。给妈妈手机需要考虑2022年还有高通870新机三台机型配置对比你是不是很难想象这都2022年了,还有手机厂商发布高通870的手机,要知道这可是两年前的芯片,要知道以前高通可没有出现这种景象啊,归根结底是什么原因呢?还不是因为后续的芯片不太给力
进军集成灶领域,老板电器拉开行业洗牌大幕目前,国内家电市场已趋于饱和,再叠加原材料上涨疫情反复等因素,家电行业压力骤增。面对如此情形,企业只有拓宽眼界寻求新兴发展之路,才能进一步赢得市场先机。老板电器专注不断的自我进化自云康宝CS10A八电极体脂秤,了解身体状况需要它随着生活水平日渐提高,人们对健康的重视程度逐渐加深,过去人们只知道关注体重,随着健身理念的普及,现在人们了解身体的体重体脂率等体征取代了关注体重,成为了更加科学的健康指标。这样体脂跌破5300元!苹果A15全网通5G,谁曾料到,降价如此之快最近小芳在整理主市面上主流机型的售价情况的过程当中异常发现,iPhone13这款手机的价格出现了异动,在京东上绿色版本的iPhone13的售价已经来到了5249元,而白色版本或者是给摩托罗拉手机外观优化的建议如今的摩托罗拉手机已取代小米手机的信价比之王的称号,凭借价格上的优势让消费者得到了实惠。希望摩托罗拉能够继续推出高信价比产品。为了让摩托罗拉能够生产出更优秀的手机,今天小编给摩托罗创新可分离设计,飞宇pocket2S口袋相机有哪些独到之处?随后记录现在几乎成为我生活的一部分了,我习惯通过图像的方式去记录生活,尤其是当前短视频当道的情况下,视频记录更成为了我习惯的一部分。我目前习惯的记录方式是手机和微单,微单能够提供最魅族19sPro敲定天玑9000芯片,161TB大存储,黄章信心十足最近各大品牌都纷纷发布了新的旗舰系列,就连和魅族同为老品牌的中兴,今年也是火力全开,只有魅族还在按兵不动。虽然说还不知道具体的发机日期,但是可以确定的是魅族今年也有联发科的天玑处理华为哈勃投资,激光芯片第一股长光华芯登上科创板文福布斯中国4月1日,长光华芯在上海证券交易所科创板上市,公司证券代码688048。SH,发行价格80。8元股。该公司拟首次公开发行3,390万股,占发行后股份总数的25。招股书显小米上线49元换电池米粉节活动,每天十点开启4月1日消息,小米在今日开启了米粉节活动,并且在4月1日到4月10日期间的每天10点开启49元换电池活动的抢购,每一场的持续时间为20分钟。值得注意的是,这一次的小米米粉节49元换为什么雨水闻起来很好闻?最近北京下了一场小雨,空气变得格外清新,雨水的气味让人很舒心,你喜欢雨水的气味吗?其实,有的人喜欢雨水的气味,并不只是心理感受,这后面还真的有科学道理。为什么雨水闻起来很好闻?科学比亚迪海豹特斯拉Model3你准备接招吧要说国内汽车发展情况,新能源车绝对在全球范围内无可匹敌,除了大量造车新势力带来的天马行空的设计外,传统燃油车企也不甘示弱纷纷发布自家新能源汽车。有着制造电池背景的比亚迪更不甘示弱,兼客周报工信部重拳推进打猫断卡,京东裁员仍在继续国家知识产权局我国知识产权人才规模达69万人国家知识产权局人事司一级巡视员丰兆龙在国家知识产权局3月例行新闻发布会上介绍,我国知识产权人才规模达到69万人,国家经济职称系列增设知识