目标检测工作原理:从滑动窗口到Haar特征检测的完整实现
目标检测探索指南 🔍
目标检测就像是一位细心的侦探!我们需要在图像中寻找并定位特定的目标,就像侦探在现场搜寻线索一样。让我们一起来探索这个充满挑战的图像处理领域吧!
目录
- 1. 什么是目标检测?
- 2. 滑动窗口检测
- 3. HOG+SVM检测
- 4. Haar+AdaBoost检测
- 5. 非极大值抑制
- 6. 目标跟踪
- 7. 代码实现与优化
- 8. 应用场景与实践
1. 什么是目标检测?
想象一下,你是一位图像侦探,正在搜寻图像中的"线索"。目标检测就是这样的过程,它可以帮助我们:
- 🔍 定位目标位置(找到"线索"的位置)
- 📏 确定目标大小(测量"线索"的范围)
- 🎯 识别目标类别(判断"线索"的类型)
- 🔄 跟踪目标运动(追踪"线索"的变化)
2. 滑动窗口检测
2.1 基本原理
滑动窗口就像是侦探用放大镜一格一格地检查现场!通过在图像上滑动不同大小的窗口来寻找目标。
关键步骤:
- 多尺度金字塔
- 窗口滑动
- 特征提取
- 分类判断
2.2 实现示例
// 滑动窗口检测实现
vector<DetectionResult> sliding_window_detect(const Mat& src,const Size& window_size,int stride,float threshold) {vector<DetectionResult> results;HOGExtractor hog(window_size);// 加载预训练的SVM模型Ptr<ml::SVM> svm = ml::SVM::load("pedestrian_svm.xml");#pragma omp parallel forfor (int y = 0; y <= src.rows - window_size.height; y += stride) {for (int x = 0; x <= src.cols - window_size.width; x += stride) {// 提取窗口Mat window = src(Rect(x, y, window_size.width, window_size.height));// 计算HOG特征vector<float> features = hog.compute(window);// SVM预测Mat feature_mat(1, static_cast<int>(features.size()), CV_32F);memcpy(feature_mat.data, features.data(), features.size() * sizeof(float));float score = svm->predict(feature_mat, noArray(), ml::StatModel::RAW_OUTPUT);if (score > threshold) {DetectionResult det;det.bbox = Rect(x, y, window_size.width, window_size.height);det.confidence = score;det.class_id = 1; // 行人类别det.label = "pedestrian";#pragma omp criticalresults.push_back(det);}}}return results;
}
def sliding_window_detection(img_path, window_size=(64, 64), stride=32):"""滑动窗口检测实现参数:img_path: 输入图像路径window_size: 窗口大小,默认(64, 64)stride: 步长,默认32返回:检测结果可视化"""# 读取图像img = cv2.imread(img_path)if img is None:raise ValueError(f"无法读取图像: {img_path}")# 复制原图用于绘制结果result = img.copy()# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 定义简单的目标检测函数(这里使用边缘检测作为示例)def detect_object(window):edges = cv2.Canny(window, 100, 200)return np.sum(edges) > 1000 # 简单的阈值判断# 滑动窗口检测for y in range(0, img.shape[0] - window_size[1], stride):for x in range(0, img.shape[1] - window_size[0], stride):# 提取窗口window = gray[y:y+window_size[1], x:x+window_size[0]]# 检测目标if detect_object(window):# 绘制检测框cv2.rectangle(result, (x, y),(x + window_size[0], y + window_size[1]),(0, 255, 0), 2)return result
3. HOG+SVM检测
3.1 算法原理
HOG(方向梯度直方图)特征就像是侦探提取的"纹理线索",SVM(支持向量机)就像是经验丰富的"判断专家"。
HOG特征计算:
g x = I ( x + 1 , y ) − I ( x − 1 , y ) g y = I ( x , y + 1 ) − I ( x , y − 1 ) g = g x 2 + g y 2 θ = arctan ( g y g x ) \begin{aligned} g_x &= I(x+1,y) - I(x-1,y) \\ g_y &= I(x,y+1) - I(x,y-1) \\ g &= \sqrt{g_x^2 + g_y^2} \\ \theta &= \arctan(\frac{g_y}{g_x}) \end{aligned} gxgygθ=I(x+1,y)−I(x−1,y)=I(x,y+1)−I(x,y−1)=gx2+gy2=arctan(gxgy)
3.2 实现示例
// HOG特征提取器
class HOGExtractor {
public:HOGExtractor(Size win_size = Size(64, 128),Size block_size = Size(16, 16),Size block_stride = Size(8, 8),Size cell_size = Size(8, 8),int nbins = 9): win_size_(win_size),block_size_(block_size),block_stride_(block_stride),cell_size_(cell_size),nbins_(nbins) {// 计算HOG特征维度Size n_cells(win_size.width / cell_size.width,win_size.height / cell_size.height);Size n_blocks((n_cells.width - block_size.width / cell_size.width) /(block_stride.width / cell_size.width) + 1,(n_cells.height - block_size.height / cell_size.height) /(block_stride.height / cell_size.height) + 1);feature_dim_ = n_blocks.width * n_blocks.height *block_size.width * block_size.height *nbins / (cell_size.width * cell_size.height);}// 计算图像梯度void computeGradients(const Mat& img, Mat& magnitude, Mat& angle) const {magnitude = Mat::zeros(img.size(), CV_32F);angle = Mat::zeros(img.size(), CV_32F);#pragma omp parallel forfor (int y = 1; y < img.rows - 1; y++) {for (int x = 1; x < img.cols - 1; x++) {// 计算x方向梯度float gx = static_cast<float>(img.at<uchar>(y, x + 1) - img.at<uchar>(y, x - 1));// 计算y方向梯度float gy = static_cast<float>(img.at<uchar>(y + 1, x) - img.at<uchar>(y - 1, x));// 计算梯度幅值magnitude.at<float>(y, x) = std::sqrt(gx * gx + gy * gy);// 计算梯度方向(角度)angle.at<float>(y, x) = static_cast<float>(std::atan2(gy, gx) * 180.0 / CV_PI);if (angle.at<float>(y, x) < 0) {angle.at<float>(y, x) += 180.0f;}}}}// 计算cell直方图void computeCellHistogram(const Mat& magnitude, const Mat& angle,vector<vector<vector<float>>>& cell_hists) const {Size n_cells(win_size_.width / cell_size_.width,win_size_.height / cell_size_.height);#pragma omp parallel for collapse(2)for (int y = 0; y < magnitude.rows; y++) {for (int x = 0; x < magnitude.cols; x++) {float mag = magnitude.at<float>(y, x);float ang = angle.at<float>(y, x);// 计算bin索引float bin_width = 180.0f / nbins_;int bin = static_cast<int>(ang / bin_width);int next_bin = (bin + 1) % nbins_;float alpha = (ang - bin * bin_width) / bin_width;// 计算cell索引int cell_x = x / cell_size_.width;int cell_y = y / cell_size_.height;if (cell_x < n_cells.width && cell_y < n_cells.height) {#pragma omp atomiccell_hists[cell_y][cell_x][bin] += mag * (1 - alpha);#pragma omp atomiccell_hists[cell_y][cell_x][next_bin] += mag * alpha;}}}}// 计算block特征并归一化void computeBlockFeatures(const vector<vector<vector<float>>>& cell_hists,vector<float>& features) const {Size n_cells(win_size_.width / cell_size_.width,win_size_.height / cell_size_.height);Size n_blocks((n_cells.width - block_size_.width / cell_size_.width) /(block_stride_.width / cell_size_.width) + 1,(n_cells.height - block_size_.height / cell_size_.height) /(block_stride_.height / cell_size_.height) + 1);for (int by = 0; by <= n_cells.height - block_size_.height / cell_size_.height;by += block_stride_.height / cell_size_.height) {for (int bx = 0; bx <= n_cells.width - block_size_.width / cell_size_.width;bx += block_stride_.width / cell_size_.width) {vector<float> block_features;float norm = 0;// 收集block中的所有cell直方图for (int cy = by; cy < by + block_size_.height / cell_size_.height; cy++) {for (int cx = bx; cx < bx + block_size_.width / cell_size_.width; cx++) {block_features.insert(block_features.end(),cell_hists[cy][cx].begin(),cell_hists[cy][cx].end());for (float val : cell_hists[cy][cx]) {norm += val * val;}}}// L2-Norm归一化norm = std::sqrt(norm + 1e-5);for (float& val : block_features) {val /= norm;}features.insert(features.end(),block_features.begin(),block_features.end());}}}vector<float> compute(const Mat& img) const {// 调整图像大小Mat resized;resize(img, resized, win_size_);// 计算梯度Mat magnitude, angle;computeGradients(resized, magnitude, angle);// 计算cell直方图Size n_cells(win_size_.width / cell_size_.width,win_size_.height / cell_size_.height);vector<vector<vector<float>>> cell_hists(n_cells.height,vector<vector<float>>(n_cells.width, vector<float>(nbins_, 0)));computeCellHistogram(magnitude, angle, cell_hists);// 计算block特征并归一化vector<float> features;features.reserve(feature_dim_);computeBlockFeatures(cell_hists, features);return features;}private:Size win_size_;Size block_size_;Size block_stride_;Size cell_size_;int nbins_;int feature_dim_;
};
class HOGExtractor:"""HOG特征提取器"""def __init__(self, win_size=(64, 128), block_size=(16, 16),block_stride=(8, 8), cell_size=(8, 8), nbins=9):self.win_size = win_sizeself.block_size = block_sizeself.block_stride = block_strideself.cell_size = cell_sizeself.nbins = nbins# 计算特征维度n_cells = (win_size[0] // cell_size[0], win_size[1] // cell_size[1])n_blocks = ((n_cells[0] - block_size[0] // cell_size[0]) // (block_stride[0] // cell_size[0]) + 1,(n_cells[1] - block_size[1] // cell_size[1]) // (block_stride[1] // cell_size[1]) + 1)self.feature_dim = n_blocks[0] * n_blocks[1] * block_size[0] * block_size[1] * nbins // (cell_size[0] * cell_size[1])def compute_gradients(self, img):"""计算图像梯度"""# 确保图像是灰度图if len(img.shape) > 2:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 计算x和y方向的梯度gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)# 计算梯度幅值和方向magnitude = np.sqrt(gx**2 + gy**2)angle = np.arctan2(gy, gx) * 180 / np.piangle[angle < 0] += 180return magnitude, angledef compute_cell_histogram(self, magnitude, angle):"""计算cell直方图"""n_cells = (self.win_size[0] // self.cell_size[0],self.win_size[1] // self.cell_size[1])cell_hists = np.zeros((n_cells[1], n_cells[0], self.nbins))# 计算每个像素的贡献for y in range(magnitude.shape[0]):for x in range(magnitude.shape[1]):mag = magnitude[y, x]ang = angle[y, x]# 计算bin索引bin_width = 180.0 / self.nbinsbin_idx = int(ang / bin_width)next_bin = (bin_idx + 1) % self.nbinsalpha = (ang - bin_idx * bin_width) / bin_width# 计算cell索引cell_x = x // self.cell_size[0]cell_y = y // self.cell_size[1]if cell_x < n_cells[0] and cell_y < n_cells[1]:cell_hists[cell_y, cell_x, bin_idx] += mag * (1 - alpha)cell_hists[cell_y, cell_x, next_bin] += mag * alphareturn cell_histsdef compute_block_features(self, cell_hists):"""计算block特征并归一化"""n_cells = (self.win_size[0] // self.cell_size[0],self.win_size[1] // self.cell_size[1])n_blocks = ((n_cells[0] - self.block_size[0] // self.cell_size[0]) //(self.block_stride[0] // self.cell_size[0]) + 1,(n_cells[1] - self.block_size[1] // self.cell_size[1]) //(self.block_stride[1] // self.cell_size[1]) + 1)features = []for by in range(0, n_cells[1] - self.block_size[1] // self.cell_size[1] + 1,self.block_stride[1] // self.cell_size[1]):for bx in range(0, n_cells[0] - self.block_size[0] // self.cell_size[0] + 1,self.block_stride[0] // self.cell_size[0]):# 提取block中的cell直方图block_features = cell_hists[by:by + self.block_size[1] // self.cell_size[1],bx:bx + self.block_size[0] // self.cell_size[0]].flatten()# L2-Norm归一化norm = np.sqrt(np.sum(block_features**2) + 1e-5)block_features = block_features / normfeatures.extend(block_features)return np.array(features)def compute(self, img):"""计算HOG特征"""# 调整图像大小img = cv2.resize(img, self.win_size)# 计算梯度magnitude, angle = self.compute_gradients(img)# 计算cell直方图cell_hists = self.compute_cell_histogram(magnitude, angle)# 计算block特征并归一化features = self.compute_block_features(cell_hists)return features
4. Haar+AdaBoost检测
4.1 算法原理
Haar特征就像是侦探寻找的"明暗对比线索",AdaBoost就像是多位专家组成的"决策委员会"。
Haar特征计算:
f = ∑ i ∈ w h i t e I ( i ) − ∑ i ∈ b l a c k I ( i ) f = \sum_{i \in white} I(i) - \sum_{i \in black} I(i) f=i∈white∑I(i)−i∈black∑I(i)
4.2 实现示例
// Haar特征提取器
class HaarExtractor {
public:HaarExtractor() {// 加载预训练的Haar级联分类器face_cascade_.load("haarcascade_frontalface_alt.xml");}vector<Rect> detect(const Mat& img, double scale_factor = 1.1, int min_neighbors = 3) {vector<Rect> faces;face_cascade_.detectMultiScale(img, faces, scale_factor, min_neighbors);return faces;}private:CascadeClassifier face_cascade_;
};// 使用示例
Mat detectFaces(const Mat& img) {Mat result = img.clone();Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);HaarExtractor haar;vector<Rect> faces = haar.detect(gray);for (const Rect& face : faces) {rectangle(result, face, Scalar(0, 255, 0), 2);}return result;
}
def haar_adaboost_detection(img_path):"""Haar+AdaBoost检测实现参数:img_path: 输入图像路径返回:检测结果可视化"""# 读取图像img = cv2.imread(img_path)result = img.copy()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 加载预训练的人脸检测器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 进行人脸检测faces = face_cascade.detectMultiScale(gray, 1.1, 4)# 绘制检测结果for (x, y, w, h) in faces:cv2.rectangle(result, (x, y), (x+w, y+h), (0, 255, 0), 2)return result
5. 非极大值抑制
5.1 算法原理
非极大值抑制就像是侦探整理重复的线索,只保留最显著的发现。
NMS算法步骤:
- 按置信度排序
- 计算重叠度
- 抑制重叠框
5.2 实现示例
// 非极大值抑制实现
vector<int> nms(const vector<Rect>& boxes, const vector<float>& scores,float iou_threshold) {vector<int> indices(boxes.size());std::iota(indices.begin(), indices.end(), 0); // 填充为 0, 1, 2, ...// 按分数排序sort(indices.begin(), indices.end(),[&scores](int a, int b) { return scores[a] > scores[b]; });vector<int> keep;while (!indices.empty()) {int curr = indices[0];keep.push_back(curr);vector<int> tmp;for (size_t i = 1; i < indices.size(); i++) {float iou = compute_iou(boxes[curr], boxes[indices[i]]);if (iou <= iou_threshold) {tmp.push_back(indices[i]);}}indices = tmp;}return keep;
}// 计算两个矩形的IoU
float compute_iou(const Rect& a, const Rect& b) {int x1 = max(a.x, b.x);int y1 = max(a.y, b.y);int x2 = min(a.x + a.width, b.x + b.width);int y2 = min(a.y + a.height, b.y + b.height);if (x1 >= x2 || y1 >= y2) return 0.0f;float intersection_area = static_cast<float>((x2 - x1) * (y2 - y1));float union_area = static_cast<float>(a.width * a.height + b.width * b.height - intersection_area);return intersection_area / union_area;
}
def compute_nms_manual(boxes, scores, iou_threshold=0.5):"""手动实现非极大值抑制算法参数:boxes: 边界框坐标列表,每个框为[x1, y1, x2, y2]格式scores: 每个边界框对应的置信度分数iou_threshold: IoU阈值,默认0.5返回:keep: 保留的边界框索引列表"""# 计算所有框的面积x1 = boxes[:, 0]y1 = boxes[:, 1]x2 = boxes[:, 2]y2 = boxes[:, 3]areas = (x2 - x1) * (y2 - y1)# 根据分数排序order = scores.argsort()[::-1]keep = []while order.size > 0:i = order[0]keep.append(i)if order.size == 1:break# 计算IoUxx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(0.0, xx2 - xx1)h = np.maximum(0.0, yy2 - yy1)inter = w * hovr = inter / (areas[i] + areas[order[1:]] - inter)# 保留IoU小于阈值的框inds = np.where(ovr <= iou_threshold)[0]order = order[inds + 1]return keep
6. 目标跟踪
6.1 基本原理
目标跟踪就像是侦探持续追踪重要线索,需要考虑:
- 运动预测
- 特征匹配
- 轨迹平滑
- 遮挡处理
6.2 实现示例
// 简单的目标跟踪器实现
vector<DetectionResult> track_objects(const Mat& src,const Mat& prev,const vector<DetectionResult>& prev_boxes) {vector<DetectionResult> curr_boxes;// 计算光流vector<Point2f> prev_points, curr_points;for (const auto& det : prev_boxes) {prev_points.push_back(Point2f(static_cast<float>(det.bbox.x + det.bbox.width/2),static_cast<float>(det.bbox.y + det.bbox.height/2)));}vector<uchar> status;vector<float> err;calcOpticalFlowPyrLK(prev, src, prev_points, curr_points, status, err);// 更新检测框位置for (size_t i = 0; i < prev_boxes.size(); i++) {if (status[i]) {DetectionResult det = prev_boxes[i];float dx = curr_points[i].x - prev_points[i].x;float dy = curr_points[i].y - prev_points[i].y;det.bbox.x += static_cast<int>(dx);det.bbox.y += static_cast<int>(dy);curr_boxes.push_back(det);}}return curr_boxes;
}// 可视化检测结果
Mat draw_detections(const Mat& src,const vector<DetectionResult>& detections) {Mat img_display = src.clone();if (img_display.channels() == 1) {cvtColor(img_display, img_display, COLOR_GRAY2BGR);}for (const auto& det : detections) {Scalar color;if (det.class_id == 1) { // 行人color = Scalar(0, 255, 0);} else if (det.class_id == 2) { // 人脸color = Scalar(0, 0, 255);} else {color = Scalar(255, 0, 0);}// 绘制边界框rectangle(img_display, det.bbox, color, 2);// 绘制标签和置信度string label = format("%s %.2f", det.label.c_str(), det.confidence);int baseline = 0;Size text_size = getTextSize(label, FONT_HERSHEY_SIMPLEX,0.5, 1, &baseline);rectangle(img_display,Point(det.bbox.x, det.bbox.y - text_size.height - 5),Point(det.bbox.x + text_size.width, det.bbox.y),color, -1);putText(img_display, label,Point(det.bbox.x, det.bbox.y - 5),FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255), 1);}return img_display;
}
def object_tracking(img_path, video_path=None):"""简单的目标跟踪实现参数:img_path: 输入图像路径video_path: 视频路径(可选)返回:跟踪结果可视化"""# 读取图像img = cv2.imread(img_path)result = img.copy()# 转换为HSV颜色空间hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义目标颜色范围(以红色为例)lower_red = np.array([0, 50, 50])upper_red = np.array([10, 255, 255])# 创建掩码mask = cv2.inRange(hsv, lower_red, upper_red)# 寻找轮廓contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)if contours:# 找到最大的轮廓c = max(contours, key=cv2.contourArea)x, y, w, h = cv2.boundingRect(c)cv2.rectangle(result, (x, y), (x+w, y+h), (0, 255, 0), 2)return result
7. 代码实现与优化
7.1 性能优化技巧
- 使用积分图像加速特征计算
- GPU加速大规模计算
- 多线程并行处理
- 特征金字塔缓存
7.2 优化示例
// 使用积分图像优化特征计算
class IntegralFeature {
private:Mat integralImg;Mat integralSqImg;public:void compute(const Mat& img) {integral(img, integralImg, integralSqImg);}float getSum(const Rect& r) const {return integralImg.at<double>(r.y+r.height,r.x+r.width)+ integralImg.at<double>(r.y,r.x)- integralImg.at<double>(r.y,r.x+r.width)- integralImg.at<double>(r.y+r.height,r.x);}float getVariance(const Rect& r) const {float area = r.width * r.height;float sum = getSum(r);float sqSum = getSqSum(r);return (sqSum - sum*sum/area) / area;}
};
8. 应用场景与实践
8.1 典型应用
- 👤 人脸检测
- 🚗 车辆检测
- 🚶 行人检测
- 📝 文字检测
- 🎯 缺陷检测
8.2 实践建议
-
数据准备
- 充分的训练数据
- 数据增强
- 标注质量控制
-
算法选择
- 根据场景选择合适的算法
- 考虑实时性要求
- 权衡精度和速度
-
部署优化
- 模型压缩
- 计算加速
- 内存优化
总结
目标检测就像是在图像中玩"找茬游戏",我们需要在复杂的场景中找到特定的目标!通过滑动窗口、HOG+SVM、Haar+AdaBoost等方法,我们可以有效地定位和识别这些目标。在实际应用中,需要根据具体场景选择合适的方法,就像选择不同的"放大镜"来观察不同的目标。
记住:好的目标检测系统就像是一个经验丰富的"图像侦探",能够从复杂的场景中发现重要的目标!🔍
参考资料
- Viola P, Jones M. Rapid object detection using a boosted cascade of simple features[C]. CVPR, 2001
- Dalal N, Triggs B. Histograms of oriented gradients for human detection[C]. CVPR, 2005
- OpenCV官方文档: https://docs.opencv.org/
- 更多资源: IP101项目主页
相关文章:
目标检测工作原理:从滑动窗口到Haar特征检测的完整实现
目标检测探索指南 🔍 目标检测就像是一位细心的侦探!我们需要在图像中寻找并定位特定的目标,就像侦探在现场搜寻线索一样。让我们一起来探索这个充满挑战的图像处理领域吧! 目录 1. 什么是目标检测?2. 滑动窗口检测3.…...
【LUT技术专题】针对降噪优化的通道感知轻量级LUT算法:DnLUT
DnLUT:Ultra-Efficient Color Image Denoising via Channel-Aware Lookup(2025 CVPR) 专题介绍一、研究背景二、DnLUT方法2.1 Pairwise Channel Mixer2.2 Rotation Non-overlapping Kernel(L型卷积) 三、实验结果四、总…...
支持同步观看的媒体服务器GhostHub
简介 什么是 GhostHub ? GhostHub 是一个基于滑动界面的媒体服务器,旨在实现实时同步、聊天和隧道分享。它允许用户快速共享和浏览媒体内容,无需复杂的配置或帐户。 主要特点 零配置: 即开即用,无需安装或创建帐户。滑动浏览: 提…...
告别 pip:使用 uv 加速你的 Python 包管理
使用 uv:更快的 Python 包管理工具 随着 Python 生态的演进,包管理工具也在不断升级迭代。uv 是 Astral(同样维护 ruff 的团队)推出的下一代 Python 包与项目管理器,主打 单一可执行文件、极致性能,可在多数场景下取代 pip、pip-tools、pipx 与 virtualenv 等传统工具,…...
使用glsl 来做视频矫正
描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…...
【VSCode】快捷键合集(持续更新~)
一、基础编辑操作 注释/取消注释 Ctrl /:快速注释或取消注释当前行或选中行。ctrlshift/:块注释 代码格式化 • Shift Alt F:格式化整个文档,统一代码风格。 行操作 • Alt ↑/↓:向上/向下移动当前行。 • Shi…...
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
使用 MATLAB 对城市雨季防洪排污问题进行建模与仿真,需要结合数学模型、工程经验和 MATLAB 的数值计算、数据可视化及优化工具。以下是详细的步骤指南,包含实际案例和代码示例: 一、问题分析与建模框架 1. 问题拆解 • 核心目标: …...
由浮点数x的位级表示求其整型值
由浮点数x的位级表示,得到浮点数的十进制表示,在超过32位整型数的表示范围时,返回0X80000000;在32位整型数的表示范围内时,返回强制转化为整型的值。舍入时采用向0舍入。 程序代码 typedef unsigned long int float_…...
【Qt】Qt常见控件的相关知识点
1.close退出槽函数 2.设置快捷键,QMenu 。 适用&字母就能设置快捷键,运行qt程序,最后就可以按Alt对应的字母进行快捷操作。 3.QMenuBar内存泄露问题 如果ui已经自动生成了menubar,我们再次生成一个新的菜单栏,而…...
数据结构*优先级队列(堆)
什么是优先级队列(堆) 优先级队列一般通过堆(Heap)这种数据结构来实现,堆是一种特殊的完全二叉树,其每个节点都满足堆的性质。如下图所示就是一个堆: 堆的存储方式 由于堆是一棵完全二叉树,所以也满足二…...
Windows本地化部署Dify完整指南
Windows本地化部署Dify完整指南 作者:朱元禄 版权声明:本文为朱元禄原创文章,转载请注明出处及作者信息 关键词:Dify部署,Windows安装Dify,Dify本地化,Dify教程,Dify配置,朱元禄 一、Docker Desktop安装与配置 1.1 下载Docker De…...
全局异常处理:如何优雅地统一管理业务异常
在软件开发中,异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性,还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...
AI517 AI本地部署 docker微调(失败)
本地部署AI 计划使用OLLAMA进行本地部署 修改DNS 访问github 刷新缓存 配置环境变量 OLLAMA安装成功 部署成功 计划使用docker进行微调 下载安装docker 虚拟化已开启 开启上面这些 准备下载ubuntu docker ragflow dify 用git去泡...
C++(初阶)(十八)——AVL树
AVL树 AVL树概念实现AVL树的结点插入插入方法 平衡因子更新更新停止条件旋转右单旋左单旋左右双旋右左双旋 遍历AVL平衡检测 完整代码 概念 1,AVL树是最先发明的⾃平衡⼆叉查找树,AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制高度差去控制平衡。…...
2022河南CCPC(前四题)
签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…...
【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数
将 x 减到 0 的最小操作数 一、题目链接二、题目三、题目解析四、算法原理五、编写代码六、时空复杂度 一、题目链接 将 x 减到 0 的最小操作数 二、题目 三、题目解析 以示例1为例: 四、算法原理 像"题目解析"中正面删除并修改数组元素的操作太困难&…...
电机试验平台:创新科技推动电动机研究发展
电机试验平台是电机制造和研发过程中不可或缺的重要设备,其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大,对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…...
linux-软件的安装与部署、web应用部署到阿里云
一、软件安装方式概述 CentOS安装软件的方式主要包括: - 源码安装 - rpm安装(二进制安装) - yum安装(在线安装) 1.源码安装: 源码包是指C等语言所开发的源代码文件的一个压缩包,通常压缩为.…...
Qt Widgets模块功能详细说明,基本控件:QLabel(一)
一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QLabel 1.1、概述 (用途、继承关系) QLabel 是 Qt 框架中用于显示文本、图像或动画的控件,属…...
Ubuntu 安装 squid
1. 安装Squid及工具 Debian/Ubuntu sudo apt update sudo apt install squid apache2-utils CentOS/RHEL sudo yum install squid httpd-tools 2. 创建用户名密码文件 创建密码文件(首次使用 -c 参数,后续添加用户省略) sudo htpasswd…...
中药药效成分群的合成生物学研究进展-文献精读130
Advances in synthetic biology for producing potent pharmaceutical ingredients of traditional Chinese medicine 中药药效成分群的合成生物学研究进展 摘要 中药是中华民族的文化瑰宝,也是我国在新药创制领域的重要驱动力。许多中药材来源于稀缺物种…...
芯片生态链深度解析(三):芯片设计篇——数字文明的造物主战争
【开篇:设计——数字文明的“造物主战场”】 当英伟达的H100芯片以576TB/s显存带宽重构AI算力边界,当阿里平头哥倚天710以RISC-V架构实现性能对标ARM的突破,这场围绕芯片设计的全球竞赛早已超越技术本身,成为算法、架构与生态标准…...
Echart地图数据源获取
DataV.GeoAtlas地理小工具系列 选择需要的区域地图,选中后输出即可: 地图钻取代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>map</title><style>html, body, #map{margin: 0;…...
【C++ - 仿mudou库one thread one loop式高并发服务器实现】
文章目录 项目介绍项目模块和服务器主要设计模式项目主要流程前置知识1.bind函数2.定时器任务TimerTask和时间轮思想TimerWheel3.正则表达式4.通用型容器Any类 服务器设计模式1)单Reactor单线程模式2)单Reactor多线程模式3)多Reactor多线程模…...
本地缓存更新方案探索
文章目录 本地缓存更新方案探索1 背景2 方案探索2.1 初始化2.2 实时更新2.2.1 长轮询2.2.1.1 client2.2.2.2 server 本地缓存更新方案探索 1 背景 大家在工作中是否遇到过某些业务数据需要频繁使用,但是数据量不大的情况,一般就是几十条甚至几百条这种…...
Java—异常体系
Java的异常体系是Java语言中用于处理程序运行过程中可能出现的错误的机制。通过异常处理,程序可以在遇到问题时自动反馈,从而避免程序崩溃。Java异常体系中包含两大类:错误(Error)和异常(Exception)。 一、错误(Error)…...
深度学习(第3章——亚像素卷积和可形变卷积)
前言: 本章介绍了计算机识别超分领域和目标检测领域中常常使用的两种卷积变体,亚像素卷积(Subpixel Convolution)和可形变卷积(Deformable Convolution),并给出对应pytorch的使用。 亚像素卷积…...
5.15 学习日志
1.SST(总平方和)、SSR(回归平方和)、SSE(残差平方和)之间的关系。 在使用线性回归模型时,经常提到的统计量MSE(Mean Squared Error、均方误差):是 SSE 的平均…...
重排序模型解读:gte-multilingual-reranker-base 首个GTE系列重排模型诞生
模型介绍 gte-multilingual-reranker-base 模型是 GTE 模型系列中的第一个 reranker 模型,由阿里巴巴团队开发。 模型特征: Model Size: 306MMax Input Tokens: 8192 benchmark 关键属性: 高性能:与类似大小的 reranker 模型…...
计算机发展的历程
计算机系统的概述 一, 计算机系统的定义 计算机系统的概念 计算机系统 硬件 软件 硬件的概念 计算机的实体, 如主机, 外设等 计算机系统的物理基础 决定了计算机系统的天花板瓶颈 软件的概念 由具有各类特殊功能的程序组成 决定了把硬件的性能发挥到什么程度 软件的分类…...
【通用智能体】Search Tools:Open Deep Research 项目实战指南
Open Deep Research 项目实战指南 一、项目运行方式(一)运行环境要求(二)运行方式(三)传统本地运行(四)Docker 容器运行 二、操作步骤(一)使用搜索功能&#…...
nodejs 文件的复制
在 Node.js 中,文件复制操作可以通过多种方式实现,具体取决于文件大小、性能需求以及是否需要保留文件元数据(如权限、时间戳等)。以下是几种常见的文件复制方法及其示例代码: 1. 使用 fs.copyFile(简单高…...
GO语言学习(三)
GO语言学习(三) GO语言的独特接口可以实现内容和面向对象组织的更加方便,我们从这里来详细的讲解接口,让大家感受一下interface的魅力 interface定义 首先接口是一组方法签名的组合,我们通过接口来实现定义对象的一…...
高频面试题(含笔试高频算法整理)基本总结回顾61
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
C++:C++内存管理
C 内存分区 C 内存分为 5 个主要区域: 栈 (Stack):存储局部变量、函数参数和返回地址。由编译器自动分配和释放,效率高但空间有限。 堆 (Heap):动态分配的内存区域,需手动管理(new/delete 或 malloc/free…...
目标跟踪相关综述文章
文章年份会议/引用量IFObject tracking:A survery20067618Object Tracking Methods:A Review2019554Multiple object tracking: A literature review20201294Deep learning for multiple object tracking: a survey2019145Deep Learning for Visual Tracking:A Comprehensive S…...
JavaScript【6】事件
1.概述: 在 JavaScript 中,事件(Event)是浏览器或 DOM(文档对象模型)与 JavaScript 代码之间交互的一种机制。它代表了在浏览器环境中发生的特定行为或者动作,比如用户点击鼠标、敲击键盘、页面…...
Python训练打卡Day26
函数专题1:函数定义与参数 知识点回顾: 函数的定义变量作用域:局部变量和全局变量函数的参数类型:位置参数、默认参数、不定参数传递参数的手段:关键词参数传递参数的顺序:同时出现三种参数类型时 到目前为…...
通俗版解释CPU、核心、进程、线程、协程的定义及关系
通俗版解释(比喻法) 1. CPU 和核心 CPU 一个工厂(负责干活的总部)。核心 工厂里的车间(比如工厂有4个车间,就能同时处理4个任务)。 2. 进程 进程 一家独立运营的公司(比如一家…...
微积分基本规则及示例解析
微积分中的基本规则是构成微积分理论和应用的基石。以下是一些微积分中的基本规则,我将用简单的例子来解释它们,以便小学生也能理解。 1. **极限规则**: - 常数的极限:\(\lim_{x \to a} c c\) - 例如,\(\lim…...
Baklib知识中台构建企业智能服务新引擎
知识中台构建智能服务新范式 随着企业数字化转型进入深水区,传统知识管理模式的局限性日益显现——分散的文档系统、低效的信息检索以及割裂的业务场景,严重制约着组织效能的释放。在此背景下,Baklib提出的知识中台解决方案,通过…...
Python实例题:Python百行制作登陆系统
目录 Python实例题 题目 python-login-systemPython 百行登录系统脚本 代码解释 用户数据库: 注册功能: 登录功能: 主程序: 运行思路 注意事项 Python实例题 题目 Python百行制作登陆系统 python-login-systemPython…...
Java求职面试:从核心技术到大数据与AI的场景应用
面试场景: 在某互联网大厂的面试间,一位严肃的面试官正准备对面前的求职者谢飞机进行技术面试。谢飞机虽然有些紧张,但他相信凭借自己的机智和幽默能够顺利通过。 第一轮提问:核心语言与平台的基础问题 面试官:“谢…...
系统架构设计(六):面向对象设计
核心概念 概念含义说明对象(Object)现实世界事物的抽象表示,包含属性(状态)和方法(行为)类(Class)一类对象的抽象模板继承(Inheritance)子类继承…...
国内AWS CloudFront与S3私有桶集成指南:安全访问静态内容
在现代web应用架构中,将静态内容存储在Amazon S3中并通过CloudFront分发是一种常见且高效的做法。本指南将详细介绍如何创建私有S3桶,配置CloudFront分配,并使用Origin Access Identity (OAI)来确保安全访问。 步骤1:创建S3桶 首先,我们需要创建一个名为"b-static&…...
MATLAB进行深度学习网络训练
文章目录 前言环境配置一、环境部署二、数据准备三、训练配置与执行四、模型评估与优化五、高级技巧六、实战案例:COVID-19 肺部 CT 图像分类 前言 在 MATLAB 中进行深度学习网络训练主要分为数据准备、网络构建、训练配置和模型评估四个核心步骤。以下是详细教程&…...
jvm安全点(三)openjdk17 c++源码垃圾回收之安全点结束,唤醒线程
1. VMThread::inner_execute() - 触发安全点 cpp 复制 void VMThread::inner_execute(VM_Operation* op) { if (op->evaluate_at_safepoint()) { SafepointSynchronize::begin(); // 进入安全点,阻塞所有线程 // ...执行GC等操作... SafepointSynchronize::…...
局部放大maya的视图HUD文字大小的方法
一、问题描述: 有网友问:有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗? 在 Maya 中,可以通过自定义 HUD(Heads-Up Display)元素的字体大小来局部放大特…...
Vue.js 教学第三章:模板语法精讲,插值与 v-bind 指令
Vue.js 模板语法精讲:插值与 v-bind 指令 在 Vue.js 开发中,模板语法是构建动态用户界面的核心。本文将深入讲解两大基础模板语法:插值({{ }})和 v-bind 指令,通过大量实例帮助你掌握这些关键概念。 一、插值语法:双花括号的魔法 1.1 基础文本插值 双花括号是最简单的…...
系统架构设计师案例分析题——软件架构设计篇
重中之重,本题争取拿下25满分~ 目录 一.核心知识 1.什么是架构风格 2.RUP的9个核心工作流 3.企业应用集成方式 4.软件质量属性 5.SySML系统建模语言9种图 6.云计算架构 7.中间件 8.构件、连接件、软件重用 9.层次型架构的缺点 10.架构开发方法ADM 11.微…...