当前位置: 首页 > news >正文

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.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.jsqmd.com/news/33109/

相关文章:

  • 2025年泵站闸门定制厂家权威推荐榜单:截流闸门/分流井闸门/截流井污水闸门源头厂家精选
  • 2025年石墨增碳剂搅拌机源头厂家权威推荐:塑料粉混合机/厚型防火涂料搅拌机混合机/灌浆料搅拌机设备厂商精选
  • 深入理解浮点数格式:FP32、BF16、FP16与FP8的技术对比 - 详解
  • 2025年粉末涂料最新权威排行榜TOP10,行业新启航
  • 2025年11月小学生学习机品牌推荐:五强口碑榜与选购指南
  • 详细介绍:Java 数学类详解:Math 类常用方法(abs/sqrt/random 等)一篇掌握
  • Ubuntu环境下删除Docker镜像与容器、配置静态IP地址
  • 2025 年管线管公司最新推荐排行榜:权威测评发布,揭秘行业前五强综合实力及选购指南L245N 管线管/L360N 管线管/L415N 管线管公司推荐
  • 2025年11月学习机品牌对比榜:从早教到高中全场景机型盘点
  • 2025年湖南房屋鉴定公司权威推荐榜单:湖南房屋鉴定报告/湖南房屋鉴定机构/湖南房屋安全检测服务机构精选
  • 2025 年合金管公司最新推荐榜权威发布:12Cr1MoVG/15CrMoG/P22 合金管优质企业榜单及选择指南
  • 2025年发电电焊机工厂权威推荐:柴油焊机/汽油焊机/柴油发电电焊机源头厂家精选
  • 2025 年电线电缆实力厂家最新推荐榜单:结合协会测评权威数据,精选优质企业赋能工程与民生采购阻燃 / 耐火 / 屏蔽 / 低烟 / 电子和网络电缆电线推荐
  • 2025 年度茶叶优质品牌权威榜单发布,最新推荐品牌核心优势全解析助消费者选对好茶
  • 企业自研低代码,为什么常常走不通?
  • 2025年逆流闭式冷却塔制造企业权威推荐榜单:复合流闭式冷却塔/工业闭式冷却塔/横流式闭式冷却塔源头厂家精选
  • re-upx
  • 2025年工程机械润滑油厂商权威推荐:风电设备专用润滑油/钢铁行业润滑油/化工行业润滑油源头供应商精选
  • Windows10系统离线安装.NET Framework 3.5的方法-cab文件安装法 - 阳光宝贝
  • 2025年防霉涂料直销厂家权威推荐榜单:防潮涂料/洁净涂料/硅晶釉涂源头供应商精选
  • MySQL索引类型及其应用
  • re-catch
  • Unity后处理胶片颗粒FilmGrain技术全解析
  • 最长递增子序列(LIS)深度解析:从动态规划到贪心+二分
  • 2025 年颗粒灌装机源头厂家最新推荐榜:涵盖全自动、双头、四头、杂粮等多类型设备,助力企业精准选优质生产商
  • 2025 年彩灯源头厂家最新推荐排行榜权威发布,涵盖节日 / 生肖 / 大型户外等全品类彩灯定制,实力标杆厂家详细测评
  • 2025 年最新推荐花灯源头厂家权威排行榜:全产业链实力企业甄选 + 20000 平厂房厂家名单发布大型手工花灯/春节花灯/元宵节花灯公司推荐
  • 2025 年旋转接头源头厂家最新推荐榜:液压 / 高温 / 非标等多类型产品权威测评及优质企业盘点
  • 小程序认证费:如何可以省下这小程序认证费用?
  • 激光驱动器技术:精密控制与创新应用