Опыт обучения LoRA моделей на базе FLUX.1-dev для игровых ассетов: подготовка датасета и лучшие настройки
#171 среда, 29 октября 2025 г. четверг, 30 октября 2025 г. 17 минут(ы) 1614 слов
🎥 Видеоинструкции по обучению LoRA моделей на базе FLUX.1-dev для игровых ассетов
📺 VK видео
🧠 Описание видео
Видео посвящено личному опыту обучения моделей на базе FLUX.1-dev для генерации изображений — в частности, LoRA моделей, применяемых при создании игровых ассетов.
Рассказано, как правильно подготовить датасет:
- Использовать изображения размером 1024×1024.
- Собирать наборы с разными позами персонажей или вариациями экипировки на одной картинке — это упрощает использование ассетов в играх.
⚙️ Основные рекомендации по обучению
- Использовать триггерное слово, уникальное для каждого датасета.
- Повторять обучение каждой картинки 20 раз каждые 9 эпох, чтобы избежать переобучения.
- Оптимальный размер сети — 128: хороший баланс между детализацией и размером файла.
- Сохранять модель после каждой эпохи и применять лору средней эпохи (5–6) для баланса точности и вариативности.
🧩 Практические примеры
Показаны разные типы датасетов:
- фэнтезийные персонажи;
- образы с бронёй и экипировкой;
- комикс с котиками 🐱.
Обучение датасета из 25 изображений на 9 эпох занимает примерно 5 часов на RTX 4090. Используется скрипт для автоматической генерации описаний изображений с помощью GPT-4 Vision, что улучшает качество промптов и итоговой модели.
🎮 Кому будет полезно
Видео будет особенно интересно разработчикам игр и всем, кто хочет обучать собственные LoRA-модели под разные задачи: от игровых ассетов до стилизованных генераций.
🧩 Объяснение параметров на скриншоте FLUX.1-dev LoRA Training UI

1️⃣ Model name (d4k1s01_charsheet)
Уникальное имя для обучаемой LoRA модели. Используется для сохранения результата и различия между разными наборами данных. 💡 Важно: имя модели не должно повторяться, иначе может перезаписаться предыдущий результат.
2️⃣ Trigger word / sentence (d4k1s01 charsheet)
Триггерное слово или фраза, которая будет использоваться при генерации изображений с обученной LoRA.
Это ключ, по которому модель "узнаёт" нужный стиль или персонажа.
💬 Пример: если LoRA обучена на рыцарях, триггер может быть "knight fluxstyle".
3️⃣ Base model (flux-dev)
Выбор базовой модели, на которой будет происходить обучение. В данном случае используется FLUX.1-dev, — универсальная dev-версия модели для дообучения (fine-tuning). 🧠 LoRA фактически "прикрепляется" к этой основе.
4️⃣ VRAM (12G / 16G / 20G)
Выбор режима в зависимости от объёма видеопамяти (VRAM).
- 12G — оптимизированный low VRAM режим (для RTX 3060 / 4070 и т.п.).
- 16G / 20G — стандартные режимы с большей точностью и скоростью. ⚙️ Этот параметр регулирует объём батча и размер кэша во время обучения.
5️⃣ Repeat trains per image (20)
Количество повторений обучения для каждой картинки. Каждое изображение из датасета используется 20 раз за эпоху, чтобы модель лучше "запомнила" его особенности. ⚠️ Слишком большое значение может привести к переобучению, слишком малое — к недообучению.
6️⃣ Max Train Epochs (9)
Количество эпох обучения — сколько раз модель полностью пройдёт весь датасет. Рекомендуемое значение 5–9 эпох. 💡 Обычно лучшая LoRA получается на 5–6 эпохе, где баланс между вариативностью и точностью оптимален.
7️⃣ Dataset files (combined_001.png, .txt, и т.д.)
Список файлов, участвующих в обучении.
.png— изображения (ресурсы для обучения)..txt— подписи (caption-файлы), описывающие содержание картинок для корректного обучения.- 📁 Все пары
.png+.txtформируют датасет для LoRA. - 💡 Вы можете просто перетащить ваши файлы из подготовленного датасета прямо в это окно для загрузки.

⚙️ Пояснение к параметрам Advanced Options в интерфейсе FLUX.1-dev LoRA Training

1️⃣ --save_every_n_epochs = 1
Сохраняет модель после каждой эпохи обучения.
Это значит, что после завершения каждой эпохи создаётся отдельный .safetensors файл LoRA.
💡 Полезно для выбора лучшей версии LoRA — например, часто оптимальный результат получается на 5–6 эпохе, не обязательно на последней.
2️⃣ --network_dim = 128
Параметр, определяющий размер внутренней сети LoRA (LoRA Rank). Он влияет на глубину и детализацию обучения, а также на размер итогового файла.
📊 Рекомендуемые значения:
32–64— лёгкая LoRA с хорошим качеством и небольшим размером (оптимальный диапазон).64–96— высокая детализация, подходит для сложных или стилизованных наборов данных.128— максимально допустимое значение для FLUX.1-dev; выше не даёт ощутимых улучшений и сильно увеличивает вес модели.
⚠️ Важно: слишком высокий network_dim может привести к переобучению и сделать LoRA тяжёлой без заметного прироста качества.
3️⃣ --caption_prefix = "d4k1s01 charsheet"
Добавляет указанный текст перед каждой подписью (caption) при обучении.
Это помогает усилить ассоциацию между изображениями и триггерным словом,
чтобы при генерации по запросу d4k1s01 charsheet модель точно вызывала нужный стиль или персонажа.
💬 Пример: если картинка описана как "cyberpunk armor", модель обучается видеть её как "d4k1s01 charsheet cyberpunk armor".
🧠 Скрипт автоматического описания изображений для датасета LoRA (FLUX)
art_to_text.py Python-скрипт автоматически анализирует PNG-изображения в указанной папке и создаёт к каждому файл .txt с кратким описанием содержимого на английском языке.
Описания генерируются с помощью мультимодели OpenAI (например, GPT-4o) и подходят для использования при обучении LoRA-моделей FLUX.
from pathlib import Path
import base64
from openai import OpenAI
# =============== НАСТРОЙКИ ===============
DIRECTORY = r"art" # Путь к папке с PNG
RECURSIVE = False # True — искать во вложенных папках
MODEL = "gpt-4o" # Модель OpenAI
API_KEY = "s...A"
# ==========================================
client = OpenAI(api_key=API_KEY)
#text_analyze = "Analyze the provided image containing character equipment or armor sprite parts. Identify and describe all items in the grid from left to right, top to bottom, but present the result as one continuous descriptive block. In your description, specify the item types (helmet, shoulder pad, chest armor, torso armor (lower part of armor), skirt armor, belt, skirt), colors, materials, decorative elements, and view angles (front, side, etc.). Mention mirrored or symmetrical variations where applicable. The final output must be written as a single paragraph without numbered or bulleted lists, suitable for embedding in a sprite asset database."
#text_analyze = "Describe what is shown in this image briefly. Analyze the provided image containing character equipment or armor sprite parts. Identify and describe all items in the grid from left to right, top to bottom, but present the result as one continuous descriptive block. In your description, specify the item types (helmet, shoulder pad, chest armor, torso armor (lower part of armor), skirt armor, belt, skirt), colors, materials, decorative elements, and view angles (front, side, etc.). Mention mirrored or symmetrical variations where applicable. The final output must be written as a single paragraph without numbered or bulleted lists, suitable for embedding in a sprite asset database."
#item_type = "skirt armor" # helmet, shoulder pad, chest armor, torso armor (lower part of armor), skirt armor, belt, skirt, etc.
#text_analyze = f"Analyze the provided image containing character equipment {item_type}. The image shows a {item_type} designed, represented in two tiles to display both the back and front views. Describe the item in a single continuous paragraph, specifying its type {item_type}, primary colors, materials, decorative details, and the perspective of each tile (e.g., front view, back view). Highlight any symmetrical or mirrored aspects, and emphasize how both views together represent the full design of the item. The final output must be a single paragraph without numbered or bulleted lists, written in a descriptive style suitable for embedding in a sprite asset database."
#text_analyze = "Describe what is shown in this image briefly. Write all in English."
text_analyze = "Describe the 3D character model shown in this 2x2 grid layout. Analyze each view in order: top-left (front view), top-right (right side view), bottom-left (back view), bottom-right (three-quarter view). Describe the character's appearance including hair, facial features, clothing, armor, accessories, crown/headwear, cape, and color scheme. Present all information as one continuous paragraph without lists."
print(text_analyze)
def describe_image(path: Path) -> str:
# Кодируем картинку в base64
with open(path, "rb") as f:
img_b64 = base64.b64encode(f.read()).decode("utf-8")
# Делаем мультимодальный запрос
response = client.chat.completions.create(
model=MODEL,
messages=[
{
"role": "system",
"content": (
"You are an assistant that describes images in short, concise English text. "
"One block of text, no line breaks. Suitable for training FLUX LoRA."
)
},
{
"role": "user",
"content": [
{"type": "text", "text": text_analyze},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{img_b64}"
}
}
]
}
],
#max_tokens=100
)
return response.choices[0].message.content.strip()
def process_png(path: Path):
try:
desc = describe_image(path)
file_title = path.stem
text_out = f"{file_title} {desc}"
txt_path = path.with_suffix(".txt")
with open(txt_path, "w", encoding="utf-8") as f:
f.write(text_out)
print(f"OK {path} -> {txt_path}")
except Exception as e:
print(f"ERR {path}: {e}")
def run():
root = Path(DIRECTORY).expanduser().resolve()
if not root.is_dir():
print(f"Не директория: {root}")
return
iterator = root.rglob("*.png") if RECURSIVE else root.glob("*.png")
files = list(iterator)
if not files:
print("PNG-файлы не найдены.")
return
for p in sorted(files):
process_png(p)
if __name__ == "__main__":
run()
⚙️ Что делает скрипт
- Сканирует папку
DIRECTORY(по умолчаниюart) и находит все.pngфайлы. -
Для каждого изображения:
-
кодирует его в base64;
- отправляет запрос в OpenAI API с заданным промптом (
text_analyze); - получает описание изображения;
- сохраняет результат в
.txtфайл рядом с изображением. - Выводит прогресс в консоль (
OK/ERR).
📦 Пример результата
art/armor_001.png → art/armor_001.txt
Файл armor_001.txt будет содержать короткое описание изображения в одну строку, пригодное для обучения FLUX-LoRA.
🔧 Основные параметры
DIRECTORY— путь к папке с PNG-файлами.RECURSIVE— искать ли файлы во вложенных папках.MODEL— используемая модель OpenAI (например,gpt-4o).text_analyze— текст запроса, определяющий стиль описания.
Примеры дата сета + результат работы FLUX-LoRA



ComfyUI Workflow FLUX-LoRA
ComfyUI_00024_workflow.png:

Загрузите ComfyUI_00024_workflow.png и перетащите в окно ComfyUI чтобы открыть ComfyUI Workflow:

⚡️ Дополнительно:
💾 сборка ComfyUI портативная для FLUX.1-dev + AI Upascaling
💾 архив с Fluxgym - модель FLUX.1-dev
📘 Установка Fluxgym FLUX LoRA с поддержкой LOW VRAM 12 GB / 16 GB / 20 GB на Windows 10