造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”

本文主要是介绍造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

“0”数字字符零 的图片(16*16点阵):

#Letter23Digital23R231006d.pyimport torch
import torch.nn as nn
import torch.optim as optim   #optimizer = optim.SGD(model.parameters(), lr=0.01)
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
#from PIL import ImageDraw, ImageFontfrom torchvision import transforms
import matplotlib.pyplot as plt   #matplotlib显示字符(结果)Times500=4590# 参数设置
font_path = "arial.ttf"    #"e:\\22Letter23r1002\\arial.ttf"    #e:\\arial.ttf"
#siz28e28 = 28
siz28e14=32
#characters = ["2","4","我"] +[str(i) for i in range(8,9)] + ["A","Z"]   #["A", "B"]
Characts01 = ["8","-","+","X","2"] +[str(i) for i in range(0,2)] print(Characts01)# 1. 生成字符和数字的点阵数据
def render_char(char, siz28e14):image = Image.new("L", (siz28e14, siz28e14), "white")draw = ImageDraw.Draw(image)font = ImageFont.truetype(font_path, siz28e14)
#-----------------------------------------w03 = draw.textlength(char, font=font)h03 = siz28e14print("{[w3",w03, "h3",w03 ,"]} ")
#-----------------------------------------draw.text(((siz28e14-w03)/2, (siz28e14-h03)/2), char, font=font, fill="black")return imageData01 = []
labels = []
for i, char in enumerate(Characts01):img = render_char(char, siz28e14)Data01.append(transforms.ToTensor()(img))labels.append(i)print("i",i,char)#-----------------------------
# 2. 显示取得的 arial.ttf 字体的图像
for i in range(len(Data01)):plt.imshow(Data01[i].squeeze().cpu().numpy(), cmap="gray")plt.title("char:"+Characts01[i])plt.axis("off")
#  plt.show()#-----------------------------# 2. 训练神经网络模型
class SimpleNet(nn.Module):def __init__(self, num_classes):super(SimpleNet, self).__init__()self.fc = nn.Linear(siz28e14 * siz28e14, num_classes)def forward(self, x):x = x.view(-1, siz28e14 * siz28e14)x = self.fc(x)return xmodel = SimpleNet(len(Characts01))
loss_function = nn.CrossEntropyLoss()
#optimizer = optim.SGD(model.parameters(), lr=0.01)
optimizer = optim.SGD(model.parameters(), lr=0.003)for epoch in range(Times500):#8000):#1000):inputs = torch.stack(Data01)targets = torch.tensor(labels)optimizer.zero_grad()outputs = model(inputs)loss = loss_function(outputs, targets)loss.backward()optimizer.step()# 3. 使用模型进行预测
def predict_image(img_path):model.eval()img = Image.open(img_path).convert("L").resize((siz28e14, siz28e14))img_tensor = transforms.ToTensor()(img).unsqueeze(0)output = model(img_tensor)_, predicted = output.max(1)return Characts01[predicted[0]]#01//8_"8"----
im="f8_16x18.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#1//1-minus"1"----
im="_1_16x16.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#2//我-"我"----
im="wo19x19.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#3//8-"8"----
im="8_16x16.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
#plt.axis("off")
plt.show()#4//minus-minus"-"----
im="f:\\22Letter23r1002\minus16x16.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()

造车先做三蹦子的原理是:

torch,tensorflew,pytorch这个相当于马达、发动机、变速器等底层原件……

一、造车要不要先研究马达、轮子、发动机?
当然!必须!

二、

研究完 元器件 马达、轮子、发动机  就该造……
就可以 造 宝马?奔驰?Prius、本田、混动了吗?

没那么简单……

对于初级架构师傅来讲……

学习 Prius的新型架构当然有用!

但是,能完整的 架构出来一辆 五菱宏光、架构出一辆老头乐,架构出一辆三蹦子……那才是一位合格的架构师

如果一个伪装的架构师问你:

我需要 三年时间、三个亿$金钱 架构出一辆 特斯了、Prius混动汽车…… 给钱吧!?

你应该这样回复他:

那我只给你三个月时间,只给你10万~100万人民币…… 请你先给俺架构出一辆 老头乐的或五菱宏光!!

做好了,

咱们开展下个任务!!

做不好,那您不叫架构师……  骗子 称号更适合您!

同样道理,一个合格的 外科医生,

在给 患者病人 做手术以前,当然应该是先 解剖 过 小白鼠、和青蛙;

我读过 Caffe的完整代码,这相当于解剖尸体;

重新遭过轮子。

这次,就手工 撸 一个 文字(字符)识别 的框架 出来…… 作为 机器学习的“三蹦子”、小白鼠、或者“果蝇”

下面Demo就是 字符(数字、字母)识别的基本框架……

先用 torch完成……

import torch
import torch.nn as nn
import torch.optim as optim
from PIL import Image, ImageDraw, ImageFont
from torchvision import transforms
import matplotlib.pyplot as plt# 参数设置
font_path = "e:\\arial.ttf"
siz28e28 = 28
characters = [str(i) for i in range(0, 10)] + ["A", "B"]# 1. 生成字符和数字的点阵数据
def render_char(char, siz28e28):image = Image.new("L", (siz28e28, siz28e28), "white")draw = ImageDraw.Draw(image)font = ImageFont.truetype(font_path, siz28e28)
#----------------------------------------------------------
#    w, h = draw.textsize(char, font=font)# 使用textbox方法来获取文本的边界框
#    left, upper, right, lower = draw.textbbox((0, 0), char, font=font)
#    w01, h01 = right - left, lower - upper
#    print("[right",right," _left",left, " _lower",lower, " _upper",upper ,")")
#    print("(w1",w01, "h1",h01 ,"] ")
#    w02, h02 = draw.textsize(char, font=font)    //draw.textsize()函数新版本DeprecationWarning: textsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use textbbox or textlength instead.
#    print("{[w2",w02, "h2",w02 ,"]} ")w03 = draw.textlength(char, font=font)h03 = siz28e28print("{[w3",w03, "h3",w03 ,"]} ")
#=============================================draw.text(((siz28e28-w03)/2, (siz28e28-h03)/2), char, font=font, fill="black")return imagedata = []
labels = []
for i, char in enumerate(characters):img = render_char(char, siz28e28)data.append(transforms.ToTensor()(img))labels.append(i)# 2. 训练神经网络模型
class SimpleNet(nn.Module):def __init__(self, num_classes):super(SimpleNet, self).__init__()self.fc = nn.Linear(siz28e28 * siz28e28, num_classes)def forward(self, x):x = x.view(-1, siz28e28 * siz28e28)x = self.fc(x)return xmodel = SimpleNet(len(characters))
loss_function = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)for epoch in range(1000):inputs = torch.stack(data)targets = torch.tensor(labels)optimizer.zero_grad()outputs = model(inputs)loss = loss_function(outputs, targets)loss.backward()optimizer.step()# 3. 使用模型进行预测
def predict_image(img_path):model.eval()img = Image.open(img_path).convert("L").resize((siz28e28, siz28e28))img_tensor = transforms.ToTensor()(img).unsqueeze(0)output = model(img_tensor)_, predicted = output.max(1)return characters[predicted[0]]# 预测E盘的图像
#img_path = "E:\\i.png"
img_path = "E:\\256A256.png"
predicted_char = predict_image(img_path)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(img_path))
plt.title(f"Predicted: {predicted_char}")
plt.axis("off")
plt.show()

这篇关于造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/326859

相关文章

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为