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

В этом году синтетические данные вызвали много шумихи, и я подумал немного поиграть с ними. Когда вы хотите использовать нейронные сети, проблема в практическом мире - это «данные». Хорошие, чистые и маркированные данные - мечта любого инженера / исследователя компьютерного зрения.

В этом году я столкнулся с интересной проблемой, когда мне пришлось создать инструмент для обнаружения аномалий. Задача заключалась в том, чтобы сборочная линия была чрезвычайно эффективной и ежеквартально производила почти 10–15 неисправных деталей! В таком сценарии, как разработать стратегию сбора данных?

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

Затем, ничего не сказав команде по обнаружению аномалий, я отправился в свой кокон кодирования, чтобы построить простой генератор синтетических данных аномалий, используя только opencv. Я хотел создать доказательство концепции, которое можно использовать для обучения нейронных сетей, и если оно сработает, мы сможем генерировать реалистично выглядящие данные. Рад, что идея сработала!

Начнем кодирование с импорта необходимых модулей -

# author - Vipul Vaibhaw
import cv2
import numpy as np
import random

Теперь нам нужно пустое изображение, в основном массив numpy, который мы будем использовать для генерации изображений.

height = 500
width = 500
blank_image = np.zeros((height,width,3), np.uint8)

Хорошо, а теперь, если вы сделаете cv2.imshow здесь. Вы увидите черное изображение, потому что все значения пикселей равны нулю.

Здорово! Наша доска для рисования готова. Теперь нам нужно повозиться со значениями пикселей и каналами, чтобы получить желаемый тип изображения.

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

Хорошо, тогда давайте выберем второй канал изображения (RGB или BGR, зеленый всегда второй канал) и изменим его.

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

for row in blank_image[:,:width,1]:
    for element in range(len(row)):
        row[element] = random.choice([100,255])

Мы провели итерацию по второму каналу и случайным образом присвоили значениям пикселей 100 (темно-зеленый) и 255 (светло-зеленый), чтобы получить эффект зернистости.

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

cv2.circle(blank_image, (250,250), 400, (0,100,0), thickness=-1, lineType=8, shift=0)

Теперь мы заметили, что на зернистом фоне царапины выглядели беловатыми, а на чистом фоне царапины были серебристыми.

num_scratches=random.randint(0,5)
for _ in range(num_scratches):
    row_random = random.randint(150,400)
    blank_image[row_random:(row_random+1), row_random:(row_random+random.randint(25,75))] = (192,192,192)

Для создания царапин на шумном фоне мы создали белые царапины.

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

Совет - используйте cv2.createCLAHE(), чтобы придать вашим изображениям световые эффекты.

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

Свяжитесь с нами, если вам понадобится помощь в создании синтетических данных.

Надеюсь, статья вам понравилась! Продолжайте учиться и делиться знаниями. Следуйте за мной на github, stackoverflow, linkedin или twitter.