Форум программистов, компьютерный форум, киберфорум
Наши страницы
jvf
Войти
Регистрация
Восстановить пароль
Оценить эту запись

2018.05.22 Получение информации из детектора в DataFrame

Запись от jvf размещена 22.05.2018 в 17:44

1. Вчера я написал программу, которая загоняет в DataFrame -- речь о Python -- данные о том, где датчик движения зафиксировал движение.

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

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

Конечно, уже есть натренированные классификаторы на кошек. Но у меня плохая веб-камера, изображение размытое, некачественное, и эти классификаторы часто ошибаются, потому что они натренированы на качественные изображения. Поэтому нам нужно самим написать что-то. Какие-то алгоритмы.

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

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

Вот наш код: мы создаём пустой DataFrame

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def create_DataFrame(self, key):
        df = pd.DataFrame()
 
        df["x"] = []
        df["y"] = []
        df["w"] = []
        df["h"] = []
        df["frame_shape.x"] = []
        df["frame_shape.y"] = []
        df["file_size"] = []
        df["cat_or_not"] = []
        df["file_name"] = [""]
 
        df = df.drop(df.index[0])
 
        if key == True:
            #сохраняем файл
            df.to_pickle(self.PANDAS_FILE) 
 
        return df
Затем, когда детектор фиксирует движение, каждый раз заполняем эту таблицу, состоящую из следующих значений:
x -- левая координата изображения по x, которую зафиксировал детектор
y -- левая координата изображения по y, которую зафиксировал детектор движения
w -- ширина изображение, которое заметил детектор движения
h -- высота изображения
frame_shape.x -- размер всего изображения по x
frame_shape.y -- размер всего изображения по y
file_size -- размер файла
cat_or_not -- ответ, есть ли на изображении кошка или нет. Если есть, то ставим 1, если нет, то 0
file_name -- название нашего файла

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

Теперь перед нами стоит следующая задача: когда у нас будет большая таблица, то нам нужно предсказать, используя эти значение, а что находится на экране: кошка, я или что-то ещё.


Update:


Интересная информация о машинном обучении с youtube: один из самых понятных видео-курсов:

https://www.youtube.com/watch?v=0ImpTjNeWGo


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

Вот сам текст программы:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
 
# Устанавливаем seed для повторяемости результатов
numpy.random.seed(42)
 
# Загружаем данные
(X_train, y_train), (X_test, y_test) = mnist.load_data()
 
# Преобразование размерности изображений
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
# Нормализация данных
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
 
# Преобразуем метки в категории
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)
 
# Создаем последовательную модель
model = Sequential()
 
# Добавляем уровни сети
model.add(Dense(800, input_dim=784, activation="relu", kernel_initializer="normal"))
model.add(Dense(10, activation="softmax", kernel_initializer="normal"))
 
# Компилируем модель
model.compile(loss="categorical_crossentropy", optimizer="SGD", metrics=["accuracy"])
 
print(model.summary())
 
# Обучаем сеть
model.fit(X_train, Y_train, batch_size=200, epochs=25, validation_split=0.2, verbose=2)
 
# Оцениваем качество обучения сети на тестовых данных
scores = model.evaluate(X_test, Y_test, verbose=0)
print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))
Основные вещи:
Здесь вводится функция Relu -- это функция, которая берёт максимум от 0 до x. Например, если F(x)=x^2, то relu на промежутке от 0 до 10 будет равна 100.

Также мы используем на выходе функцию softmax. Это функция, которая делает так, чтобы сумма всех нейронов на выходе была равна 1. Очень удобно для предсказания.

verbose -- это параметр, который даёт нам информацию во время обучения. Если verbose равен 0, то у нас ничего не будет выводиться. Если verbose равен 1, то информация будет выводиться максимально подробная. Если 2 или более, то более сжатая.

Параметр batch_size -- это сколько значений мы берём в нейронную сеть за раз. Если наш компьютер слабый и начинаем тормозить, то лучше уменьшить batch_size до приемлемого уровня.


Update:


На Kaggle проходит соревнование для новичков в программировании. Здесь можно выдать свои данные и посмотреть, какой результат получится в соревновании по распознаванию рукописных цифр.
https://www.kaggle.com/c/digit-recognizer/kernels

Есть файл train.csv, он занимает 73.22 MB
И есть файл test.csv, он занимаем 48.75 MB

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

Здесь новички могут посоревноваться в том, кто напишет более крутую программу по распознаванию рукописных цифр. Можно использовать текст Созыкина выше как стартовый шаблон.
Размещено в Без категории
Просмотров 312 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru