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

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

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

Статья будет полезна:

  • начинающим специалистам в Computer Vision;

  • студентам, выбирающим тему проекта или диплома;

  • самоучкам, которые хотят не просто «обучить YOLO на готовом датасете», а разобраться, как всё устроено в реальности.

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

Введение

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

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

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

В отличие от существующих датасетов и исследований, направленных на использование больших, сбалансированных датасетов (например, COCO, Pascal VOC), реальные данные часто не сбалансированы и «грязные». В своей работе я столкнулся именно с этим, разрабатывая систему автоматического распознавания дефектов печатных плат.

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

Подготовка данных, оборудование, среда

Для эксперимента были закуплены 20 печатных плат, двух различных типов. Платы были разделены на следующие категории: 1 плата – чистая, не тронутая; 2 платы – полностью распаяны без дефектов; 2 платы – чистые, с царапинами и нарисованными дефектами дорожек; 5 плат – полностью распаяны с дефектами пайки и царапинами. Всего снято 203 изображения в разных условиях: менялись камеры (веб-камера и телефон), освещение, угол наклона, расстояние. Часть плат имела намеренно внесенные дефекты (непропай, замыкание, трещина дорожки и др.).

Рисунок 1. Пример изображений печатной платы №1 экспериментального датасета
Рисунок 1. Пример изображений печатной платы №1 экспериментального датасета
Рисунок 2. Пример изображений печатной платы №2 экспериментального датасета
Рисунок 2. Пример изображений печатной платы №2 экспериментального датасета

Цель - чтобы датасет содержал максимально разнообразные данные, а не выглядел как синтетика.

Чтобы предотвратить переобучение модели и повысить ее устойчивость к различным вариантам объектов, в датасет были добавлены 354 изображения схожих плат и отдельных элементов плат. Это позволило модели видеть больше разнообразных примеров и лучше различать нюансы между похожими объектами. В итоге общее количество изображений в датасете достигло 557, что обеспечило достаточное разнообразие данных для обучения модели и уменьшило риск того, что она будет слишком хорошо запоминать конкретные примеры вместо того, чтобы учиться обобщать закономерности.

Рисунок 3. Пример изображений отдельных элементов экспериментального датасета
Рисунок 3. Пример изображений отдельных элементов экспериментального датасета

Добавление изображений отдельных элементов плат повысило качество модели примерно до 1,3%, так как это позволило модели лучше различать детали и «сломало» иллюзию закономерного расположения элементов на платах. В то же время включение изображений схожих плат, плат с другим цветом и конфигурациями немного снизило точность модели на величину чуть больше 2%, что объясняется увеличением разнообразия данных и необходимостью модели обобщать закономерности.

Рисунок 4. Пример схожих плат экспериментального датасета
Рисунок 4. Пример схожих плат экспериментального датасета

Изображения, сделанные под сильным углом к элементу, были удалены из датасета. Их было мало, и модель плохо справлялась с распознаванием элементов под такими ракурсами, что могло существенно ухудшить работу системы распознавания дефектов в целом.

Рисунок 5. Примеры изображений экспериментального датасета
Рисунок 5. Примеры изображений экспериментального датасета

Для аннотирования и разметки полученного датасета используется платформа Roboflow, у нее удобный интерфейс, экспорт в YOLO-формат и встроенные аугментации. Разметка включала не только выделение объектов, но и проверку качества аннотаций, что является критически важным этапом в задачах CV. С помощью встроенной аугментации я увеличил датасет с 557 изображения до 1449 изображений.

Рисунок 6. Аугментация датасета на платформе Roboflow
Рисунок 6. Аугментация датасета на платформе Roboflow
Рисунок 7.  Пример исказившихся плат экспериментального датасета
Рисунок 7.  Пример исказившихся плат экспериментального датасета

С встроенной (бесконтрольной) аугментацией необходимо быть аккуратным так как она может испортить датасет. Например, повороты могут привести к изменению геометрии исходных полигонов (с 4 на 6/8), а также произойти смещение ограничивающих рамок. Эти искажения обусловлены особенностями обработки изображений при поворотах так как при кадрировании части полигона выходят за границы нового изображения, вследствие чего автоматически добавляются новые точки в местах пересечения полигона с границами кадра.

Второй тип искажения связан с попытками системы сохранить объект целиком после трансформаций, что приводит к добавлению буферной зоны вокруг него. Это, в свою очередь, снижает точность аппроксимации контура.

Рисунок 8. Дефект "буферной зоны" и увеличение количества точек полигона
Рисунок 8. Дефект "буферной зоны" и увеличение количества точек полигона

Для экспериментов также использовал CVAT и Label Studio, чтобы сравнить удобство и скорость работы - об этом я подробнее расскажу в отдельной статье.

Работа с подготовкой датасета проводилась в среде Google Colab с Python версией 3.12.12 и фреймворком глубокого обучения PyTorch версии 2.8.0+cu126.

Датасет

Всего в датасет вошло 1449 изображений, они различаются по конфигурации, цвету, количеству и типу компонентов, освещению и углу обзора. Это разнообразие помогает модели быть более устойчивой к внешним изменениям и лучше обобщать данные.

Лучший способ избежать «мусора» на выходе - не дать ему попасть на вход.

При работе с данными всегда необходимо контролировать их качество, распределение по классам, корректность разбиения на train / validation / test. Лучший способ - это визуализация.

При аугментации данных изначально задается распределение по классам, например, я задавал train 80% (446 изображений), validation 10% (57 изображений), test 10% (57 изображений) на втором этапе Train/Test Split (см. Рисунок 5). Однако после проведения аугментации распределение неожиданно изменилось до: train 92%, validation 4%, test 4%, что является довольно частой ошибкой при аугментации.

Рисунок 9. Результат распределения экспериментального датасета после аугментации
Рисунок 9. Результат распределения экспериментального датасета после аугментации

Важно помнить, что аугментация увеличивает количество изображений, но может исказить соотношение классов. Например, увеличение числа изображений одного класса не дает такой же пользы, как создание новых примеров для изображений, содержащих 15 классов.

Было до проверки

После проверки

Train

1338

Train

1159

Valid

57

Valid

144

Test

54

Test

146

Датасет включает 15 классов электронных компонентов, представленных в таблице ниже:

Класс

Train

Valid

Test

Всего

% датасет

1

QFP

465

55

81

601

0.82%

2

QFP_area

116

19

22

157

0.21%

3

SOP

1342

165

141

1648

2.25%

4

SOP_area

200

38

26

264

0.36%

5

SOT23

2050

265

286

2601

3.56%

6

SOT_area

463

85

47

595

0.81%

7

hole

1184

148

210

1542

2.11%

8

smd_LED

2300

457

263

3020

4.13%

9

smd_area

8631

1540

967

11138

15.23%

10

smd_capacitor

6672

1299

705

8676

11.87%

11

smd_combo

1171

158

109

1438

1.97%

12

smd_combo_area

275

44

32

351

0.48%

13

smd_diod

2348

316

272

2936

4.02%

14

smd_resistor

25829

3651

2759

32239

44.09%

15

test_point

4736

640

531

5907

8.08%

Такое распределение естественно отражает реальные физические соотношения компонентов на печатных платах. На одной плате всегда присутствует большое количество пассивных элементов (smd_resistor, smd_capacitor), они составляют более 50% всех аннотаций, что соответствует реальной плотности монтажа. Активные компоненты (QFP, SOP, SOT23) встречаются значительно реже, поскольку на одной плате обычно размещается ограниченное количество контроллеров или процессоров, что может негативно сказаться на качестве их распознавания моделью.

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

Рисунок 10. Распределение классов в обучающей, валидационной и тестовой выборках (train, valid, test)
Рисунок 10. Распределение классов в обучающей, валидационной и тестовой выборках (train, valid, test)
Рисунок 11. Распределение классов в обучающей выборке (train)
Рисунок 11. Распределение классов в обучающей выборке (train)
Рисунок 12. Распределение классов в валидационной выборке (valid)
Рисунок 12. Распределение классов в валидационной выборке (valid)
Рисунок 13. Распределение классов в тестовой выборке (test)
Рисунок 13. Распределение классов в тестовой выборке (test)

Классы в выборках train, valid и test распределены достаточно равномерно, что видно по схожим пропорциям объектов каждого класса в разных подвыборках. Такое распределение способствует более стабильному обучению модели и повышает достоверность ее оценки на валидационных и тестовых данных.

Для визуализации структуры данных я применил методы t-SNE и PCA.

Рисунок 14. Визуализация латентного пространства методом t-SNE
Рисунок 14. Визуализация латентного пространства методом t-SNE

t-SNE показал четкое разделение классов, это говорит о том, что латентное пространство, из которого произведена редукция размерности, эффективно кодирует семантическую информацию, но не сохраняет глобальную структуру данных, и его оси не несут интерпретируемой нагрузки. В отличие от PCA, в t-SNE взаимное расположение кластеров друг относительно друга не имеет физического смысла (Например, при визуализации датасета MNIST содержащего рукописные цифры от 0 до 9, на графике единица будет находится дальше от нуля, чем четверка. Потому, что по написанию единица больше похожа на четверку, чем на ноль).

Рисунок 15. Визуализация латентного пространства методом PCA
Рисунок 15. Визуализация латентного пространства методом PCA

PCA же выявил глобальные взаимосвязи в данных, а именно градиентное распределение вдоль главных компонент, что может отражать общий тренд в структуре латентного пространства и видны линейные корреляции между различными компонентами, особенно по первой главной компоненте. Этот метод дает общее представление о структуре данных, но не эффективен для визуальной кластеризации в случае сложных нелинейных связей. Например, smd_resistor и smd_capacitor оказались достаточно близки, что логично по их форме и размеру.

Эти методы помогли убедиться, что данные готовы к обучению, и показали, какие классы стоит дополнительно усилить аугментацией.

На следующем этапе я обучал различные модели YOLO на этом датасете, сравнивал качество распознавания разных версий моделей и анализировал влияние дисбаланса классов на метрики качества.

Полученный опыт погрузил в полный цикл Machine Learning проекта, от реальных данных и разметки до экспериментов с моделями и инфраструктурой. Этот опыт показал, что даже небольшой по объему датасет может быть крайне полезен, если он реалистичный, хорошо размеченный и собран с пониманием цели.

Если вы инженер или исследователь в сфере ML/CV и вам есть, что обсудить, буду рад пообщаться. Я открыт к junior-позициям и исследовательским задачам, связанным с Computer Vision, Data Labeling и MLOps.

Комментарии (4)


  1. Arhammon
    21.11.2025 03:28

    Если работает стабильно можно и в продакшен за деньги - сейчас на ниве импортозамещения многие предприятия осваивают свою мелкосерийку.

    Единственное реальные дефекты на производстве бывают не совсем такие как можно придумать.

    Скрытый текст