Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

семестр 2 / лабы / lab4_prot

.py
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
4.77 Кб
Скачать
import os
import skimage
import numpy
import matplotlib.pyplot as plt
import threading
import time

#Создание класса-наследника класса Thread с возвращением элементов
class ThreadRV(threading.Thread):

	def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, Verbose=None):
		threading.Thread.__init__(self, group, target, name, args, kwargs)
		self._return = None

	def run(self):
		if self._target is not None:
			self._return = self._target(*self._args, ** self._kwargs)

	def result(self):
		return self._return

#Функция вызова потоков
def thrd_call(trg, argnt1, argnt2, a):
	thread1 = ThreadRV(target=trg, args =argnt1)
	thread2 = ThreadRV(target=trg, args =argnt2)
	thread1.start()
	thread2.start()
	if a == False:
		thread2.join()
		thread1.join()
	elif a == True:
		thread1.join()
		thread2.join()
		return (thread1.result(), thread2.result())

#Функция считывания названий файлов
def f_name(s):
	lt = os.listdir(s)
	return lt

#Функция создания списков изображений
def img_read(ls, path):
	array = []
	for i in ls:
		array.append(numpy.array(skimage.io.imread(f'{path}/{i}')))
	return array

#Функция «спрямления» изображений
def img_flatten(ls):
	for i in ls:
		i.shape = (len(i)*len(i[0])*3)
		i = i.T

#Функция пересоздания массива
def arr_rec(index_array, orig_array):
	copy_array = numpy.copy(orig_array)
	for i in range(0, len(index_array)):
		copy_array[i] = orig_array[index_array[i]]
	orig_array = numpy.copy(copy_array)
	return orig_array

#Функция извлечения части из массива
def arr_cut(array, left_border, right_border):
	array_cut = array[left_border:right_border]
	return array_cut

#Функция вывода изображения на экран
def img_out(number, img, val):
	plt.figure(number)
	plt.imshow(numpy.reshape(img, (64,64,3)))
	if val == 0:
		print(f'This is image without trees')
	elif val == 1:
		print(f'This is image with trees')

#Очистка окна консоли
os.system('cls')

#Запуск таймера
t1 = time.perf_counter_ns()

#1. Создание списков названий файлов в папках
trees_list, no_trees_list = thrd_call(f_name,
	("Trees",), ("NoTrees",), True)

#2. Создание списков изображений в папке
trees_img_list, no_trees_img_list = thrd_call(img_read,
	(trees_list, "Trees"), (no_trees_list, "NoTrees"), True)

	##Вывод необходимого изображения
plt.figure(1)
plt.imshow(no_trees_img_list[6])

#3. Создание массива параметров для машинного обучения
	##3а. «Спрямление» массивов изображений
thrd_call(img_flatten, (trees_img_list,),
	(no_trees_img_list,), False)
	##3б. Объединение массивов в массив параметров
X = numpy.vstack((numpy.array(trees_img_list[0:len(trees_img_list)+1]),
	numpy.array(no_trees_img_list[0:len(no_trees_img_list)+1])))

#4. Создание массива результатов
Y = numpy.hstack((numpy.ones(len(X)//2),
	numpy.zeros(len(X)//2))).T

#5. Перемешивание строк массивов результатов и параметров
index = numpy.linspace(0, len(X)-1, len(X), dtype=numpy.int16)
index = numpy.random.permutation(index)
X, Y = thrd_call(arr_rec, (index, X), (index, Y), True)

#6 Разделение на части
	##Выделение данных на обучение
X_learn, Y_learn = thrd_call(arr_cut, (X,0,6400), (Y,0,6400), True)
	##Выделение данных на кроссвалидацию
X_cross, Y_cross = thrd_call(arr_cut, (X,6400,8400), (Y,6400,8400), True)
	##Выделение данных на тестирование
X_test, Y_test = thrd_call(arr_cut, (X,8400,10400), (Y,8400,10400), True)

#7 Вывод необходимых изображений на экран
	##Вывод первого изображения из набора для обучения
img_out(2, X_learn[0], Y_learn[0])
	##Вывод первого изображения из набора для кроссвалидации
img_out(3, X_cross[0], Y_cross[0])
	##Вывод первого изображения из набора для тестов
img_out(4, X_test[0], Y_test[0])

#Вывод времени выполнения программы
print(f'Total program execution time: {(time.perf_counter_ns()-t1)/10**9} seconds')

plt.show()
Соседние файлы в папке лабы