Нейросеть сделала 3D‑модель по фото. Почему принтер с ней совсем не согласен

Вы скармливаете нейросети снимок фигурки, и через несколько минут на экране уже крутится аккуратная 3D‑модель. Всё на месте, даже надпись на груди. Скачиваете файл, открываете слайсер, а он первым делом интересуется, не в метрах ли вы случайно сделали эту красоту. А в файле она размером с маковое зерно.

И это самый безобидный дефект. Почти у каждой второй модели слайсер показывает значок предупреждения. А о некоторых дефектах он прямо не говорит: на превью всё выглядит идеально, а в файле ступни робота висят в воздухе отдельно от ног.

Меня зовут Артём Кузнецов, я AI/ML‑инженер и CTO стартапа, который занимается AI‑технологиями в области 3D‑печати.

Ниже — откуда берутся эти дефекты, если заглянуть под капот генераторов, и как их определять за пару минут, пока стол принтера нагревается. Разбор идёт на уровне сетки и с кодом, так что может пригодиться и тем, кто встраивает генерацию 3D в свой софт.

Тестовый набор: четыре картинки и пять нейросетей

Чтобы не делать выводы по одному случайному примеру, мы собрали небольшой тестовый набор. Каждая картинка в нём проверяет одну известную слабость генераторов, поэтому по результату сразу видно, на чём сломалась модель.

Картинки нарисовала нейросеть FLUX.1 [schnell] по коротким описаниям: так проще получить чистый фон, ровный свет и ровно ту особенность, которую хотим проверить. Это не фото, поэтому дальше я называю их картинками. Для генераторов это лёгкий режим: на снимке с телефона добавятся фон, тени и перспектива.

Рис. 1. Картинки тестового набора и то, что проверяет каждая.Рис. 1. Картинки тестового набора и то, что проверяет каждая.

Почему именно эти четыре:

Картинка

Что в ней трудного

Чем это грозит при печати

Робот

наплечники, отделённые от корпуса, тонкая антенна, раскрытая клешня

генератор может оставить детали отдельными кусками, потерять антенну или склеить пальцы клешни

Кружка

сквозная ручка и пустота внутри

ручка должна остаться сквозной, а не превратиться во вмятину, а в пустоте может завестись мусор

Очки

оправа и дужки толщиной с проволоку

тонкое проваливается сквозь сетку генератора или слипается с соседним

Дракон

перепонки крыльев, шипы на спине, длинный хвост

тонкие стенки и острые кончики выходят тоньше линии сопла или пропадают

Генераторов взяли пять, и форму все они строят по‑разному. Всех вызывали через API:

  • TripoSR (Stability AI и Tripo, 2024) — открытая модель: поле на трёх плоскостях (triplane), поверхность строит marching cubes;

  • TRELLIS (Microsoft) — открытая модель: скрытое представление на разреженной воксельной сетке, поверхность строит FlexiCubes;

  • TRELLIS.2 (Microsoft) — его свежая версия с другим представлением формы, без поля;

  • SAM 3D Objects (Meta) — открытая модель, которая восстанавливает отдельные объекты сцены по одной картинке;

  • Hunyuan3D 3.1 (Tencent) — закрытый сервис, устройство которого не раскрыто.

Как устройство генератора сказывается на дефектах, подробно разберу во второй статье.

Все двадцать моделей мы скачали как есть, без доработки, и проверили по тем же правилам, по которым Bambu Studio решает, показывать ли значок предупреждения (эти правила разобраны ниже). Девять не прошли.

Рис. 2. Что пять генераторов сделали из четырёх картинок. Модели показаны без текстуры, то есть так, как их напечатает принтер. Зелёная полоса — файл прошёл проверку, красная — нет; под полосой главные дефекты.Рис. 2. Что пять генераторов сделали из четырёх картинок. Модели показаны без текстуры, то есть так, как их напечатает принтер. Зелёная полоса — файл прошёл проверку, красная — нет; под полосой главные дефекты.

Сложнее всего оказались очки: у трёх генераторов из пяти тонкая оправа либо порвалась, либо слиплась. Кружку, робота и дракона испортили по два генератора, и каждый раз это TripoSR и TRELLIS.2. По генераторам картина такая:

Генератор

Не прошли проверку

Самый тяжёлый случай

TripoSR

4 из 4

кружка: 93 отдельные части, 612 открытых рёбер

TRELLIS

1 из 4

очки: одна «защемлённая» вершина

TRELLIS.2

4 из 4

робот: 3163 ребра, на которых сходится больше двух треугольников, 113 частей

SAM 3D Objects

0 из 4

ошибок нет, но в каждом файле россыпь деталей: робот — 23, кружка — 13, дракон — 12

Hunyuan3D 3.1 (API)

0 из 4

чисто

Генерации от 6 августа 2026 года, файлы без обработки.

Дальше в примерах в основном робот: на нём видны почти все дефекты.

Как нейросеть достраивает невидимое

Первым я открыл в Bambu Studio как раз этого робота и не сразу понял, почему на столе ничего нет.

На картинке нет третьего измерения. Обратную сторону фигурки нейросеть додумывает по тому, что видела при обучении, и выглядит это вполне убедительно.

Устроены генераторы по‑разному, но большинство строит форму через поле. Для каждой точки пространства нейросеть решает, внутри объекта эта точка или снаружи, а некоторые заодно оценивают расстояние до поверхности. Спрашивают её не обо всех точках подряд, а только об узлах трёхмерной сетки.

Потом по границе между «внутри» и «снаружи» натягивают поверхность из треугольников. Чаще всего это делает marching cubes: алгоритму почти сорок лет, и его потомки работают до сих пор.

Первая проблема в том, что сетка работает как сито. Всё, что тоньше шага ячейки, либо проваливается, либо слипается с соседями.

Рис. 3. Тот же процесс в двух измерениях. Синие узлы — точки, которые нейросеть сочла внутренними. Поверхность натягивается по ним, поэтому тонкая антенна исчезает, а сближенные ноги сливаются. На сетке вчетверо мельче обе детали сохраняются.Рис. 3. Тот же процесс в двух измерениях. Синие узлы — точки, которые нейросеть сочла внутренними. Поверхность натягивается по ним, поэтому тонкая антенна исчезает, а сближенные ноги сливаются. На сетке вчетверо мельче обе детали сохраняются.

Вторая проблема в обучении. Многие генераторы учились по плоским картинкам: готовую модель рендерят под разными углами и сравнивают с эталоном. Если у объекта есть дыра, которую не видно ни с одного ракурса, такое обучение её не заметит.

Чего ждёт слайсер

Для печати принтеру нужен герметичный объём, который можно заполнять пластиком слой за слоем. Отсюда жёсткие требования к геометрии файла:

  • непрерывная оболочка без дыр и щелей;

  • каждое ребро принадлежит ровно двум треугольникам;

  • нормали всех граней развёрнуты наружу;

  • стенки не тоньше двух диаметров сопла (при стандартном сопле 0,4 мм это 0,8 мм);

  • модель стоит на столе одним целым телом.

Например, Bambu Studio показывает значок предупреждения в списке объектов, если нарушено одно из первых трёх условий или если ему пришлось самому чинить сетку при загрузке. Это видно в его исходниках (TriangleMesh.hpp и GUI_ObjectList.cpp, версия 2.8.4):

// src/libslic3r/TriangleMesh.hppbool manifold() const { return non_manifold_edges == 0 && non_manifold_vertices == 0; }bool has_any_issue() const { return !manifold() || has_open_edges() || has_reversed_faces; }// src/slic3r/GUI/GUI_ObjectList.cppreturn (stats.has_any_issue() || stats.repaired()) ? "obj_warning" : "";

Значок загорается, если в сетке есть рёбра, где сходится больше двух треугольников, «защемлённые» вершины, открытые рёбра или вывернутые грани, либо если слайсер что‑то поправил сам при загрузке (repaired()). А вот про размер, тонкие стенки или висящие элементы значок ничего не скажет.

Пять дефектов на примерах

1. Робот размером с маковое зерно

У всех двадцати моделей набора наибольший размер оказался от 0,85 до 1,38 единицы. Единиц измерения в формате STL нет вообще, там хранятся только числа. Слайсер по умолчанию считает их миллиметрами, и робот получается высотой около миллиметра.

Слайсеры пытаются это исправить. Если объём модели микроскопический, слайсер пересчитывает размер, решив, что файл задан в дюймах или метрах. Но срабатывает это по‑разному: часть моделей превращается в фигурки ростом 2,5 см, а некоторые (например, робот от TRELLIS.2) вдруг вырастают до метра.

Угадывает Bambu Studio по объёму модели. В исходниках (Model.cpp) это две константы:

static constexpr const double volume_threshold_inches = 8.0;static constexpr const double volume_threshold_meters = 0.008;

Объём меньше 8 мм³ — модель считается дюймовой и увеличивается в 25,4 раза, меньше 0,008 мм³ — метровой и увеличивается в 1000 раз. У тринадцати моделей набора объём попал в «дюймовый» диапазон, у семи — в «метровый».

Рис. 4. Bambu Studio 2.7 при импорте сырого робота от Hunyuan3D 3.1: объект слишком маленький, возможно, он в метрах или дюймах. Версия 2.8 уже не спрашивает и пересчитывает сама.Рис. 4. Bambu Studio 2.7 при импорте сырого робота от Hunyuan3D 3.1: объект слишком маленький, возможно, он в метрах или дюймах. Версия 2.8 уже не спрашивает и пересчитывает сама.

Нейросеть тут не виновата: по одной картинке не угадать, перед нами статуэтка или памятник. Генератор работает в своих координатах и вписывает объект в куб со стороной около единицы. Лечится это просто: задайте реальный размер по любой оси с сохранением пропорций.

2. Кружка из 93 разрозненных фрагментов

Снаружи кружка от TripoSR выглядит вполне прилично. Но если открыть её в редакторе сетки, обнаружится 93 изолированные детали: сама кружка и ещё 92 мелких осколка внутри неё.

Ни один из этих кусочков не касается стенок, они висят в пустоте. Если высота кружки 8 см, паразитные фрагменты — около миллиметра. Слайсер честно попытается напечатать всё, что окажется крупнее диаметра сопла.

Рис. 5. Кружка TripoSR. Слева — как её показывает вьюер, справа — разрез, кольцами отмечены отдельные осколки.Рис. 5. Кружка TripoSR. Слева — как её показывает вьюер, справа — разрез, кольцами отмечены отдельные осколки.

Причина — шум в поле. В пустоте внутри кружки нейросеть время от времени ошибается и отвечает «внутри», а marching cubes аккуратно обтягивает каждую такую ошибку замкнутым пузырём.

Кроме того, в модели 612 открытых рёбер. Больше половины из них — зазоры между треугольниками меньше миллионной доли размера модели: глазу они незаметны, а для слайсера это дыры в геометрии. Остальное — настоящие дыры.

3. Рёбра на четыре треугольника (non‑manifold)

У робота от TRELLIS.2 больше трёх тысяч рёбер, на которых сходятся сразу четыре треугольника вместо двух. Bambu Studio помечает их как ошибку: non‑manifold edges.

Рис. 6. Робот TRELLIS.2. Красным отмечены рёбра, на которых сходятся четыре треугольника; справа — увеличенный фрагмент.Рис. 6. Робот TRELLIS.2. Красным отмечены рёбра, на которых сходятся четыре треугольника; справа — увеличенный фрагмент.

Такой дефект возникает на крутых изгибах и стыках деталей. У генераторов, которые строят форму по полю, он появляется, когда соседние элементы сближаются сильнее, чем позволяет шаг сетки. TRELLIS.2 устроен иначе: по описанию модели, его представление формы обходится без поля и нарочно допускает такие рёбра.

Старый TRELLIS на том же роботе выдал чистую сетку, а новая версия, научившись лучше передавать сложные формы, испортила геометрию.

4. Ступни отдельно от ног

У того же многострадального робота ступни отсоединены от ног. Если робот высотой 8 см, они висят в 0,5–0,7 мм от ног и на 0,15 мм не достают до стола. Так же отдельно висит шарик на конце антенны, а рядом с ним в пустоте ещё один элемент.

Рис. 7. Робот TRELLIS.2. Цветом выделены куски, которые не касаются корпуса. В середине — разрез через ступню и ногу при высоте робота 80 мм, справа — антенна сбоку. Двойной контур на разрезе — не ошибка рисунка: стенки у этого робота состоят из двух поверхностей.Рис. 7. Робот TRELLIS.2. Цветом выделены куски, которые не касаются корпуса. В середине — разрез через ступню и ногу при высоте робота 80 мм, справа — антенна сбоку. Двойной контур на разрезе — не ошибка рисунка: стенки у этого робота состоят из двух поверхностей.

Слайсер не считает несколько тел в одном файле ошибкой: так устроены, например, шахматные комплекты. После нарезки он предупредит о висящих зонах (floating regions), но то же самое пишет и про чистого робота, у которого просто висят руки. А этого робота Bambu Studio резать отказался вовсе: между кончиком антенны и шариками остался пустой слой.

Если шарики убрать, нарезка пройдёт, но печатать ступни принтер начнёт прямо в воздухе: под ними нет опоры.

Вдобавок этот робот оказался полым внутри. Стенки у него тоньше ширины одной линии, и слайсер напечатает их хрупкой нитью или выбросит.

5. Детали только «в краске»

Самую чистую геометрию выдал Hunyuan3D 3.1: к его файлу у слайсера нет претензий. На превью у робота чёрное забрало, жёлтые глаза и яркие эмблемы. Если отключить текстуру, глаза превращаются в едва заметные бугорки, а от надписи на груди остаётся решётка.

Рис. 8. Робот Hunyuan3D 3.1 с текстурой и без неё. Принтер напечатает правую картинку.Рис. 8. Робот Hunyuan3D 3.1 с текстурой и без неё. Принтер напечатает правую картинку.

Если печатать одним пластиком, цвета не будет: принтер повторяет только форму. Всё, что на исходной картинке нарисовано плоско (глаза, логотипы, узоры), генератор переносит в текстуру, а не в рельеф. С AMS цвет можно перенести в пластик, но плоское так и останется плоским, и фигурка выйдет глаже, чем на превью.

Проверка кодом

Всё, что выше, можно проверить самостоятельно. Почти все числа из таблицы в начале статьи считает вот такой скрипт на Python с библиотекой trimesh (проверено на версии 5.1):

import sysimport numpy as npimport trimesh# Читаем файл как есть: trimesh только склеит вершины с одинаковыми координатамиmesh = trimesh.load(sys.argv[1], force="mesh")# Сколько треугольников сходится на каждом ребреuses = np.bincount(mesh.edges_unique_inverse)# Отдельные части: куски, которые не связаны ни одной общей вершинойparts = trimesh.graph.connected_components(mesh.edges_unique, nodes=np.unique(mesh.faces))print("габарит, единиц: ", np.round(mesh.extents, 2))print("открытых рёбер: ", int((uses == 1).sum()))print("рёбер на 3+ треуг.: ", int((uses > 2).sum()))print("отдельных частей: ", len(parts))

На кружке от TripoSR и роботе от TRELLIS.2 он выдаёт ровно то, что стоит в таблице:

$ python check_mesh.py mug_triposr.stlгабарит, единиц: [0.69 0.89 0.69]открытых рёбер: 612рёбер на 3+ треуг.: 0отдельных частей: 93$ python check_mesh.py robot_trellis2.stlгабарит, единиц: [0.72 1. 0.48]открытых рёбер: 8рёбер на 3+ треуг.: 3163отдельных частей: 113

Из пяти дефектов выше скрипт показывает четыре: размер, мусор и открытые рёбра, рёбра на четыре треугольника и отдельные куски. Что ступни висят над столом, он не скажет: это видно только после нарезки. Детали «в краске» видно только глазами, а «защемлённую» вершину, как у очков от TRELLIS, скрипт не заметит: для этого нужна проверка посложнее.

Экспресс‑проверка за пять минут

Большинство таких дефектов можно найти ещё до печати, если идти по порядку:

  1. Посмотрите на модель без текстуры: откройте STL в любом просмотрщике, цвета в нём нет. Чего нет в рельефе, того не будет и в пластике.

  2. Откройте модель в слайсере и наведите курсор на значок предупреждения в списке объектов. Bambu Studio показывает, сколько в модели открытых рёбер и сколько ошибок он исправил сам.

  3. Задайте размер по одному известному измерению, с сохранением пропорций. Если слайсер сам пересчитал модель из дюймов или метров, проверьте, что получилось.

  4. Щёлкните по модели правой кнопкой и выберите Split → To objects. Если она рассыпалась на десятки мелких осколков, внутри почти наверняка мусор.

  5. Нарежьте модель и пройдитесь ползунком слоёв в превью. Если какой‑то элемент (например, ступни или шарик антенны) начинается в воздухе, принтер будет «лить пластик в никуда».

Мелкие дефекты можно исправить сразу в слайсере: в Bambu Studio и PrusaSlicer на Windows есть починка по правому клику. Для серьёзных случаев есть Blender (панель 3D Print Toolbox) и MeshLab.

Только следите, чтобы вместе с мусором автопочинка не «откусила» роботу пальцы или антенну. А висящие в воздухе ступни никакой инструмент автоматически не приклеит — их придётся двигать руками.

Что получилось на двадцати моделях

Девять моделей из двадцати не прошли проверку слайсера, и восемь из этих девяти дали два генератора: TripoSR и TRELLIS.2. Новая TRELLIS.2 сломала все четыре модели, старая TRELLIS — одну. Самые чистые файлы у Hunyuan3D 3.1, но мелкие детали у него живут в краске. А размер не угадал ни один генератор: за них его угадывает слайсер.

В следующей статье разберём, почему у каждого генератора свой «почерк» дефектов и как по устройству нейросети заранее понять, где она сломает модель. А в третьей заглянем под капот слайсеров: что именно они проверяют и как модель может сломаться в момент сохранения файла.

P. S. Если у вас есть модель из нейросети, которая не печатается, напишите в комментариях, каким генератором она сделана и что с ней не так. Самые интересные случаи разберу в следующих статьях.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев