C#实战:AES解密Terraria存档与二进制文件处理
1. 项目概述与核心需求最近在折腾Terraria的存档文件发现它的玩家数据.plr文件是用AES加密的直接打开就是一堆乱码。网上虽然有一些现成的存档修改器但要么功能不全要么用起来不顺手更重要的是作为一个喜欢刨根问底的开发者我更想知道它到底是怎么加密的以及如何用代码亲手把它解开、修改、再封回去。这个过程不仅能让你自由定制角色属性、物品栏更是深入理解AES对称加密和二进制文件处理的一个绝佳实战案例。今天我就来完整拆解这个流程从分析文件结构到编写C#解密/加密代码最后实现一个简单的属性修改功能。无论你是想学习C#文件操作、加解密实战还是单纯想给自己的Terraria角色“开个小灶”这篇内容都能给你一条清晰的路径。2. 逆向工程Terraria存档文件结构探秘在动手写代码之前我们必须先搞清楚敌人长什么样。Terraria的存档主要分为两个部分世界存档.wld文件和玩家存档.plr文件。我们这次的目标是后者。2.1 玩家存档.plr的宏观结构用一个十六进制编辑器比如HxD或010 Editor打开一个.plr文件你会发现它并非从头到尾都是加密的密文。Terraria采用了一种“部分加密”的策略这为我们提供了突破口。文件大致可以分为三个部分文件头Header文件最开始的几十个字节。这部分通常是未加密的包含了一些元数据比如存档版本号、玩家名字的长度标识等。这是识别文件类型和版本的关键。加密数据主体Encrypted Data Body紧接头部的、一大段看起来是随机乱码的数据。这就是使用AES算法加密后的核心玩家数据包括生命值、魔力值、物品栏、装备、外观等所有重要信息。文件尾可能存在的校验或填充这部分不一定都有早期版本可能直接结束。我们的核心任务就是找到加密数据块的起始位置并用正确的密钥和初始化向量IV将其解密还原成我们可以理解的二进制数据流。2.2 定位AES加密参数密钥与IVAES加密需要两个关键参数密钥Key和初始化向量IV。对于Terraria好消息是在相当长的一段版本迭代中它使用的都是固定的、硬编码在游戏程序中的密钥和IV。这意味着我们不需要去破解只需要找到它们。通过逆向分析游戏程序此过程涉及反编译仅用于学习目的可以找到这些常量。一个广泛流传的、适用于多个历史版本的密钥和IV如下以十六进制字符串表示AES Key:t3rr4r1a4ndgr3at注意实际使用时需要将其转换为16字节的字节数组。字符串“t3rr4r1a4ndgr3at”正好是16个ASCII字符符合AES-128的要求。AES IV:t3rr4r14pl4y3r1v同样这也是一个16字节的IV。注意游戏版本更新可能会更改这些密钥。本文基于较通用的版本进行演示。在实际操作中如果发现解密失败首要怀疑对象就是密钥是否已随版本更新而改变。你需要针对目标游戏版本进行确认。2.3 解密后的数据结构解析成功解密后我们得到的是一个结构化的二进制数据流。Terraria使用了一种简单的序列化方式来存储数据理解其模式至关重要数据类型标记每个数据项前通常会有一个字节或更多来标识接下来的数据类型例如整数、字符串、布尔值、数组等。长度前缀对于可变长度的数据如字符串、数组在数据本身之前会存储一个表示其长度的整数通常是7位编码的变长整数以节省空间。数据本身按照标记的类型直接存储数据的二进制形式。例如读取一个字符串的伪代码逻辑是先读一个字节判断是否为“字符串类型标记”。接着读一个“变长整数”得到字符串的长度N。最后读取紧接着的N个字节并用特定的编码如UTF-8解码成字符串。物品数据则更复杂可能是一个结构体依次包含物品ID、数量、前缀等字段。3. 核心工具构建C#实现AES解密与加密理论清晰后我们开始动手搭建最核心的加解密工具类。我们将使用.NET Framework / .NET Core内置的System.Security.Cryptography命名空间。3.1 创建AES工具类我们创建一个静态类TerrariaAesHelper封装解密和加密的逻辑。using System; using System.IO; using System.Security.Cryptography; using System.Text; public static class TerrariaAesHelper { // 硬编码的AES-128密钥和IV private static readonly byte[] AES_KEY Encoding.ASCII.GetBytes(“t3rr4r1a4ndgr3at”); // 16 bytes private static readonly byte[] AES_IV Encoding.ASCII.GetBytes(“t3rr4r14pl4y3r1v”); // 16 bytes /// summary /// 解密Terraria玩家存档数据块 /// /summary /// param name“encryptedData”从.plr文件中提取的加密数据块/param /// returns解密后的原始二进制数据/returns public static byte[] DecryptPlayerData(byte[] encryptedData) { if (encryptedData null || encryptedData.Length 0) throw new ArgumentException(“加密数据不能为空”); using (Aes aesAlg Aes.Create()) { aesAlg.Key AES_KEY; aesAlg.IV AES_IV; aesAlg.Mode CipherMode.CBC; // Terraria 通常使用CBC模式 aesAlg.Padding PaddingMode.PKCS7; // 最常见的填充方式 using (ICryptoTransform decryptor aesAlg.CreateDecryptor()) using (MemoryStream msDecrypt new MemoryStream(encryptedData)) using (CryptoStream csDecrypt new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) using (MemoryStream msOutput new MemoryStream()) { csDecrypt.CopyTo(msOutput); return msOutput.ToArray(); } } } /// summary /// 加密修改后的玩家数据块 /// /summary /// param name“plainData”修改后的原始二进制数据/param /// returns可用于写回.plr文件的加密数据块/returns public static byte[] EncryptPlayerData(byte[] plainData) { if (plainData null || plainData.Length 0) throw new ArgumentException(“明文数据不能为空”); using (Aes aesAlg Aes.Create()) { aesAlg.Key AES_KEY; aesAlg.IV AES_IV; aesAlg.Mode CipherMode.CBC; aesAlg.Padding PaddingMode.PKCS7; using (ICryptoTransform encryptor aesAlg.CreateEncryptor()) using (MemoryStream msEncrypt new MemoryStream()) { using (CryptoStream csEncrypt new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { csEncrypt.Write(plainData, 0, plainData.Length); // 必须调用FlushFinalBlock确保填充字节被写入 csEncrypt.FlushFinalBlock(); } return msEncrypt.ToArray(); } } } }关键点解析CipherMode.CBC密码分组链接模式。这是最常用的模式之一它要求一个IV来使每个块的加密都依赖于前一个块提高了安全性。我们的固定IV就在这里使用。PaddingMode.PKCS7当数据长度不是AES块大小16字节的整数倍时需要进行填充。PKCS7是.NET和许多其他系统中的标准填充方式。FlushFinalBlock()在加密流的写入操作结束时必须调用。它负责处理最后一块数据的填充并完成加密过程。忘记调用它会导致加密数据不完整解密时必然失败。异常处理在实际工具中你需要用try-catch包裹这些操作特别是捕获CryptographicException它通常意味着密钥/IV错误、数据被篡改或填充不正确。3.2 处理.plr文件分离头与体加解密工具是针对“数据块”的。我们还需要一个文件处理器来切割和重组.plr文件。public class PlrFileProcessor { /// summary /// 已知的加密数据块起始偏移量这是一个示例值不同版本可能不同 /// 你需要通过分析十六进制文件来确定你版本的确切偏移量。 /// /summary private const int ENCRYPTED_DATA_OFFSET 0x150; // 例如336字节处开始加密 /// summary /// 从.plr文件中提取加密数据块 /// /summary public static byte[] ExtractEncryptedData(string plrFilePath) { byte[] allBytes File.ReadAllBytes(plrFilePath); if (allBytes.Length ENCRYPTED_DATA_OFFSET) { throw new InvalidDataException(“文件太小或偏移量设置错误。”); } // 从偏移量开始一直读到文件末尾都是加密数据 byte[] encryptedData new byte[allBytes.Length - ENCRYPTED_DATA_OFFSET]; Array.Copy(allBytes, ENCRYPTED_DATA_OFFSET, encryptedData, 0, encryptedData.Length); return encryptedData; } /// summary /// 从.plr文件中提取文件头未加密部分 /// /summary public static byte[] ExtractFileHeader(string plrFilePath) { byte[] allBytes File.ReadAllBytes(plrFilePath); if (allBytes.Length ENCRYPTED_DATA_OFFSET) { throw new InvalidDataException(“文件太小或偏移量设置错误。”); } byte[] header new byte[ENCRYPTED_DATA_OFFSET]; Array.Copy(allBytes, 0, header, 0, header.Length); return header; } /// summary /// 将文件头和加密后的数据块合并生成新的.plr文件 /// /summary public static void RebuildPlrFile(string outputFilePath, byte[] fileHeader, byte[] encryptedData) { using (FileStream fs new FileStream(outputFilePath, FileMode.Create)) using (BinaryWriter writer new BinaryWriter(fs)) { writer.Write(fileHeader); writer.Write(encryptedData); } } }如何确定ENCRYPTED_DATA_OFFSET这是整个流程中最需要手动分析和可能因版本而异的步骤。用十六进制编辑器打开一个.plr文件。观察文件开头部分通常能看到一些可读的字符串如版本号等。向下滚动寻找一个明显的“分界线”在这条线之后数据看起来完全变成无规律的、高熵值的随机字节比如几乎看不到连续的00或可读字符。这个分界线的位置就是加密数据的起始偏移量。记录这个偏移量的十六进制值并转换为十进制填入代码常量中。你可以先从一个已知可用的修改器或社区文档中查找常见版本的偏移量作为起点。4. 实战演练修改玩家生命值与魔力值现在我们有了解密数据、修改数据、再加密数据并写回文件的能力。让我们实现一个具体功能将玩家的生命值和魔力值修改为最大值。4.1 解析解密后的二进制数据假设我们已经通过分析或参考社区文档知道了生命值和魔力值在解密数据流中的存储位置和格式。例如它们可能是两个连续的4字节有符号整数int位于某个特定偏移量。我们创建一个数据解析器public class PlayerDataParser { // 这些偏移量是相对于解密后的数据块plain data起始位置的 // 这需要你通过分析或查阅资料获得。此处为示例值。 private const int HEALTH_OFFSET 0x100; private const int MANA_OFFSET 0x104; public static void ModifyHealthAndMana(byte[] plainData, int newHealth, int newMana) { if (plainData null || plainData.Length (MANA_OFFSET 4)) throw new ArgumentException(“明文数据无效或长度不足”); // 将int转换为字节数组并写入指定位置 BitConverter.GetBytes(newHealth).CopyTo(plainData, HEALTH_OFFSET); BitConverter.GetBytes(newMana).CopyTo(plainData, MANA_OFFSET); // 注意BitConverter.GetBytes 的结果取决于系统字节序Endianness。 // Terraria 通常使用小端序Little-Endian这与x86/x64系统一致。 // 如果你在非Intel架构上运行可能需要处理字节序转换。 } public static (int Health, int Mana) ReadHealthAndMana(byte[] plainData) { if (plainData null || plainData.Length (MANA_OFFSET 4)) throw new ArgumentException(“明文数据无效或长度不足”); int health BitConverter.ToInt32(plainData, HEALTH_OFFSET); int mana BitConverter.ToInt32(plainData, MANA_OFFSET); return (health, mana); } }4.2 整合完整工作流现在我们把所有步骤串联起来形成一个完整的控制台应用程序示例class Program { static void Main(string[] args) { string originalPlrPath “C:\Terraria\Players\MyPlayer.plr”; string backupPlrPath originalPlrPath “.backup”; string modifiedPlrPath “C:\Terraria\Players\MyPlayer_modified.plr”; // **第一步备份原文件** File.Copy(originalPlrPath, backupPlrPath, overwrite: true); Console.WriteLine(“原文件已备份。”); try { // **第二步提取文件头和加密数据** byte[] fileHeader PlrFileProcessor.ExtractFileHeader(originalPlrPath); byte[] encryptedData PlrFileProcessor.ExtractEncryptedData(originalPlrPath); Console.WriteLine($“文件头长度{fileHeader.Length} 字节加密数据长度{encryptedData.Length} 字节”); // **第三步解密数据** byte[] plainData TerrariaAesHelper.DecryptPlayerData(encryptedData); Console.WriteLine(“数据解密成功。”); // **第四步读取并显示当前属性** var (currentHealth, currentMana) PlayerDataParser.ReadHealthAndMana(plainData); Console.WriteLine($“当前生命值{currentHealth}当前魔力值{currentMana}”); // **第五步修改属性例如改为最大值500和200** PlayerDataParser.ModifyHealthAndMana(plainData, newHealth: 500, newMana: 200); Console.WriteLine(“已修改生命值和魔力值。”); // **第六步重新加密修改后的数据** byte[] newEncryptedData TerrariaAesHelper.EncryptPlayerData(plainData); Console.WriteLine(“数据重新加密成功。”); // **第七步重建.plr文件** PlrFileProcessor.RebuildPlrFile(modifiedPlrPath, fileHeader, newEncryptedData); Console.WriteLine($“新存档已生成{modifiedPlrPath}”); Console.WriteLine(“\n操作完成请将新文件重命名或替换原文件进行测试。”); Console.WriteLine(“**重要**操作前请务必关闭Terraria游戏。”); } catch (CryptographicException ex) { Console.WriteLine($“加解密失败{ex.Message}”); Console.WriteLine(“可能原因1. 密钥/IV错误2. 加密数据偏移量不正确3. 文件已损坏。”); } catch (Exception ex) { Console.WriteLine($“处理过程中发生错误{ex.Message}”); } } }5. 进阶挑战与深度解析完成基础修改后你可以向更复杂的领域探索。5.1 动态定位数据偏移量硬编码偏移量非常脆弱。更健壮的方法是解析文件头。文件头里可能包含了一个字段指明了玩家数据部分在加密前的长度或加密块的起始位置。你需要分析文件头的结构编写代码动态计算ENCRYPTED_DATA_OFFSET。这通常涉及读取一些长度标识、跳过某些特定结构的字段。5.2 解析完整的物品栏系统物品栏是存档中最复杂的部分之一。每个物品槽位可能存储一个“Item”对象其序列化结构可能如下物品IDshort或int标识物品类型如“铜短剑”、“生命水晶”。数量int对于可堆叠物品。前缀byte物品的前缀ID如“锋利”、“传奇”。其他标志位可能还有“是否收藏”、“染料”等信息。解析它需要你找到物品栏数组的起始位置。读取一个表示数组长度的变长整数。循环读取每个“Item”结构体。 修改物品栏意味着你要精确地构建符合这个序列化格式的字节流并替换掉原来的数据段。5.3 处理版本差异与兼容性不同版本的Terraria存档格式可能有显著差异。一个专业的修改器应该读取版本号首先从文件头确定存档版本。分支逻辑根据版本号选择对应的密钥、IV、数据偏移量、数据结构解析器。错误恢复当解析失败时提供清晰的错误信息而不是崩溃。6. 常见问题、排查技巧与安全须知在实际操作中你几乎一定会遇到各种问题。下面是我踩过坑后总结的一些经验。6.1 解密失败CryptographicException这是最常见的问题通常有以下几种原因和排查步骤问题现象可能原因排查步骤抛出CryptographicException 提示“填充无效无法被移除”1.密钥(Key)或IV错误最常见2.加密数据偏移量(ENCRYPTED_DATA_OFFSET)不准确提取的数据不是完整的密文块3. 数据在提取或传输过程中被损坏1.确认游戏版本检查你的.plr文件对应的Terraria版本并寻找该版本对应的密钥/IV。社区论坛、GitHub上的开源项目是重要来源。2.校验偏移量用十六进制编辑器重新确认加密数据起始位置。尝试稍微调整偏移量±几个字节进行测试。3.检查提取逻辑确保ExtractEncryptedData方法正确地从指定偏移量读到文件尾。解密出的数据开头部分看起来“部分正确”但后面是乱码偏移量略微偏差你可能多截取或少截取了几字节的非加密数据如文件头末尾的某些字段导致解密时初始块错位。仔细对比解密后数据开头部分与已知的未加密元数据如果有的话或尝试以16字节AES块大小为单位微调偏移量。解密过程无异常但解析数据时格式完全不对1.加密模式或填充模式错误可能性较小2.解密成功但数据结构已随版本大变1. 尝试其他CipherMode(如ECB) 或PaddingMode(如None, Zeros)。但Terraria用CBC和PKCS7是主流。2.重点排查版本你用的解析逻辑如生命值偏移量可能已过时。需要针对新版本重新分析数据结构。一个实用的调试技巧在解密后立即将plainData的前256个字节以十六进制形式输出到文件或控制台。观察这些数据是否有规律如存在可读的字符串、重复的模式、大量的00或FF这能帮你判断解密是否基本成功。完全随机的输出意味着解密失败出现一些结构化的数据即使你看不懂则意味着解密很可能成功了。6.2 修改后游戏无法读取存档未关闭游戏修改存档时游戏必须完全关闭。游戏进程会锁定存档文件导致你无法写入或者写入后内存中的缓存覆盖了你的修改。数据结构破坏你的修改代码错误地覆盖了相邻的重要数据。例如你把一个4字节的整数写成了8字节破坏了后面所有数据的偏移。务必确保“原位修改”即写入的字节数必须等于原数据的字节数。未重新加密确保你调用的是EncryptPlayerData而不是错误地将明文数据直接写回文件。文件头不匹配某些版本可能在文件头存储了数据部分的CRC校验和或长度。如果你修改了数据长度比如添加/删除了物品但没有更新文件头中的对应字段游戏可能会拒绝加载。对于简单修改如改数值通常不会改变数据总长度此问题不常见。6.3 安全与道德须知备份备份备份在操作任何存档文件前养成复制备份的习惯。代码中的第一步就是备份。仅限单人/本地使用此类修改绝对不要用于多人游戏或服务器这会被视为作弊破坏其他玩家的体验并可能导致封禁。学习目的优先这个项目的核心价值在于学习AES加解密、二进制文件处理、逆向工程数据结构的思维方法。享受“创造”工具的乐趣而不仅仅是“修改”结果的快感。尊重知识产权相关的分析成果用于个人学习和交流避免用于制作广泛传播的、破坏游戏平衡的作弊工具。最后这个项目就像一把瑞士军刀核心的AES加解密模块和文件处理框架是刀柄和主体而针对不同数据字段生命、魔力、物品的解析器则是不同的工具头。掌握了这套方法你不仅能对付Terraria也能以类似的思路去探索其他使用对称加密存储本地数据的应用程序真正将知识转化为解决问题的能力。动手试试吧从解密第一个存档、看到那些熟悉的属性名以明文形式出现的那一刻起你会感受到前所未有的成就感。

相关新闻

如何判断正规的轻盈美学品牌?机构选品避坑指南

如何判断正规的轻盈美学品牌?机构选品避坑指南

这几年,“轻盈美学”在轻医美圈子里被频繁提起。它不是单一技术,而更接近一套审美逻辑——不追求过度饱满和过度紧绷,而是关注自然度、肤质质感与整体和谐感。对机构和渠道商来说,轻盈美学对应的并不是某个爆款项目,而…

2026/7/30 11:01:55 阅读更多 →
云服务器部署Playwright爬虫环境:避坑指南与完整解决方案

云服务器部署Playwright爬虫环境:避坑指南与完整解决方案

1. 项目概述:为什么云服务器上装Playwright这么“坑”? 最近在云服务器上部署一个Python爬虫项目,核心工具选用了微软开源的Playwright。本以为 pip install playwright 加个 playwright install 就能搞定,结果从环境配置到依…

2026/7/29 17:40:49 阅读更多 →
100间客房酒店热水解决方案

100间客房酒店热水解决方案

作为酒店运营的核心配套系统,热水供应直接影响客人入住体验、运营成本及合规性。100间客房规模的酒店,若热水系统设计不合理,易出现用水等待时间长、能耗居高不下、高峰时段热水供应不足等痛点,既降低客人满意度,也增加…

2026/7/30 6:41:21 阅读更多 →

最新新闻

Godot引擎RPG开发终极指南:从架构设计到性能优化

Godot引擎RPG开发终极指南:从架构设计到性能优化

1. 项目概述:为什么选择Godot引擎来开发你的RPG?如果你正在寻找一个既能让你完全掌控游戏开发流程,又不会让你在引擎授权费上“大出血”的开源解决方案,那么Godot引擎几乎是为独立RPG开发者量身定做的。我最初接触Godot&#xff0…

2026/7/31 12:57:23 阅读更多 →
OpenCode模型配置与AI Agent开发实战指南

OpenCode模型配置与AI Agent开发实战指南

1. OpenCode模型配置深度解析作为AI Agent开发领域的核心工具,OpenCode的模型配置能力直接决定了Agent的智能水平和任务执行效果。今天我将结合自己多次实战经验,系统梳理OpenCode模型配置的关键要点,特别是针对opencode/xxx这类自定义模型的…

2026/7/31 12:57:23 阅读更多 →
终极分屏游戏指南:使用Nucleus Coop免费实现本地多人同屏体验

终极分屏游戏指南:使用Nucleus Coop免费实现本地多人同屏体验

终极分屏游戏指南:使用Nucleus Coop免费实现本地多人同屏体验 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop Nucleus Coop是一款革命性…

2026/7/31 12:57:23 阅读更多 →
2026.7.30

2026.7.30

相对运动transform.Translate(), 可以实现物体的运动transform.Translate( dx, dy, dz, space )第四个参数:Space.World 相对于 世界坐标系 Space.Self 相对于本地坐标系运动的方向获取目标物体 GameObject flag GameObject.Find( "红旗" );转向目标 thi…

2026/7/31 12:57:23 阅读更多 →
macOS与Windows截图自动加水印:快捷指令与Python脚本实战指南

macOS与Windows截图自动加水印:快捷指令与Python脚本实战指南

1. 项目概述:为什么我们需要自动化水印工具? 每次截图后,打开图片编辑软件,手动添加文字水印,调整位置、透明度,再保存——这个流程是不是让你觉得繁琐又低效?如果你经常需要处理大量截图&#…

2026/7/31 12:57:23 阅读更多 →
Jetson Nano供电模式详解:J48跳线作用与电源故障排查指南

Jetson Nano供电模式详解:J48跳线作用与电源故障排查指南

1. 项目缘起:从一块“点不亮”的板子说起 前段时间,我手头的一个边缘计算项目需要用到Jetson Nano。这块开发板在AIoT圈子里名气不小,功耗和算力平衡得不错,是很多嵌入式视觉项目的首选。我从仓库里翻出一块闲置的Nano&#xff0c…

2026/7/31 12:56:23 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻