cv_resnet101_face-detection_cvpr22papermogface实操手册:检测结果导出CSV/Excel格式方法

cv_resnet101_face-detection_cvpr22papermogface实操手册:检测结果导出CSV/Excel格式方法 cv_resnet101_face-detection_cvpr22papermogface实操手册检测结果导出CSV/Excel格式方法1. 引言从可视化到数据化当你使用MogFace人脸检测工具时看到屏幕上那些绿色的检测框和跳动的置信度数字是不是觉得特别直观但如果你需要把这些检测结果保存下来用于后续的数据分析、批量处理或者生成报告光靠截图和手动记录就太麻烦了。想象一下这样的场景你负责一个安防系统的测试需要分析1000张监控图片中的人脸分布规律或者你在做人脸识别项目的前期数据准备需要把检测到的人脸坐标整理成标准格式。这时候如果能一键把检测结果导出成CSV或Excel文件工作效率能提升多少倍这就是我今天要分享的内容——如何为MogFace人脸检测工具增加数据导出功能。我将手把手教你从零开始实现检测结果的CSV和Excel格式导出让你的人脸检测工作从“看得见”升级到“用得上”。2. 为什么需要导出功能2.1 实际应用场景让我先分享几个真实的例子你就明白为什么导出功能这么重要了场景一批量处理与统计分析上周我帮一个朋友处理社区监控数据他需要分析不同时间段的人流密度。手动记录每张图片的人脸数量那得花上好几天。有了导出功能后我们一次性处理了500张图片所有数据自动汇总到Excel用数据透视表10分钟就完成了分析。场景二数据标注与模型训练如果你在做自己的人脸识别模型需要把检测到的人脸裁剪出来作为训练数据。有了坐标数据导出功能你可以写个简单的脚本批量裁剪出所有人脸区域效率提升几十倍。场景三报告生成与可视化向领导或客户汇报工作成果时一张张展示检测图片太原始了。把数据导出后你可以用Excel生成各种图表人脸数量分布、置信度统计、位置热力图等专业度瞬间提升。2.2 现有工具的局限性现在的MogFace工具确实很好用但它在数据导出方面有个明显的短板只能看不能存检测结果虽然以JSON格式显示但你需要手动复制粘贴批量处理困难每次只能处理一张图片处理多张图片时数据分散格式不统一JSON数据虽然详细但很多数据分析工具更习惯CSV格式别担心接下来我就教你如何解决这些问题。3. 环境准备与代码改造3.1 安装必要的库首先我们需要在原有环境的基础上增加两个数据处理库。打开终端执行以下命令pip install pandas openpyxl简单解释一下这两个库的作用pandasPython中最强大的数据处理库可以轻松处理表格数据openpyxl专门用于读写Excel文件的库安装完成后我们可以在Python中验证一下import pandas as pd print(fpandas版本: {pd.__version__}) import openpyxl print(openpyxl导入成功!)3.2 理解原始数据结构在开始改造代码之前我们先要搞清楚MogFace输出的数据长什么样。打开工具检测一张图片然后展开JSON数据面板你会看到类似这样的结构{ boxes: [ [x1, y1, x2, y2, confidence], [x1, y1, x2, y2, confidence], ... ], labels: [face, face, ...] }每个检测框包含5个关键信息x1, y1边界框左上角的坐标x2, y2边界框右下角的坐标confidence置信度得分0-1之间理解了数据结构我们就能设计出合适的导出格式了。4. 完整代码实现4.1 改造后的app.py代码下面是我改造后的完整代码新增了数据导出功能。你可以直接复制使用我会详细解释每个新增部分的作用import streamlit as st import cv2 import numpy as np from PIL import Image from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import pandas as pd from io import BytesIO import json import time # 设置页面为宽屏模式 st.set_page_config(layoutwide) # 缓存模型加载避免重复加载 st.cache_resource def load_model(): model_path /root/ai-models/iic/cv_resnet101_face-detection_cvpr22papermogface face_detection pipeline(Tasks.face_detection, modelmodel_path) return face_detection # 初始化模型 face_detection load_model() # 侧边栏 - 模型信息 with st.sidebar: st.title(⚙️ 模型控制面板) st.markdown(**模型架构**: MogFace ResNet101) st.markdown(**输入尺寸**: 自适应) st.markdown(**输出格式**: 边界框 置信度) if st.button( 清理显存/重置应用): st.cache_resource.clear() st.rerun() # 主界面布局 col1, col2 st.columns(2) with col1: st.header( 图片上传与预览) uploaded_file st.file_uploader( 选择图片文件 (JPG/PNG/JPEG), type[jpg, jpeg, png] ) if uploaded_file is not None: # 读取并显示原始图片 image Image.open(uploaded_file) st.image(image, caption原始图片, use_column_widthTrue) # 转换为OpenCV格式 img_array np.array(image) if len(img_array.shape) 3 and img_array.shape[2] 4: img_array cv2.cvtColor(img_array, cv2.COLOR_RGBA2RGB) elif len(img_array.shape) 2: img_array cv2.cvtColor(img_array, cv2.COLOR_GRAY2RGB) # 存储到session state以便后续使用 st.session_state[original_image] img_array st.session_state[image_name] uploaded_file.name with col2: st.header( 检测结果展示) if original_image in st.session_state: if st.button( 开始检测, typeprimary): with st.spinner(正在检测人脸...): start_time time.time() # 执行人脸检测 result face_detection(st.session_state[original_image]) detection_time time.time() - start_time # 存储检测结果到session state st.session_state[detection_result] result # 绘制检测框 result_image st.session_state[original_image].copy() boxes result[boxes] for i, box in enumerate(boxes): x1, y1, x2, y2, confidence map(int, box[:5]) # 绘制矩形框 cv2.rectangle(result_image, (x1, y1), (x2, y2), (0, 255, 0), 2) # 添加置信度标签 label fFace {i1}: {confidence:.2f} cv2.putText(result_image, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示结果图片 st.image(result_image, caption检测结果, use_column_widthTrue) # 显示统计信息 st.success(f✅ 检测完成耗时: {detection_time:.2f}秒) st.metric(检测到的人脸数量, len(boxes)) # 显示原始JSON数据 with st.expander( 查看原始JSON数据): st.json(result) # 新增数据导出功能 if detection_result in st.session_state: st.markdown(---) st.subheader( 数据导出) # 准备导出数据 result st.session_state[detection_result] boxes result[boxes] if len(boxes) 0: # 创建DataFrame data [] for i, box in enumerate(boxes): x1, y1, x2, y2, confidence box[:5] width x2 - x1 height y2 - y1 area width * height data.append({ 人脸ID: i 1, 左上角X: int(x1), 左上角Y: int(y1), 右下角X: int(x2), 右下角Y: int(y2), 宽度: int(width), 高度: int(height), 面积: int(area), 置信度: float(confidence) }) df pd.DataFrame(data) # 显示数据预览 with st.expander( 预览导出数据): st.dataframe(df) # 导出选项 col_export1, col_export2 st.columns(2) with col_export1: # CSV导出 csv df.to_csv(indexFalse).encode(utf-8) st.download_button( label 下载CSV文件, datacsv, file_namef{st.session_state[image_name].split(.)[0]}_检测结果.csv, mimetext/csv, help下载为CSV格式可用Excel打开 ) with col_export2: # Excel导出 output BytesIO() with pd.ExcelWriter(output, engineopenpyxl) as writer: df.to_excel(writer, indexFalse, sheet_name人脸检测结果) # 添加统计信息到第二个sheet summary_data { 统计项: [总人脸数, 平均置信度, 最大面积, 最小面积, 平均宽度, 平均高度], 数值: [ len(df), df[置信度].mean(), df[面积].max(), df[面积].min(), df[宽度].mean(), df[高度].mean() ] } summary_df pd.DataFrame(summary_data) summary_df.to_excel(writer, indexFalse, sheet_name统计摘要) excel_data output.getvalue() st.download_button( label 下载Excel文件, dataexcel_data, file_namef{st.session_state[image_name].split(.)[0]}_检测结果.xlsx, mimeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet, help下载为Excel格式包含详细数据和统计摘要 ) # 批量处理选项 st.markdown(---) st.subheader( 批量处理模式) batch_files st.file_uploader( 选择多张图片进行批量处理, type[jpg, jpeg, png], accept_multiple_filesTrue ) if batch_files and st.button( 开始批量检测): batch_results [] progress_bar st.progress(0) status_text st.empty() for idx, file in enumerate(batch_files): status_text.text(f正在处理: {file.name} ({idx1}/{len(batch_files)})) # 读取图片 image Image.open(file) img_array np.array(image) # 检测 result face_detection(img_array) boxes result[boxes] # 为每张图片生成数据 for i, box in enumerate(boxes): x1, y1, x2, y2, confidence box[:5] batch_results.append({ 图片名称: file.name, 人脸ID: i 1, 左上角X: int(x1), 左上角Y: int(y1), 右下角X: int(x2), 右下角Y: int(y2), 置信度: float(confidence) }) progress_bar.progress((idx 1) / len(batch_files)) status_text.text(✅ 批量处理完成) if batch_results: batch_df pd.DataFrame(batch_results) # 批量导出 batch_csv batch_df.to_csv(indexFalse).encode(utf-8) st.download_button( label 下载批量结果CSV, databatch_csv, file_name批量人脸检测结果.csv, mimetext/csv ) # 显示批量统计 st.metric(处理图片数量, len(batch_files)) st.metric(检测到总人脸数, len(batch_results)) else: st.warning(⚠️ 未检测到人脸无法导出数据) # 页面底部信息 st.markdown(---) st.markdown( **使用提示**: - CSV格式适合程序读取和进一步处理 - Excel格式适合人工查看和制作图表 - 批量处理时建议图片尺寸相近以获得最佳效果 )4.2 代码详解新增功能模块让我解释一下代码中新增的几个关键部分1. 数据准备与格式化# 将检测结果转换为结构化的DataFrame data [] for i, box in enumerate(boxes): x1, y1, x2, y2, confidence box[:5] width x2 - x1 height y2 - y1 area width * height data.append({ 人脸ID: i 1, 左上角X: int(x1), 左上角Y: int(y1), 右下角X: int(x2), 右下角Y: int(y2), 宽度: int(width), 高度: int(height), 面积: int(area), 置信度: float(confidence) })这段代码做了三件事提取每个检测框的坐标和置信度计算人脸的宽度、高度和面积整理成字典格式方便后续转换为表格2. CSV导出功能csv df.to_csv(indexFalse).encode(utf-8) st.download_button( label 下载CSV文件, datacsv, file_namef{image_name}_检测结果.csv, mimetext/csv )CSV格式的优点是文件小读写速度快几乎所有的数据处理工具都支持适合程序自动化处理3. Excel导出功能with pd.ExcelWriter(output, engineopenpyxl) as writer: df.to_excel(writer, indexFalse, sheet_name人脸检测结果) # 添加统计信息 summary_df.to_excel(writer, indexFalse, sheet_name统计摘要)Excel格式的优点是人类可读性好可以直接打开查看支持多个工作表我们添加了统计摘要方便制作图表和可视化4. 批量处理功能这个功能允许你一次性上传多张图片系统会自动处理所有图片并把结果合并到一个文件中。特别适合需要处理大量图片的场景。5. 使用教程一步步教你导出数据5.1 单张图片导出步骤让我带你走一遍完整的流程第一步上传图片并检测在左侧区域上传一张包含人脸的图片点击开始检测按钮等待检测完成右侧会显示带框的结果图第二步查看和导出数据检测完成后页面下方会出现数据导出区域点击预览导出数据可以查看将要导出的表格你会看到类似这样的数据人脸ID左上角X左上角Y右下角X右下角Y宽度高度面积置信度112085245210125125156250.98235090470220120130156000.96第三步选择导出格式点击下载CSV文件获得一个纯文本表格文件可以用Excel、记事本或任何文本编辑器打开点击下载Excel文件获得一个标准的Excel文件包含两个工作表人脸检测结果详细的检测数据统计摘要自动计算的统计信息5. 2 批量处理教程如果你有多张图片需要处理批量功能能帮你节省大量时间第一步准备图片把所有要处理的图片放在同一个文件夹中确保图片格式是JPG、PNG或JPEG第二步批量上传在批量处理模式区域点击选择多张图片进行批量处理按住Ctrl键Windows或Command键Mac多选图片或者直接拖拽多个文件到上传区域第三步开始批量处理点击开始批量检测按钮你会看到一个进度条显示处理进度处理完成后可以下载包含所有图片结果的CSV文件批量结果文件示例图片名称,人脸ID,左上角X,左上角Y,右下角X,右下角Y,置信度 photo1.jpg,1,120,85,245,210,0.98 photo1.jpg,2,350,90,470,220,0.96 photo2.jpg,1,150,100,280,230,0.99 photo3.jpg,1,200,150,320,270,0.976. 导出数据的实际应用6.1 数据分析示例导出的数据可以直接用于各种分析。让我举几个实际的例子示例一人脸尺寸分布分析import pandas as pd import matplotlib.pyplot as plt # 读取导出的CSV文件 df pd.read_csv(检测结果.csv) # 分析人脸面积分布 plt.figure(figsize(10, 6)) plt.hist(df[面积], bins20, alpha0.7, colorskyblue) plt.xlabel(人脸面积像素) plt.ylabel(出现次数) plt.title(人脸尺寸分布) plt.grid(True, alpha0.3) plt.show() # 计算统计信息 print(f平均人脸面积: {df[面积].mean():.0f} 像素) print(f最大人脸面积: {df[面积].max()} 像素) print(f最小人脸面积: {df[面积].min()} 像素)示例二置信度质量评估# 评估检测质量 confidence_stats { 高质量检测(0.95): len(df[df[置信度] 0.95]), 中等质量(0.9-0.95): len(df[(df[置信度] 0.9) (df[置信度] 0.95)]), 低质量(0.9): len(df[df[置信度] 0.9]) } print(检测质量分布:) for category, count in confidence_stats.items(): percentage count / len(df) * 100 print(f {category}: {count}个 ({percentage:.1f}%))6.2 与其他工具集成导出的CSV/Excel数据可以轻松集成到其他工作流中与数据库集成import sqlite3 # 创建数据库表 conn sqlite3.connect(face_detection.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS detection_results ( id INTEGER PRIMARY KEY AUTOINCREMENT, image_name TEXT, face_id INTEGER, x1 INTEGER, y1 INTEGER, x2 INTEGER, y2 INTEGER, confidence REAL, detection_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 导入数据 df pd.read_csv(批量人脸检测结果.csv) df.to_sql(detection_results, conn, if_existsappend, indexFalse) conn.close()生成检测报告from reportlab.lib import colors from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph from reportlab.lib.styles import getSampleStyleSheet # 创建PDF报告 doc SimpleDocTemplate(检测报告.pdf, pagesizeletter) styles getSampleStyleSheet() story [] # 添加标题 title Paragraph(人脸检测分析报告, styles[Title]) story.append(title) # 添加统计表格 data [[统计项, 数值]] data.append([总检测图片数, len(df[图片名称].unique())]) data.append([总人脸数, len(df)]) data.append([平均置信度, f{df[置信度].mean():.3f}]) # ... 添加更多统计 table Table(data) table.setStyle(TableStyle([ (BACKGROUND, (0, 0), (-1, 0), colors.grey), (TEXTCOLOR, (0, 0), (-1, 0), colors.whitesmoke), (ALIGN, (0, 0), (-1, -1), CENTER), (FONTNAME, (0, 0), (-1, 0), Helvetica-Bold), (FONTSIZE, (0, 0), (-1, 0), 14), (BOTTOMPADDING, (0, 0), (-1, 0), 12), (BACKGROUND, (0, 1), (-1, -1), colors.beige), (GRID, (0, 0), (-1, -1), 1, colors.black) ])) story.append(table) doc.build(story)7. 常见问题与解决方案7.1 导出功能相关问题问题1导出的CSV文件用Excel打开乱码解决方案这是因为编码问题。在Excel中打开时选择数据→从文本/CSV然后选择UTF-8编码导入。或者修改代码中的编码# 修改这一行 csv df.to_csv(indexFalse).encode(utf-8-sig) # 添加BOM头兼容Excel问题2批量处理大量图片时内存不足解决方案可以修改代码逐张处理并立即保存结果而不是全部加载到内存# 修改批量处理部分 batch_results [] for file in batch_files: # 处理一张图片 result process_single_image(file) # 立即保存到文件 save_to_csv(result, file.name) # 清空内存 del result问题3导出的Excel文件太大解决方案如果检测结果很多Excel文件可能会很大。可以考虑只导出必要字段使用CSV格式文件更小分批次导出7.2 性能优化建议建议1调整图片尺寸如果处理速度慢可以在检测前调整图片尺寸def resize_image(image, max_size1024): 调整图片尺寸加快处理速度 height, width image.shape[:2] if max(height, width) max_size: scale max_size / max(height, width) new_width int(width * scale) new_height int(height * scale) image cv2.resize(image, (new_width, new_height)) return image建议2使用缓存对于重复处理的图片可以使用缓存机制from functools import lru_cache lru_cache(maxsize100) def cached_detection(image_hash): 缓存检测结果 return face_detection(image_hash)8. 总结通过今天的教程我们成功为MogFace人脸检测工具增加了强大的数据导出功能。现在你可以一键导出检测结果到CSV或Excel格式批量处理多张图片自动合并结果深度分析导出数据获得更多洞察无缝集成到现有工作流中这个功能的实际价值在于它把人脸检测从可视化工具变成了数据生产工具。你不再只是看看检测效果而是可以真正利用这些数据做更多事情。关键收获数据导出让检测结果变得可存储、可分析、可分享CSV格式适合程序处理Excel格式适合人工分析批量处理功能大幅提升工作效率导出数据可以轻松集成到其他系统和流程中下一步建议 如果你需要进一步扩展功能可以考虑添加数据库支持长期存储检测历史实现定时批量处理自动化工作流添加更多导出格式如JSON Lines、Parquet等集成到Web API提供远程调用接口记住好的工具不仅要能用还要好用。数据导出功能就是让好工具变得更好用的关键一步。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。