Файл: Методические указания по выполнению лабораторных работ для студентов, обучающихся с применением.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 05.12.2023

Просмотров: 131

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

27
Можно клонировать какой-либо проект с github.
! git clone https://github.com/ ……………
Для подключения диска Google можно воспользоваться командами, при- веденными на рисунке 1.13.
Рис. 1.13 – Подключение Google Disk
Другой способ – нажмите иконку «папка» и затем Mount Drive (рис. 1.14).
Рис. 1.14 – Подключение Google Disk
После запуска кода появится сообщение о необходимости ввода кода ав- торизации, для этого перейдите по указанной ссылке и разрешите сторонним компонентам получать доступ к вашему диску (рис. 1.15).
Рис. 1.15 – Результат подключения диска

28
На рисунке 1.16 приведен пример формы, из которой необходимо копи- ровать код авторизации.
Рис. 1.16 – Форма для копирования ключа авторизации
Ниже должен быть указан код авторизации, который нужно скопировать в поле ввода.
Теперь можно обращаться к файлам на Google-диске.
Зайдем на свой Google-диск: https://drive.google.com
, или из google.com.
Создадим директорию Python (название может быть другое). Можем те- перь записать в нее нужные нам файлы (с помощью upload) или даже целую директорию (upload directory) (рис. 1.17).
Рис. 1.17 – Диск с созданным каталогом
Можно вернуться на Colab, выбрать Download py и сохранить все Cells в файле на вашем рабочем компьютере.
На нашей рабочей машине создадим в любом удобном редакторе файл со скриптом на Python, например, с названием file1.py. Внимательно вводите

29 пути, чтобы не ошибиться, в конце поставьте слеш, если вдруг происходит ошибка. import math import numpy x = numpy.array([i for i in range(100)]) print(x)
Запишем этот файл со скриптом на Google-диск.
Затем вернемся в colab cell и запустим наш скрипт (рис. 1.18).
Рис. 1.18 – Результат работы скрипта
Попробуем импортировать этот скрипт как модуль (рис. 1.19).
Рис. 1.19 – Результат работы скрипта
Как видите, при подключении модуля его код исполнился. Вы можете написать свой скрипт или реализовать свой проект, затем сохранить его на Google-диск и запустить для исполнения на colab.
Вернитесь на Google-диск и в папке Python создайте папку dataf, скопи- руйте в эту папку какие-либо изображения в формате jpg, порядка 5 файлов

30
(используйте файлы, содержащие 3 цветовые гаммы, если использовать 4 или меньше, то необходимо будет изменить код самостоятельно).
Создайте еще одну ячейку + Code и в ней проводите эксперименты. За- пишите туда данный код, внимательно изучите его, при необходимости прове- дите рефакторинг
1   2   3   4   5   6   7

import
sys
import
os
import
numpy
as
np
from
PIL
import
Image
import
matplotlib
.
pyplot
as
plt sys
.
path
.
append
(
'/mntDrive/My Drive/python'
)
def
read_image_files
(
files_max_count
,
dir_name
):
files
=
os
.
listdir
(
dir_name
)
if
(
files_max_count
>
len
(
files
)):
# определяем количество файлов, не больше max files_count
=
len
(
files
)
else
:
files_count
=
files_max_count image_box
=
[[]]*
files_count
for
file_i
in
range
(
files_count
):
# сохраняем изображения в список image_box
[
file_i
]
=
Image
.
open
(
dir_name
+
'/'
+
files
[
file_i
])
# / ??
return
files_count
,
image_box files_count
,
image_box
=
read_image_files
(
10
,
'/mntDrive/My
Drive/python/dataf'
)
print
(
files_count
)
fig
=
plt
.
figure
(
figsize
=(
15
,
15
))
plot_countx
=
int
(
files_count
**
0.5
)+
1
plot_county
=
int
(
files_count
**
0.5
)+
1
print
(
image_box
)
viewer
=
[[]]*
files_count
# массив саб графиков
for
i
in
range
(
files_count
):
viewer
[
i
]
=
fig
.
add_subplot
(
plot_countx
,
plot_county
,
i
+
1
)
viewer
[
i
].
imshow
(
np
.
array
(
image_box
[
i
]))
# делаем график изображения fig
.
show
()

31
Если все сделано правильно, должны быть отображены файлы с изобра- жениями.
Попробуйте изменить программу, создав более короткий или удобо- читаемый код.
Попробуем изменить немного программу и преобразовать изображение, изменив его размер.
Какими другими более удачными названиями можно обозначить некото- рые переменные?
import
random height
=
224
width
=
224
# копирование изображений в массив numpy и изменение их размеров
# попробуйте написать код, который сохраняет соотношение сторон images_resized
=
[[]]*
files_count
for
i
in
range
(
files_count
):
images_resized
[
i
]
=
np
.
array
(
image_box
[
i
].
resize
((
height
,
width
)))/
255.0
images_resized
=
np
.
array
(
images_resized
)
# пример кода вместо кода выше,
# закомментировать код нежелательно, или оставлять
# закомментированный код, лучше сразу удалять
# np.array([np.array(image_box[i].resize((height,width))) for i in
# range(files_count)]) al
=
0.3
image_
=
images_resized
[
0
]*
al
+
images_resized
[
1
]*(
1
-
al
)
fig_
=
plt
.
figure
(
figsize
=(
7
,
7
))
viewer_
=
fig_
.
add_subplot
(
1
,
1
,
1
)
viewer_
.
imshow
(
image_
)
fig_
.
show
()
Изучим некоторые возможности работы с массивами numpy.
Суть данного примера заключается в том, что исходное изображение представляет собой трехмерную матрицу, в которой сначала идет измерение по высоте, потом по ширине, далее – измерение, хранящее цветовые составля- ющие r, g, b. Фактически матрица хранит списки из трех элементов. С помощью операции суммирования и деления на 3 по третьей оси мы получаем гамму в серых цветах и фактически матрицу 224 на 224. Но такая матрица на графике


32 будет отображена как тепловой график, где малые значения будут близки к хо- лодным синим цветам, а большие – к ярким красным. Но мы хотим отобразить серые цвета, тогда мы должны растиражировать нашу составляющую интен- сивности три раза, для этого мы с помощью expand_dims расширяем опять мас- сив до размерности 224*224*1, а затем с помощью repeat дублируем три раза каждую составляющую в матрице, таким образом получая тензор 224*224*3.
# суммируем цветовые составляющие трехмерного "тензора" 224*224*3
# суммирование по третьей оси, индекс 2
# результат матрица 224*224, где все суммы r, g, b поделены на 3 image_
=
images_resized
[
0
].
sum
(
axis
=
2
)/
3.0
# расширяем измерения массива от 2 до 3
image_1
=
np
.
expand_dims
(
image_
,
axis
=
2
)
# повторяем матрицы 224 на 224 три раза, получая 224*224*3
image_2
=
np
.
repeat
(
image_1
,
repeats
=
3
,
axis
=
2
)
print
(
image_1
.
shape
)
# задаем пространство для размещения графиков fig_
=
plt
.
figure
(
figsize
=(
7
,
7
))
# отображаем первый график слева viewer_1
=
fig_
.
add_subplot
(
1
,
2
,
1
# отображаем второй график справа viewer_2
=
fig_
.
add_subplot
(
1
,
2
,
2
)
viewer_1
.
imshow
(
image_
)
viewer_2
.
imshow
(
image_2
)
fig_
.
show
()
Первый аргумент в методе figure задает пространственный размер по вер- тикали и горизонтали. В методе subplot первый аргумент задает количество кле- ток по вертикали, второй – количество по горизонтали, третий аргумент задает номер графика, который будет отображен в соответствующей клетке.
В numpy, как и со списками, можно использовать срезы, в этом случае различаются представления view и полные копии copy, простое присвоение пе- ременной не создает никакой копии, просто переменная ссылается на тот же объект.
Поэкспериментируем.
# создаем представление массива, верхняя половина image_
=
images_resized
[
0
,
0
:
112
,
0
:
224
]
# создаем полную копию

33 image_copy
=
images_resized
[
0
].
copy
()
# создаем представление массива, нижняя половина рисунка image_1
=
images_resized
[
0
,
112
:
224
,
0
:
224
]
# должен измениться и рисунок images_resized[0]
# поизменяйте третий срез image_1
[
56
:
112
,:,
0
:
3
]
=
1.0
print
(
image_
.
shape
)
fig_
=
plt
.
figure
(
figsize
=(
7
,
7
))
# здесь задаем четыре графика в клетках 2 на 2 viewer_1
=
fig_
.
add_subplot
(
2
,
2
,
1
)
viewer_2
=
fig_
.
add_subplot
(
2
,
2
,
2
)
viewer_3
=
fig_
.
add_subplot
(
2
,
2
,
3
)
viewer_4
=
fig_
.
add_subplot
(
2
,
2
,
4
)
# в созданных клетках отображаем графики viewer_1
.
imshow
(
image_
)
viewer_2
.
imshow
(
image_1
)
viewer_3
.
imshow
(
images_resized
[
0
])
viewer_4
.
imshow
(
image_copy
)
fig_
.
show
()
Примеры для ознакомления, которые необходимо создать. image_1
[
56
:
112
,:,
0
:
3
]
=
np
.
random
.
rand
(
56
,
224
,
3
)
# меняем местами первую и вторую ось (транспонируем), поворачиваем картин- ку viewer_4
.
imshow
(
image_copy
.
transpose
(
1
,
0
,
2
))
# задаем один оттенок белого image_1
[
56
:
112
,:]
=
np
.
expand_dims
(
np
.
random
.
rand
(
56
,
224
),
axis
=
2
)
# эквивалентно вызову np.expand два раза image_1
[
56
:
112
,:]
=
np
.
random
.
rand
(
56
)[:,
np
.
newaxis
,
np
.
newaxis
]
# сделайте золотым цветом image_1
[
56
:
112
,:]
=
np
.
random
.
rand
(
3
)[
np
.
newaxis
,
np
.
newaxis
,:]
Соответственно, элементы массива с меньшим числом элементов копи- руются в массив с большим количеством элементов, дублируясь, но количество измерений, как и размерность, должно совпадать по соответствующей оси.
Предполагается, что одиночные элементы дублируются.
Например: image_1[56:112,:] = np.random.rand(224,3)[np.newaxis,:]
Дополнительная информация о слайсах:


34
Запомните, копирование x[0:-1] = x[0:-1] приведет к клонированию всего массива без последнего элемента. Для получения полного клона нужно указать, например, len(x), x[0:len(x)] = x[0:len(x)] либо x[0:]= y[0:], при этом x[-1] даст последний элемент массива, т. к. слайсы не захватывают последний указанный элемент диапазона.
Закрасьте нижнюю левую часть изображения золотым цветом.
Заполнить случайными значениями другие части рисунка, например цен- тральную часть.
Сделайте цвет рисунка в оттенках красного. Вместо констант используйте переменные.
Сделайте заливку верхней правой части рисунка градиентной.
Реализовать функции, которые это делают.
*Необходимо изменить размер исходного изображения на произвольный,
сохранив при этом исходное соотношение сторон. Пустые части изображения заполнить черным либо цветом точки, наиболее близкой к краю расширения.
Наложение на изображение шума, распределенного равномерно, и после- дующее сглаживание результата гауссовым фильтром.
import
scipy
.
ndimage
.
filters
as
filt
# создаем копию изображения image_copy1
=
image_copy
.
copy
()
# зашумляем изображение image_rand
=
image_copy
+
(
np
.
random
.
rand
(*
image_copy
.
shape
)-
0.5
)*
0.3
# нормируем зашумленное изображения в пределах от 0 до 1
image_rand
=
(
image_rand
-
image_rand
.
min
())
/
(
image_rand
.
max
()-
image_rand
.
min
())
# транспонируем, выводя измерение цветовых карт на первое место
# 3*224*224
image_rand
=
image_rand
.
transpose
((
2
,
0
,
1
))
# фильтруем гауссовым фильтром каждую карту image_filt
=
np
.
array
([
filt
.
gaussian_filter
(
image_rand
[
i
],
1
)
for
i
in
range
(
3
)])
# возвращаем исходный формат 224*224*3
image_filt
=
image_filt
.
transpose
((
1
,
2
,
0
))
image_rand
=
image_rand
.
transpose
((
1
,
2
,
0
))

35 viewer_2
.
imshow
(
image_copy
)
viewer_3
.
imshow
(
image_rand
)
viewer_4
.
imshow
(
image_filt
)
fig_
.
show
()
Можно использовать медианный фильтр. Фильтрация будет изучаться на системах цифровой обработки сигналов. Одна из простейших идей фильтров – это скользящее среднее и медианная фильтрация. Скользящее среднее предпола- гает получение среднего в некотором небольшом окне относительно точки, меди- анная – взятие центрального элемента среди упорядоченных в окне. Более слож- ные методы основаны на преобразовании Фурье, вейвлет-преобразовании и т. д. filt.median_filter(image_rand[i],7)
Можно сохранить numpy массив на диск, в том числе на Google-диск. np.save('/mntDrive/My Drive/python/img',image_filt)
Или загрузить: arr = np.load('/mntDrive/My Drive/python/img.npy')
Кроме того, можно загружать или сохранять несколько массивов.
>>> np.savez('example_2', a, b, c)
>>> np.savez('example_2', a=a, b=b, c=c)
>>>
>>> ex_2 = np.load('example_2.npz')
Оцените ошибку фильтрации, используя исходное и зашумленное (сгла- женное) изображение, обычный подход с помощью циклов и подход с примене- нием массивов numpy. Наряду с равномерным шумом попробуйте гауссов шум randn.
Сохраните и посчитайте результаты, отобразите их в виде графиков или в текстовом виде, используя форматный вывод или f-строки.
*Попробуйте написать алгоритм, который реализует подбор фильтра по одному из его параметров, минимизирующему ошибку сглаживания для данной группы картинок (например, для изображения растений). Можно ис- пользовать случайный поиск, метод дифференциальной эволюции или генети- ческий алгоритм.


36
Изменение размера изображения с помощью интерполяции.
import
scipy
.
ndimage
.
interpolation
as
interp fig_
=
plt
.
figure
(
figsize
=(
7
,
7
))
viewer_1
=
fig_
.
add_subplot
(
2
,
2
,
1
)
viewer_2
=
fig_
.
add_subplot
(
2
,
2
,
2
)
viewer_3
=
fig_
.
add_subplot
(
2
,
2
,
3
)
viewer_4
=
fig_
.
add_subplot
(
2
,
2
,
4
)
# меняем масштаб изображения image_interp
=
interp
.
zoom
(
image_copy
,(
2
,
2
,
1
))
# вращаем изображение на 45 градусов, вращаем оси 0,1
image_rot
=
interp
.
rotate
(
input
=
image_copy
,
angle
=
45
,
axes
=(
0
,
1
),
reshape
=
False
)
# с изменением исходного размера массива image_rot_r
=
interp
.
rotate
(
input
=
image_copy
,
angle
=
45
,
axes
=(
0
,
1
),
reshape
=
True
)
#
отображаем форму массива
print
(
image_interp
.
shape
)
print
(
image_rot
.
shape
)
print
(
image_rot_r
.
shape
)
viewer_1
.
imshow
(
image_copy
)
viewer_2
.
imshow
(
image_interp
)
viewer_3
.
imshow
(
image_rot
)
viewer_4
.
imshow
(
image_rot_r
)
fig_
.
show
()
Результат представлен на рисунке 1.20.

37
Рис. 1.20 – Результат работы скрипта поворота
В модуле interpolation также есть функции трансформации изображения с помощью матрицы поворота, масштабирования и сдвига. Есть возможность выбора порядка сплайновой интерполяции.
Наложите повернутую уменьшенную картинку на другую в виде водяного знака.
1.7
Возможности Python для обработки данных
В данном параграфе рассмотрены возможности доступа к сервисам, предоставляющим открытые данные; продемонстрированы способы обработки и визуализации данных на Python, некоторые возможности библиотек panda, matplotlib, seaborn; описан доступ к API сервиса data.gov.ru.

38
1.7.1
Примеры ресурсов с открытыми данными
В настоящее время проекты, связанные с публикацией различных откры- тых данных, очень популярны, есть множество ресурсов, представляющих воз- можности для поиска, публикации и анализа.
1.
Проект data.world
. Открытое сообщество data.world предназначено для тех, кто увлечен анализом данных. В коллекции доступно более 450 наборов данных практически для любых целей. Большинство из них требуют выполне- ния очистки, а очистка данных является важным этапом любого проекта по науке о данных. Наборы данных охватывают такие темы, как финансы, пре- ступность, экономика, образование, перепись населения, образование, окружа- ющую среда, энергетика, спорт, НАСА и многие другие.
2.
Проект
Kaggle
. Одна из самых крупных Data Science платформ, с боль- шим набором данных для анализа, проведения соревнований по обработке, с примерами проектов. В основном присутствуют чистые данные, в особенно- сти те, которые выложены для проведения соревнований.
3.
Проект
Socrata OpenData
. Наиболее мощная поисковая система, в кото- рой есть возможность использования SQL-запросов. Включает данные по те- мам, связанным с финансами, инфраструктурой, транспортом, окружающей средой, экономикой и общественной безопасностью. Все наборы данных кате- горизированы с помощью алгоритмов машинного обучения. Помимо этого
Discovery API
от Socrata OpenData предоставляет способ получения доступа ко всем общедоступным данным с платформы. Еще одна отличительная осо- бенность для разработчиков заключается в том, что вызовы API возвращают вложенные объекты JSON, которые легко понять и проанализировать.
4.
Открытые государственные наборы данных: data.gov, data.gov.ru,
data.gov.uk и т. д.