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