Когда пришло время выбирать тему диплома, я, как и многие студенты, понятия не имел, о чём писать. После мозгового штурма с одногруппниками родилась идея, которая из простого «варианта для защиты» превратилась в полноценный инженерный проект: «исследование и разработка системы автоматического распознавания дефектов печатных плат».
Со временем я понял, что выбрал тему не случайно - это реально актуальная задача для производства, где качество пайки напрямую влияет на работоспособность устройств, а ещё отличный шанс пройти весь цикл Computer Vision проекта от сбора данных до обучения моделей.
Эта статья краткая выжимка моего опыта: как собрал собственный датасет дефектов печатных плат для обучения моделей, какие инструменты использовал и на что стоит обратить внимание.
Статья будет полезна:
начинающим специалистам в Computer Vision;
студентам, выбирающим тему проекта или диплома;
самоучкам, которые хотят не просто «обучить YOLO на готовом датасете», а разобраться, как всё устроено в реальности.
Я не претендую на экспертный вердикт, это черновик моего самообучения, я хочу показать особенности и помочь другим избежать тех же вопросов, на которые мне пришлось тратить время.
Введение
В промышленности важно своевременно выявлять дефекты на печатных платах. Большинство открытых датасетов не соответствуют конкретным условиям или содержат ограниченное количество примеров, поэтому я решил собрать собственный датасет.
Кроме того, современные платы становятся все меньше, а значит, и дефекты всё менее заметны. Поэтому я решил собрать реальный датасет печатных плат, приближенный к реальным задачам контроля качества.
Чтобы не уйти в бесконечное планирование, я выбрал платы, которые используются для обучения пайке микроэлементов - на них можно легко моделировать дефекты вручную.
В отличие от существующих датасетов и исследований, направленных на использование больших, сбалансированных датасетов (например, COCO, Pascal VOC), реальные данные часто не сбалансированы и «грязные». В своей работе я столкнулся именно с этим, разрабатывая систему автоматического распознавания дефектов печатных плат.
В рамках дипломного проекта я разработал систему из трех моделей YOLO, предназначенную для автоматического выявления дефектов на печатных платах. Идея заключается в поэтапном распознавании, сначала определяем, что перед нами действительно плата, затем анализируем её элементы, и выявляем дефекты.
Подготовка данных, оборудование, среда
Для эксперимента были закуплены 20 печатных плат, двух различных типов. Платы были разделены на следующие категории: 1 плата – чистая, не тронутая; 2 платы – полностью распаяны без дефектов; 2 платы – чистые, с царапинами и нарисованными дефектами дорожек; 5 плат – полностью распаяны с дефектами пайки и царапинами. Всего снято 203 изображения в разных условиях: менялись камеры (веб-камера и телефон), освещение, угол наклона, расстояние. Часть плат имела намеренно внесенные дефекты (непропай, замыкание, трещина дорожки и др.).


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

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

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

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


С встроенной (бесконтрольной) аугментацией необходимо быть аккуратным так как она может испортить датасет. Например, повороты могут привести к изменению геометрии исходных полигонов (с 4 на 6/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%, что является довольно частой ошибкой при аугментации.

Важно помнить, что аугментация увеличивает количество изображений, но может исказить соотношение классов. Например, увеличение числа изображений одного класса не дает такой же пользы, как создание новых примеров для изображений, содержащих 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) встречаются значительно реже, поскольку на одной плате обычно размещается ограниченное количество контроллеров или процессоров, что может негативно сказаться на качестве их распознавания моделью.
Такой дисбаланс классов создает интересную задачу для обучения моделей, но об этом в следующей части. Спойлер: все решаемо, есть подходы к балансировке и оптимизации обучения на таких данных.




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

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

PCA же выявил глобальные взаимосвязи в данных, а именно градиентное распределение вдоль главных компонент, что может отражать общий тренд в структуре латентного пространства и видны линейные корреляции между различными компонентами, особенно по первой главной компоненте. Этот метод дает общее представление о структуре данных, но не эффективен для визуальной кластеризации в случае сложных нелинейных связей. Например, smd_resistor и smd_capacitor оказались достаточно близки, что логично по их форме и размеру.
Эти методы помогли убедиться, что данные готовы к обучению, и показали, какие классы стоит дополнительно усилить аугментацией.
На следующем этапе я обучал различные модели YOLO на этом датасете, сравнивал качество распознавания разных версий моделей и анализировал влияние дисбаланса классов на метрики качества.
Полученный опыт погрузил в полный цикл Machine Learning проекта, от реальных данных и разметки до экспериментов с моделями и инфраструктурой. Этот опыт показал, что даже небольшой по объему датасет может быть крайне полезен, если он реалистичный, хорошо размеченный и собран с пониманием цели.
Если вы инженер или исследователь в сфере ML/CV и вам есть, что обсудить, буду рад пообщаться. Я открыт к junior-позициям и исследовательским задачам, связанным с Computer Vision, Data Labeling и MLOps.
Arhammon
Если работает стабильно можно и в продакшен за деньги - сейчас на ниве импортозамещения многие предприятия осваивают свою мелкосерийку.
Единственное реальные дефекты на производстве бывают не совсем такие как можно придумать.
Скрытый текст