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

news2024/11/20 12:28:25

“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 plt

Times2000=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 = siz28e28
    print("{[w3",w03, "h3",w03 ,"]} ")
#=============================================
    draw.text(((siz28e28-w03)/2, (siz28e28-h03)/2), char, font=font, fill="black")
    return image

data = []
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 x

model = 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 = siz28e28
    print("{[w3",w03, "h3",w03 ,"]} ")
#=============================================
    draw.text(((siz28e28-w03)/2, (siz28e28-h03)/2), char, font=font, fill="black")
    return image

data = []
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 x

model = 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式实时操作系统的设计与开发(内存资源池存储管理)

内存资源池存储管理 内存资源池存储管理属于固定大小内存管理系统,内存池中内存块的分配和回收是基于第一级内存管理系统的,因为内存池中内存块是由第一级内存管理的算法所确定的。 内存池存储管理系统主要用于操作系统的一些常用结构的内存管理。例如…

位操作符^以及正负数在计算机中的存储

(数据是怎么在计算机中存储的)​ 正数和负数在内存中都是以补码的形式存储的,但不同的是正数的原码,补码,反码都是相同的,而负数的原码,补码和反码是不同的。 负数的原码,补码,反码之间存在什么…

神仙级价格:腾讯云双十一服务器优惠价格表来了

2023腾讯云双十一服务器优惠价格表多少钱一年?轻量服务器2核2G3M、2核2G4M、2核4G5M、4核8G12M、8核16G18M、16核32G28M和云服务器CVM标准型S5实例优惠价格,腾讯云百科今年双11服务器价格会在当前的价格基础上享受个9折优惠,可领券 https://c…

【Java】一只小菜坤的编程题之旅【4】

文章目录 1丶合并两个有序链表2丶栈的压入、弹出序列3丶设计循环队列4丶最小栈 1丶合并两个有序链表 小菜坤的答案: class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode newHeadnew ListNode(0);ListNode tmpnewHead;while…

Git的介绍和命令汇总

目录 一、git介绍 1、git的工作区域 2、git中文件的四种状态 二、常用命令 1、基础命令 2、提交类命令 3、删除类命令 4、分支类相关命令 5、 查看类相关命令 6、撤销类命令 一、git介绍 1、git的工作区域 在Git中,有四个工作区域:工作区域&am…

k8s认证

1. 证书介绍 服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥 一共有多少证书: *Etcd: Etcd对外提供服务,要有一套etcd server证书Etcd各节点之间进行通信,要有一套etcd peer证书Kube-APIserver访问Etcd&a…

算法学习之 背包01问题 , 备战leecode

来看题目 我们分析一下题目&#xff0c;首先我们要排序&#xff0c;这有助于我们得到最大的值&#xff0c;我们要得到一个递推公式 代码如下: class Solution { public:int maxSatisfaction(vector<int>& satisfaction) {int n satisfaction.size();vector<v…

【数据结构复习之路】串 (超详细讲解) 严蔚敏版

专栏&#xff1a;数据结构复习之路 复习完上面一章【线性表】【栈和队列】&#xff0c;我们接着复习串&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在我这么辛苦整理的份上&#xff0c;三连一下啦 目…

42917-2023 消光制品用聚氯乙烯树脂

1 范围 本文件规定了消光制品用聚氯乙烯树脂的分类、技术要求、取样、试验方法、检验规则及标志、随行 文件、包装、运输和贮存。 本文件适用于氯乙烯与交联剂悬浮共聚所制得的用于生产消光制品的聚氯乙烯树脂。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而…

通过高通量测序评估金针菇(双孢蘑菇)生产过程中的微生物演替

1.1 Title:Microbial succession during button mushroom (Agaricus bisporus) production evaluated via high-throughput sequencing 1.2 作者&#xff1a;Ban Ga-Hee 1.3 机构&#xff1a;Ewha Womans University 1.4 期刊&#xff1a;Food Microbiology 1.5 分区/影响因…

连接器信号完整性仿真教程 八

连接器信号完整性仿真主要是解算S参数及与之相关的参数&#xff0c;查看仿真结果相对于HFSS&#xff0c;其操作要简单得多。不需要复杂的操作&#xff0c;基本上左边导航树中&#xff0c;就可直接打开需要查看的仿真结果。下面以B to B Connector仿真结果实例演示&#xff0c;详…

何为心理承受能力?如何提高心理承受能力?

心理承受能力&#xff0c;也可以理解为人的抗压能力&#xff0c;指的是承受压力&#xff0c;承受逆境的能力。人的一生其实就是在不断的解决问题&#xff0c;见招拆招&#xff0c;遇到问题解决问题&#xff0c;在我们不断学习和锻炼的过程中&#xff0c;提高了我们解决问题的效…

Python之解析式和生成器表达式

Python之解析式和生成器表达式 列表解析式 列表解析式List Comprehension&#xff0c;也叫列表推导式。 语法 [返回值 for 元素 in 可迭代对象 if 条件]使用中括号[]&#xff0c;内部是for循环&#xff0c;if条件语句可选返回一个新的列表 列表解析式是一种语法糖 编译器…

Vue中如何处理表单输入验证?

在Vue中,能使用多种方式处理表单输入验证。以下是几种常见的方法: 1:使用Vue的指令和表达式: Vue提供了一些内置的指令和表达式,可以直接在模板中进行表单验证。例如,你可以使用v-model指令结合条件表达式来验证输入内容。 <template><div><input v-mod…

微软官方推出的四款工具,太实用了,值得收藏

目录 一、Officeplus——丰富的办公资源库 二、微软数学求解器 三、微软内置edge浏览器 四、Microsoft To-Do 办公待办神器 所以今天小编给大家分享4个微软官方推出的实用工具&#xff0c;每一个都非常好用&#xff0c;对于大家日常办公&#xff0c;非常有必要&#xff0c;感兴…

【C++深入浅出】C/C++内存管理(教你如何new到对象)

一. 前言 前面我们学习了有关C类和对象的知识&#xff0c;学会了如何构建一个完整的类&#xff0c;这些类都是存储在栈空间上的。在C语言中&#xff0c;我们不仅可以在栈上定义变量&#xff0c;也可以对堆上的空间进行管理&#xff0c;在接下来的几期中&#xff0c;我们的目标就…

idea + Docker-Compose 实现自动化打包部署(仅限测试环境)

一、修改docker.service文件&#xff0c;添加监听端口 vi /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock重启docker服务 systemctl daemo…

一个进程最多可以创建多少个线程基本分析

前言 ​话不多说&#xff0c;先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中&#xff0c;虚拟地址空间的内部又被分为内核空间和用户空间两部分&#xff0c;不同位数的系统&#xff0c;地址空间的范围也不同。比如最常见的 32 位和 64 位系统&…

四大特性模块(module)

module的动机 C20中新增了四大特性之一的模块(module)&#xff0c;用以解决传统的头文件在编译时间及程序组织上的问题。 modules 试图解决的痛点 能最大的痛点就是编译慢, 头文件的重复替换, 比如你有多个翻译单元, 每一个都调用了 iostream, 就得都处理一遍. 预处理完的源…

muduo异步日志库

文章目录 一、日志库模型参考 一、日志库模型 muduo日志库是异步高性能日志库&#xff0c;其性能开销大约是前端每写一条日志消息耗时1.0us~1.6us。 采用双缓冲区&#xff08;double buffering&#xff09;交互技术。基本思想是准备2部分buffer&#xff1a;A和B&#xff0c;前…