Привет, Хабр! Меня зовут Павел Криницин. Я работаю на крупном металлургическом предприятии по производству и переработке алюминиевой продукции, где слежу за работой оборудования. В этой статье я расскажу, как мы исследовали способы раннего диагностирования повреждений конвейерных лент с применением компьютерного зрения. Эта статья будет полезна широкому кругу специалистов, занятых в различных областях промышленности, где применяют конвейерные транспортные системы. Описанные в статье подходы делают диагностику оборудования и поиск дефектов более точными, а планирование ремонтных работ — более эффективным.
Работает аналитиком на крупном металлургическом предприятии и применяет алгоритмы машинного обучения и цифрового зрения для оптимизации производственных процессов.
Но прежде чем мы перейдём к содержанию исследования, скажу пару слов о самом оборудовании и его роли в производственном процессе.
Транспортное оборудование занимает большую долю всех промышленных объектов на металлургических предприятиях. От работоспособности ленточных конвейеров зависит функционирование всего производственного процесса. Транспортёры обеспечивают непрерывность подачи сырья на очередной производственный участок для его дальнейшей обработки и перемещают готовую продукцию на следующие этапы производства или на отгрузку.
Устройством, которое перемещает грузы, могут быть металлические пластины — траки — или транспортёрная лента. Сфера их применения различна, у каждого есть свои преимущества, недостатки и технические особенности: сложность ремонта и монтажа, дороговизна запасных частей, ограничения по месту установки. Часто на производстве используют конвейеры с транспортёрной лентой, изготовленной на ПВХ- или резиновой основе. Их доля среди транспортёрного оборудования составляет более 90%.
Срок службы резиновой конвейерной ленты — в среднем один-два года, металлических траков — десятки лет. Учитывая высокую частоту отказов оборудования для транспортировки и переработки нефтяного кокса, повышение надёжности транспортёрной ленты — приоритетная и особо актуальная задача на производстве.
Вот основные проблемы, которые возникают при эксплуатации транспортёрной ленты конвейеров:
Износ ленты — со временем лента истирается о транспортируемые материалы и изнашивается, это приводит к образованию сквозного износа и деформациям.
Попадание посторонних предметов, которое механически повреждает ленту, создаёт на ней разрывы и сквозные дефекты.
Повреждение резинового слоя ленты экстремальными температурами от воздействия нефтяного кокса после прокалочной печи и холодильного барабана — на рабочей поверхности образуются трещины, их глубина и интенсивность постепенно увеличиваются, и лента рвётся.
Для защиты от высокой температуры применяется лента марки 2Т3, но и она не выдерживает длительного контакта с разогретым прокалённым коксом.
На срок службы транспортёрных лент могут влиять и другие факторы — например, фракционный и химический состав сырья: прокалённый и сырой нефтяной кокс, анодная масса. При перегоне сырого нефтяного кокса зимой на транспортёрную ленту воздействуют химические реагенты, которые уменьшают смерзание сырья. Чтобы снизить их вредное воздействие, используют маслостойкую транспортёрную ленту 2МС. Но постепенно её рабочая поверхность размягчается, теряет эластичные свойства и деформируется.
На срок службы транспортёрных лент влияют и разнообразные условия эксплуатации оборудования. Часть оборудования работает непрерывно, другая — по установленному графику. Различается и загруженность транспортёров сырьём: постоянная загруженность или периодически изменяющаяся в процессе работы, эксплуатация на предельной производительности или в щадящем режиме. Из-за этого установить нормативный срок эксплуатации для транспортёрных лент невозможно: он сильно варьируется для аналогичного оборудования даже в пределах одного цеха.
Специально обученный персонал сервисной службы выполняет регулярную классическую визуальную диагностику технического состояния лент в процессе эксплуатации. Но у этой процедуры тоже свои недостатки. Во время осмотра лента обычно находится под слоем материала, а при большом количестве оборудования невозможно одновременно остановить все транспортировочные системы. Проблема человеческого фактора тоже имеет большое значение: каждый пропущенный специалистом дефект может остановить конвейер и всю производственную линию, что приведёт к крайне негативным последствиям.
Именно поэтому так важно внедрять дифференцированный подход к обслуживанию оборудования, который учитывает степень влияния конкретного конвейера на производственный процесс в целом. Повреждения ленты могут быть разными: одни требуют немедленного устранения, другие позволяют планировать ремонт в прогнозируемые сроки. Поэтому перед нами встала задача разработать и внедрить автоматизированную систему диагностики ленты в процессе эксплуатации. Такая система значительно повысила бы точность и своевременность обнаружения дефектов, обеспечила бы более стабильную и безопасную работу производственных линий.
Чтобы справиться с характерными неисправностями ленты на нашем производстве: трещинами поверхности, деформациями и локальными разрывами или сквозными отверстиями, — мы изучили возможности самостоятельно реализовать алгоритмы компьютерного зрения, так как хотели оценивать состояние транспортного оборудования без привлечения ремонтного персонала, то есть в автоматическом режиме.
Компьютерное зрение — это технология, позволяющая компьютерам «видеть» и интерпретировать визуальные данные путём анализа изображений или видео. Она применяет методы обработки изображений, машинного обучения и искусственного интеллекта, чтобы выполнять задачи детекции и сегментации объектов, которые раньше могли выполнять только люди.
Так, с помощью видеокамер и алгоритмов анализа изображений мы отследили состояние транспортёрной ленты в режиме реального времени, а система автоматически выявила признаки износа — трещины, разрывы.
Мы обработали видеопоток с камеры со скоростью записи 250 к/сек и получили изображения транспортёрных лент с дефектами. Присвоили изображениям классы в соответствии с доминирующим дефектом на них. Например, если на ленте были разрывы и трещины, то изображению присваивался класс «Разрыв ленты» — как наиболее важный с точки зрения дальнейшей безотказной работы оборудования.
Чтобы повысить универсальность работы модели, выполнили аугментацию изображений на обучающей выборке:
transformed_dataset = []
transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5), # Случайное отражение по горизонтали с вероятностью 50%
transforms.RandomRotation(degrees=(-15, 15)), # Случайный поворот на угол от –15 до 15 градусов
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1) # Изменение цветовых характеристик
])
Исказили положение изображений и их цветовую гамму.
Далее импортировали из пакета Torchvision библиотеки PyTorch предобученную модель ResNet-18, заморозили все слои модели и поменяли последний полносвязный слой на новый — с четырьмя выходными классами. Определили функции потерь и оптимизатора:
model = models.resnet18(pretrained=True)
for param in model.parameters():
param.requires_grad = False
num_classes = 4 # Количество классов в нашем датасете
model.fc = nn.Linear(model.fc.in_features, num_classes)
# Определение функции потерь и оптимизатора
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
Потом пробно обучили модель-классификатор на 20 эпохах, получили значение ошибки Loss — 7%. Учитывая, что на обучающей выборке было всего 224 изображения, мы получили неплохие результаты.
Чтобы проверить работу модели, загрузили изображение из тренировочной выборки. А после обработки моделью получили заключение о состоянии ленты.
Таким образом, мы выяснили, что благодаря классификатору можно выявлять наличие или отсутствие дефектов на ленте и определять, какая визуальная диагностика нужна: с привлечением специалистов сервисной организации или с помощью алгоритмов детекции и сегментации. Такой алгоритм работы прост в реализации, его можно применять для диагностирования большей части конвейерного оборудования и контроля его исправного состояния.
Чтобы обучить модель-детектор, нужен был набор изображений с размеченными дефектами. Мы размечали их в программе CVAT. Классы распознаваемых дефектов — трещины, порывы ленты, состояние стыка ленты.
В программе каждому изображению присвоили свой ID-номер, название дефекта и его координаты. Для одного изображения могло быть несколько отметок о дефектах.
Затем с помощью методов Python создали датафрейм на основе XML-разметки. Для этого определили функцию def parse_annotation
: она анализировала XML-файл с аннотациями для изображений. Функция parse_annotation
преобразовывала XML-данные в список словарей, каждый из которых содержал подробную информацию об одном объекте изображения: имя файла, размер изображения, метку класса и координаты точек полигональной линии.
def parse_annotation(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
objects = []
for image in root.findall('image'):
filename = image.get('name')
width = int(image.get('width'))
height = int(image.get('height'))
for polyline in image.findall('polyline'):
label = polyline.get('label')
points = polyline.get('points')
objects.append({
'name': filename,
'width': width,
'height': height,
'class': label,
'points': points
})
return objects
Проверили разметку изображения на основании созданного датафрейма.
Далее создали класс нашего датасета (class CustomDataset(Dataset)), — таким образом мы подготовили данные в удобном формате для загрузки батчами с помощью DataLoader из PyTorch:
class CustomDataset(Dataset):
def __init__(self, root, df, transforms=None):
self.root = root
self.transforms = transforms
self.dataframe = df
self.imgs = list(self.dataframe['filename'].unique())
def __getitem__(self, idx):
img_name = self.imgs[idx]
img_path = os.path.join(self.root, img_name)
img = Image.open(img_path).convert("RGB")
current_annotations = self.dataframe[self.dataframe['filename'] == img_name]
num_objs = len(current_annotations)
boxes = []
labels = []
for _, row in current_annotations.iterrows():
boxes.append([row["xmin"], row["ymin"], row["xmax"], row["ymax"]])
labels.append(row["class"])
boxes = torch.as_tensor(boxes, dtype=torch.float32)
labels = torch.as_tensor(labels, dtype=torch.int64)
image_id = torch.tensor([idx])
area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
iscrowd = torch.zeros((num_objs,), dtype=torch.int64)
target = {"boxes": boxes, "labels": labels, "image_id": image_id, "area": area, "iscrowd": iscrowd}
if self.transforms:
img, target = self.transforms(img, target)
return img, target
def __len__(self):
return len(self.imgs)
И создали функцию обучения модели-детектора. Обучили модель:
def train_model(num_classes, num_epochs, batch_size, device):
dataset = CustomDataset(img_path, df, transforms=get_transform(train=True))
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=0, collate_fn=collate_fn)
class_weights = calculate_class_weights(df)
criterion = torch.nn.CrossEntropyLoss(weight=class_weights)
weights = FasterRCNN_ResNet50_FPN_Weights.COCO_V1
model = fasterrcnn_resnet50_fpn(weights=weights)
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
model = model.to(device)
params = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005)
lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1)
for epoch in range(num_epochs):
model.train()
epoch_loss = 0
progress_bar = tqdm(data_loader, desc=f'Epoch {epoch + 1}/{num_epochs}', leave=False)
for images, targets in progress_bar:
images = list(image.to(device) for image in images)
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
loss_dict = model(images, targets)
losses = sum(loss for loss in loss_dict.values())
epoch_loss += losses.item()
optimizer.zero_grad()
losses.backward()
optimizer.step()
progress_bar.set_postfix(loss=epoch_loss / (progress_bar.n + 1))
lr_scheduler.step()
print(f"Epoch {epoch + 1} completed with loss {epoch_loss / len(data_loader)}")
print("Training completed.")
return model
Обученная модель распознавала объекты на изображениях из тренировочной выборки.
Модель-детектор улучшила диагностику транспортёрной ленты: позволила не только выявлять неисправности, но и оценивать их масштаб. Например, теперь можно было рассчитать площадь выявленных повреждений. Эта информация особенно важна для определения дальнейшей стратегии в ремонте транспортёрного оборудования.
Применение такой модели подходит для оборудования, которое установлено в местах с затруднённым для сервисного обслуживания расположением — стеснённые условия, недостаточная высота потолков, — и позволяет полностью исключить диагностику специалистами сервисной службы.
С помощью сегментации изображений обычно выделяют объекты и их границы на изображениях. Так мы определили функцию создания сегментационной маски объектов и их последующую визуализацию:
def create_segmentation_mask(height, width, points):
mask = np.zeros((height, width), dtype=np.uint8)
points = points.split(';')
points = [list(map(float, p.split(','))) for p in points]
points = np.array(points, dtype=np.int32)
cv2.fillPoly(mask, [points], 1)
return mask
def show_images_with_masks(images, masks, num_images=3):
combined = list(zip(images, masks))
random.shuffle(combined)
images, masks = zip(*combined)
fig, axes = plt.subplots(num_images, 2, figsize=(10, 15))
for i in range(num_images):
axes[i, 0].imshow(images[i])
axes[i, 0].set_title(f'Image {i+1}')
axes[i, 1].imshow(masks[i], cmap='gray')
axes[i, 1].set_title(f'Mask {i+1}')
plt.tight_layout()
plt.show()
Создали модель сегментации изображений для обработки датасета, обучили её:
# Загрузка модели
weights = MaskRCNN_ResNet50_FPN_Weights.COCO_V1
model = maskrcnn_resnet50_fpn(weights=weights)
# Количество классов (например, 1 класс + фон)
num_classes = 3
# Замена box_predictor
model.roi_heads.box_predictor = torchvision.models.detection.faster_rcnn.FastRCNNPredictor(
model.roi_heads.box_predictor.cls_score.in_features, num_classes)
# Замена mask_predictor
model.roi_heads.mask_predictor = torchvision.models.detection.mask_rcnn.MaskRCNNPredictor(
model.roi_heads.mask_predictor.conv5_mask.in_channels,
model.roi_heads.mask_predictor.conv5_mask.out_channels,
num_classes
)
# Проверка модели
print(model)
Чтобы оценить качество обучения модели, визуализировали предсказания модели на новых изображениях.
Сегментация дефектов на ленте расширяет возможности диагностики, позволяя более точно рассчитать площадь повреждения ленты и предсказать остаточный срок эксплуатации. Характер расположения объектов на изображении указывает на причины возникновения дефектов, помогает разработать корректирующие мероприятия, чтобы исключить или ослабить влияние этих дефектов.
Конвейерное оборудование обычно устанавливают и эксплуатируют в местах с повышенной запылённостью и влажностью, поэтому камеры должны быть с достаточной степенью пылевлагозащиты. Мы использовали видеокамеры со степенью защиты IP64.
После обучения алгоритма размеченный датасет с изображениями участков транспортёрных лент показывает хорошие результаты и отлично выявляет дефекты на ленте. Этого достаточно, чтобы детально определить техническое состояние ленты и решить, нужно ли проводить её визуальный контроль с привлечением специалистов по сервисному обслуживанию.
Алгоритмы, обученные с помощью координат вершин ограничивающих прямоугольников, предоставляют гораздо больше информации о самом дефекте: его приблизительном размере, месте расположения, характере повреждений. По этой информации можно предсказать срок службы ленты, примерно оценить площадь её повреждения и зафиксировать воздействие на неё высокой температуры или химических реагентов.
Сегментация объектов на ленте даёт более качественное представление о площади повреждения и точно фиксирует повреждённые области. Применять сегментацию целесообразно для особо ответственного оборудования, так как его безаварийная работа обеспечивает работоспособность всей технологической линии производства.
В дальнейшем мы будем оптимизировать систему обслуживания оборудования по категориям важности для производственного процесса на основе полученной информации о работе моделей и интегрировать этот алгоритм в систему управления предприятием — MES.
Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных занятий:
Промышленное программирование: что нужно знать инженеру по автоматизации;
1С-аналитика: как стать специалистом по автоматизации процессов;
Пошаговый план «Как стать аналитиком данных и стартовать в Data Science»;
Митап «Аналитика в промышленности».
Или открыть перспективы с профессиональным обучением и переподготовкой: