Научно-исследовательская работа
«Практические аспекты проектирования программного
обеспечения для автоматической обработки больших массивов
данных аэросъёмки в инфракрасном спектре с целью
превентивного обнаружения очагов эндогенных пожаров»
Оглавление
Введение в актуальность проблемы ............................................................................................3
Задача ..............................................................................................................................................6
Решение ..........................................................................................................................................6
Приложение 1. Описание работы алгоритма ............................................................................10
Приложение 2. Программный код алгоритма...........................................................................16
Приложение 3. Программный код программного обеспечения с интерфейсом ...................19
Приложение 4. Презентация .......................................................................................................32
2
Введение в актуальность проблемы
Научные изыскания направлены на разработку методического и
программного решения для анализа рисков и раннего предупреждения
эндогенных пожаров на угольных предприятиях.
По статистике за последние 20 лет только на угольных предприятиях
Кузбасса произошло более 150 эндогенных пожаров [данные АО НЦ
«ВостНИИ»].
Ущерб, причиняемый эндогенными пожарами, может исчисляться
десятками миллионов рублей [так, по данным ОАО «ОУК
«Южкузбассуголь», ущерб от эндогенного пожара на разрезе
«Сибиргинский», длившегося 193 часа составил 37,9 млн. рублей]. Кроме
того, распространение эндогенного пожара является одним из наиболее
серьезных рисков для здоровья и жизни персонала угольного предприятия.
В рамках экспертных интервью с инженерно-техническими
работниками угольных предприятий определено, что высокий риск
неконтролируемого развития эндогенных пожаров присутствует на 43
предприятиях по открытой добыче каменного угля в России (угольные
разрезы 4-5 класса пожарной опасности).
Учитывая особенности применяемых технологических схем, в
условиях открытых горных экономически целесообразно создать
типизацию зон наиболее вероятного возникновения эндогенных пожаров,
т.е. вести полноценную профилактику и эффективно управлять рисками
эндогенных пожаров. Однако такая работа на угольных предприятиях не
ведется в силу отсутствия простых и объективных программно-аппаратных
решений для заблаговременного обнаружения локации очага
самовозгорания угля и действующих эндогенных пожаров, а также
отслеживания процесса в динамике и построения взвешенных
математически аргументированных прогнозов развития ситуации.
Аналогичная задача теплового мониторинга с целью раннего
обнаружения локации самонагревания и самовозгорания углей является
актуальной для мест складирования угля –штабелей угольных теплоэнергостанций, угольных терминалов грузовых морских портов: для таких
объектов действующими нормативными документами установлена
необходимость теплового контроля при длительном (более 1 мес.) хранении
угля с периодичностью от 1 раза/день до 1 раза/10 дней в зависимости от
группы углей.
В рамках действующих в РФ нормативных документов тепловой
мониторинг угольных складов должен осуществляться крайне
ресурсоемким способом: погружением инертного градусника в массив
угольного склада на глубину не менее 2,5-3 метров с помощью
специального инструментария. Критическим ограничением такого метода
является его низкая эффективность: на комплексный тепловой мониторинг
крупного угольного склада может уйти значительное количество человеко3
часов, при этом полноценную визуализацию локаций самонагревания угля
в массиве получить невозможно.
Тепловой мониторинг горных массивов на отрабатываемых
склонах угольных карьеров в настоящее время на практике не ведется
в силу отсутствия доступных и практичных решений для полноценного
теплового мониторинга значительных по площади территорий.
Т.е. в инженерной практике освоения месторождений каменного угля
отсутствует такой управленческий продукт как «температурная карта
открытых горных работ» (ИК-план карьера с привязкой к местности по
координатам GPS). Что делает процесс управления рисками самовозгорания
угольных пластов невозможным.
Бенчмаркинг зарубежной практики теплового мониторинга
значительных по площади и запасам угольных складов показывает, что
существуют решения для постоянного теплового мониторинга в режиме онлайн, реализация которых, однако, сопряжена со значительными
инвестиционными затратами.
Так, в 2016 году на угольном складе компании Nástup Mines
Cooperation в Тушимице (Чехия) была внедрена система, состоящая из
нескольких десятков тепловизоров FLIR Systems, стационарно
установленных на мачтах для постоянного и полностью автоматического
мониторинга угольных штабелей. Из-за большой площади склада
использование переносных тепловизоров не являлось практичным
решением для мониторинга 100 000 тонн угля, хранящихся на объекте
размерами
примерно
800
х
200
метров
(http://www.flir.ru/automation/display/?id=43078). Оценочная стоимость
внедрения такой системы составляет около 120 млн. рублей (без стоимости
обслуживания).
С другой стороны, крупнейшими зарубежными производителями
техники для тепломониторинга созданы программные решения для
дистанционного теплового контроля объектов с помощью беспилотного
летательного аппарата (Workswell CorePlayer, FLIR). Однако,
использование указанного программного обеспечения не может в полной
мере решить задач теплового мониторинга с целью раннего обнаружения
локаций самонагревания и самовозгорания угля на угольных складах, а
также эндогенных пожаров в горном массиве разреза, в силу следующих
функциональных причин:
Программное обеспечение носит проприетарный характер, т.е.
совместимо только с телевизионными камерами производителей
(Workswell, FLIR).
2.
Программное обеспечение индексирует области с различными
поверхностными температурами объектов (т.е. очаг самонагревания угля
можно будет обнаружить, только когда на глубине 2,5-3 метра с высокой
долей вероятности уже достигнута критическая температура нагревания.
1.
4
При этом, в соответствии с действующими в России нормами и
инструкциями, особенно тщательно следует производить замеры
температуры на глубине 2,5-3,5 м от поверхности штабеля).
3.
Программное обеспечение не позволяет прогнозировать
глубинные температуры на основании измерений поверхностных
температур, не позволяет прогнозировать динамику развития локации очага
самовозгорания или эндогенного пожара, не обеспечивает поддержку
процесса принятия управленческих решений на основании действующих
нормативных актов и инструкций.
4.
Программное обеспечение не позволяет обрабатывать большие
массивы визуальных данных (десятки тысяч аэрофотоснимков, которые
остаются после визуального обследования угольного разреза с помощью
БПЛА) в автоматическом режиме – нельзя выделить области повышенного
риска эндогенного возгорания автоматически, что влечет за собой
значительные операционные издержки.
Представленные далее результаты научно-исследовательской работы
освещают практические аспекты разработки программного решения с
отличным от продуктов-конкурентов функционалом, «заточенным» под
задачи теплового мониторинга сыпучих самовозгораемых грузов и склонов
горных карьеров:
Дистанционный тепловой мониторинг объектов на предприятиях
угольной промышленности (разработана методика, решение по
использованию беспилотного летательного аппарата с тепловизором в
качестве навесного оборудования).
2.
Работа с большими массивами данных аэрофотосъёмки –
автоматическое определение территорий повышенного риска эндогенного
возгорания по заданным критериям (температура, площадь).
3. Определение локации самонагревания и самовозгорания на
угольных складах на различных «температурных стадиях», локации
эндогенных пожаров в горных массивах разрезов на тепловой 3D-карте с
геопривязкой к местности.
4.
Прогноз
динамики
распространения
очагов
самонагревания/самовозгорания угольного склада, эндогенного пожара в
горном массиве.
1.
Функционал программного решения полезен для инженернотехнических работников предприятий по открытой добыче угля,
осуществляющих периодическую съемку горных работ с помощью
беспилотного летательного аппарата.
5
Задача
Автоматическое определение очагов аномальных температур из
собранной
базы
данных
ИК-изображений,
полученных
с
помощью
беспилотного летательного аппарата.
Решение
Для решения данной задачи был написан алгоритм ее решения и
апробирован на экспериментальной базе данных.
Написание алгоритма
автоматического определения эндогенного пожара и вероятности его
возникновения по анализу ИК-изображений осуществлялось в ПО MatLab. На
рис. 1. представлена блок–схема работы алгоритма, которая включает
первичный анализ температурного поля загруженного ИК-изображения,
определение
вероятности
возникновения
и
существования
очага
самовозгорания, расчета динамики распространения очага самовозгорания
углей в глубину.
Импорт ИК-изображений
Первичный анализ
Пожара
нет
Пожар
возможен
Полный анализ
Пожар
есть
Определение
площади и
температуры пожара
Расчет эволюции
подземного очага
самовозгорания
Определение
параметров
подземного очага
самовозгорания
Сравнение экспериментальных и
расчетных температурных полей
6
Рис. 1. Блок–схема работы алгоритма программы анализа ИК-изображений с
определением вероятности возникновения и существования очага
самовозгорания, определения параметров эндогенного пожара.
Обработка ИК-изображений с помощью данного алгоритма позволяет
точно определить очаги эндогенного пожара и места его потенциального
возникновения с расчетом их площади, координат и температурных полей.
Алгоритм включает в себя следующие стадии работы:
– формирование трехмерного массива с количеством строчек и
столбцов, соответствующих размеру изображения;
– фильтр шумов, сглаживающий полученные данные;
– визуализация необходимых данных в 3 и 2 мерных графических
изображениях;
– определение координат и амплитуды максимума, площади пожара на
полувысоте температуры.
Более детальное научное описание работы алгоритма представлено в
Приложении 1.
Программный код, разбитый на блоки, представлен в Приложении 2.
После апробации и тестирования работы программного кода был создан
пользовательский интерфейс программы и сама программа была доработана.
Интерфейс был реализован gui. Для удобства обработки фотографий
был реализован алгоритм для обработки большого массива фотографий и
сортировки этих фотографий по разным каталогам – рис. 2.
7
Рис. 2. Основной интерфейс программы.
Описание интерфейса программы:
●
Выбор папки с фотографиями - необходимо выбрать каталог со
всеми фотографиями, полученными с БПЛА в формате (jpg, png).
●
Выбор папки для пожаров - необходимо выбрать каталог, куда
будут помещены уже обработанные фотографии с найденными очагами
пожара.
●
Выберете папку для фотографий с возможным пожаром -
необходимо выбрать каталог, куда будут помещены уже обработанные
фотографии, где пожар был обнаружен только после первого анализа, то есть
температура, определенная на снимке, была выше заданного предела, а
площадь не соответствовала заданному пределу.
●
Укажите интенсивность пожара - Необходимо указать значения
от 0 - 255 которое соответствует максимальной и минимальной температуре.
●
Укажите площадь пожара - необходимо указать площадь по
превышению этого значения будем считать, что на изображении - пожар.
●
Метр квадратный на пиксель - данное значение необходимо для
корректного подсчета площади пожара.
8
●
Пуск - Запуск обработки.
●
Окно Log позволяет в реальном времени отслеживать такие
параметры:
○
Имя изображения: Untitled006555.jpg
○
Размер изображения: 704x576
○
Максимальная интенсивность: 133.0
○
Обработка по температуре: Возможен пожар
○
Обработка по площади: Нет пожара
○
Точка: 46, 491 интенсивность: 192
●
Кнопка сохранить Log - позволяет сохранить отчет о работе
программы
Программное обеспечение размещено по ссылке:
https://github.com/kemsu/FSImg.git
Программный
код
завершенного
программного
обеспечения
представлен в Приложении 3.
Презентация работающего алгоритма и готового программного
обеспечения представлена в Приложении 4.
9
Приложение 1. Описание работы алгоритма
Для решения задачи был использован оператор imread.
A=imread (имя файла ИК-изображения) формирует трехмерный массив
A с количеством строчек (b) и столбцов (c), соответствующих размеру
изображения в формате RGB (d=3) ([b,c,d]=size(A)). При этом, элементы
массива относятся к целым положительным числам от 0 до 255, автоматически
образующих соответствующий класс 'uint8'. Для дальнейшего анализа
изображения (массива) оставаться в данном классе не представляется
возможным (для него действия сложения, умножения и др. не определены),
поэтому переводим исходные данные в изменяемый формат (Za= double (A)).
С элементами массива Za возможно совершение всех математических
операций, в том числе – трехмерная визуализация. Для примера возьмем ИКизображение - рис. П1.1.
Рис. П1.1. Анализируемое ИК-изображение.
На рис. П1.2 изображена трехмерная визуализация поля температур
данного ИК-изображения, полученная с помощью оператора surfl.
10
Рис. П1.2. Поле температур ИК-изображения.
Рис. П1.3. Сечения исходного массива ИК-изображения 1-интенсивность
красного цвета, 2–зеленого и 3–синего.
На рис. П1.3 показаны сечения исходного массива по отдельным
компонентам. Первая кривая показывает интенсивность красного цвета,
вторая – зеленого и третья – синего. Как мы видим, отличия в интенсивностях
света практически несущественные и проявляются только на краях
изображения.
11
Рис. П1.2 и П1.3 показывают необходимость предварительной
фильтрации данных со сглаживанием шумов.
Рис. П1.4. Сечения исходного массива, сплошная линий интенсивность исходного красного цвета (1), пунктир – интенсивность
сглаженного сигнала (2).
Использован алгоритм «скользящего окна» с усреднением по пяти
точкам (кроме самой точки, точки, лежащие справа, слева, спереди и сзади).
Пунктирная линия рис. П1.4 показывает исправленный сигнал:
Zai=Za;
for nn=1:10
for m=1:3
Zaa(1,1,m)=Za(1,1,m);
Zaa(1,c,m)=Za(1,c,m);
Zaa(b,1,m)=Za(b,1,m);
Zaa(b,c,m)=Za(b,c,m);
end
for m=1:3
for i=2:c-1
Zaa(1,i,m)=(Za(1,i-1,m)+Za(1,i,m)+Za(1,i+1,m))/3;
Zaa(b,i,m)=(Za(b,i-1,m)+Za(b,i,m)+Za(b,i+1,m))/3;
end
12
for j=2:b-1
Zaa(j,1,m)=(Za(j-1,1,m)+Za(j,1,m)+Za(j+1,1,m))/3;
Zaa(j,c,m)=(Za(j-1,c,m)+Za(b,c,m)+Za(j+1,c,m))/3;
end
for i=2:c-1
for j=2:b-1
Zaa(j,i,m)=(Za(j-1,i,m)+Za(j,i,m)+Za(j+1,i,m)+Za(j,i-1,m)+Za(j,i+1,m))/5;
end
end
end
Za=Zaa;
end
Рис. П1.5. Сглаженное поле температур ИК-изображения.
Результаты
сглаживания
поля
температур
ИК-изображения
представлены на рис. П1.5.
Факт эндогенного пожара сопровождается появлением на ИКизображениях областей белого цвета с температурой более 100 o C. Поэтому
самым простым способом решения задачи автоматического обнаружения
пожара является определение максимальной температуры на снимке и ее
сравнение с выбираемой за репер температурой (в программе 180o C, но это
13
настраиваемый параметр, который может быть выбран как меньше, так и
больше в зависимости пытаемся мы обнаружить эндогенный пожар, или зону
нагрева, в которой может возникнуть эндогенный пожар).
Фрагмент соответствующей программы представлен ниже:
MaxT=max(Ti(1:c,1:b)); % массив становится одномерным, в котором
каждая температура является максимальной в горизонтальном сечении.
MaxT=max(MaxT) % определяется максимальная температура на ИКизображении, которое и выводится на экран монитора. Для рассматриваемого
ИК-изображения (имя файла) MaxT = 209.96.
if MaxT>180
'Пожар'
end
Так как температура превышает 180o C, выбранных нами для
определения факта наличия огня, действие программы приведет к появлению
надписи «Пожар».
Однако, эндогенному пожару на начальном предшествует стадия
самонагревания, поэтому важным параметром является площадь участка с
повышенной температурой. Данная задача решается автоматически. Для этого
алгоритм
пересчитывает
количество
пикселей
ИК-изображения
с
температурой большей заданной, а потом пересчитывает его в м2:
Фрагмент алгоритма программы представлен ниже:
dSP=X*Y/c/b % определяем площадь пикселя снимка
mPt=0; % начинаем считать количество пикселей с нулевого значения
этой величины
for i=1:c % цикл по ширине снимка
for j=1:b % цикл по высоте снимка
if Ti(i,j)>180 % при выполнении условия превышение температуры в
данной точке выбранного значения
mPt=mPt+1; % увеличиваем параметр на единицу, засчитав данный
пиксель
14
end
end
SP=dSP*mPt % пересчитываем количество пикселей в размерные
единицы
if SP>1
'Пожар' % определяем условие объявления тревоги
end
результатом выполнения программы для рассматриваемого ИКизображения является:
dSP = 6.65838 (см2) (площадь пикселя, SP = 13.59 (м2), Пожар.
Расширив представленный алгоритм для расчета нескольких сотен
площадей ИК-изображения с превышением заданной температуры, которая в
данном случае является аргументом искомой функции получаем график
зависимости площади от температуры - рис. П6.6.
Рис. П1.6. Зависимость площади ИК-изображения от температуры в этой
области.
На рис. П1.6 мы видим важную особенность поля температур с наличием
источников тепла: наличие больших градиентов температур.
15
Приложение 2. Программный код алгоритма
Блок 1.
#!/usr/bin/env python
# -*- coding: utf-8 -*#Модуль для работы к файломи
import os
def getDataFolder(path = "image"):
return os.listdir(path)
if __name__ == '__main__': # Program start from here
try:
print("Для работы с файлами")
print(getDataFolder())
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program
destroy() will be executed.
print("stop")
Блок 2.
import numpy
import matplotlib.pyplot as plt
TmT = [210, 208, 42, 39, 57, 97, 94, 197, 204]
def getFireSearch(image, N_f):
(c, b) = image.size
print("Размер изображения")
print(str(c) + ' ' + str(b))
T = numpy.zeros(image.size)
plt.imshow(image)
plt.show()
Tma = TmT[N_f]
Tmi = -10
tT = (Tma - Tmi) / 255
for j in range(0, c - 1):
16
for i in range(0, b - 1):
T[j, i] = Tmi + (image.getpixel((j, i))[0] + image.getpixel((j, i))[1] +
image.getpixel((j, i))[2]) / 3 * tT
MaxT = numpy.max(T)
print("max = " + str(MaxT))
if (MaxT > 180):
print('Пожар')
return 2
elif(MaxT > 80):
print('Внимание, в зоне наблюдения возможно возникновение
пожара')
return 1
else:
print('Угрозы возникновения пожара нет')
return 0
Блок 3.
from PIL import Image
import fireSearch as fs
import files as f
def test():
fire = 0
notFire = 0
firePossible = 0
listImage = f.getDataFolder()
for i in range(0, len(listImage)):
print("Имя изображения: "+ listImage[i])
im = Image.open('image/'+listImage[i])
searchFire = fs.getFireSearch(im, i)
if searchFire == 2:
17
fire +=1
elif (searchFire == 1):
firePossible +=1
else:
notFire +=1
print("-----------------------------------")
print("На данных изображениях найдено")
print("Изображений с пожаром: " + str(fire))
print("Изображений с возможностью возникновения пожара: " +
str(firePossible))
print("Изображений где не найдены пожары: " + str(notFire))
if __name__ == '__main__': # Program start from here
try:
test()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program
destroy() will be executed.
print("stop")
18
Приложение 3. Программный код программного обеспечения с
интерфейсом
Основной модуль: В нем прописаны функции, которые позволяют для
входящий фотографии определить есть ли пожар.
import numpy
import matplotlib.pyplot as plt
def getFireSearch(image, TmT):
fireJ = numpy.zeros(0)# масив для хранения точек с пожароси
fireI = numpy.zeros(0)
(c, b) = image.size
T = numpy.zeros(image.size)
#print(type(image.getpixel((0,0)))) #<class 'tuple'> - старые ихображения
#<class 'int'> - новые ихображения
if str(type(image.getpixel((0,0)))) == "<class 'tuple'>":
boolTypeImage = True
else:
boolTypeImage = False
#plt.imshow(image)
#plt.show()
Tma = TmT
Tmi = -10
tT = (Tma - Tmi) / 255
for j in range(0, c - 1):
for i in range(0, b - 1):
if boolTypeImage:
T[j, i] = Tmi + (image.getpixel((j, i))[0] + image.getpixel((j, i))[1] +
image.getpixel((j, i))[2]) / 3 * tT
else:
T[j, i] = Tmi + (image.getpixel((j, i)) + image.getpixel((j, i)) +
image.getpixel((j, i))) / 3 * tT
19
if T[j,i] == TmT:
fireJ = numpy.append(fireJ,j)
fireI = numpy.append(fireI,i)
MaxT = numpy.max(T)
#[0] - РАзмер изображения
#[1] - Координаты пожара
#[2] - Максимальная температура
#[3] - Преобразованная матрица
return ((c,b),(fireJ,fireI),MaxT,T)
def test():
from PIL import Image
import files as file
pachImage = 'image/' + file.getDataFolder()[0]
im = Image.open(pachImage)
res = getFireSearch(im, 200)
print(res[1][0])
print(res[2])
'''
#########################################################
X=10
Y=10
S = 0.1
#########################################################
if (MaxT > 180):
print('Обработка по температуре: Пожар')
if fireMaxT(T, c, b, X, Y, S) == 1:
return 2
else:
return 0
elif(MaxT > 80):
20
print('Обработка по температуре: Возможен пожар')
if fireMaxT(T, c, b, X, Y, S) == 1:
return 2
else:
return 1
else:
print('Обработка по температуре: нет пожара')
return 0
'''
def fireMaxT(T,c,b,X,Y,S):
dSP = X * Y / c / b
mPt = 0
for i in range(0,c-1):
for j in range(0,b-1):
if T[i,j]>180:
mPt = mPt + 1
SP = dSP * mPt
print("SP: "+str(SP))
print("mPt: "+str(mPt))
print("dSP: " + str(dSP))
if SP > S:
print("Обработка по площади: Пожар")
return 1
else:
print("Обработка по площади: Нет Пожара")
return 0
if __name__ == '__main__': # Program start from here
try:
test()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program
21
destroy() will be executed.
print("СП")
Модуль для работы с файлами:
#!/usr/bin/env python
# -*- coding: utf-8 -*#Модуль для работы к файломи
#Сортировка раскодрованного видео
from PIL import Image
import os
def getDataFolder(path = "image"):
return os.listdir(path)
def getImage(i):
pach = "D:\geo\/fotoItog/"
pachItog = "D:\geo\/fotoItog2/"
listImage = getDataFolder(pach)
image = Image.open(pach + '/' + listImage[i])
image.save(pachItog + listImage[i])
if __name__ == '__main__': # Program start from here
try:
print("Файлы")
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program
destroy() will be executed.
print("stop")
Модуль для запуска:
import sys # sys нужен для передачи argv в QApplication
import design # Это наш конвертированный файл дизайна
from PyQt5 import QtCore, QtGui, QtWidgets
import fireSearch as fire
from PIL import Image
import files as file
22
class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
pachImage = None
pachFireImage = None
pachPossibleFireImage = None
def __init__(self):
# Это здесь нужно для доступа к переменным, методам
# и т.д. в файле design.py
super().__init__()
self.setupUi(self) # Это нужно для инициализации нашего дизайна
# при нажатии кнопки
self.pushButton.clicked.connect(self.SetPachImage)
self.pushButton_2.clicked.connect(self.SetFireImage)
self.pushButton_3.clicked.connect(self.SetPossibleFireImage)
self.pushButton_4.clicked.connect(self.starting)
self.pushButton_5.clicked.connect(self.clearLog)
self.pushButton_6.clicked.connect(self.SaveLog)
def starting(self):
if (self.pachImage == None) and (self.pachFireImage == None) and
(self.pachPossibleFireImage == None):
print("Не все параметры заданны")
self.listWidget.addItem("Не все параметры заданны")
else:
listImage = file.getDataFolder(self.pachImage)
value = 0
self.progressBar.setValue(value)
self.progressBar.setMaximum(len(listImage))
for i in range(0, len(listImage)):
print("Осталось обработать: " + str(len(listImage) - i))
print("Имя изображения: " + listImage[i])
self.listWidget.addItem("Имя изображения: " + listImage[i])
23
im = Image.open(self.pachImage + '/' + listImage[i])
searchFire = fire.getFireSearch(im, self.spinBox.value())
value = value + 1
self.progressBar.setValue(value)
# [0] - РАзмер изображения
# [1] - Координаты пожара
# [2] - Максимальная температура
# [3] - Преобразованная матрица
#return ((c, b), (fireJ, fireI), MaxT, T)
self.listWidget.addItem('Размер изображения: ' +
str(searchFire[0][0])+"x"+str(searchFire[0][1]))
self.listWidget.addItem('Максимальная интенсивность: ' +
str(searchFire[2]))
if (searchFire[2] > 180):
print('Обработка по температуре: Пожар')
self.listWidget.addItem('Обработка по температуре: Пожар')
if (fire.fireMaxT(searchFire[3], searchFire[0][0], searchFire[0][1],
self.spinBox_3.value(),self.spinBox_3.value(), self.spinBox_2.value()) == 1):
print("Обработка по площади: Пожар")
self.listWidget.addItem("Обработка по площади: Пожар")
im.save(self.pachFireImage +"/" + listImage[i])
else:
print("Обработка по площади: Нет пожара")
self.listWidget.addItem("Обработка по площади: Нет пожара")
elif (searchFire[2] > 80):
print('Обработка по температуре: Возможен пожар')
self.listWidget.addItem('Обработка по температуре: Возможен
пожар')
if (fire.fireMaxT(searchFire[3], searchFire[0][0], searchFire[0][1],
self.spinBox_3.value(),self.spinBox_3.value(), self.spinBox_2.value()) == 1):
24
print("Обработка по площади: Пожар")
self.listWidget.addItem("Обработка по площади: Пожар")
im.save(self.pachFireImage + "/" + listImage[i])
else:
print("Обработка по площади: Нет пожара")
self.listWidget.addItem("Обработка по площади: Нет пожара")
im.save(self.pachPossibleFireImage + "/" + listImage[i])
else:
print('Обработка по температуре: нет пожара')
self.listWidget.addItem('Обработка по температуре: нет пожара')
j=0
for q in searchFire[1][0]:
maxIntensiv = im.getpixel((j,q))[0]
print("интенсивность")
print(maxIntensiv)
self.listWidget.addItem("Точка: " + str(int(q)) + ", " +
str(int(searchFire[1][1][j])) +" интенсивность: " + str(maxIntensiv))
j=j+1
self.listWidget.addItem('__________________________________________')
im.close()
def clearLog(self):
self.listWidget.clear()
def SaveLog(self):
name = QtWidgets.QFileDialog.getSaveFileName(self, 'Сохранить LOG')
print(name)
file = open(name[0], 'w')
for i in range(0, len(self.listWidget)):
text = self.listWidget.item(i).text()
print(text)
file.write(str(text) + "\n")
25
file.close()
def SetPachImage(self):
directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите
папку")
# открыть диалог выбора директории и установить значение переменной
# равной пути к выбранной директории
if directory: # не продолжать выполнение, если пользователь не выбрал
директорию
self.pachImage = directory
self.label_4.setText(str(len(file.getDataFolder(self.pachImage)))+" штук")
def SetFireImage(self):
directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите
папку")
# открыть диалог выбора директории и установить значение переменной
# равной пути к выбранной директории
if directory: # не продолжать выполнение, если пользователь не выбрал
директорию
self.pachFireImage = directory
def SetPossibleFireImage(self):
directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите
папку")
# открыть диалог выбора директории и установить значение переменной
# равной пути к выбранной директории
if directory: # не продолжать выполнение, если пользователь не выбрал
директорию
self.pachPossibleFireImage = directory
def main():
QtGui.QGuiApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication
window = ExampleApp() # Создаём объект класса ExampleApp
26
window.show() # Показываем окно
app.exec_() # и запускаем приложение
if __name__ == '__main__': # Если мы запускаем файл напрямую, а не
импортируем
main() # то запускаем функцию main()
Модуль пользовательского интерфейса:
# -*- coding: utf-8 -*# Form implementation generated from reading ui file
'C:\Users\User2\Documents\DimaProject\FSImg\Disain\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(582, 317)
MainWindow.setMinimumSize(QtCore.QSize(300, 266))
MainWindow.setMaximumSize(QtCore.QSize(582, 317))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(220, 13, 62, 19))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(8, 13, 161, 16))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(8, 43, 171, 16))
27
self.label_2.setObjectName("label_2")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(220, 73, 62, 19))
self.pushButton_2.setObjectName("pushButton_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(7, 73, 161, 16))
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(220, 43, 71, 16))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(7, 103, 181, 16))
self.label_5.setObjectName("label_5")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(220, 103, 62, 19))
self.pushButton_3.setObjectName("pushButton_3")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect(7, 133, 281, 131))
self.groupBox.setObjectName("groupBox")
self.label_6 = QtWidgets.QLabel(self.groupBox)
self.label_6.setGeometry(QtCore.QRect(10, 16, 141, 16))
self.label_6.setObjectName("label_6")
self.label_7 = QtWidgets.QLabel(self.groupBox)
self.label_7.setGeometry(QtCore.QRect(10, 46, 141, 16))
self.label_7.setObjectName("label_7")
self.pushButton_4 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_4.setGeometry(QtCore.QRect(10, 100, 62, 19))
self.pushButton_4.setObjectName("pushButton_4")
self.spinBox = QtWidgets.QSpinBox(self.groupBox)
self.spinBox.setGeometry(QtCore.QRect(214, 12, 61, 22))
28
self.spinBox.setMaximum(255)
self.spinBox.setProperty("value", 150)
self.spinBox.setObjectName("spinBox")
self.label_8 = QtWidgets.QLabel(self.groupBox)
self.label_8.setGeometry(QtCore.QRect(10, 72, 141, 16))
self.label_8.setObjectName("label_8")
self.spinBox_3 = QtWidgets.QSpinBox(self.groupBox)
self.spinBox_3.setGeometry(QtCore.QRect(215, 67, 60, 22))
self.spinBox_3.setMaximum(255)
self.spinBox_3.setProperty("value", 20)
self.spinBox_3.setObjectName("spinBox_3")
self.pushButton_5 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_5.setGeometry(QtCore.QRect(190, 100, 81, 19))
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_6.setGeometry(QtCore.QRect(90, 100, 81, 19))
self.pushButton_6.setObjectName("pushButton_6")
self.spinBox_2 = QtWidgets.QDoubleSpinBox(self.groupBox)
self.spinBox_2.setGeometry(QtCore.QRect(214, 39, 62, 22))
self.spinBox_2.setSingleStep(0.01)
self.spinBox_2.setProperty("value", 1.0)
self.spinBox_2.setObjectName("spinBox_2")
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(7, 270, 571, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_2.setGeometry(QtCore.QRect(290, 13, 281, 251))
self.groupBox_2.setObjectName("groupBox_2")
self.listWidget = QtWidgets.QListWidget(self.groupBox_2)
29
self.listWidget.setGeometry(QtCore.QRect(9, 15, 261, 231))
self.listWidget.setObjectName("listWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Поиск
пожаров"))
self.pushButton.setText(_translate("MainWindow", "Выбор"))
self.label.setText(_translate("MainWindow", "Выберете папку с
фотографиями"))
self.label_2.setText(_translate("MainWindow", "Количество фотографий
для обработки"))
self.pushButton_2.setText(_translate("MainWindow", "Выбор"))
self.label_3.setText(_translate("MainWindow", "Выберете вапку для
пожаров"))
self.label_4.setText(_translate("MainWindow", "Выберете папку"))
self.label_5.setText(_translate("MainWindow", "Выберете папку для
возможных пожаров"))
self.pushButton_3.setText(_translate("MainWindow", "Выбор"))
self.groupBox.setTitle(_translate("MainWindow", "Параметры"))
self.label_6.setText(_translate("MainWindow", "Укажите интенсивность
пожара"))
self.label_7.setText(_translate("MainWindow", "Укажите площадь
пожара"))
self.pushButton_4.setText(_translate("MainWindow", "Пуск"))
30
self.label_8.setText(_translate("MainWindow", "Метр квардратный на
пиксель"))
self.pushButton_5.setText(_translate("MainWindow", "Отчистить LOG"))
self.pushButton_6.setText(_translate("MainWindow", "Сохранить LOG"))
self.groupBox_2.setTitle(_translate("MainWindow", "Log"))
31
Приложение 4. Презентация
32
Разработка
Технико-экономическое
обоснование
Создание управленческой
системы предиктивного
термического анализа
и 3D-картирования на основе
ИК-изображений, получаемых
с помощью беспилотного
летательного аппарата
Рада Артём
Директор центра
компьютерного
инжиниринга
технико-экономического обоснования
Составление прототипа
ГИС- системы для работы
со спутниковыми снимками
в ИК-диапазоне
Проведение
(автоматического)
анализа изображений
в ИК-диапазоне
Проведение площадной
съемки на территории
промышленной площадки
в ИК-диапазоне
Разработка «Методики
дистанционного теплового
мониторинга открытой
добычи угля с использованием
беспилотного летательного аппарата
и специализированного навесного
оборудования (тепловизора)»
Проверка полученных результатов
с учетом имеющейся информации
о координатах очагов эндогенных
пожаров на промышленной площадке
с использованием альтернативного
оборудования и полезной нагрузки
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Систематизирована
для фотограмметрического ПО
Gb
на территории промышленной
площадки в ИК-диапазоне
фотоснимков,
Геоданные фотоснимков
и ИК-изображений
Mb
Gb
ИК-изображений,
Gb
Систематизирована
для фотограмметрического ПО
1 Pix = 3,6 см
Координаты:
55,639153 с.ш.
86,167870 в.д.
409,4 м
Температура
> 30⁰С
на территории промышленной
площадки в ИК-диапазоне
Широта: 55°37’46,678299”
Долгота: 86°10’02,383842”
Высота: 249,7 м
Max t = +150,2 °С
Min t = +14,9 °C
Average t = +38°C
Предел изотермы =
+45 °С красный
Изотерма от 0 °С до 60 °С
на территории промышленной
площадки в ИК-диапазоне
Широта: 55°37’43,206001”
Долгота: 86°10’01,029399”
Высота: 249,3 м
Max t = +150,2 °С
Min t = +4,7°C
Average t = +24,2°C
Предел изотермы =
+45 °С зелёный
Изотерма от 0 °С до 60 °С
на территории промышленной
площадки в ИК-диапазоне
Широта: 55°37’45,608799”
Долгота: 86°10’14,869699”
Высота: 249,6 м
Max t = +150,2 °С
Min t = +21,9 °C
Average t = 48,1°C
Изотерма
от 0 °С до 100 °С
Проведение
(автоматического)
анализа изображений
в ИК-диапазоне
Проведение (автоматического)
анализа изображений в ИК-диапазоне
1
Проведение (автоматического)
анализа изображений в ИК-диапазоне
2
3-х мерное представление
температурного поля
Проведение (автоматического)
анализа изображений в ИК-диапазоне
2
3-х мерное представление
температурного поля
Проведение (автоматического)
анализа изображений в ИК-диапазоне
3
Зависимость температуры от координаты Х
при фиксированном значении координаты Y (1000 м)
Проведение (автоматического)
анализа изображений в ИК-диапазоне
4
Определение наличия пожара
на ИК – изображение в автоматическом режиме
Проведение (автоматического)
анализа изображений в ИК-диапазоне
4
Результирующая по выборке запись на экране компьютера
о номерах рисунков на которых отсутствует пожар,
вероятно возникновение очага самовозгорания, и пожар существует
Проведение (автоматического)
анализа изображений в ИК-диапазоне
5
Площадь ИК-изображения, на которой
температура больше фиксированной (по оси X)
Проверка полученных результатов с учетом имеющейся
информации о координатах очагов эндогенных пожаров
на промышленной площадке с использованием
альтернативного оборудования и полезной нагрузки
Проверка полученных результатов с учетом имеющейся
информации о координатах очагов эндогенных пожаров
на промышленной площадке с использованием
альтернативного оборудования и полезной нагрузки
Проверка полученных результатов с учетом имеющейся
информации о координатах очагов эндогенных пожаров
на промышленной площадке с использованием
альтернативного оборудования и полезной нагрузки
Проверка полученных результатов с учетом имеющейся
информации о координатах очагов эндогенных пожаров
на промышленной площадке с использованием
альтернативного оборудования и полезной нагрузки
Проверка полученных результатов с учетом имеющейся
информации о координатах очагов эндогенных пожаров
на промышленной площадке с использованием
альтернативного оборудования и полезной нагрузки
Красный
цвет t ≥ 30⁰С
при t воздуха
+2⁰С
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
Разработка «Методики дистанционного теплового
мониторинга открытой добычи угля с использованием
беспилотного летательного аппарата и специализированного навесного оборудования (тепловизора)»
технико-экономического обоснования ПОЗВОЛЯЮТ:
Осуществлять внедрение методики для использования
при планировании и ведении открытых горных работ на действующих
предприятиях угольной промышленности России (с перспективного
масштабирования на торфяную, цементную промышленность,
угольную генерацию, угольные терминалы морских портов)
На основе созданных алгоритмов приступить к разработке программного
обеспечения (с полноценным пользовательским интерфейсом)
для автоматической сортировки визуальных данных в ИК-диапазоне,
их анализу и, как следствие, управлению рисками самонагревания
и самовозгорания угля при ведении открытых горных работ,
а также при его хранении в местах перевалки и использования
Отзывы:
Авторизуйтесь, чтобы оставить отзыв