pytorch汉字识别

news/2025/11/6 12:04:52/文章来源:https://www.cnblogs.com/lwt6666/p/19196207

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

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/957671.shtml

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

相关文章

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元人文的构想中,培育健全的价值主体是根基,而促成主体间在复杂社会中达成智慧共识是目标。然而,若缺乏对社会整体价值脉动的…

2025 年电线电缆实力厂家最新推荐榜单:结合协会测评权威数据,精选优质企业赋能工程与民生采购阻燃 / 耐火 / 屏蔽 / 低烟 / 电子和网络电缆电线推荐

引言 电线电缆作为工业生产与民生建设的核心载体,其质量与性能至关重要。据中国电线电缆行业协会 2025 年最新测评数据显示,当前行业内仅 38% 的企业产品在导电性能、绝缘强度等关键指标上完全达标,部分小型厂家因不…

2025 年度茶叶优质品牌权威榜单发布,最新推荐品牌核心优势全解析助消费者选对好茶

引言 当前茶叶市场品牌繁杂,原料以次充好、工艺不规范等问题频发,不同茶类品质判断标准差异显著,普通消费者与采购商均面临选品困境。为破解这一难题,本次榜单联合行业协会开展专项测评,采用 “三维度九指标” 体…

企业自研低代码,为什么常常走不通?

本文作者:得帆信息联合创始人兼CTO徐翔轩 最近我们签约了一个新客户,我和这位客户在22年就频繁互动过。当时,这位客户在低代码的自研和外采之间,选择了前者,也就是自己投入研发力量,孵化低代码,并在内部推广应用…

2025年逆流闭式冷却塔制造企业权威推荐榜单:复合流闭式冷却塔/工业闭式冷却塔/横流式闭式冷却塔源头厂家精选

在工业制冷领域,逆流闭式冷却塔以其高效节能、稳定可靠的特性,正成为众多企业的优先选择。 随着工业制造水平不断提升,闭式冷却塔作为工业循环水冷却的关键设备,其技术性能直接影响生产系统的运行效率与能耗水平。…

re-upx

根据提示可知是upx加壳,脱壳后用IDA打开,惯例先按shift+F12, 得到:可知需要输入验证,双击可执行文件也可验证猜想,双击“please input your flag: ” 跳转反汇编界面:查看汇编代码和流程:之后F5查看伪代码,根据…

2025年工程机械润滑油厂商权威推荐:风电设备专用润滑油/钢铁行业润滑油/化工行业润滑油源头供应商精选

工程机械润滑油作为保障设备正常运行的关键产品,凭借其优异的润滑性能、卓越的抗氧化性和稳定的高温表现,在建筑机械、矿山设备、工程车辆、工业设备等领域发挥着不可替代的作用。本文将基于行业标准与市场数据,为您…

Windows10系统离线安装.NET Framework 3.5的方法-cab文件安装法 - 阳光宝贝

Windows10系统离线安装.NET Framework 3.5时,使用下载的离线安装包有可能出现安装不成功的情况,比如报错:0X8024402c,下载多个版本依然不行,最后果断换办法——使用cab离线安装包。 操作步骤:获取.NET Framework…