04 lysenkov
DESCRIPTION
Presentation by Ilya Lysenkov at Fire workshop at Kazan State University, 27 May, 2011TRANSCRIPT
Распознавание сгоревших
территорий по космическим
снимкам с помощью
OpenCV
Илья Лысенков
Инженер по ПО, ЦКЗ Аргус
Казань, май 2011 г.
Площади сгоревших
территорий
0
1
2
3
4
5
6
РФ, 2010 г.
Данные различных организаций (млн га)
МЧС Рослесхоз ИЛ СО РАН ИКИ РАН Гринпис
http://gis-lab.info/qa/fires-greenpeace.html
OpenCV
OpenCV – это:
• быстрая
• бесплатная
• кроссплатформенная
• многофункциональная
библиотека компьютерного зрения
http://opencv.willowgarage.com
OpenCV Overview:
General Image Processing Functions
Machine
Learning: • Detection,
• Recognition
Segmentation
Tracking
Matrix Math
Utilities and
Data Structures
Fitting
Image Pyramids
Camera
calibration,
Stereo, 3D
Transforms
Features
Geometric
descriptors
Robot support
opencv.willowgarage.com > 500 algorithms
5 Gary Bradski
Other Languages
OpenCV Conceptual Structure
Python
Java (TBD)
Machine learning
HighGUI
SSE TBB GPU MPU
Modules
CORE
imgproc
Object Detection
Features2d Calib3d Stereo
VO SLAM (TBD)
Stitching (TBD)
User Contrib
Operating system
C
C++
CLASSIFICATION / REGRESSION
(new) Fast Approximate NN (FLANN)
(new) Extremely Random Trees
CART
Naïve Bayes
MLP (Back propagation)
Statistical Boosting, 4 flavors
Random Forests
SVM
Face Detector
(Histogram matching)
(Correlation)
CLUSTERING
K-Means
EM
(Mahalanobis distance)
TUNING/VALIDATION
Cross validation
Bootstrapping
Variable importance
Sampling methods
Machine Learning Library (MLL)
AACBAABBCBCC
AAA
AACACB CBABBC
CCB
B CC
ABBC CB
B C A BBC
C BB
11 11 http://opencv.willowgarage.com
Распознавание сгоревших
территорий 1. Импорт данных MODIS
2. Обучение классификатора
3. Классификация пикселей
4. Пост-обработка
5. Валидация
6. Визуализация
7. Результаты
Импорт данных: MOD09A1
vector<Mat> allBands;
allBands.push_back(modisBand);
...
Mat data;
//объединяем все каналы в одну матрицу data
merge(allBands, data);
Импорт данных: MCD45A1
Mat date = imread(burnDateFilename,
CV_LOAD_IMAGE_UNCHANGED);
Mat unburned = (date == 0);
ushort initialDay = 153; //2 июня
ushort finalDay = 248; //5 сентября
Mat burned = (date >= initialDay) & (date <= finalDay);
Тренировка классификатора
Mat trainData = data.reshape(1, data.total());
Mat responses = burned.reshape(1, burned.total());
CvRTrees classifier;
classifier.train(trainData, CV_ROW_SAMPLE,
responses);
Классификация пикселей
int rowsCount = testData.rows;
Mat prediction = Mat(rowsCount, 1, CV_32SC1);
for(int i = 0; i < rowsCount; i++)
{
Mat sample = testData.row(i);
prediction.at<int>(i, 0) = classifier.predict(sample);
}
Пост-обработка
dilate(burnedArea, burnedArea, Mat(), Point(-1, -1), 5);
erode(burnedArea, burnedArea, Mat(), Point(-1, -1), 7);
dilate(burnedArea, burnedArea, Mat(), Point(-1, -1), 3);
Валидация
Mat confusionMatrix(2, 2, CV_32SC1);
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
confusionMatrix.at<int>(i, j) =
countNonZero((groundTruth == i) & (prediction == j));
}
}
Визуализация
vector<vector<Point>> contours;
findContours(burnedArea, contours, CV_RETR_LIST,
CV_CHAIN_APPROX_NONE);
drawContours(trueColorImage, contours, -1, Scalar(0, 0, 255), 2);
namedWindow("burned area contours", CV_WINDOW_NORMAL);
imshow("burned area contours", trueColorImage);
waitKey();
Валидация
Матрица ошибок
Предсказанный класс территории
Несгоревшая Сгоревшая
Реальный класс
территории
Несгоревшая 120367 6443
Сгоревшая 172 3260
Время работы
Обучение:
0.85 секунды (54 000 пикселей)*
Классификация:
0.13 секунды (130 000 пикселей)*
*Intel Core i7 960 @ 3.20GHz с использованием одного потока
Заключение
Используя OpenCV, мы легко получили простой и быстрый алгоритм для
распознавания сгоревших территорий.
Ссылки и контакты
http://gis-lab.info/qa/burnedarea-opencv.html
http://itseez.com
http://opencv.willowgarage.com/