Это 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%.
рукопись
- Обработка изображения: извлеките основное содержимое фотографии, уберите шум и в конце концов
- Расширение данных: улучшение обобщения данных