基于遥感影像的目标检测系统:从 YOLO12 训练到 Web 在线推理 仓库地址https://github.com/Pro-Gas-Station/core-remote-sensing-detect-web一、作品背景与设计目标随着卫星与无人机遥感数据的持续积累航空与卫星影像在国土监管、港口调度、应急救灾等场景中的用量显著增加。传统人工判读方式效率低、成本高难以满足业务时效要求部分专业遥感软件功能完整但部署复杂、操作门槛高非专业人员难以独立完成影像上传、目标检测与结果归档。现有研究多集中于算法精度对比缺少从模型训练、在线推理到报告导出的工程化链路。本项目将NWPU-VHR 十类目标检测与Web 应用系统相结合实现影像上传、在线推理、结果可视化、PDF 报告导出及用户管理等功能降低遥感目标检测的使用门槛。当前开源版本以Flask Python 推理为主链路仓库同时保留Spring Boot实现通过桥接脚本调用 Python 完成检测适用于需要 Java 业务层集成的部署场景。检测类别10 类飞机、船舶、储油罐、棒球场、网球场、篮球场、田径场、港口、桥梁、车辆。测试集指标best.ptmAP0.5 91.8%Precision 95.9%Recall 85.0%mAP0.5:0.95 60.9%。二、技术架构与运行环境层级选型说明前端HTML、CSS、JavaScript检测页、登录页、个人中心、模型数据页图表ECharts训练损失曲线、验证指标曲线后端Flask 3 / Spring Boot 3.2.5REST 接口JDK 17Java 版推理PyTorch、Ultralytics、OpenCV加载 YOLO12 权重画框并回传 Base64数据库SQLite用户、报告、验证码、个人设置运行Windows 11本机部署默认端口 5011可选外部服务未配置时不影响核心检测功能阿里云短信注册、登录、改密验证码SMTP 邮件邮箱注册、报告投递、密码找回DeepSeek API检测页智能问答会员可配置独立 Key开发环境采用 IDEAJava、PyCharmPython 训练与 FlaskSQLite 以单文件形式存储便于迁移与备份。三、检测模型与数据集一YOLO12 模型接入检测骨干采用YOLO12n预训练权重在 NWPU 子集上微调。模型遵循 YOLO 单阶段检测框架Backbone 提取特征Neck 完成多尺度融合Head 输出类别与边界框。训练与推理参数与config.py、训练脚本一致输入尺寸640×640训练增强Mosaic 等Ultralytics 默认策略推理置信度阈值0.25NMS IoU0.7权重文件训练完成后使用best.ptWeb 端接收请求后将上传影像解码为 RGB 张量送入模型推理并将检测框绘制回原图连同类别统计一并返回前端。推理模块对已加载模型做内存缓存切换ready-model与自训练模型时按 key 动态加载。二NWPU-VHR 数据集组织数据来源于 NWPU-VHR-10Kaggle 整理版。数据划分如下划分数量训练集559验证集160测试集81标注采用 YOLO 格式class x_center y_center width height坐标归一化至 0~1。仓库提供dataset/small_dataset/data.yaml快速试训与all_dataset/data.yaml全量配置。训练与验证命令other/model_train/detect/code/python train.py# 微调python val.py# 验证python predict.py# 单张预测三消融与对比实验在模型数据模块中完成消融与横向对比主要结论如下完整 YOLO12 配置mAP0.591.8%去除多尺度融合相关设计后约87.0%表明 Neck 融合对遥感小目标检测具有积极作用与 YOLOv8s 等同量级模型相比精度更高参数量约9.8M适合本机部署消融实验界面见第五节三。四、系统功能设计一功能模块划分系统采用前后端分离架构通过 REST 接口交互。前端负责页面展示与表单校验后端完成权限控制、数据持久化与模型调用。核心模块如下模块功能说明主要接口/页面登录验证账号密码登录、会话校验login.html、/api/user/login注册账号手机/邮箱注册、验证码校验/api/user/register、/api/sms/send遥感检测样例加载、上传推理、结果展示detect.html、/api/detect报告管理PDF 生成、邮件发送、历史记录/api/report/pdf模型数据训练曲线、测试指标、消融结果model-data.html个人中心资料、安全、主题、地图、问答profile.html系统管理用户列表、改密、角色、注销admin-users.html用户角色分为三类普通用户检测与个人资料、会员用户邮件报告与智能问答、管理员后台运维。二用例与角色权限普通用户完成注册、登录、检测与历史查询会员用户在此基础上可使用报告邮件与 LLM 对话管理员负责账号与权限维护。检测与模型数据页面面向普通用户开放只读能力账号变更类操作仅管理员接口可执行。业务数据存储于 SQLiteusers记录账号信息detection_reports保存检测摘要user_settings存放主题等偏好短信与邮箱验证码独立建表与主业务逻辑分离。五、系统实现与界面展示一登录注册模块登录页左侧展示系统功能说明右侧提供账号密码输入。演示环境可使用admin / 123456正式部署须修改默认密码。注册支持手机号与邮箱两种方式均需验证码校验。开发模式下未配置短信时验证码输出至服务端控制台。密码找回通过已绑定手机或邮箱完成验证后重置密码。二遥感检测模块检测页顶部支持模型切换预训练权重 / 自训练权重导航栏显示当前登录用户。输入方式包括NWPU 样例卡片港口、机场、船舶等缩略图一键加载与本地上传JPG/PNG单文件上限 30MB。推理完成后展示标注影像、各检测框类别与置信度并汇总目标总数。接口返回 Base64 编码图像前端直接渲染。三模型评估与训练监控模型数据页从experiments目录及训练日志读取指标。测试集共 81 张影像、433 个实例Precision 95.9%、Recall 85.0%。车辆类与背景存在一定混淆小目标召回仍有优化空间。PR 曲线与混淆矩阵用于分析各类别漏检与误检情况归一化混淆矩阵及 val_batch 可视化反映港口、田径场等场景下的检测效果。训练损失在前 20 个 epoch 下降较快30 epoch 后 mAP0.5 稳定在约 90% 附近。四后台管理与个人中心管理员可查询用户列表、调整角色、重置密码。个人中心集成资料、安全、主题、地图、问答与报告等功能。检测报告支持 PDF 导出与邮件发送PDF 由 fpdf2 生成中文字体依赖data/fonts/simhei.ttf。六、系统测试一黑盒测试场景操作结果登录admin / 123456进入检测页错误密码输入错误密码提示失败不跳转注册手机号 验证码新用户写入 users 表样例检测选择飞机样例返回多类检测框超大文件上传 30MB前端拦截或后端报错PDF检测后导出生成可打开的中文 PDF模型数据打开 model-data曲线与表格正常管理员修改用户角色数据库角色字段更新二白盒测试对login_user、detect_objects等核心函数按分支设计用例覆盖用户不存在、密码错误、模型 key 非法、图像解码失败、权重文件缺失等路径。实测结果与预期一致异常输入均返回明确错误信息。七、核心源代码说明项目代码位于web-flask/app.py定义路由service/实现业务逻辑db.py管理数据库config.py集中配置模型路径与类别映射。以下按检测主链路说明关键实现。一模型路径配置config.py通过MODEL_CONFIGS将前端模型 key 与本地best.pt路径、训练日志目录绑定MODEL_CONFIGS{ready-model:{name:YOLO12 检测模型(已经训练好的模型),model_path:os.path.join(MODEL_BASE_PATH,已经训练好的模型和测试结果,train,weights,best.pt),train_results_path:os.path.join(...,train,results.csv),val_data_path:os.path.join(...,val),},training-model:{...}}CLASS_NAME_MAPPING{airplane:飞机,ship:船舶,# ... 共 10 类}前端传入ready-model或training-model即可切换权重无需修改推理代码。二检测接口路由app.py中检测入口负责参数校验业务逻辑委托detect_objectsapp.route(/api/detect,methods[POST])defapi_detect():datarequest.get_json(silentTrue)or{}image_datadata.get(image)ifnotimage_data:returnjsonify({code:400,message:请上传影像数据})model_namedata.get(model,ready-model)returnjsonify(detect_objects(model_name,image_data))影像以 Base64 字符串提交用户身份通过请求头X-User-Name传递用于报告入库关联。三推理服务detect_objectsservice/detection_service.py实现检测主流程校验model_name是否存在于MODEL_CONFIGS调用load_model加载 YOLO 权重内存缓存避免重复读盘decode_base64_image解码前端图像写入临时文件并调用model(temp_path)推理解析boxes组装 detections调用draw_detection_boxes绘制标注图模型缓存_model_cache{}defload_model(model_name):ifmodel_namein_model_cache:return_model_cache[model_name]cfgMODEL_CONFIGS.get(model_name)ifnotos.path.isfile(cfg[model_path]):raiseFileNotFoundError(模型权重不存在: cfg[model_path])_model_cache[model_name]YOLO(cfg[model_path])return_model_cache[model_name]推理结果包含像素坐标与归一化坐标供前端展示与 PDF 生成复用。未检出目标时返回_empty_resultdetections为空但不抛 500 错误。临时文件在finally中删除。四用户登录与 SQLite 迁移login_user查询 SQLite 并校验密码deflogin_user(username,password):ifnotusernameornotpassword:return{code:400,message:用户名和密码不能为空}row_get_row(username)ifnotroworrow[password]!password:return{code:400,message:用户名或密码错误}return{code:200,message:登录成功,data:{user:public_user(row)}}启动时init_default_users()建表并将早期users.json数据迁移至数据库。role字段区分admin/member/user注册流程通过短信或邮箱验证码校验后写入users表。五数据库表结构init_db()创建核心表CREATE TABLE IF NOT EXISTS users(...);CREATE TABLE IF NOT EXISTS detection_reports(...);CREATE TABLE IF NOT EXISTS user_settings(...);CREATE TABLE IF NOT EXISTS sms_codes(...);CREATE TABLE IF NOT EXISTS email_codes(...);get_conn()采用上下文管理器操作结束自动提交。字段扩展通过_migrate_user_role等迁移函数执行ALTER TABLE。六训练脚本与 Web 服务对接fromultralyticsimportYOLO modelYOLO(weights/yolo12n.pt)resultsmodel.train(datadataset/small_dataset/data.yaml,epochs50,imgsz640)训练产物output/train/weights/best.pt路径与config.py中配置对齐后Web 端即可通过模型下拉框加载。七前端检测请求检测页将影像编码为 Base64POST 至/api/detect{model:ready-model,image:data:image/jpeg;base64,/9j/4AAQ...}响应中data.detections为检测框列表data.detection_image为标注图 Base64报告模块将结果写入detection_reports或交由pdf_service生成 PDF。八、项目目录结构core-remote-sensing-detect-web/ ├── web-flask/ # Flask 服务 │ ├── app.py # 路由入口 │ ├── config.py # 模型路径、类别映射 │ ├── service/ # 业务逻辑 │ └── templates/ # 页面与静态资源 └── other/model_train/detect/ ├── code/ # train / val / predict ├── dataset/ # data.yaml └── output/ # best.pt仓库默认不包含大体积训练图像与.pt权重clone 后需自行训练或将best.pt放置于config.py指定路径。九、部署与运行gitclone https://github.com/Pro-Gas-Station/core-remote-sensing-detect-web.gitcdcore-remote-sensing-detect-web/web-flask pipinstall-rrequirements.txt python app.py浏览器访问 http://127.0.0.1:5011 。首次使用可复制配置模板cddata copy email_config.example.json email_config.json copy sms_config.example.json sms_config.json copy..\users.example.json..\users.json未配置邮件/短信时可正常使用检测功能注册验证码、报告邮件与 LLM 问答依赖相应外部服务配置。十、总结与改进方向本项目完成 NWPU-VHR 十类遥感目标检测与 Web 系统的工程化集成形成从训练、推理到报告导出的完整链路。当前主要不足包括小目标召回率有待提升验证码与邮件依赖外部配置高并发场景下 SQLite 单写锁可能成为瓶颈。后续可考虑数据增广与模型轻量化优化并引入容器化部署与 MySQL 等方案以提升扩展能力。