基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述
猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间内搭建模型,并在测试集中取得尽可能高的准确率。
数据集中的图片长这样👆,是不是还蛮贴近生活呢~
本文将设计一个简单的三层卷积神经网络,完成分类任务。基于Pyqt5设计交互界面,在测试集中检验分类结果。工作量不大非常适合新手作为入门项目~最终功能实现如下图所示。
代码介绍
我觉得新手最有成就感的事情莫过于跑通一个功能了,我们抛开原理不谈,先完整运行程序。代码我是用pycharm写的,新建一个classfy_program项目,在classfy_program项目中创建两个py文件,分别用于训练和测试数据集。此外还创建data文件夹,用于存放训练和测试用的图片。
cat_dog_test.py代码:
import sys
import torch
import torch.nn as nn
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QFileDialog
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from torchvision import transforms
from PIL import Image# ---------------- 定义模型结构 ----------------
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.fc1 = nn.Linear(128 * 28 * 28, 512)self.fc2 = nn.Linear(512, 2) # 猫 vs 狗def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = self.pool(torch.relu(self.conv2(x)))x = self.pool(torch.relu(self.conv3(x)))x = x.view(-1, 128 * 28 * 28)x = torch.relu(self.fc1(x))x = self.fc2(x)return x# ---------------- 图像预处理 ----------------
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225]),
])# 类别名称(根据你的训练数据文件夹顺序)
class_names = ['猫', '狗']# ---------------- 主窗口 ----------------
class CatDogClassifier(QWidget):def __init__(self):super().__init__()self.setWindowTitle("猫狗分类器")self.setGeometry(100, 100, 400, 500)# 加载模型self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")self.model = CNN().to(self.device)self.model.load_state_dict(torch.load("model_checkpoint.pth", map_location=self.device))self.model.eval()# 创建界面组件self.image_label = QLabel("请点击按钮加载图片", self)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setFixedSize(300, 300)self.result_label = QLabel("", self)self.result_label.setAlignment(Qt.AlignCenter)self.load_button = QPushButton("加载图片", self)self.load_button.clicked.connect(self.load_image)# 布局layout = QVBoxLayout()layout.addWidget(self.image_label)layout.addWidget(self.result_label)layout.addWidget(self.load_button)self.setLayout(layout)def load_image(self):file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.png *.jpg *.jpeg)")if file_path:# 显示图片pixmap = QPixmap(file_path)pixmap = pixmap.scaled(300, 300, Qt.KeepAspectRatio)self.image_label.setPixmap(pixmap)# 进行预测image = Image.open(file_path).convert("RGB")input_tensor = transform(image).unsqueeze(0).to(self.device)with torch.no_grad():output = self.model(input_tensor)_, predicted = torch.max(output, 1)result = class_names[predicted.item()]self.result_label.setText(f"预测结果:{result}")# ---------------- 运行主程序 ----------------
if __name__ == "__main__":app = QApplication(sys.argv)window = CatDogClassifier()window.show()sys.exit(app.exec_())
cat_dog_train.py代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms# 数据预处理与加载
transform = transforms.Compose([transforms.Resize((224,224)), # 调整图片尺寸为224x224transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), # 适用于自定义模型的标准化
])# 设置训练集和验证集
train_dataset = datasets.ImageFolder(root='data/train', transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 自定义卷积神经网络模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()# 第一层卷积self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1) # 输入通道为3(RGB),输出通道为32self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)# 池化层self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 全连接层self.fc1 = nn.Linear(128 * 28 * 28, 512) # 调整为经过池化后的维度self.fc2 = nn.Linear(512, 2) # 输出为2(猫 vs 狗)def forward(self, x):x = self.pool(torch.relu(self.conv1(x))) # 第一层卷积 + ReLU + 最大池化x = self.pool(torch.relu(self.conv2(x))) # 第二层卷积 + ReLU + 最大池化x = self.pool(torch.relu(self.conv3(x))) # 第三层卷积 + ReLU + 最大池化x = x.view(-1, 128 * 28 * 28) # 展平x = torch.relu(self.fc1(x)) # 全连接层 + ReLUx = self.fc2(x) # 输出层return x# 实例化模型
model = CNN()# 使用GPU训练(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device) # 将模型移动到GPU(如果可用)# 损失函数与优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):model.train()running_loss = 0.0correct = 0total = 0# 训练阶段for images, labels in train_loader:images, labels = images.to(device), labels.to(device) # 将数据移动到GPU(如果可用)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()# 输出每轮训练损失与准确率print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / len(train_loader):.4f}, Accuracy: {100 * correct / total:.2f}%")# 保存模型检查点torch.save(model.state_dict(), 'model_checkpoint.pth')print("Training complete!")
data数据集的下载链接在这里了:
Download Kaggle Cats and Dogs Dataset from Official Microsoft Download Center
希望看到这里的大家能够点一个小小的赞❤❤,后续会持续更新更多内容~~
相关文章:
基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述 猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间…...
Baklib知识中台引领服务智能跃迁
智能架构重构服务范式 Baklib 知识中台通过全量数据融合与多模态处理能力,重塑企业服务底层逻辑。基于分布式架构设计,平台将分散在业务系统、文档库及外部渠道的非结构化数据进行智能清洗与语义解析,形成标准化的知识元数据池。通过四库体系…...
【Python】超全常用 conda 命令整理
Conda命令整理文档,结合官方指南与高频使用场景分类说明,每个命令都有对应的解释 一、环境管理 1. 创建环境 基本创建conda create --name my_env # 创建名为my_env的空环境 conda create -n my_env python3.11 # 指定Python版本 conda creat…...
FreeRTOS菜鸟入门(十四)·事件
目录 1. 基本概念 2. 应用场景 3. 运作机制 4. 控制块 5. 事件函数接口 5.1 事件创建函数 xEventGroupCreate() 5.2 事件删除函数 vEventGroupDelete() 5.3 事件组置位函数 xEventGroupSetBits()(非中断) 5.4 事件组置位函数 xEventGr…...
setData执行后操作方法-微信小程序
在微信小程序中,setData 是异步执行的,如果你需要在 setData 执行完毕后执行某些操作,可以通过以下几种方式实现: 1. 使用 setData 的回调函数 从基础库 2.2.3 开始,setData 支持传入回调函数,回调会在数据…...
SpringAI特性
一、SpringAI 顾问(Advisors) Spring AI 使用 Advisors机制来增强 AI 的能力,可以理解为一系列可插拔的拦截器,在调用 AI 前和调用 AI 后可以执行一些额外的操作,比如: 前置增强:调用 AI 前改…...
捌拾叁- 量子傅里叶变换
1. 前言 最近公司地震,现在稍微有点时间继续学习。 看了几个算法,都说是基于 量子傅里叶变换 ,好,就是他了 Quantum Fourier。 2. 傅里叶变换 大学是学通信的,对于傅里叶变换还是有所理解的。其实就是基于一个 时域…...
SSTI模版注入
1、概念 SSTI是一种常见的Web安全漏洞,它允许攻击者通过注入恶意模板代码,使服务器在渲染模板时执行非预期的操作。 (1)渲染模版 至于什么是渲染模版:服务器端渲染模板是一种Web开发技术,它允许在服务器端…...
33、前台搜索功能怎么实现?
输入搜索的东西,如果为空 如果有 前端是提交表单,方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后,执行 js 中的 load方法,前端提交表单, 后端 controller 中的loa…...
量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构
摘要:基于机器学习算法对市场微观结构的实时监测,黄金价格在3300美元/盎司附近展开技术性反弹。本文通过多因子分析框架,解析美元指数上行、贸易政策突变及资产配置迁移对贵金属市场的复合影响,并构建基于LSTM神经网络的动态支撑位…...
对PyTorch模块进行性能分析
以下是针对PyTorch模块进行性能分析的完整方法与工具指南,结合了多种优化策略和实际应用场景: 一、PyTorch性能分析工具 PyTorch Profiler • 功能:内置的性能分析工具,支持捕获CPU/GPU操作、内存分配、数据形状及硬件利用率。 …...
lvm详细笔记
LVM简介 逻辑卷管理器,是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化这种限制,它允许用户将多个物理分区组合卷组。例如,系统中的多个物…...
OpenHarmony 以太网卡热插拔事件接口无效
目录 1.背景 2.解决方案 1.背景 在OpenHarmony中调用以太网热插拔时间,发现热插拔没有任何回调,如下接口 import { ethernet } from kit.NetworkKit;ethernet.on(interfaceStateChange, (data: object) > {console.log(on interfaceSharingStateCha…...
SPDK NVMe of RDMA 部署
使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令: git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…...
Go语言的逃逸分析是怎么进行的
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
纯净IP,跨境账号稳定的底层逻辑
在跨境业务快速扩张的背景下,越来越多的卖家、营销人、数据团队都开始使用代理IP来实现全球网络触达。然而,账号封禁问题始终如影随形,而背后的一个“隐性元凶”常常被忽视——纯净IP的缺失。本文将从实战角度出发,带你深入了解什…...
编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法
编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法 前言 笔者这里是封装了简单的OpenCV视频播放抽象,然后却发现移植到Ubuntu和开发板上都罢工的事情,原来是Windows平台下我们是默认下载了ffmpeg的库的,但是在泛Linu…...
djinn: 3靶场渗透
djinn: 3 来自 <https://www.vulnhub.com/entry/djinn-3,492/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.243 3࿰…...
WHAT - 简单服务发现
文章目录 简单理解举个例子简单服务发现方式1. 静态配置(最简单,但不灵活)2. DNS 发现3. 使用服务注册中心(稍高级) 总结 “简单服务发现”(Simple Service Discovery)通常指的是一种让系统中的…...
auto推导类型原则
auto 是 C11 引入的类型自动推导关键字,它允许编译器根据表达式的类型来推导变量的确切类型。虽然使用 auto 可以让代码更简洁,但理解它的类型推导规则非常关键,尤其是在涉及指针、引用、const、模板等场景时。 ✅ 一、基本推导原则 auto x …...
44.辐射发射整改简易摸底测试方法
辐射发射整改简易摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施6. 与简易方法预测试效果对比 1. 正式摸底预测试 去正式实验室做一次预测试,取得频谱图;确定超标频点和超标量(备用)。 …...
初识C++:入门基础(二)
概述:该篇博客主要介绍C的缺省函数、函数重载、和引用等知识。 目录 1. 缺省参数 2. 函数重载 3. 引用 3.1 引用的概念和定义 3.2 引用的特性 3.3 引用的使用 3.4 const引用 3.5 指针和引用的关系 4. nullptr 5. 小结 1. 缺省参数 缺省参数是声明或定义函…...
我国脑机接口市场规模将破38亿元,医疗领域成关键突破口
当人类仅凭"意念"就能操控无人机编队飞行,当瘫痪患者通过"脑控"重新站立行走,这些曾只存在于科幻电影的场景,如今正通过脑机接口技术变为现实。作为"十四五"规划中重点发展的前沿科技,我国脑机接口…...
笔记,麦克风的灵敏度
麦克风的“灵敏度(Sensitivity)”决定了它捕捉声音细节的能力。想象麦克风是一只有耳朵的生物。高灵敏度麦克风像长着“超级顺风耳”的精灵,能听见花瓣飘落的声音、远处树叶的沙沙声,甚至你心跳的微弱震动。适合录音棚里捕捉歌手的…...
国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表
不管是政府机关、公司企业,还是金融行业、教育行业等单位,在办公过程中都经常需要填写各种文书和表格,比如通知、报告、登记表、计划表、申请表等。这些文书和表格往往是用Word文件制作的模板,比方说一个通知模板中经常会有“关于…...
AKS 支持 Kata Container容器沙盒 -预览阶段
您准备好提升您的云和 DevOps 技能了吗? 🐥《云原生devops》专门为您打造,我们精心打造的数十篇文章库,这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士,还是渴望…...
Ubuntu通过源码编译方式单独安装python3.12
1、安装依赖 sudo apt-get install zlib1g sudo apt-get install zlib1g-dev sudo apt-get install openssl sudo apt-get install libssl-dev2、编译源码并安装 wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz tar -xvf Python-3.12.0.tar.xz cd Pyth…...
【某OTA网站】phantom-token 1004
新版1004 phantom-token 请求头中包含phantom-token 定位到 window.signature 熟悉的vmp 和xhs一样 最新环境检测点 最新检测 canvas 下的 toDataURL方法较严 过程中 会用setAttribute给canvas 设置width height 从而使toDataURL返回不同的值 如果写死toDataURL的返回值…...
游戏引擎学习第266天:添加顶部时钟概览视图。
简要讨论使用第三方调试工具或在多个项目中复用自己的调试工具 今天的工作主要是在提升调试界面的可用性和美观性。昨天已经整理了布局代码,今天的目标是继续优化调试界面,使其更易用。我们已经为调试工具添加了许多新功能,并且在实现过程中…...
霸王茶姬微信小程序自动化签到系统完整实现解析
霸王茶姬微信小程序自动化签到系统完整实现解析 技术栈:Node.js 微信小程序API MD5动态签名 一、脚本全景架构 功能模块图 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…...
AI与自然语言处理(NLP):从BERT到GPT的演进
AI与自然语言处理(NLP):从BERT到GPT的演进 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI与自然语言处理(NLP):从BERT到GPT的演进摘要引言…...
TRO高能预警,Keith律所×Tane Hannah Meets版权两案王炸维权
紧急避雷贴,keith律所代理Tane Hannah Meets 10个版权连发两案突袭跨境圈!案件详情如下: 案件基本情况: 起诉时间:2025-5-8 案件号:25-cv-05079、25-cv-05088 品牌:Tane Meets Works 原告&…...
在 Spring Boot 中选择合适的 HTTP 客户端
在现代的 Spring Boot 应用程序中,与外部服务进行 HTTP 通信是一个常见的需求。Spring Boot 提供了多种方式来实现 HTTP 请求,包括 Java 的 HttpClient、Spring 的 RestTemplate、WebClient,以及第三方库如 Apache HttpClient。本文将详细介绍…...
Go语言中 源文件开头的 // +build 注释的用法
// build注释主要用于实现条件编译。借助设置不同的构建标签(build tags),我们能够指定在特定的操作系统、架构或者其他自定义条件下才编译某个文件 1、基本规则 格式要求: 这种注释必须出现在文件的开头部分。注释与包声明之间至…...
C++八股 —— map/unordered_map
1. 底层数据结构 map —— 红黑树 随处可见的红黑树:原理、实现及应用场景 - 知乎 unordered_map —— 散列表 [C] 哈希表(散列表)详解_c哈希表-CSDN博客 2. 常见面试题 底层为红黑树的容器有哪些 mapmultimapsetmultiset 红黑树和AVL树…...
PostgreSQL创建只读账号
环境说明 部署环境:linux服务器docker容器部署 数据库:PostgreSQL 成果 只读账号/密码:read_only/xxx123 授权可读库:xxx、xxxdata 操作过程 #进入PostgreSQL容器(如果你没有用docker容器忽略这一步就可以了ÿ…...
DVWA靶场保姆级通关教程--06不安全验证机制
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 原理详解 1. 前后端验证逻辑不一致 2. 验证码值保存在客户端 3. 验证码可预测或重复 4. 验证码验证与逻辑解耦 一、处理关卡报错 二、low级别源…...
【日撸 Java 三百行】Day 7(Java的数组与矩阵元素相加)
目录 Day 7:Java 的数组与矩阵元素相加 一、基本知识 二、矩阵的建立与基本计算 三、代码及测试 拓展:Arrays类详解 小结 Day 7:Java 的数组与矩阵元素相加 Task: 矩阵的赋值.二重循环. 一、基本知识 在学习 Java 中的数组与矩…...
【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 递归、搜索和回溯递归搜索VS 深度优先遍历 VS 深度优先搜索 VS 宽度优先遍历 VS 宽度优先搜索 VS 暴搜回溯与剪枝 1 面试题 08.06. 汉诺塔问题1.1 分析…...
2025最新精选5款3DMAX建筑可视化插件
在3DMAX建筑可视化领域,各类工具如同繁星般璀璨,它们为设计师们搭建起通往理想作品的桥梁。今天,就让我们一同走进几款极具特色的工具——RetailStore插件、2Dto3D插件、DrawFloorPlan插件、MaxToCAD插件以及EXR透视贴图技术,探寻…...
麒麟系统使用-个性化设置
文章目录 前言一、个性化设置-背景二、个性化设置-主题三、个性化设置-锁屏四、个性化设置-屏保五、个性化设置-字体总结 前言 与windows系统相比,麒麟系统中的个性化设置大体相似,在细节上稍有不同。本文将讲述麒麟系统中的个性化设置中的各个模块。 一…...
flask开启https服务支持
目录 一、背景 二、开启https支持 三、自签名 1、安装openssl 2、验证安装 3、自签名 四、编写代码 五、访问https接口 一、背景 最近在做自动化业务,需要兼容现在主流的框架开发的前端页面,于是到github找到了几个项目,clone下来项目并…...
CNN处理图片
In [5]: 123456789101112131415161718192021222324252627282930313233import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as np# 平滑均值滤波#KaTeX parse error: Expected EOF, got _ at position 14: \text {filter_̲{arg}np.}.full (sha…...
【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)
Bootstrap V4系列 学习入门教程之 组件-表单(Forms) 表单(Forms)一、Overview二、Form controls 表单控件2.1 Sizing 尺寸2.2 Readonly 只读2.3 Readonly plain text 只读纯文本 三、Checkboxes and radios 复选框和单选框3.1 Def…...
图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法|文献速递-深度学习医疗AI最新文献
Title 题目 Image by co-reasoning: A collaborative reasoning-based implicit data augmentation method for dual-view CEUS classification 图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法 01 文献速递介绍 结合了B型超声(BUS&…...
MySQL性能分析工具:SHOW PROCESSLIST
概述 以下是一份详细的 MySQL SHOW PROCESSLIST 使用教程,帮助您监控和分析数据库当前活动,快速定位性能问题资料已经分类整理好,喜欢的朋友自取:https://pan.quark.cn/s/f52968c518d3 1. 命令基本作用 SHOW PROCESSLIST 显示当…...
Linux网络编程day8本地套接字
本地套接字 利用cs模型实现本地套接字完成进程间通信 对比网络编程TCP C/S模型,注意以下几点 1、int socket(int domain, int type, int protocol); domain-->AF_INET改为AF_UNIX , type都可写SOCK_STREAM/SOCK_DGRAM2、地址结构 sockaddr_in -->sockadd…...
使用 React Native实现鸿蒙开发的详细方案
一、环境准备 1. 基础环境要求 操作系统:Windows 10/11 或 macOS (建议版本最新)Node.js: v16.x 或更高版本npm: v8.x 或更高版本Java JDK: 11 或更高版本DevEco Studio: 3.1 或更高版本 (鸿蒙官方IDE)2. 安装 DevEco Studio 从华为开发者官网下载安装时选择以下组件: Harmo…...
WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?
通过上一章《WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍》,我们知道WEBRTC在完成 SDP 协商和 ICE 候选交换信令后,双方就可以建立 RTP 流,开始传输音视频数据,这时,RTP 数据包就通过在 IC…...
【Unity笔记】PathCreator使用教程:用PathCreator实现自定义轨迹动画与路径控制
在Unity开发过程中,角色移动、摄像机动画、轨道系统、AI巡逻等功能中,路径控制是常见又复杂的需求之一。如何优雅、高效地创建路径并控制对象沿路径运动,是游戏开发、动画制作乃至工业仿真中的关键问题。 在这篇文章中,我将介绍一…...