From 011d828f1d9330590045c3f384b14b822568cb56 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Thu, 12 Mar 2026 20:12:55 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/auto.ts | 2 ++ data/src/auto/auto.ts | 2 +- data/src/auto/info.ts | 53 ++++++++++++++++++++++++++++++++---------- data/src/auto/types.ts | 4 ++++ ginka/train_maskGIT.py | 3 ++- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/data/src/auto.ts b/data/src/auto.ts index 28d32e2..7db67a1 100644 --- a/data/src/auto.ts +++ b/data/src/auto.ts @@ -268,6 +268,8 @@ const labelConfig: IAutoLabelConfig = { maxFishCount: 2, minEntryCount: 1, maxEntryCount: 4, + guassainRadius: 2, + heatmapKernel: 3, ignoreIssues: true, customTowerFilter: info => { // if (info.name !== 'Apeiria') { diff --git a/data/src/auto/auto.ts b/data/src/auto/auto.ts index a47e561..0cabafb 100644 --- a/data/src/auto/auto.ts +++ b/data/src/auto/auto.ts @@ -95,7 +95,7 @@ export async function autoLabelTowers( } // 转换楼层 const converted = convertTowerMap(result, floor, config); - const floorInfo = parseFloorInfo(info, converted.map); + const floorInfo = parseFloorInfo(info, converted.map, config); const floorData: IConvertedMapInfo = { data: converted, tower: info, diff --git a/data/src/auto/info.ts b/data/src/auto/info.ts index 3e3495b..338019d 100644 --- a/data/src/auto/info.ts +++ b/data/src/auto/info.ts @@ -1,5 +1,5 @@ import { readFile } from 'fs/promises'; -import { IFloorInfo, ITowerInfo, TowerColor } from './types'; +import { IAutoLabelConfig, IFloorInfo, ITowerInfo, TowerColor } from './types'; import { buildTopologicalGraph } from '../topology/graph'; import { commonDoorTiles, @@ -153,7 +153,11 @@ export function computeWallDensityStd( * @param tower 地图所属塔信息 * @param map 地图矩阵 */ -export function parseFloorInfo(tower: ITowerInfo, map: number[][]): IFloorInfo { +export function parseFloorInfo( + tower: ITowerInfo, + map: number[][], + config: IAutoLabelConfig +): IFloorInfo { const topo = buildTopologicalGraph(map); const flattened = map.flat(); const area = flattened.length; @@ -229,17 +233,42 @@ export function parseFloorInfo(tower: ITowerInfo, map: number[][]): IFloorInfo { fishCount, hasUselessBranch, wallDensityStd: computeWallDensityStd(map, wallTiles, 5), - wallHeatmap: gaussainHeatmap(generateHeatmap(map, wallTiles, 1)), - enemyHeatmap: gaussainHeatmap(generateHeatmap(map, enemyTiles, 1)), - resourceHeatmap: gaussainHeatmap( - generateHeatmap(map, resourceTiles, 1) + wallHeatmap: gaussainHeatmap( + generateHeatmap(map, wallTiles, config.heatmapKernel), + config.guassainRadius ), - potionHeatmap: gaussainHeatmap(generateHeatmap(map, potionTiles, 1)), - gemHeatmap: gaussainHeatmap(generateHeatmap(map, gemTiles, 1)), - keyHeatmap: gaussainHeatmap(generateHeatmap(map, keyTiles, 1)), - itemHeatmap: gaussainHeatmap(generateHeatmap(map, itemTiles, 1)), - entryHeatmap: gaussainHeatmap(generateHeatmap(map, entryTiles, 1)), - doorHeatmap: gaussainHeatmap(generateHeatmap(map, doorTiles, 1)) + enemyHeatmap: gaussainHeatmap( + generateHeatmap(map, enemyTiles, config.heatmapKernel), + config.guassainRadius + ), + resourceHeatmap: gaussainHeatmap( + generateHeatmap(map, resourceTiles, config.heatmapKernel), + config.guassainRadius + ), + potionHeatmap: gaussainHeatmap( + generateHeatmap(map, potionTiles, config.heatmapKernel), + config.guassainRadius + ), + gemHeatmap: gaussainHeatmap( + generateHeatmap(map, gemTiles, config.heatmapKernel), + config.guassainRadius + ), + keyHeatmap: gaussainHeatmap( + generateHeatmap(map, keyTiles, config.heatmapKernel), + config.guassainRadius + ), + itemHeatmap: gaussainHeatmap( + generateHeatmap(map, itemTiles, config.heatmapKernel), + config.guassainRadius + ), + entryHeatmap: gaussainHeatmap( + generateHeatmap(map, entryTiles, config.heatmapKernel), + config.guassainRadius + ), + doorHeatmap: gaussainHeatmap( + generateHeatmap(map, doorTiles, config.heatmapKernel), + config.guassainRadius + ) }; return floorInfo; diff --git a/data/src/auto/types.ts b/data/src/auto/types.ts index 11de222..2be65e6 100644 --- a/data/src/auto/types.ts +++ b/data/src/auto/types.ts @@ -183,6 +183,10 @@ export interface IAutoLabelConfig { /** 最大墙壁密度标准差,用于描述一个地图墙壁分布是否均匀的,较大的时候可能是特殊地图,不符合要求 */ readonly maxWallDensityStd: number; + /** 热力图统计算子 */ + readonly heatmapKernel: number; + /** 热力图高斯模糊的标准差 */ + readonly guassainRadius: number; /** 是否忽略问题 */ readonly ignoreIssues: boolean; diff --git a/ginka/train_maskGIT.py b/ginka/train_maskGIT.py index 15a02d2..67e56cf 100644 --- a/ginka/train_maskGIT.py +++ b/ginka/train_maskGIT.py @@ -44,6 +44,7 @@ GENERATE_STEP = 8 MAP_SIZE = 13 * 13 HEATMAP_CHANNEL = 9 LABEL_SMOOTHING = 0.1 +RAND_RATIO = 0.1 MASK_PROBS = [0.5, 0.5] # 纯随机,分块随机 device = torch.device( @@ -114,7 +115,7 @@ def train(): B, H, W = target_map.shape target_map = target_map.view(B, H * W) - rand = torch.randn_like(heatmap).to(device) * 0.05 + rand = torch.randn_like(heatmap).to(device) * RAND_RATIO if random.random() > 0.5: heatmap = heatmap + rand