造车先做三蹦子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

相关文章

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

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

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;