pytorch汉字识别.

news/2025/11/6 12:09:48/文章来源:https://www.cnblogs.com/lwt6666/p/19196211

import os
import random
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms

解决OMP冲突

os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
device = torch.device('cpu')

配置参数

CHARS = ['一', '二', '三', '十', '人', '口', '手', '日', '月', '水']
TRAIN_NUM = 200
TEST_NUM = 50
IMG_SIZE = 64
DATA_SAVE_DIR = 'hanzi_data'
BATCH_SIZE = 32
EPOCHS = 30
LEARNING_RATE = 0.005

-------------------------- 关键改进:使用PIL默认字体生成汉字(无需额外安装) --------------------------

class HanziDatasetGenerator:
def init(self):
# 不依赖系统字体,使用PIL的默认字体+手动调整位置确保汉字显示
self.font = ImageFont.load_default()
print("提示:使用默认字体生成汉字(可能显示较简单,但能保证运行)")

# 【修复1】漏写self参数,导致无法调用类内属性
def _generate_single_img(self, char):"""生成简单但可区分的汉字图像"""img = Image.new('L', (IMG_SIZE, IMG_SIZE), color=255)  # 白底draw = ImageDraw.Draw(img)# 针对默认字体调整位置(确保汉字完整显示)char_offsets = {'一': (5, 25), '二': (5, 15), '三': (5, 10),'十': (20, 15), '人': (10, 20), '口': (15, 15),'手': (5, 10), '日': (15, 15), '月': (10, 15), '水': (5, 10)}x, y = char_offsets[char]# 固定较大字体尺寸,确保笔画清晰font_size = 40try:# 再次尝试系统字体,失败则用默认font = ImageFont.truetype('simsun.ttc', size=font_size)  # 尝试宋体draw.text((x, y), char, font=font, fill=0, stroke_width=2)except:# 用默认字体,手动加粗笔画确保可区分draw.text((x, y), char, font=self.font, fill=0, stroke_width=3)# 二次绘制增强笔画(避免默认字体太细)draw.text((x + 1, y), char, font=self.font, fill=0, stroke_width=2)# 轻微旋转增加差异rotation = random.randint(-10, 10)img = img.rotate(rotation, expand=False, fillcolor=255)return img# 【修复2】漏写self参数
def generate_dataset(self):"""生成数据集目录和图片"""if os.path.exists(DATA_SAVE_DIR):for root, dirs, files in os.walk(DATA_SAVE_DIR, topdown=False):for f in files:os.remove(os.path.join(root, f))for d in dirs:os.rmdir(os.path.join(root, d))os.rmdir(DATA_SAVE_DIR)# 创建目录for split in ['train', 'test']:for char in CHARS:os.makedirs(os.path.join(DATA_SAVE_DIR, split, char), exist_ok=True)# 生成样本print("生成数据集...")for char in CHARS:for i in range(TRAIN_NUM):img = self._generate_single_img(char)img.save(os.path.join(DATA_SAVE_DIR, 'train', char, f'{i}.png'))for i in range(TEST_NUM):img = self._generate_single_img(char)img.save(os.path.join(DATA_SAVE_DIR, 'test', char, f'{i}.png'))print(f"数据集生成完成:{os.path.abspath(DATA_SAVE_DIR)}")

-------------------------- 数据集加载 --------------------------

class HanziDataset(Dataset):
# 【修复3】__init__双下划线漏写,且漏写self
def init(self, split='train'):
self.split = split
self.data_dir = os.path.join(DATA_SAVE_DIR, split)
self.char_list = CHARS
self.char2idx = {c: i for i, c in enumerate(self.char_list)}
self.images, self.labels = self._load_data()
self.transform = transforms.ToTensor()

# 【修复4】漏写self参数
def _load_data(self):images = []labels = []for char in self.char_list:char_dir = os.path.join(self.data_dir, char)for img_name in os.listdir(char_dir):images.append(os.path.join(char_dir, img_name))labels.append(self.char2idx[char])return images, labelsdef __len__(self):return len(self.images)def __getitem__(self, idx):img = Image.open(self.images[idx]).convert('L')return self.transform(img), self.labels[idx]

-------------------------- 模型 --------------------------

class FeatureCNN(nn.Module):
# 【修复5】__init__双下划线漏写,且漏写self;Sequential内缩进混乱
def init(self, num_classes=10):
super(FeatureCNN, self).init() # 【修复6】super()调用格式补全
self.features = nn.Sequential(
nn.Conv2d(1, 8, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2, 2), # 64→32
nn.Conv2d(8, 16, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2, 2) # 32→16
)
self.classifier = nn.Linear(16 * 16 * 16, num_classes) # 【修复7】缩进修正

# 【修复8】漏写self参数
def forward(self, x):x = self.features(x)x = x.view(-1, 16 * 16 * 16)x = self.classifier(x)return x

-------------------------- 训练与识别 --------------------------

def main():
# 生成数据集(关键:即使没有中文字体也能生成可区分的图像)
generator = HanziDatasetGenerator()
generator.generate_dataset()

# 加载数据(【修复9】缩进修正,之前与main()同级导致报错)
train_dataset = HanziDataset('train')
test_dataset = HanziDataset('test')
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)
test_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=0)# 模型与优化器
model = FeatureCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)# 训练
print("\n开始训练...")
best_acc = 0.0
for epoch in range(EPOCHS):model.train()total_loss = 0.0for imgs, labels in train_loader:imgs, labels = imgs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(imgs)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item() * imgs.size(0)avg_loss = total_loss / len(train_dataset)# 测试model.eval()correct = 0total = 0with torch.no_grad():for imgs, labels in test_loader:imgs, labels = imgs.to(device), labels.to(device)outputs = model(imgs)_, preds = torch.max(outputs, 1)total += labels.size(0)correct += (preds == labels).sum().item()acc = 100 * correct / totalprint(f"轮次{epoch + 1:2d} | 损失:{avg_loss:.4f} | 准确率:{acc:.2f}%")if acc > best_acc:best_acc = acctorch.save(model.state_dict(), 'best_model.pth')if acc >= 85:print(f"达标!准确率:{acc:.2f}%")break# 识别
model.load_state_dict(torch.load('best_model.pth'))
print(f"\n最优准确率:{best_acc:.2f}%")while True:path = input("\n输入图片路径(q退出):")if path.lower() == 'q':breakif not os.path.exists(path):print("路径错误")continuetry:img = Image.open(path).convert('L').resize((64, 64))img_tensor = transforms.ToTensor()(img).unsqueeze(0).to(device)with torch.no_grad():output = model(img_tensor)pred_char = CHARS[torch.argmax(output).item()]confidence = torch.softmax(output, dim=1).max().item() * 100print(f"识别结果:{pred_char} | 可信度:{confidence:.2f}%")except Exception as e:print(f"错误:{e}")

【修复10】添加主函数调用,否则代码无法执行

if name == "main":
main()

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

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

相关文章

汉字

import os import numpy as np import pandas as pd from PIL import Image import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision i…

专业手机管理指南:使用Syncios移动管理器简化数据传输与备份

本文介绍Syncios移动管理器这款专业跨平台解决方案,能够帮助用户通过简单操作实现手机数据备份、恢复和跨设备传输,支持选择性数据管理,保障隐私安全,是手机数据管理的理想工具。像专业人士一样管理手机:使用Sync…

Russian Per GDP

So you are comparing the GDP of a zero-welfare society(USA) with a full-welfare society. A smart Russian just earn in the West but share the welfare of RF. ALSO, theres semi-welfare society.

2025年11月智能AI客服品牌推荐:综合实力排名榜

“双十一”后的客服高峰、年底会员续费潮、春节前的咨询井喷,企业客服中心在2025年第四季度普遍面临三大压力:人力缺口放大、咨询量峰值不可预测、客户对响应速度的容忍度继续下降。中国信通院《2025中国呼叫中心产业…

83windows 安装git 及git-lfs

# 1.安装 # 管理员进入PowerShell winget install Git.Git winget install GitHub.GitLFS# 验证安装是否成功 git --version git lfs version

近期小细节总结

串口并发调用 单个串口通讯(Modbus RTU也算),业务流程中的串口调用,既有定时轮询又有依次发送,也就是涉及到并发调用通讯的,不要犹豫,为通讯管理模块建立消息队列不用纠结锁的问题,天然线程安全定时任务和手动…

pytorch汉字识别

import os import random import numpy as np import matplotlib.pyplot as plt from PIL import Image, ImageDraw, ImageFont import torch import torch.nn as nn import torch.optim as optim from torch.utils.da…

2025年泵站闸门定制厂家权威推荐榜单:截流闸门/分流井闸门/截流井污水闸门源头厂家精选

在水利工程与市政排水系统中,泵站闸门作为控制水流、保障设施安全的关键设备,其质量与性能直接关系到整个系统的运行效率。 在水利工程、市政给排水、污水处理等领域,泵站闸门扮演着不可或缺的角色。据行业数据显示…

2025年石墨增碳剂搅拌机源头厂家权威推荐:塑料粉混合机/厚型防火涂料搅拌机混合机/灌浆料搅拌机设备厂商精选

石墨增碳剂搅拌机作为现代工业生产的核心混合设备,凭借其高效的混合能力、稳定的运行性能和广泛的适用性,在干粉砂浆、保温材料、真石漆、腻子粉等领域发挥着不可替代的作用。本文将基于2025年行业数据,深入分析石墨…

深入理解浮点数格式:FP32、BF16、FP16与FP8的技术对比 - 详解

深入理解浮点数格式:FP32、BF16、FP16与FP8的技术对比 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

2025年粉末涂料最新权威排行榜TOP10,行业新启航

在环保政策与工业升级的双轮驱动下,粉末涂料以其零VOC排放、高利用率和卓越性能,正成为涂装市场的绿色首选。 随着国家“双碳”政策的深入推进和制造业转型升级的加速,2025年中国粉末涂料行业迎来了新的发展契机。粉…

2025年11月小学生学习机品牌推荐:五强口碑榜与选购指南

孩子刚上一年级,作业辅导成了全家“战场”:拼音读不准、口算总出错,家长一吼孩子就哭,老人想帮却不懂新教材。这是不少家庭正在经历的日常。教育部《2024全国义务教育质量监测报告》显示,小学低年级学生每天课外学…

详细介绍:Java 数学类详解:Math 类常用方法(abs/sqrt/random 等)一篇掌握

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu环境下删除Docker镜像与容器、配置静态IP地址

在Ubuntu环境下管理Docker镜像和容器,以及配置静态IP地址,是日常服务器管理的常见任务。 删除Docker镜像与容器 删除容器: 要删除特定的Docker容器,首先需要停止该容器: docker stop <container_id_or_name>…

2025 年管线管公司最新推荐排行榜:权威测评发布,揭秘行业前五强综合实力及选购指南L245N 管线管/L360N 管线管/L415N 管线管公司推荐

引言 在工业经济持续发展的背景下,管线管作为能源输送、石油化工、城市建设等领域的核心基础材料,市场需求持续攀升,但行业内产品质量参差、服务能力失衡等问题仍较为突出。为破解采购端选择难题,塑料管道协会联合…

2025年11月学习机品牌对比榜:从早教到高中全场景机型盘点

期中刚过,家长群里最热闹的话题就是“要不要买学习机”。试卷发下来,有人欢喜有人愁,欢喜的那拨已经把学习机当成“第二老师”,愁的那拨还在纠结“到底买哪台”。教育部“双减”之后,校内作业量下降,家庭学习权重…

2025年湖南房屋鉴定公司权威推荐榜单:湖南房屋鉴定报告/湖南房屋鉴定机构/湖南房屋安全检测服务机构精选

房屋安全鉴定作为建筑工程领域的重要环节,凭借其专业的技术要求、严谨的评估标准和全面的安全保障,在老旧小区改造、公共建筑安全、灾后应急评估、工业建筑检测等领域发挥着至关重要的作用。本文将基于行业标准与技术…

2025 年合金管公司最新推荐榜权威发布:12Cr1MoVG/15CrMoG/P22 合金管优质企业榜单及选择指南

引言 当前合金管市场需求持续攀升,但产品质量合格率仅为 78%,采购方因信息不对称导致的选型失误率达 32%。为破解行业痛点,行业协会联合检测机构开展 2025 年度合金管企业测评,覆盖 120 余家企业,最终形成最新推荐…

2025年发电电焊机工厂权威推荐:柴油焊机/汽油焊机/柴油发电电焊机源头厂家精选

发电电焊机作为现代工业施工与应急作业的核心装备,凭借其高效集成特性、稳定输出性能和强大适应能力,在建筑施工、管道工程、应急维修、野外作业等领域发挥着不可替代的作用。本文将基于2025年行业数据与技术标准,为…

【AI元人文:构建“舆情反射与模拟沙盘”机制(合二篇)】

AI元人文:构建“舆情反射与模拟沙盘”机制——从价值混沌到共识可期的文明导航系统 在AI元人文的构想中,培育健全的价值主体是根基,而促成主体间在复杂社会中达成智慧共识是目标。然而,若缺乏对社会整体价值脉动的…