большая работа по компьютерному зрению

алгоритм

Это 3-й день моего участия в августовском испытании обновлений, подробности о событии:Испытание августовского обновления

Система распознавания жестов на базе Opencv+keras

Система распознавания жестов на базе Opencv+keras

Технологии

python3.6 + opencv + keras + numpy + PIL

Обработка изображения

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

   # 图像边缘处理--腐蚀
   fgmask = cv2.erode(bg, self.skinkernel, iterations=1)
   # 将原始图像与腐蚀处理后的图片做"与"操作
   bitwise_and = cv2.bitwise_and(frame, frame, mask=fgmask)
   # 灰度处理
   gray = cv2.cvtColor(bitwise_and, cv2.COLOR_BGR2GRAY)
   # 高斯滤波
   blur = cv2.GaussianBlur(gray, (self.blurValue, self.blurValue), 2)
   cv2.imshow('GaussianBlur', blur)
   # 使用自适应阈值分割(adaptiveThreshold)
   thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
  #图像阈值化的一般目的是从灰度图像中分享目标区域和背景区域
   cv2.imshow('thresh', thresh)
   Ges = cv2.resize(thresh, (100, 100))
         

Обработанное изображение:

увеличение данных

увеличение данных

Использование увеличения данных в основном заключается в добавлении незначительных помех или изменений в обучающие данные.С одной стороны, это может увеличить обучающие данные для улучшения способности модели к обобщению, а с другой стороны, это может увеличить данные о шуме. для повышения надежности модели. Основными методами улучшения данных являются: флип, случайная обрезка, цветовое дрожание, сдвиг, масштабирование, контрастность, шум, вращение Трансформация/отражение Преобразование (вращение/отражение) и др.

Операции по дополнению данных включают следующее:

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

Переворот изображения: отражение изображения влево и вправо.

Отбеливание изображения: выполните операцию отбеливания изображения, то есть нормализуйте само изображение до распределения Гаусса (0,1).

  test_datagen = ImageDataGenerator(rescale=1. / 255)
        train_datagen = ImageDataGenerator(
            rescale=1. / 255,
            rotation_range=40,
            width_shift_range=0.2,
            height_shift_range=0.2,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)

        train_dir = r'Gesture_predict'
        validation_dir = r'Gesture_train'
        # train_img_list, test_img_list, train_lable_list, test_lable_list
        train_datagen.fit(train_img_list)
        train_generator = train_datagen.flow(train_img_list,train_lable_list,batch_size=10)
        validation_generator = test_datagen.flow(test_img_list,test_lable_list,batch_size=10)

Извлечение признаков

        def extarct_features(flag, sample_count):
            features = np.zeros(shape=(sample_count, 3, 3, 512))
            labels = np.zeros(shape=(sample_count,5))
            if flag=="train":
                generator = datagen.flow(train_img_list,train_lable_list,batch_size=20)
            else:
                generator = datagen.flow(test_img_list,test_lable_list,batch_size=20)
            i = 0
            for inputs_batch, labels_batch in generator:
                if i * (batch_size+1 )>= sample_count:
                    break
                features_batch = conv_base.predict(inputs_batch)
                features[i * batch_size: (i + 1) * batch_size] = features_batch
                labels[i * batch_size: (i + 1) * batch_size] = labels_batch
                i += 1


            return features, labels

Улучшения модели

Начните с модели, улучшите способность модели к обобщению и используйте некоторые методы улучшения. Следующие шаги состоят в том, чтобы внести некоторые улучшения с точки зрения модели, такие как нормализация партии, снижение веса. Здесь я экспериментировал с 3 методами улучшения, которые будут представлены по очереди.

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

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

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

Структурная схема модели

 # 批规范化处理
        model.add(BatchNormalization())
        # 激活函数relu
        model.add(Activation('relu', name='activation_1'))
        # 卷积层2,个数32,尺寸3*3,填充方式valid,步长默认1*1
        model.add(Convolution2D(
            filters=32,
            kernel_size=(3, 3),
            name='conv2d_2'
        ))
        model.add(BatchNormalization())
        model.add(Activation('relu', name='activation_2'))

        # 池化层,尺寸2*2,步长为2*2,填充方式为valid
        model.add(MaxPool2D(
            pool_size=(2, 2),
            strides=(2, 2),
            padding='valid',
            name='max_pooling2d_1'
        ))
        # dropout层,失活系数0.5
        model.add(Dropout(0.5, name='dropout_1'))
        # 转化为一维矩阵
        model.add(Flatten(name='flatten_1'))
        # 全连接层,128个神经元
        model.add(Dense(128, name='dense_1'))
        model.add(BatchNormalization())
        model.add(Activation('relu', name='activation_3'))
        # model.add(Dropout(0.5, name='dropout_2'))

        # 分类层,L2正则优化
        model.add(Dense(self.categories,
                        # kernel_regularizer=regularizers.l2(0.01),
                        name='dense_2'))
        # 分类层,激活函数sofomax
        model.add(Activation('softmax', name='activation_4'))

Анализ результатов:

Анализ результатов: мы наблюдали кривую обучения и кривую проверки.Очевидно, что эффект улучшения хороший, не только потеря процесса обучения может быть более стабильной, но и точность набора проверки может быть увеличена до более чем 90%, и эффект улучшения очень очевиден. Это показывает, что улучшение изображения действительно достигло эффекта улучшения способности к обобщению и надежности модели за счет увеличения количества данных обучающего набора. С точки зрения точности это также привело к улучшению на 10%. Следовательно, улучшение данных действительно имеет отличный эффект.. Однако нас все еще не устраивает точность распознавания порядка 80%.

рукопись

  1. Обработка изображения: извлеките основное содержимое фотографии, уберите шум и в конце концов
  2. Расширение данных: улучшение обобщения данных