Практическая работа
по теме «Техническое зрение и нейронные сети»
Цель: познакомиться с
библиотеками OpenCV и TensorFlow языка
программирования python, научиться с помощью них
обрабатывать изображения и выполнять простейшие задачи классификации
Задание № 1. Установка библиотеки OpenCV в проект программы PyCharm
1.
Запустите программу PyCharm и создайте
новый проект с виртуальной средой (в группе Python Interpreter выбрать New environment using). В папке проекта
будет папка venv, в которой находится виртуальный
интерпретатор Python такой же версии, что и системный
интепретатор, но с отдельными библиотеками.
Дождитесь
автоматической настройки виртуальной среды проекта
2.
Закройте созданный файл main.py (если появился) и создайте
свой в корневом каталоге в инспекторе файлов проекта.
3.
Установите необходимую библиотеку. Для этого нужно
открыть настройки File -> Settings и в появившемся окне найти Python Interpreter,
где выбрать виртуальный интерпретатор проекта.
4.
Добавьте к существующим библиотекам OpenCV. Нажмите
на + и найдите opencv-python в списке, затем выберите её и нажмите на Install Package.
После этого можно закрыть диалоговые окна
5.
Напишите тестовый вывод версии библиотеки. В коде импортируйте
в программу установленную библиотеку и выведите на экран её версию. Запустите
программу
import cv2
print(cv2.__version__)
|
ЗАДАНИЕ 2. ОСНОВЫ OPENCV. ВЫВОД ИЗОБРАЖЕНИЯ НА ЭКРАН
1.
Скачайте любое изображение и перенесите его в
локальное расположение проекта. Локальное расположение файлов проекта можно
узнать в строке инспектора файлов. Также можно открыть проводник по этим
файлам, вызвав контекстное меню и выбрав в нём пункт Open In
2.
Напишите программу по образцу, исключая строки с
комментариями:
# импортирование библиотеки opencv
import cv2
# чтение изображения из файла в переменную img
img = cv2.imread('man.jpg')
# Создание окна с именем Image и вывод в него изображения из переменной img
cv2.imshow("Image", img)
# print(img.shape)
# ожидание нажатия любой клавиши для продолжения работы программы
cv2.waitKey(0)
# удаление всех окон
cv2.destroyAllWindows()
|
3.
Запустите созданную программу средствами PyCharm.
Проанализируйте принцип работы алгоритма.
4.
Добавьте в программу строчку вывода разрешения
изображения в терминал
print(img.shape)
Определите, что в выводимом
кортеже является высотой и шириной изображения. Почему глубина изображения
равна трём?
Дополнительно. Напишите программу, которая открывает и выводит по
очереди несколько изображений
Задание 3. Основы OpenCV. Обрезка изображения
1.
Создайте новую программу по образцу без указания
комментариев
import cv2
img = cv2.imread('man.jpg')
print(img.shape)
# срез матрицы изображения по высоте и запись в переменную cut_img_1
cut_img_1 = img[0:200, :]
# срез матрицы изображения по ширине и запись в переменную cut_img_2
cut_img_2 = img[:, 200:499]
# срез матрицы изображения по двум координатам и запись в переменную cut_img_3
cut_img_3 = img[300:499, 100:250]
cv2.imshow("Image-1", cut_img_1)
cv2.imshow("Image-2", cut_img_2)
cv2.imshow("Image-3", cut_img_3)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
2.
Запустите программу и проанализируйте принцип работы
алгоритма
3.
3. Напишите свою программу, которая обрезает
выбранный вами принт из предлагаемого набора в файле prints.png
Подсказка. Программа, которая обрезает свечу в
наборе, выглядит следующим образом:
import cv2
img = cv2.imread('prints.png')
cut_img = img[150:300, 20:140]
cv2.imshow("Cut Image", cut_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
Дополнительно.
Напишите программу, которая с помощью цикла обрезает и выводит каждый принт из
набора
ЗАДАНИЕ 4. ОСНОВЫ OPENCV. НАЛОЖЕНИЕ ИЗОБРАЖЕНИЯ
1.
Создайте новую программу по образцу
import cv2
print_img = cv2.imread('prints.png')
cut_img = print_img[150:300, 20:140]
man_img = cv2.imread('man.jpg')
man_img[150:300, 200:320] = cut_img
cv2.imshow("Image", man_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
2.
Запустите программу и проанализируйте принцип
работы алгоритма
3.
Напишите свою программу для вставки выбранного вами
принта из предыдущего задания в новое изображение (например, )
4.
Измените размер изображения принта с помощью
функции
cv2.resize(изображение, (новая ширина, новая
высота))
Пример:
import cv2
print_img = cv2.imread('prints.png')
cut_img = print_img[150:300, 20:140]
cut_img = cv2.resize(cut_img, (160, 200))
man_img = cv2.imread('man.jpg')
man_img[130:330, 180:340] = cut_img
cv2.imshow("Image", man_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
Дополнительно.
Напишите
программу, которая вставляет на футболку несколько принтов (на ваш выбор)
ЗАДАНИЕ 5. ВЫВОД ВИДЕОПОТОКА С WEB-КАМЕРЫ
1.
Напишите программу по следующему примеру:
# импортирование библиотеки OpenCV
import cv2
# инициализация камеры, подключённой компьютеру
cap = cv2.VideoCapture(0)
# бесконечный цикл вывода видеопотока на экран
while True:
# получение флага успешности чтения кадра и самого кадра с камеры
success, frame = cap.read()
# если кадр получен, то выводим его на экран, иначе пишем сообщение об ошибке и выходим из цикла
if success:
cv2.imshow("Result", frame)
# если нажата клавиша "пробел", то завершаем работу программы
if cv2.waitKey(1) & 0xFF == ord(' '):
break
else:
print("Error!")
break
# закрываем все созданные окна
cv2.destroyAllWindows()
# освобождаем камеру
cap.release()
2.
Запустите программу и проанализируйте принцип
работы алгоритма
3.
С помощью метода shape, изученного на
прошлом уроке, выведите в консоль размер кадров
4.
С помощью инструментов для работы с многомерными
массивами (срезы списков) сделайте кадры квадратными, обрезав их по левому и
правому краю
5.
С помощью функции cv2.resize(изображение, (новая
ширина, новая высота)) сделайте изображение размером 224x224 пикселя
ЗАДАНИЕ 6. СОЗДАНИЕ СТОП-КАДРА
1.
Напишите программу по следующему примеру:
# импортирование библиотеки OpenCV
import cv2
# импортирование библиотеки для работы с датой и временем datetime
import datetime
# инициализация камеры, подключённой компьютеру
cap = cv2.VideoCapture(0)
# бесконечный цикл вывода кадров на экран
while True:
# получение флага успешности чтения кадра и самого кадра с камеры
success, frame = cap.read()
# получение текущей даты и времени
now = datetime.datetime.now()
if success:
# наложение на кадр текста - текущего времени в формате ЧАСЫ:МИНУТЫ:СЕКУНДЫ
# определённого шрифта, размера, цвета и жирности
cv2.putText(frame, now.strftime("%H:%M:%S"), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# вывод кадра на экран
cv2.imshow("Result", frame)
if cv2.waitKey(1) & 0xFF == ord(' '):
# запись текущего кадра в графический файл с именем в формате frame_чч_мм_сс.jpg
cv2.imwrite("frame_" + now.strftime("%H_%M_%S") + ".jpg", frame)
break
else:
print("Error!")
break
# закрытие окон и освобождение камеры
cv2.destroyAllWindows()
cap.release()
2.
Запустите программу и проанализируйте принцип
работы алгоритма
3.
Исправьте программу, чтобы изображение сохранялось
без метки времени (подсказка: нужно создать копию кадра для вывода на экран (с
помощью функции copy), на которую будет накладываться метка времени, а в
функцию imwrite необходимо подставлять оригинальный кадр)
4.
Примените зеркальное отражение к стоп-кадру с
помощью функции cv2.flip(). Данный метод принимает два параметра – исходное
изображение и ось для отражения. В качестве осей может быть следующие числа: 0
– по вертикали, 1 – по горизонтали, (-1) – по вертикали и по горизонтали.
Например, отображение по горизонтали делается так:
image = cv2.flip(image,1)
ЗАДАНИЕ 7. РАСПОЗНАВАНИЕ
ИЗОБРАЖЕНИЙ С ПОМОЩЬЮ НЕЙРОННОЙ СЕТИ
1.
Зайдите на сайт https://teachablemachine.withgoogle.com/
и выберите создание стандартной модели классификатора изображений
2.
Обучите модель на распознавание 3 предметов и фона
3.
Сделайте экспорт полученной модели нейронной сети,
сохранив файл keras_model.h5 в папке своего проекта
4.
Напишите программу для распознавания изображения и проанализируйте
принцип работы алгоритма. В качестве изображений используйте стоп-кадры,
сделанные с помощью предыдущей программы. Не забудьте заменить имена меток
(названия классов изображений):
import cv2
import numpy as np
# импортирование инструментов работы с моделью нейронной сети
from tensorflow.keras.models import load_model
# загрузка модели нейронной сети из файла keras_model.h5
model = load_model('keras_model.h5')
# создание массива имён меток (должны быть в том же порядке, что и при тренировке нейронной сети)
labels = ['label 1', 'label 2', 'label 3', 'nothing']
# чтение файла изображения в переменную img
img = cv2.imread('frame_20_30_41.jpg')
# изменение размера изображения на 224x224 - размер входного слоя загруженной нейронной сети
img = cv2.resize(img, (224, 224))
# нормализация матрицы изображения - все значения пикселей приводятся к диапазону [0, 1]
img = img.astype("float32") / 255.0
# приведение массива изображения к нужной форме для подачи в нейронную сеть –
# вытягивание матрицы в вектор)
img = np.expand_dims(img, axis=0)
# получение прогноза нейронной сети при распознавании текущего изображения
prediction = model.predict(img)
# вывод прогноза в необработанном виде - значения выходного слоя нейронной сети
print(prediction)
# вывод вероятностей соотнесения с каждым классом изображения
for i in range(len(labels)):
probability = str(round(prediction[0][i], 2)) + '%'
print(labels[i], probability, sep=' - ')
Дополнительно: в последнем цикле сделайте
вывод классов в порядке убывания их вероятностей
ЗАДАНИЕ 8.
РАСПОЗНАВАНИЕ ОБЪЕКТОВ НА ВИДЕОПОТОКЕ
1.
Напишите программу и проанализируйте принцип работы
алгоритма. Добавьте комментарии к написанному коду.
import cv2
from tensorflow.keras.models import load_model
import numpy as np
model = load_model('keras_model.h5')
labels = ['label 1', 'label 2', 'label 3', 'nothing']
cap = cv2.VideoCapture(0)
while True:
success, imageOrig = cap.read()
if success:
image = cv2.resize(imageOrig, (224, 224))
image = image.astype("float32") / 255.0
image = np.expand_dims(image, axis=0)
prediction = model.predict(image)
name = labels[prediction.argmax(axis=1)[0]]
cv2.putText(imageOrig, name, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow("Result image", imageOrig)
if cv2.waitKey(1) & 0xFF == ord(' '):
break
else:
print("Error!")
break
cv2.destroyAllWindows()
cap.release()
2.
Добавьте к тексту на кадрах, помимо названия
класса, процент его прогноза
Дополнительно: добавьте вывод на кадрах имена
всех классов с их прогнозом в порядке убывания
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.