Тоссим руду: очень неочевидная ИТ-задача
Дробилка с выдвигаемым конусом
Сначала в карьере весело бахает инженерный заряд, а потом к нам приезжает поезд с рудой. Это здоровенные камни, которые надо раздробить на части, а части перетереть в щебень, а щебень потом — в песок. На каждом этапе, если дробить слишком мелко, то будет перерасход энергии и износ машин, а если слишком крупно — этот перерасход и износ лягут на следующий этап.
Это чистая оптимизационная задача: надо дробить в заданном коридоре и всем будет счастье. Проблема в том, что мы не знаем, слишком мелко мы дробим или слишком крупно. Конвейер огромный, едет со скоростью 3,15 метра в секунду, глазами люди там ничего отличить не могут. А нужно знать фракционный состав руды.
Советские инженеры это решили специальным ведром, которое зачерпывает руду раз в 24 минуты и кладёт в тестовый бункер. Через каждые пять зачерпываний бункер опустошается на несколько сит, просеивается, и после этого человек взвешивает, сколько руды осталось на каждом из них. Так мы получали данные механическим способом раз в два часа.
И тут такие приходим мы из ИТ и говорим производству:, а хотите в реальном времени? Производство сначала крутит пальцем у виска, а потом говорит, что хочет. Потому что цена эффекта — 115 миллионов рублей в год.
Техпроцесс
Про взрыв вы уже знаете. Дальше руда едет на специальном локальном поезде-вертушке из места временного хранения в загрузочный бункер крупной дробилки. Вертушкой поезд называется потому, что он ездит в обе стороны, то есть может вагонами вперёд.
Разгрузка руды в дробилку
Дробилка — это конус, на дне которого крутится другой конус. И яма, и «нож мясорубки» стальные, поэтому легко перетирают камни. Точнее, крошат на более мелкие. Это вы видите на первой картинке сверху. Вот она ещё раз на всякий случай:
Дробилка, вид сбоку: по бокам — два редуктора с электродвигателями, по центру — бункер с дробящим конусом внутри.
Чем выше вы выдвинете подвижный конус (который растирает камни о стенки «ямы»), тем мельче пойдёт фракция, но тем более энергозатратно это будет. Наша задача — получить 90% кусков размером до 350 миллиметров. Дробилка, фактически, сама сортирует руду — из нижнего отверстия может выпасть только то, что проходит под габарит. Проблема в том, что руда — это не шарики, и может образоваться «кирпич», то есть нечто с неравными пропорциями, что по двум габаритам меньше 350, а в третьем габарите больше длинное, чем широкое. Это случайный процесс, просто статистика. Чтобы уменьшить вероятность выпадения кирпича из дробилки, нужно уменьшить разгрузочную щель, и фракция станет оптимальной. Но важно соблюдать технологию, чтобы каждый камень не дробился мельче желанного габарита.
Ещё советские инженеры так настроили процесс, что максимальная энергоэффективность следующих переделов достигается, когда таких «кирпичей» не больше 10%. То есть хочется, чтобы их было мало. Но максимальная эффективность этого конкретного процесса достигается, когда крупных камней как можно больше, поэтому мы стараемся держаться по верхней границе. В целом чуть ниже этой границы по габариту — оптимум для всего процесса дробления руды: от самосвала и поезда до выходного продукта.
На крупной дробилке «кирпичи» видно глазами.
Руда крупной фракции — вид с камер машинного зрения
Дальше фракция (преимущественно размером до 350 мм) едет по двум конвейерам. Двум — это потому что резервирование. Если встанет один, то останется второй, и техпроцесс не остановится. Поэтому можно ремонтировать их и обслуживать без даунтайма.
Если по конвейеру едет брак — большой камень или много больших камней — мы не останавливаем ничего, а просто миримся с тем, что дальше дробить будет дороже. Но стараемся корректировать на дробилке щелевой режим и осматриваем прорывы сит.
Это нижняя чаша мелкой дробилки, в которой происходит третья стадия дробления
Самое интересное случается дальше, когда фракция становится мелкой. На следующем участке, на паре метров конвейера встречается до трёх тысяч камней — щебень из руды. Их дробит средняя дробилка (так называется в зависимости от крупности куска). Там уже появляется фракция до шести миллиметров — её мы отсеиваем через грохот (вибрирующее сито), но её относительно мало. Остальное едет в третью дробилку — мелкую, по двум другим конвейерам. В третьей дробилке мы додрабливаем всё до фракции пять-шесть миллиметров и снова отсеиваем через грохот. То, что просыпается — это конечный продукт. То, что не просыпалось (надрешетный продукт) — снова едет в мелкую дробилку.
Так выглядит с камер машинного зрения руда средней фракции
А вот так — мелкой фракции
Состав руды постоянно меняется в зависимости от того, из какого места карьера мы её берём, может меняться минеральный состав и «поляризация» (она лежит слоями). Параметры дробилки тоже постоянно меняются — металл изнашивается, и конус вместе с бронёй работает всё менее и менее эффективно. Сита иногда рвутся, и тогда на конвейер за ними падают крупные куски, которые иначе были бы отсеяны.
Где там оптимизация
Технологическая задача дробления руды была решена ещё в СССР: вот коридоры фракций и брака, делайте так, пожалуйста, товарищи. Задача получения данных по рассеву фракций руды тоже решалась незамысловатым способом: конвейер тормозится, приходят мужики с лопатами, снимают всю руду с двух метров конвейера и потом также вручную просеивают эти 200 килограммов руды через сита. В сегодняшних условиях тормозить производство ради такого замера слишком дорого, мы это делаем не чаще раза в квартал.
До последнего времени мы получали данные механизированным способом, который я кратко описывал в самом начале: каждые 24 минуты с конвейера берется немного руды и высыпается в ведерко. Каждые два часа это ведерко, в котором накопилась руда от пяти таких «зачерпываний», просеивается через сита. Потом по формуле считается средневзвешенное за два часа. Проблема в том, что и этого недостаточно — и лаг измерений большой, и руда на конвейере сверху и снизу слоя отличается по размеру.
В идеале нам хотелось:
- Знать, что именно сейчас выдаёт дробилка,
- Чтобы понять, как именно поменять её режим.
Ещё точнее надо понимать только то, что сейчас выдаёт дробилка и менять режим в нужную сторону до тех пор, пока она не начнёт выдавать нужное распределение фракций. Почему нельзя с первого раза попасть в изменение без промежуточных оценок — потому что и руда случайна, и состояние износа дробилки тяжело ложится в матмодель.
В общем, нужна быстрая обратная связь.
Надо измерять камни, которые едут по конвейеру.
Первое, что мы попробовали — это поискать лидар. Лидар — крутая штука, но на такую скорость работы конвейера он стоит от пары миллионов рублей за единицу, а нам нужно минимум шесть единиц. Второй идеей была камера с лазерным проектором — по проекции полоски можно понимать её геометрическое искажение, а по геометрическому искажению полоски — что именно под ней едет. Такой сканер называется «камера глубины». В целом неплохо, но не решается главная задача — определение гранулометрического состава. Про ручной отбор руды уже говорил — не вариант. Ещё в нашей руде магнитного железа до 28%, а общего до 32%, но более-менее рациональных вариантов с магнитами мы не придумали. В итоге решили пробовать видеоаналитику, то есть машинное зрение.
Поначалу всё выглядело просто: снимаем тысячу картинок, грустные люди обводят там каждый камень прямоугольником (а грустные они потому, что камней несколько тысяч в кадре уже на втором участке среднего дробления и сотни тысяч на третьем мелкого), мы скармливаем в ML, модель жужжит и выдаёт нам идеальный результат.
Не сработало.
Точнее, не так. Сначала нам понадобилось получать нормальные фотографии для обучающей и тестовой выборки (ну и для эксплуатации тоже). В цеху темно.
Поэтому вместе с камерами мы повесили прожекторы над конвейером, чтобы был хороший свет. Это позволило без проблем видеть контуры камней вместо тёмно-серого потока.
Освещение потока руды на конвейерной ленте
Затем пришлось решать еще одну задачу. Помещения цеха, где дробится руда, не хирургическая операционная — камеры и прожекторы периодически пылятся. Думали про кожухи с дворниками и водой. Попробовали. Пока не работает. В будущем поищем другие способы, а пока раз в два дня сотрудники цеха протирают камеру, а мы ещё детектируем её запыление и запыление прожекторов, потому что они тоже тускнеют по мере работы в цеху.
Данные с запылённой камеры на второй день
Протёрли камеру
«Кирпич» поехал
Ложноположительное срабатывание
Потом порвался конвейер, и рабочим надо было добраться к месту ремонта, а камера немного мешала. Они её сначала срезали болгаркой, а потом повесили заново. Но получилось, что уже чуть на другой высоте и чуть под другим углом, то есть мы не могли полагаться на данные первых измерений о размере камней. Пришлось делать перекалибровку. Зато теперь при сдвиге камеры или размещении на новом конвейере мы сразу заново фотографируем линейку. Это звучит просто, но на деле надо было придумать правильную линейку, сделать интерфейс для её загрузки с фото, а потом прописать правила накладывания координатной сетки по фото. Итог — если надо перекалибровать соотношение пикселей на миллиметр, нужно учесть, что это займет некоторое время (чтобы взять СИЗы, линейку, дойти до цеха, приложить, вернуться к компьютеру, открыть фотографию и загрузить её в блок калибровки).
Калибровка машинного зрения для точности детектирования размера куска. Металлическая линейка на ленте конвейера размечена известными интервалами для калибровки соотношения пикселей на миллиметр.
Снова линейка
В итоге мы пришли к следующей схеме:
- Взяли данные с механического отбора за два часа как эталон количественного распределения фракций.
- Взяли фотографии за эти два часа примерно в моменты отбора и поставили в соответствие числам распределения, то есть получили основу для обучения.
- Повторили несколько сотен раз — сколько позволяла скорость механических отборов.
- Затем в блендере нагенерили похожих материалов в 3D, чтобы обогатить выборку — там 3D-шаман смотрел на реальные фотографии и перемешивал моделируемые камни.
- Обучили математическую модель и провели тестовый анализ данных на разработанной математической модели.
Реальное фото
Синтетическое изображение
Так же был реализован алгоритм детекции границ крупных камней на всех трех участках. Реальное распределение для подсчёта брака на участке крупного дробления. Но реальное распределение по фракциям необходимо для управления дроблением — оно важно для каждого последующего передела дробления и измельчения.
По моделям: instance segmentation Resnet50 maskrcnn на участках среднего и мелкого дробления (параллельно тестируем Yolact на участке крупного дробления, хотим ускориться и уменьшить занимаемую память), на среднем участке модель детекции Yolox, тестируем переход на TOOD. В модели предсказания распределения по фракциям используем resnet18 + head из нескольких линейных слоев. Более жирные архитектуры не дают прироста качества. Сейчас инференс гоняем на torch, но в планах переход на TensorRT и упаковка всего в DeepStream от Nvidia.
Это заработало. Дальше мы смотрели, насколько наша оценка совпадает или отличается от оценки СККР (механизированного отбора проб) — то есть, по сути, сделали мониторинг точности с возможностью ручной калибровки возможностей машинного зрения. Автокоррекции и переобучения на лету нет (как минимум пока) — если приезжает другая руда или модель начинает «гнать» по каким-то своим эмельным причинам, мы приходим и разбираемся. Пока точность в коридоре около полумиллиметра.
Если быть более точным, наше измерение (точнее, прогноз по сотням фотографий из видеопотока) и измерение механическим способом не совсем одинаковы. Из-за того, что размеры сита дискретны, и их всего четыре штуки, в механическом процессе фракции делятся на 0–5 мм, 5–10 мм, 10–15 мм и выше 15. Но если слишком большой процент кусков руды будут на верхнем пределе по размеру, то мы получим неверную оценку состава фракций. Особенно это неприятно в крупной фракции, потому что «больше 15» — это в теории может быть что угодно, включая Тунгусский метеорит. На практике там, конечно, большие камни не попадаются, но 15–350 мм встретить вполне можно. А разница между «из дробилки лезет преимущественно 200» и «в крупной фракции всё по 16» огромная.
Ещё одна контрольная точка для обучения — ручной рассев раз в квартал, который также используется для калибровки системы механической оценки, которую я описывал выше (те самые мужики с лопатами).
Дальше тестовая эксплуатация шла без сюрпризов, пока не выяснилось, что можно пускать двойной объём руды по конвейеру. Однажды, в момент остановки одного из конвейеров всю руду пустили на второй конвейер — оказалось, это возможно, хоть и создаёт дополнительные сложности для процесса. А для нас сложность была в том, что слой руды стал выше и модель впала в панику. Потому что камни стали ближе к камере на несколько десятков сантиметров, что тут же увеличило их визуальные размеры. А мы тренировали модель только на одной высоте слоя — стандартной. Потом уже мы узнали, что такой режим включается всего пару раз в год по особым обстоятельствам, и модель дорабатывать не нужно, как и снимать заново обучающую выборку или думать о дополнительной калибровке. В общем, давайте просто запишем, что в таком режиме рекомендации софта слушать не надо, а этот день, когда роботы запаниковали, постараемся забыть. На самом деле, конечно же, задачу записали в бэклог, при повторении — возьмем в работу.
Итого
- Есть детектор негабарита по краям камней. Очень удобно считать «кирпичи», что решает задачу с пониманием, что, если дробилка работает нормально при этом, значит, прорвано сито, нужно останавливать грохот и идти смотреть, что там. И ещё ряд других вспомогательных задач оценки качества руды.
- Есть модель, которая на основании обучающей выборки фотографий в момент забора и результатов этого забора умеет делать прогноз количества разных фракций в руде. Она служит для оперативного управления дробилкой.
- Есть мониторинг, который связывает фактические данные отборов руды с данными прогнозов модели — и следит, чтобы модель не сильно врала. Если врёт сильно — зовёт нас разбираться. Например, может приехать вообще другая руда (да хоть другого цвета и другого состава), и тогда придётся думать, что делать с обучающей выборкой.
- Есть оценка состояния камеры и света, чтобы прогнозировать, когда надо будет протирать, — и ставить такую задачу рабочим цеха хотя бы за смену до протирки.
- Есть хранение фотографий — мы держим два месяца полной истории на всякий случай.
- Есть модуль калибровки по линейке.
Чего мы не знаем — это как вся эта сборка будет работать на другом конвейере. Недавно вот проверили: модель третьего участка по поиску негабаритов умеет работать на первом с достаточным качеством. Модели двух конвейеров второго участка имели разные обучающие выборки (снятые на двух разных камерах двух разных конвейеров) — при объединении они улучшают качество прогноза, а не ухудшают его. Вполне возможно, что новые конвейеры с такими же прожекторами можно будет запускать довольно просто.
Не хватает оптимизации. Сейчас мы делаем 20–30 прогнозов в секунду, а надо быстрее, до 50 раз — иначе пропускаем часть быстро уезжающих камней. Надо оптимизировать код в паре мест, это просто время.
Бывает руда цвета ленты конвейера: у нас такой в карьере нет, но в природе встречается. Что с этим делать, пока непонятно. Если что, рядом мы решаем похожую задачу для оценки качества извести, и там всё в белой пыли, то есть фон совпадает с цветом объекта. Но там-то всё в разы проще: их конвейер можно останавливать сколько угодно раз, а механические заборы очень лёгкие. Там модель по видимому слою оценивает объём по границам блоков, умножает на плотность и получает нужные параметры — достаточно поиска границ и ещё одной доработки на пыль. Но там ещё далеко до финала пока, а на руде уже год тестовой эксплуатации и хорошая подтверждённая экономия.
Так что на текущий момент всё это работает хорошо, но есть ещё много всего, как улучшать и докручивать.