Remove unused files
This commit is contained in:
@@ -95,7 +95,12 @@
|
|||||||
"mcp__desktop-commander__start_search",
|
"mcp__desktop-commander__start_search",
|
||||||
"mcp__desktop-commander__get_more_search_results",
|
"mcp__desktop-commander__get_more_search_results",
|
||||||
"mcp__desktop-commander__list_searches",
|
"mcp__desktop-commander__list_searches",
|
||||||
"Bash(grep -oE \"Faulting[^<]{1,500}|APPLICATION CRASHING[^<]{1,300}|EventID[^>]*>1000[^<]*|ExceptionCode[^<]{1,100}|onnxruntime[^<]{1,300}\" \"C:\\\\Users\\\\nghia\\\\Downloads\\\\Evenlog.xml\")"
|
"Bash(grep -oE \"Faulting[^<]{1,500}|APPLICATION CRASHING[^<]{1,300}|EventID[^>]*>1000[^<]*|ExceptionCode[^<]{1,100}|onnxruntime[^<]{1,300}\" \"C:\\\\Users\\\\nghia\\\\Downloads\\\\Evenlog.xml\")",
|
||||||
|
"mcp__desktop-commander__start_process",
|
||||||
|
"Bash(grep -oE \"Faulting[^<]{1,600}|ExceptionCode[^<]{1,100}|FaultingOffset[^<]{1,60}|FaultingModule[^<]{1,200}\" \"C:\\\\Users\\\\nghia\\\\Downloads\\\\Evenlog2.xml\")",
|
||||||
|
"Bash(grep -aoE \"Faulting[^<]{1,600}\" \"C:\\\\Users\\\\nghia\\\\Downloads\\\\Evenlog2.xml\")",
|
||||||
|
"Bash(where python:*)",
|
||||||
|
"Bash(grep -aoE \"Faulting[^<]{1,700}|ExceptionCode'[^<]{1,60}|FaultingOffset'[^<]{1,60}\" 'C:/Users/nghia/Downloads/Evenlog3.xml')"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,295 +0,0 @@
|
|||||||
#ifndef ANSFIRENSMOKE_H
|
|
||||||
#define ANSFIRENSMOKE_H
|
|
||||||
#pragma once
|
|
||||||
#include "ANSEngineCommon.h"
|
|
||||||
#include <opencv2/opencv.hpp>
|
|
||||||
#include <opencv2/dnn.hpp>
|
|
||||||
#include <openvino/openvino.hpp>
|
|
||||||
#include "ANSYOLOV10OVOD.h"
|
|
||||||
#include "ANSYOLOV10RTOD.h"
|
|
||||||
|
|
||||||
namespace ANSCENTER
|
|
||||||
{
|
|
||||||
class ImageProcessor {
|
|
||||||
const int MAX_QUEUE_SIZE = 10;
|
|
||||||
const int THRESHOLD = 8;
|
|
||||||
public:
|
|
||||||
// Add image to the queue and process if queue has 10 images
|
|
||||||
std::vector<cv::Rect> addImageToQueue(const cv::Mat& image) {
|
|
||||||
width = image.cols;
|
|
||||||
height = image.rows;
|
|
||||||
|
|
||||||
// Check if queue size is already 10, if so, remove the oldest image
|
|
||||||
if (imageQueue.size() == MAX_QUEUE_SIZE) {
|
|
||||||
imageQueue.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the new image to the queue
|
|
||||||
imageQueue.push(image.clone());
|
|
||||||
|
|
||||||
// Process images if we have exactly 10 images in the queue
|
|
||||||
if (imageQueue.size() == MAX_QUEUE_SIZE) {
|
|
||||||
return processQueueImages();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return an empty vector if not yet ready to process
|
|
||||||
return std::vector<cv::Rect>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int width, height;
|
|
||||||
std::queue<cv::Mat> imageQueue;
|
|
||||||
|
|
||||||
// Sum all images in the queue, create a mask, and return array of bounding rectangles
|
|
||||||
std::vector<cv::Rect> processQueueImages() {
|
|
||||||
// Initialize the sum image with zeros
|
|
||||||
cv::Mat sumImage = cv::Mat::zeros(height, width, CV_32FC1);
|
|
||||||
|
|
||||||
// Use a temporary queue to preserve the original images
|
|
||||||
std::queue<cv::Mat> tempQueue = imageQueue;
|
|
||||||
|
|
||||||
// Sum up all images in the queue
|
|
||||||
while (!tempQueue.empty()) {
|
|
||||||
cv::Mat img = tempQueue.front();
|
|
||||||
tempQueue.pop();
|
|
||||||
|
|
||||||
// Accumulate image pixels in sumImage
|
|
||||||
sumImage += img;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Threshold the summed image to create a binary mask
|
|
||||||
cv::Mat mask;
|
|
||||||
cv::threshold(sumImage, mask, THRESHOLD, 1, cv::THRESH_BINARY);
|
|
||||||
|
|
||||||
// Convert mask to 8-bit to find contours
|
|
||||||
mask.convertTo(mask, CV_8UC1);
|
|
||||||
|
|
||||||
// Find contours on the mask
|
|
||||||
std::vector<std::vector<cv::Point>> contours;
|
|
||||||
cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
|
|
||||||
|
|
||||||
// Extract bounding rectangles for each contour
|
|
||||||
std::vector<cv::Rect> boundingRects;
|
|
||||||
for (const auto& contour : contours) {
|
|
||||||
cv::Rect boundingRect = cv::boundingRect(contour);
|
|
||||||
boundingRects.push_back(boundingRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
return boundingRects;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
class GLCM {
|
|
||||||
public:
|
|
||||||
explicit GLCM(const std::string& channel) : channel(channel) {}
|
|
||||||
|
|
||||||
std::vector<cv::Mat> getGLCM(const cv::Mat& imageChannel,
|
|
||||||
const std::vector<int>& distances = { 5 },
|
|
||||||
const std::vector<float>& angles = { 0.0f },// { 0.0f, CV_PI / 4.0f, CV_PI / 2.0f, 3.0f * CV_PI / 4.0f },
|
|
||||||
int levels = 256,
|
|
||||||
bool symmetric = false,
|
|
||||||
bool normed = false) {
|
|
||||||
cv::Mat imageChannel8;
|
|
||||||
imageChannel.convertTo(imageChannel8, CV_8U);
|
|
||||||
|
|
||||||
return graycomatrix(imageChannel8, distances, angles, levels, symmetric, normed);
|
|
||||||
}
|
|
||||||
void getStockPropFromGLCM(const std::vector<cv::Mat>& glcmMatrices, const std::string& prop) {
|
|
||||||
auto featureVector = graycoprops(glcmMatrices, prop);
|
|
||||||
for (size_t i = 0; i < featureVector.size(); ++i) {
|
|
||||||
props[prop + std::to_string(i + 1) + "_channel" + channel] = featureVector[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const std::map<std::string, double>& getProps() const {
|
|
||||||
return props;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::string channel;
|
|
||||||
std::map<std::string, double> props;
|
|
||||||
void normalizeGLCM(cv::Mat& glcm);
|
|
||||||
std::vector<cv::Mat> graycomatrix(const cv::Mat& image,
|
|
||||||
const std::vector<int>& distances,
|
|
||||||
const std::vector<float>& angles,
|
|
||||||
int levels = 256,
|
|
||||||
bool symmetric = false,
|
|
||||||
bool normed = false);
|
|
||||||
std::vector<double> graycoprops(const std::vector<cv::Mat>& glcmMatrices, const std::string& property);
|
|
||||||
};
|
|
||||||
class HaralickFeatureExtractor {
|
|
||||||
public:
|
|
||||||
HaralickFeatureExtractor() {
|
|
||||||
}
|
|
||||||
~HaralickFeatureExtractor()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
void Init(const std::string& colourSpace = "RGB",
|
|
||||||
const std::vector<std::string>& properties = { "energy","homogeneity","dissimilarity","contrast"})
|
|
||||||
{
|
|
||||||
props = properties;
|
|
||||||
for (char channel : colourSpace) {
|
|
||||||
channels.push_back(std::string(1, channel));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cv::Mat resizeWithMinAspectRatio(const cv::Mat& inputImage, int minSize) {
|
|
||||||
// Get original dimensions
|
|
||||||
int originalWidth = inputImage.cols;
|
|
||||||
int originalHeight = inputImage.rows;
|
|
||||||
if ((originalWidth > minSize) && (originalHeight > minSize))return inputImage;
|
|
||||||
// Calculate aspect ratio
|
|
||||||
float aspectRatio = static_cast<float>(originalWidth) / static_cast<float>(originalHeight);
|
|
||||||
|
|
||||||
// Calculate new dimensions based on the minimum size
|
|
||||||
int newWidth, newHeight;
|
|
||||||
if (originalWidth > originalHeight) {
|
|
||||||
newHeight = minSize;
|
|
||||||
newWidth = static_cast<int>(minSize * aspectRatio);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
newWidth = minSize;
|
|
||||||
newHeight = static_cast<int>(minSize / aspectRatio);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resize the image
|
|
||||||
cv::Mat resizedImage;
|
|
||||||
cv::resize(inputImage, resizedImage, cv::Size(newWidth, newHeight));
|
|
||||||
|
|
||||||
return resizedImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<double> createFeatureVector(const cv::Mat& inputImage) {
|
|
||||||
|
|
||||||
//0. Resize the image to a minimum size
|
|
||||||
cv::Mat frame = resizeWithMinAspectRatio(inputImage, 200);// min is 20
|
|
||||||
|
|
||||||
//1. Convert to RGB format if necessary
|
|
||||||
cv::Mat imageArray;
|
|
||||||
if (inputImage.channels() == 3) {
|
|
||||||
cv::cvtColor(frame, imageArray, cv::COLOR_BGR2RGB); // Convert BGR to RGB
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Split the image into individual channels
|
|
||||||
std::vector<cv::Mat> imageChannels(3);
|
|
||||||
cv::split(imageArray, imageChannels);
|
|
||||||
|
|
||||||
// Initialize GLCM objects for each channel
|
|
||||||
GLCM glcmChannel0("R"); // Red channel
|
|
||||||
GLCM glcmChannel1("G"); // Green channel
|
|
||||||
GLCM glcmChannel2("B"); // Blue channel
|
|
||||||
|
|
||||||
// Calculate GLCM matrices for each channel
|
|
||||||
auto glcmChannel0Matx = glcmChannel0.getGLCM(imageChannels[0]);
|
|
||||||
auto glcmChannel1Matx = glcmChannel1.getGLCM(imageChannels[1]);
|
|
||||||
auto glcmChannel2Matx = glcmChannel2.getGLCM(imageChannels[2]);
|
|
||||||
|
|
||||||
// Compute properties for each channel
|
|
||||||
for (const auto& prop : props) {
|
|
||||||
glcmChannel0.getStockPropFromGLCM(glcmChannel0Matx, prop);
|
|
||||||
glcmChannel1.getStockPropFromGLCM(glcmChannel1Matx, prop);
|
|
||||||
glcmChannel2.getStockPropFromGLCM(glcmChannel2Matx, prop);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Combine all properties into a single feature vector in the desired order
|
|
||||||
std::vector<double> featureVector;
|
|
||||||
|
|
||||||
// Iterate over channels first (R, G, B)
|
|
||||||
for (size_t channelIdx = 0; channelIdx < 3; ++channelIdx) {
|
|
||||||
const GLCM* glcmChannel = nullptr;
|
|
||||||
std::string channelName;
|
|
||||||
|
|
||||||
// Select the appropriate channel
|
|
||||||
if (channelIdx == 0) {
|
|
||||||
glcmChannel = &glcmChannel0;
|
|
||||||
channelName = "R";
|
|
||||||
}
|
|
||||||
else if (channelIdx == 1) {
|
|
||||||
glcmChannel = &glcmChannel1;
|
|
||||||
channelName = "G";
|
|
||||||
}
|
|
||||||
else if (channelIdx == 2) {
|
|
||||||
glcmChannel = &glcmChannel2;
|
|
||||||
channelName = "B";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve properties for the selected channel
|
|
||||||
const auto& propsMap = glcmChannel->getProps();
|
|
||||||
|
|
||||||
// Iterate over properties for the current channel
|
|
||||||
for (const auto& prop : props) {
|
|
||||||
std::string key = prop + "1_channel" + channelName;
|
|
||||||
if (propsMap.find(key) != propsMap.end()) {
|
|
||||||
featureVector.push_back(propsMap.at(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
frame.release();
|
|
||||||
return featureVector;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<std::string> props;
|
|
||||||
std::vector<std::string> channels;
|
|
||||||
};
|
|
||||||
class ANSENGINE_API ANSFIRENSMOKE :public ANSODBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual bool Initialize(std::string licenseKey, ModelConfig modelConfig, const std::string& modelZipFilePath, const std::string& modelZipPassword, std::string& labelMap) override;
|
|
||||||
virtual bool LoadModel(const std::string& modelZipFilePath, const std::string& modelZipPassword) override;
|
|
||||||
virtual bool LoadModelFromFolder(std::string licenseKey, ModelConfig modelConfig, std::string modelName, std::string className,const std::string& modelFolder, std::string& labelMap)override;
|
|
||||||
|
|
||||||
bool OptimizeModel(bool fp16, std::string& optimizedModelFolder);
|
|
||||||
std::vector<Object> RunInference(const cv::Mat& input);
|
|
||||||
std::vector<Object> RunInference(const cv::Mat& input, const std::string& camera_id);
|
|
||||||
bool Destroy();
|
|
||||||
~ANSFIRENSMOKE();
|
|
||||||
private:
|
|
||||||
double _hsvThreshold;
|
|
||||||
std::vector<Range> _smoke_colour;
|
|
||||||
std::vector<Range> _fire_colour;
|
|
||||||
std::string _classifierModelPath;
|
|
||||||
ANSOYOLOV10OVOD _cpuObjectDetector;
|
|
||||||
ANSYOLOV10RTOD _gpuObjectDetector;
|
|
||||||
EngineType _engineType;
|
|
||||||
ImageProcessor _smokeImageProcessor;
|
|
||||||
ImageProcessor _fireImageProcessor;
|
|
||||||
ANNHUBClassifier _annhub;
|
|
||||||
const int SMOKE_THRESHOLD_SIZE = 4;
|
|
||||||
const int HISTORY_SIZE = 30;
|
|
||||||
const int MIN_MATCHES = 9;
|
|
||||||
const float IOU_THRESHOLD = 0.4;
|
|
||||||
const int MINIMUM_STABLE_DURATION = 30;
|
|
||||||
const float MAX_MOVEMENT = 40.0;
|
|
||||||
const float ALPHA = 0.7;
|
|
||||||
cv::Rect _detectedArea;// Area where fire and smoke are detected
|
|
||||||
cv::Rect _previousDetectedArea;// Area where fire and smoke are detected
|
|
||||||
int _retainDetectedArea{ 0 };
|
|
||||||
bool _isFireNSmokeDetected{ false };
|
|
||||||
bool _classifierInitialized{ false };
|
|
||||||
HaralickFeatureExtractor _extractor;
|
|
||||||
std::vector<std::pair<Object, int>> _persistent_detections;
|
|
||||||
std::deque<std::vector<Object>> _stablization_queue;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool MajorityColourInFrame(const cv::Mat frame, Range range, float area_threshold = 0.8);
|
|
||||||
bool MajorityColourInFrame(const cv::Mat frame, std::vector<Range> ranges, float area_threshold = 0.8);
|
|
||||||
bool DetectFireNSmokeColourInFrame(const cv::Mat& frame, const cv::Rect bBox, const std::vector<Range>& ranges, float area_threshold);
|
|
||||||
cv::Mat CreateBinaryImageWithRects(int width, int height, const std::vector<cv::Rect>& rects);
|
|
||||||
cv::Point2f CalculateCentroid(const std::vector<cv::Rect>& group);
|
|
||||||
cv::Point2f CalculateGroupCenter(const std::vector<cv::Rect>& group);
|
|
||||||
std::vector<cv::Rect> CreateCoveringMaskRects(const cv::Mat& image, const std::vector<cv::Rect>& maskRects, float maxDistance);
|
|
||||||
std::vector<Object> ProcecssDetection(const std::vector<Object>& detectedObjects, const std::string& camera_id, int threshold = 8);
|
|
||||||
cv::Rect CreateMinimumSquareBoundingBox(const std::vector<Object>& detectedObjects, int minSize = 640);
|
|
||||||
bool IsOverlap(const cv::Rect& target, const std::vector<Object>& rectArray);
|
|
||||||
bool IsFireDetected(const cv::Mat image, const cv::Rect bBox);
|
|
||||||
bool IsSmokeDetected(const cv::Mat image, const cv::Rect bBox);
|
|
||||||
float calculateIOU(const cv::Rect& box_a, const cv::Rect& box_b);
|
|
||||||
std::vector<Object> StablizeDetection(const std::vector<Object>& detectedObjects, const std::string& camera_id);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user