Форум программистов, компьютерный форум, киберфорум
jvf
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

28.05.24 Создание скриншотов для последующего анализа алгоритмами машинного обучения

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

1. Создание скриншотов для последующего анализа алгоритмами машинного обучения

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

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

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

Вот я её и написал.

Программа очень короткая и простая. Состоит из двух файлов. Первый называется utils:

Программа utils делает простую вещь: создаёт необходимые папки под названием "Data", "Photo", а также подпапки в папке Photo под названием "orig" и "compr". Также в ней есть функция, которая будет сохранять наш файл на диск.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import os
import cv2
import datetime
import time
 
class utils:
 
    def __init__(self):
 
        #папка, в которой мы запуситили нашу программу
        mDir = os.path.dirname(os.path.realpath('__file__'))
        print("mDir=", mDir)        
        #папка Data, то есть мы запустили файл в некой папке, и в ней находится папка data
        self.DATA_DIR = os.path.join(mDir, "data")
        #папка Photo, то есть мы запустили файл в некой папке, и в ней неходится папка photo
        self.PHOTO_DIR = os.path.join(mDir, "photo") 
        #папка внутри папки photo с названием orig
        self.PHOTO_DIR_ORIG = os.path.join(self.PHOTO_DIR, "orig")
        #папка внутри папки photo с названием compr
        self.PHOTO_DIR_COMPR = os.path.join(self.PHOTO_DIR, "compr"  )
 
        #если этих папок нет, то мы автоматически их создаём
        for d in [self.DATA_DIR, self.PHOTO_DIR, self.PHOTO_DIR_ORIG, self.PHOTO_DIR_COMPR]:
            if not os.path.exists(d):
                os.mkdir(d)
 
    def give_data_dir(self):
 
        return self.DATA_DIR
 
    def give_photo_dir(self):
 
        return self.PHOTO_DIR
 
    def give_photo_dir_orig(self):
 
        return self.PHOTO_DIR_ORIG
 
    def give_photo_dir_compr(self):
 
        return self.PHOTO_DIR_COMPR
 
    #сохраняем наш файл на диск   
    def save_photo_disk(self, frame, path):
        
        print("Start")
        now = datetime.datetime.now()
 
        mstr = str(now)
        nstr = ""
        count = 0
        
        for m in mstr:
            if m == ":":
                nstr += "_"
            else:
                nstr += m
 
            if "." in nstr:
                count += 1
            if count ==3:
                break
 
        #print("mstr=", mstr)
        #print("nstr=", nstr)
 
        nstr += ".jpg"
 
        new_name = os.path.join(path,nstr)
        print("path=", path)
        print("nstr=", nstr)
        cv2.imwrite(new_name, frame)
А следующая программа просто сохраняет изображение в папку "orig". Ставим этот файл в автозагрузку, и через некоторое время у нас будет много скриншотов нашего экрана, с которыми мы можем что-то делать. Как-то их потом изучать. Находить некоторые закономерности.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
#вот эта библиотека и позволит нам снимать скриншоты нашео экрана
import pyautogui
import imutils
import cv2
 
from utils import utils
 
import time
 
mDir = utils()
 
while True:
    #снимает скриншотв экрана
    image = pyautogui.screenshot()
    #сохраняем в более привычный массив через библиотеку OpenCV
    image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
    #сохраняем наш файл на диск
    mDir.save_photo_disk(image, mDir.give_photo_dir_orig())
    print(mDir.give_photo_dir_orig())
    #Берём паузу, чем больше она будет, тем реже будет делать снимки нашего экране
    #Чем меньше паузу, тем чаще
    time.sleep(300)
Соответственно, это самый простой способ получить какую-то базу, чтобы на ней что-то делать.

2. Интересное видео о машинном обучении

Анализ качества обучения нейронной сети
https://www.youtube.com/watch?v=ykDH66b0N_4


Интересные факты из видео:

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

2. В библиотеке Keras можно использовать функцию, которая позволяет автоматически разбить данные для обучения и данные для проверки. Для этого можно написать так:

Python
1
model.fit(X_train, y_train, batch_size = 200, nb_epoch = 100, validation_split = 0.2, verbose = 1)
Если мы напишем такую команду, то Keras будет выводить нам данные, то есть цифры и на обучающей выборке, и на тестовой. Например,

Epoch 1/100
loss : 1.4934 - acc:0.6488 - val_loss:0,9905, val_acc - 0.8146
loss : 1.4934 - acc:0.6488 -- это данные на обучающей выборке
val_loss:0,9905, val_acc - 0.8146 -- данные на проверочной выборке

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


3. Интересные тексты о машинном обучении

На Kaggle есть интересный код: https://www.kaggle.com/yassine... -997-top-6

Здесь рассказывает о новой функции ReduceLROnPlateau

Чтобы её воспользоваться, надо сначала импортировать

Python
1
from keras.callbacks import ReduceLROnPlateau
А затем мы можем применить эту функцию:

Python
1
2
3
4
5
learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', 
                                            patience=3, 
                                            verbose=1, 
                                            factor=0.5, 
                                            min_lr=0.00001)
Этот автор решил её применить, чтобы оптимизатор работал быстрее.

learning_rate - это шаг, с которым оптимизатор пытается достичь минимума нашей функции.

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

На следующем рисунке это поясняется: https://en.wikipedia.org/wiki/... iginal.svg

Поэтому лучше не иметь learning_rate постоянным, а постепенно уменьшать его с каждым шагом.

Основная вещь в ReduceLROnPlateau -- мы уменьшаем learning_rate динамически. Мы следим за показателями val_acc, и если точность не повышается за три эпохи, то мы уменьшаем learning_rate в два раза.

Иными словами, мы пытаемся достичь минимума с большим шагом (пытаемся ускорить алгоритм), но если результаты не улучшаются, то мы уменьшаем learning_rate в два раза.
Размещено в Без категории
Показов 2042 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru