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

利用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),并传递给神经网络进行识别
  待识别完成后,就可以把结果备注在原始图片上

华为获取AMRV9授权面临困扰,中国该全力发展RiscV了ARM已推出全新的V9架构,目前尚未明确华为是否能获得V9的授权,这对中国芯片产业已造成重大影响,在如此情况下,中国发展RiscV架构才是最好的应对办法。华为的遭遇警醒中国芯片产业李佳琦薇娅们注意,互联网营销师职业标准来了原标题李佳琦薇娅们注意,你们的职业标准来了!李佳琦和薇娅们注意了,互联网营销师国家职业技能标准来了。近日,人社部中央网信办国家广播电视总局共同发布了互联网营销师国家职业技能标准。这Meta要求法庭驳回美政府诉讼,原告要求卖掉Instagram和Whatsapp鞭牛士12月2日消息,据报道,美国社交网络巨头Meta平台公司(之前的Facebook)向美国一家法庭提出申请,要求法庭驳回美国联邦贸易委员会(FTC)之前对该公司提出的剥离两大社微信如何找回已删除的好友?即使对方改了微信号也可以微信如何找回已删除的好友?因为一些原因你删除过一些好友,也有好友删除过你,想要加回来的话怎么找回呢?今天这篇文章就是给大家分享下如何找回那个好友,还能知道他她的微信号,即使对方换了电子书,电子纸,平板电脑(ipad,华为等)哪一款阅读手写体验比较好?感谢阅读作为老师,如果需要手写备课,那么如果能够接上投影,有时候把自己需要的内容投影出来,并且还能在上面手写内容给学生讲解,那么体验就更好了。我在参加培训的时候,很多的培训讲师就会胡锡进和杨元庆的关系,是一场资本的博弈以前胡锡进与司马南都是以老朋友相称,因为此次发了一篇没有完全力挺老朋友,多年友谊小船说翻就翻。不仅如此,司马南还将胡锡进一些不为人知的老底公布出来,仅称是有人发给自己的,无过多说明虚拟现实与增强现实导读借助头盔眼镜耳机等虚拟现实设备,人们可以穿越到硝烟弥漫的古战场,融入浩瀚无边的太空旅行,将科幻小说电影里的场景移至眼前虚拟现实早已进入我们的生活。文章来源本文引自智能制造实践(世界艾滋病日苹果提供六个新的AppleWatch表盘iOS15。1停止验证在世界艾滋病日,苹果强调了它与(RED)的长期合作关系,自2006年以来,(RED)已经筹集了2。7亿美元用于抗击艾滋病,推出了年度ApplePay捐赠计划,并提供了六个可下载的A洗碗机用久了有异味吗?我家的卡萨帝嵌入式还好哎,用了也有几年了,从来没有异味,可能跟紫外线除菌有关系吧,毕竟可以除菌消毒嘛,而且我平时使用的时候也算是比较仔细一点,会提前把剩饭剩菜倒一下,用水龙头稍微一预算2500以内,买什么手机合适?感谢各位小伙伴的阅读。目前8G运存的手机不少,但大多数的都是顶级旗舰机才会配有8G内存,而2500以内的8G手机少之又少,像红魔一代MIX2这样的高通骁龙835上一代旗舰由于处理器降噪音助听器是听不到噪音吗?对于生活环境中经常出现的噪声,包括日常生活中家用电器的声音汽车的声音等等。由于语言和这些噪音有不同的信号结构,助听器会侦测并通过信号数字化分析来区分普通言语声和噪声的区别,然后对噪
彻底向美屈服!英国大规模拆除华为5G设备,至少20亿英镑打水漂据彭博社5月14日报道,在英国法规的强迫下,英国电信不得不斥资7亿美元,将其耗费10年时间在该国安装的华为5G设备全部拆除。而这一切都是因为美国以所谓的华为构成威胁为借口不断施压,华为鸿蒙再次传来好消息,京东率先表示支持,全面告别安卓不远了华为鸿蒙再次传来好消息自从华为向部分机型用户推送了鸿蒙OS开发者测试版之后,这款新生的国产系统就备受人们关注,很多花粉都想要加入华为的开发者计划。但可惜的是,目前只有华为最新款的机华为鸿蒙系统再遭拦路虎!并非谷歌安卓系统而是鸿蒙公司注册商标5月16日讯相信大家都知道,华为官方早已放话,将会在6月份正式推送鸿蒙OS系统正式版,部分华为荣耀手机可以率先升级体验鸿蒙OS系统,这也让很多华为手机用户们非常激动不已,因为华为作智商接连被马斯克按在地上摩擦之后,数字币圈能否回归理性?最近两个月,新晋世界首富马斯克在现实上演维度压制,把全世界人民的智商按在地上狠狠摩擦!说到马斯克就不得不说到特斯拉和SpaceX,他正是利用它们在数字币圈,搅起无边风雨。什么叫翻手威兰达出高性能版了?还巨省油?价格还跟双擎差不多?新能源车型中,插电混动的受欢迎程度其实还不如纯电,但实际上插电混动是目前新能源最好的解决方案,毕竟可油可电,无续航和充电的烦恼。不过,如果不是在限号城市,大家对新能源其实是没有太大喂不饱的极兔200亿能烧出一个快递新霸主?图源网络伯虎点睛整个行业中每家的市场份额都被极兔瓜分了一部分。一只飞速奔跑的兔子,搅浑了快递江湖水,用时仅一年。它的A面,是资本的宠儿。弹药源源不断,高瓴红杉博裕资本纷纷下注,令这上海微电子28纳米和14纳米光刻机最新进展,令人振奋中芯国际刚刚公布了今年第一季度的财报,营收和利润双双大幅度增长,这在大家的预料之中,在全球芯片短缺的大背景下,预计本季度中芯国际还将继续保持高速增长的势头。但这种快速的增长当中还是中国电信安徽公司推出我为群众办实事八项服务举措来源人民网安徽频道为提升人民群众的获得感幸福感安全感,更好地服务广大用户,2021年5。17世界电信和信息社会日来临之际,中国电信安徽公司推出我为群众办实事八项服务举措,以实际行动美国半导体209亿并购案,只需中国点头,即将完成收购欧界报道随着ADI并购Maxim一案陆续在美国欧盟菲律宾中国台湾日本新加坡和韩国等国家获得批准,这样一来ADI公司只需要经过中国监管机构的批准,这项高达209亿美元的收购案就可以完目前值得入手的三款中端机,大快充高刷屏,性价比更是无敌如今的手机市场,硬件发展已经十分成熟了,即使是千元机也可以拥有不错的体验,但要加上一点质感和设计的话,还是要加点预算考虑中端机,既有接近旗舰机的性能,颜值也有出色的表现,那么今天笔Android12首款旗舰机爆出21天图文打卡挑战Android12早在今年2月份便发布首个开发者预览版,在这个预览版中,Android12针对图像视频的处理,以及未来的安全更新都有更新。时隔三个多月,谷歌爆出,