Python 关于logging.py的NOTSET

本文探讨了Python中logging模块的日志级别设置问题,特别是NOTSET级别,并解释了它为何会被误解为输出所有信息。实际测试表明,NOTSET级别等效于WARNING级别。

环境:python2.7 

  网上有文章说,日志的过滤级别设置为NOTSET,即意味着“输出所有信息”,但是我今天的测试结果却不同。

通过查看代码,发现NOTSET是logging的默认过滤级别,即在日志没有设定过滤级别时,默认为NOTSET。

而在logging打印日志时,过滤级别NOTSET会转换为WARNING。因此,今天我测试时设置为NOTSET,结果日志中打印的是WARNING及以上级别的记录。

所以,网上有的文章会说,python的logging的默认级别是WARNING,如下:

SetLevel

Logging有如下级别: DEBUG,INFO,WARNING,ERROR,CRITICAL

默认级别是WARNING, logging模块只会输出指定level以上的log

来源:http://blog.youkuaiyun.com/balderfan/article/details/7644807


顺便查到的一些资料:

日志过程讲解的:http://blog.chinaunix.net/uid-403117-id-2407615.html

这个大概翻译的,看到几个转载的:http://blog.sina.com.cn/s/blog_4b5039210100f1wv.html

这个很详细的,还没有细看,标记下:http://blog.youkuaiyun.com/wujieyhy2006/article/details/7068320

标记:http://blog.youkuaiyun.com/balderfan/article/details/7644807

某个官方文档:http://docs.python.org/release/2.6.6/library/logging.html


以上是我个人的看法,还没找到官方资料支持。英文看得我眼花可怜。哪位找到确切的资料,请顺便告知在下一声阿

<think>我们正在编写一个监控文件夹并处理图片的Python脚本。根据要求,我们需要确保检测过但未识别到的图片被单独存放在一个文件夹中。我们已经有了一个实现,但需要进一步优化和明确。 目标: 1. 监控一个文件夹(SOURCE_DIR),当有新图片出现时进行处理。 2. 使用YOLOv8模型检测图片中的目标。 3. 如果检测到目标,将结果按类别保存到detected_results下的对应子文件夹(每个类别一个文件夹)。 4. 如果没有检测到目标,将图片保存到专门的no_detection文件夹(按日期创建子文件夹)。 5. 支持配置是否在未检测到目标的图片上添加文本标注。 代码中已经实现的功能: - 使用YOLOv8模型进行目标检测。 - 将检测到的目标按类别保存。 - 对未检测到目标的图片,可以选择保存原始图片或添加“No Detection”文本后保存,并放入按日期创建的no_detection子文件夹。 - 使用轮询机制监控文件夹,避免重复处理。 现在,我们按照要求,将代码整理并确保满足所有条件。 注意:我们假设用户已经安装了必要的库(ultralytics, opencv-python)。 我们将代码组织如下:</think>下面是一个完整的文件夹监控和目标检测脚本,可直接保存为 `detector.py` 运行: ```python """ 文件夹监控与目标检测系统 功能: 1. 监控指定文件夹中的新图片 2. 使用YOLOv8进行目标检测 3. 将检测结果按类别保存到对应文件夹 4. 未检测到目标的图片单独保存到"no_detection"文件夹 5. 支持按日期分类存储未检测图片 """ import os import time import datetime import logging from pathlib import Path from collections import defaultdict from ultralytics import YOLO import cv2 # 配置参数 SOURCE_DIR = "input_images" # 监控的图片文件夹 OUTPUT_DIR = "detected_results" # 检测结果根目录 NO_DETECTION_DIR = "no_detection" # 未检测到目标的文件夹 POLL_INTERVAL = 1 # 文件夹轮询间隔(秒) STABLE_TIME = 0.5 # 文件稳定时间(秒) IMAGE_EXTS = {'.jpg', '.jpeg', '.png', '.bmp', '.webp'} # 支持的图片格式 CONFIDENCE_THRESHOLD = 0.25 # 置信度阈值 SAVE_ORIGINAL_NO_DETECTION = True # 是否保存原始未检测图片 MODEL_NAME = 'yolov8n.pt' # 使用的模型文件 # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("detector.log"), logging.StreamHandler() ] ) def setup_directories(): """创建必要的目录结构""" Path(SOURCE_DIR).mkdir(parents=True, exist_ok=True) Path(OUTPUT_DIR).mkdir(parents=True, exist_ok=True) Path(NO_DETECTION_DIR).mkdir(parents=True, exist_ok=True) logging.info(f"监控文件夹: {SOURCE_DIR}") logging.info(f"结果保存到: {OUTPUT_DIR}") logging.info(f"未检测图片保存到: {NO_DETECTION_DIR}") def create_no_detection_folder(): """创建按日期分类的未检测文件夹""" today = datetime.datetime.now().strftime("%Y-%m-%d") no_detect_dir = Path(NO_DETECTION_DIR) / today no_detect_dir.mkdir(parents=True, exist_ok=True) return no_detect_dir def process_image(image_path, model): """ 处理单张图片并保存结果 参数: image_path (str): 图片文件路径 model (YOLO): 加载的YOLO模型 返回: dict: 处理结果统计 """ # 读取原始图片 try: original_img = cv2.imread(image_path) if original_img is None: logging.error(f"无法读取图片: {image_path}") return {} except Exception as e: logging.error(f"读取图片出错: {image_path} - {str(e)}") return {} # 执行目标检测 try: results = model(image_path, conf=CONFIDENCE_THRESHOLD) except Exception as e: logging.error(f"目标检测失败: {image_path} - {str(e)}") return {} # 检测结果计数器 detection_count = 0 class_files = defaultdict(list) # 处理检测结果 for result in results: # 统计检测到的目标数量 if result.boxes is not None: detection_count += len(result.boxes) # 绘制检测结果 plotted_img = result.plot() # 获取检测到的类别 class_indices = result.boxes.cls.int().tolist() # 为每个检测到的类别保存结果 for cls_idx in set(class_indices): # 使用set去重 cls_name = model.names[cls_idx] cls_dir = Path(OUTPUT_DIR) / cls_name cls_dir.mkdir(parents=True, exist_ok=True) # 保存路径 save_path = str(cls_dir / f"{Path(image_path).stem}_result{Path(image_path).suffix}") try: cv2.imwrite(save_path, plotted_img) class_files[cls_name].append(save_path) except Exception as e: logging.error(f"保存图片失败: {save_path} - {str(e)}") # 如果没有检测到任何目标 if detection_count == 0: # 创建按日期分类的未检测文件夹 no_detect_dir = create_no_detection_folder() # 保存未检测图片 if SAVE_ORIGINAL_NO_DETECTION: # 保存原始图片 save_path = str(no_detect_dir / f"{file_name}") try: cv2.imwrite(save_path, original_img) class_files["no_detection"] = [save_path] logging.info(f"未检测到目标: 保存原始图片 -> {save_path}") except Exception as e: logging.error(f"保存未检测图片失败: {save_path} - {str(e)}") else: # 在图片上添加"未检测到目标"文本 try: annotated_img = original_img.copy() text = "No Detection" font = cv2.FONT_HERSHEY_SIMPLEX font_scale = 1 thickness = 2 color = (0, 0, 255) # 红色文本 # 获取文本尺寸并居中 text_size = cv2.getTextSize(text, font, font_scale, thickness)[0] text_x = (annotated_img.shape[1] - text_size[0]) // 2 text_y = (annotated_img.shape[0] + text_size[1]) // 2 # 添加文本 cv2.putText(annotated_img, text, (text_x, text_y), font, font_scale, color, thickness) # 保存路径 save_path = str(no_detect_dir / f"{Path(image_path).name}") cv2.imwrite(save_path, annotated_img) class_files["no_detection"] = [save_path] logging.info(f"未检测到目标: 添加标注后保存 -> {save_path}") except Exception as e: logging.error(f"处理未检测图片失败: {image_path} - {str(e)}") return class_files def monitor_folder(): """监控文件夹并处理新图片""" # 初始化模型 try: model = YOLO(MODEL_NAME) logging.info(f"加载模型成功: {MODEL_NAME}") except Exception as e: logging.error(f"加载模型失败: {MODEL_NAME} - {str(e)}") return # 记录已处理文件 processed_files = set() # 初始扫描已存在文件 for entry in Path(SOURCE_DIR).iterdir(): if entry.is_file() and entry.suffix.lower() in IMAGE_EXTS: processed_files.add(str(entry.resolve())) logging.info(f"开始监控文件夹,置信度阈值: {CONFIDENCE_THRESHOLD}") logging.info("按 Ctrl+C 停止监控...") try: while True: # 获取文件夹中的所有文件 for entry in Path(SOURCE_DIR).iterdir(): if not entry.is_file(): continue file_path = str(entry.resolve()) file_ext = entry.suffix.lower() # 检查是否为支持的图片文件 if file_ext not in IMAGE_EXTS: continue # 检查是否已处理过 if file_path in processed_files: continue # 检查文件是否稳定 file_age = time.time() - entry.stat().st_mtime if file_age < STABLE_TIME: continue # 处理新图片 logging.info(f"处理新图片: {entry.name}") result_files = process_image(file_path, model) # 记录已处理文件 processed_files.add(file_path) # 打印处理结果 if "no_detection" in result_files: logging.info(f" └─ 未检测到目标: {result_files['no_detection'][0]}") else: for cls_name, paths in result_files.items(): logging.info(f" ├─ 检测到 {cls_name}: {len(paths)}张图片") time.sleep(POLL_INTERVAL) except KeyboardInterrupt: logging.info("\n监控已停止") except Exception as e: logging.error(f"监控过程中发生错误: {str(e)}") if __name__ == "__main__": setup_directories() monitor_folder() ``` ### 使用说明 1. **安装依赖**: ```bash pip install ultralytics opencv-python ``` 2. **创建文件夹结构**: ``` your_project/ ├── detector.py ├── input_images/ # 监控文件夹(自动创建) ├── detected_results/ # 检测结果(自动创建) └── no_detection/ # 未检测图片(自动创建) ``` 3. **运行程序**: ```bash python detector.py ``` 4. **添加测试图片**: - 将图片放入 `input_images/` 文件夹 - 程序会自动检测并处理新图片 ### 功能特点 1. **智能文件夹监控**: - 自动检测新添加的图片文件 - 等待文件写入完成后再处理(避免处理不完整的文件) - 支持多种图片格式:JPG, PNG, BMP, WEBP 2. **目标检测处理**: - 使用YOLOv8进行目标检测 - 可配置置信度阈值(`CONFIDENCE_THRESHOLD`) - 检测结果按类别保存到对应子文件夹 3. **未检测图片处理**: - 未检测到目标的图片单独保存 - 按日期创建子文件夹(如 `no_detection/2023-10-15/`) - 可选择保存原始图片或添加标注的图片(`SAVE_ORIGINAL_NO_DETECTION`) 4. **错误处理与日志**: - 全面的异常处理 - 详细的日志记录(控制台输出 + 文件日志) - 错误信息清晰明了 5. **配置选项**: ```python # 主要配置参数 SOURCE_DIR = "input_images" # 监控文件夹 OUTPUT_DIR = "detected_results" # 结果保存目录 NO_DETECTION_DIR = "no_detection" # 未检测图片目录 CONFIDENCE_THRESHOLD = 0.25 # 置信度阈值 (0-1) MODEL_NAME = 'yolov8n.pt' # 模型文件 (yolov8s.pt, yolov8m.pt等) ``` ### 运行示例 ``` 2023-10-15 14:30:45,123 - INFO - 监控文件夹: input_images 2023-10-15 14:30:45,456 - INFO - 加载模型成功: yolov8n.pt 2023-10-15 14:30:45,789 - INFO - 开始监控文件夹,置信度阈值: 0.25 2023-10-15 14:30:45,789 - INFO - 按 Ctrl+C 停止监控... 2023-10-15 14:31:02,345 - INFO - 处理新图片: cat.jpg 2023-10-15 14:31:03,567 - INFO - ├─ 检测到 cat: 1张图片 2023-10-15 14:31:20,111 - INFO - 处理新图片: street.jpg 2023-10-15 14:31:21,234 - INFO - ├─ 检测到 person: 3张图片 2023-10-15 14:31:21,234 - INFO - ├─ 检测到 car: 2张图片 2023-10-15 14:31:40,555 - INFO - 处理新图片: empty.jpg 2023-10-15 14:31:41,678 - INFO - └─ 未检测到目标: no_detection/2023-10-15/empty.jpg ``` ### 文件结构示例 处理完成后,文件夹结构如下: ``` input_images/ # 原始图片(保持不变) ├─ cat.jpg ├─ street.jpg └─ empty.jpg detected_results/ # 检测结果 ├─ cat/ │ └─ cat_result.jpg ├─ person/ │ └─ street_result.jpg └─ car/ └─ street_result.jpg no_detection/ # 未检测到目标的图片 └─ 2023-10-15/ # 按日期分类 └─ empty.jpg # 未检测图片 ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值