造车先做三蹦子-之三:自制数据集(6x6数据集)230103

6*6的数据集制造、与识别:

#6*6的数据集的制作、与识别、测试、输出等


import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
class NeuralNet(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(NeuralNet, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, hidden_size)
        self.fc3 = nn.Linear(hidden_size, num_classes)
        self.relu = nn.ReLU()

    def forward(self, x):
        out = self.relu(self.fc1(x))
        out = self.relu(self.fc2(out))
        out = self.fc3(out)
        return out

# 数据准备
train_data = torch.tensor([
    [[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0]], 
    [[0,0,0,0,0,0],[0,0,0,0,0,0],[1,1,1,1,1,1],[1,1,1,1,1,1],[0,0,0,0,0,0],[0,0,0,0,0,0]],
    # ... 其他训练数据
]  , dtype=torch.float32 )
train_labels = torch.tensor([
    [1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0],
    # ... 其他训练标签
]  , dtype=torch.float32 )

test_data = torch.tensor([
    [[0,0,0,0,0,0],[0,1,1,1,1,0],[1,1,1,1,1,1],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]],
    [[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,1,0,0,0],[0,0,0,1,0,0]],
    # ... 其他测试数据
]  , dtype=torch.float32 )

# 参数设置
input_size = 6 * 6  # 输入维度
hidden_size = 50   # 隐藏层节点数量
num_classes = 7    # 输出维度
learning_rate = 0.001
num_epochs = 1000

model = NeuralNet(input_size, hidden_size, num_classes)

# 损失和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
for epoch in range(num_epochs):
    # 前向传播
    outputs = model(train_data.view(-1, 36))
    loss = criterion(outputs, torch.argmax(train_labels, 1))
    
    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

# 保存模型
torch.save(model.state_dict(), 'model.ckpt')

# 测试
with torch.no_grad():
    test_outputs = model(test_data.view(-1, 36))
    predicted = torch.argmax(test_outputs.data, 1)
    for i, prediction in enumerate(predicted):
        print(f"Test data {i+1}: Predicted label: {prediction.item()}")

#true Type 字体作为训练库,完成字符的识别

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,10)] + ["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)
#-----------------------------------------
    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]]


#//1-----
im="f:\\22letter23r1002\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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值