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

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

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


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 pltTimes2000=1000# 参数设置
font_path = "arial.ttf"    #e:\\arial.ttf"
#siz28e28 = 28
siz28e28=28
characters = ["2","4"] +[str(i) for i in range(8,9)] + ["A","Z"]   #["A", "B"]
print(characters)# 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(Times2000):#8000):#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"
#img_path = "E:\\A128_128.png"
#img_path="e:\\a16_16.png"
#img_path="e:\\9_16_16.png"
#im="e:\\0_16_16.png"#//1-----
im="f:\\22letter23r1001\8_16_16.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()#//2-----------------------------------------im="f:\\22letter23r1001\A16_16.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()#//3-----------------------------------------im="f:\\22letter23r1001\\01616.png"   #f:\\22letter23r1001\x0e16.png'
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#//4-----------------------------------------im="f:\\22letter23r1001\8_17x20.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")plt.show()#//5-----------------------------------------im="f:\\22letter23r1001\8_15x19.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#//6-----------------------------------------im="f:\\22letter23r1001\8_25x31.png"
predicted_char = predict_image(im)
print(f"预测的字符为: {predicted_char}")# 使用matplotlib显示结果
plt.imshow(Image.open(im))
plt.title(f"Predicted: {predicted_char}")
plt.show()#//6-----------------------------------------im="f:\\22letter23r1001\01616.png"

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

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/260767

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

使用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. 裁剪与重置图像