EagleEye作品分享:Streamlit大屏中支持缩放/拖拽/框选区域再检测的交互效果
今天想和大家分享一个我们团队最近在做的项目——EagleEye。这不仅仅是一个目标检测工具,更是一个集成了先进交互体验的智能视觉分析系统。如果你用过一些传统的检测工具,可能会觉得它们要么操作繁琐,要么结果展示不够直观。我们想做的,就是打破这种局面,让目标检测变得像在手机上放大一张照片、框选一个区域那样简单自然。
EagleEye的核心,是基于达摩院的DAMO-YOLO TinyNAS架构打造的一个毫秒级目标检测引擎。听起来有点技术?别担心,简单来说,它就像一个反应极快的“眼睛”,能在眨眼间(20毫秒以内)识别出图片或视频里的各种物体。更酷的是,我们为它配上了一套用Streamlit开发的交互式大屏界面。在这个大屏上,你不仅能实时看到检测结果,还能像操作地图一样,对图片进行缩放、拖拽,甚至框选特定区域进行二次检测。这种“指哪打哪”的交互方式,极大地提升了分析效率和体验。
接下来,我就带你深入看看,这个支持缩放、拖拽和区域再检测的交互效果是如何实现的,以及它能为你解决什么问题。
1. 项目核心:为什么需要这样的交互?
在开始讲技术细节前,我们先聊聊“为什么”。传统的目标检测流程通常是:上传图片 -> 模型推理 -> 输出带框的结果图。这个流程存在几个痛点:
- 全局检测的局限:一张高分辨率大图里,我们可能只关心某个角落的细节。对整个图片进行一次检测,既浪费算力,也可能因为目标太小而被忽略。
- 分析不聚焦:结果图上密密麻麻的框,很难快速定位到关键区域进行深入观察。
- 调试不直观:当你想调整检测参数(比如灵敏度)来优化某个局部区域的检测效果时,往往需要重新对整个图片进行推理,过程繁琐。
EagleEye的交互设计,正是为了直接解决这些问题。它把检测的主动权交还给用户,让你可以:
- 宏观浏览:先看整张图的检测概览。
- 微观聚焦:对感兴趣的区域放大,查看更清晰的细节。
- 精准分析:如果对放大后的某个小区域仍有疑问,可以直接框选它,让模型只对这个框内的像素进行“二次检测”,获得更精确的结果。
这种工作流,特别适合安防监控回溯(在庞大的监控画面中定位关键人物)、工业质检(在高清产品图上检查微小瑕疵)、医学影像分析(聚焦于病灶区域)等需要精细化操作的场景。
2. 交互效果实现的三驾马车
要实现这样流畅的交互,背后需要三个关键部分的紧密配合:强大的检测引擎、灵活的前端交互库以及高效的前后端通信。
2.1 引擎基石:DAMO-YOLO TinyNAS
交互再花哨,如果底子(检测模型)不行,一切都是空谈。EagleEye选用DAMO-YOLO TinyNAS作为核心引擎,主要看中它两点:
- 快如闪电(低延迟):得益于TinyNAS(神经架构搜索)技术,这个模型的结构是“量身定制”的,在保证精度的前提下,最大限度地减少了计算量。这确保了即使在用户频繁进行区域再检测的交互下,系统也能在几十毫秒内给出响应,体验无比跟手。
- 精准可控(动态阈值):我们集成了动态阈值调节功能。在Streamlit侧边栏,你可以用一个滑块实时调整“置信度阈值”。这个功能与交互深度结合:
- 当你框选区域再检测时,可以临时调低阈值,避免在小区域检测中漏掉目标。
- 在浏览全局结果时,可以调高阈值,让画面只显示确信度高的结果,更加清爽。
# 简化的推理函数示例,展示阈值如何应用 def eagleeye_inference(image, confidence_threshold=0.5): """ 使用DAMO-YOLO TinyNAS引擎进行目标检测 :param image: 输入图像(numpy数组) :param confidence_threshold: 置信度阈值,来自前端滑块 :return: 带标注框的图像和检测结果列表 """ # 1. 模型前向推理(这里是核心,实际调用C++/TensorRT优化后的引擎) # raw_detections = model.predict(image) # 2. 根据前端传来的阈值进行过滤 filtered_results = [] for det in raw_detections: if det.confidence >= confidence_threshold: # 关键过滤步骤 filtered_results.append(det) # 3. 将过滤后的结果绘制到图像上 annotated_image = draw_boxes(image, filtered_results) return annotated_image, filtered_results2.2 交互界面:Streamlit与自定义组件的融合
Streamlit本身擅长快速构建数据应用,但其原生图表组件对复杂的图像交互支持有限。为了实现缩放和框选,我们采用了“混合模式”:
- Streamlit 主体框架:负责构建整个应用布局,包括标题、侧边栏参数控件(置信度滑块)、文件上传区、结果展示区等。它提供了极快的开发迭代速度。
- 前端自定义组件(React + Konva.js):为了获得媲美专业图像软件(如Photoshop)的交互体验,我们使用React和Konva.js(一个HTML5 Canvas 2D绘图库)开发了一个自定义组件。这个组件被嵌入到Streamlit页面中,主要负责:
- 图像的缩放与拖拽:通过鼠标滚轮和拖拽实现,操作手感顺滑。
- 绘制选择框:监听鼠标事件,允许用户用鼠标拉出一个矩形框。
- 坐标转换与通信:将Canvas上的像素坐标,准确转换为原始图像上的坐标,并通过Streamlit的组件通信机制,将框选区域的坐标发送回Python后端。
# Streamlit 主应用代码结构示例 import streamlit as st from your_custom_component import image_interaction # 导入自定义交互组件 st.title("🦅 EagleEye 智能视觉分析平台") confidence = st.sidebar.slider("置信度阈值", 0.0, 1.0, 0.5, 0.05) uploaded_file = st.file_uploader("上传一张图片", type=['png', 'jpg', 'jpeg']) if uploaded_file is not None: original_image = load_image(uploaded_file) # 首次全局检测 global_result_img, _ = eagleeye_inference(original_image, confidence) # 显示图像,并嵌入自定义交互组件 # 组件会返回用户是否进行了框选以及框选的坐标 selection_data = image_interaction(global_result_img, key="img_interaction") # 如果用户框选了区域 if selection_data and selection_data['has_selection']: x1, y1, x2, y2 = selection_data['bbox'] st.write(f"您框选的区域坐标: ({x1}, {y1}) -> ({x2}, {y2})") # 从原图中裁剪出框选区域 cropped_region = original_image[y1:y2, x1:x2] # 对框选区域进行二次检测(这里可以使用不同的阈值) st.subheader("区域再检测结果") region_result_img, region_dets = eagleeye_inference(cropped_region, confidence=0.3) # 区域检测可调低阈值 st.image(region_result_img, caption="精细区域检测结果")2.3 通信与逻辑:无缝衔接交互意图
整个交互流程的数据流是这样的:
- 用户在前端Canvas上框选一个区域。
- 自定义组件捕获框选的相对于当前视图的像素坐标。
- 组件内部根据当前的缩放比例和偏移量,计算出该区域在原始全分辨率图像上的绝对坐标。
- 这些坐标通过Streamlit的
st.components.v1通信机制传回Python后端。 - Python后端收到坐标,从原始图像数据中裁剪出对应的像素块。
- 调用DAMO-YOLO引擎对这个裁剪块进行第二次推理。
- 将第二次推理得到的结果图(可能只包含局部)和检测数据返回前端更新显示。
这个过程的关键在于坐标转换的准确性,必须确保用户在屏幕上框的那一小块,精准对应到原始大图上的正确位置。
3. 实战效果展示:一目了然的交互价值
光说不练假把式。下面我通过一个简单的场景,展示这套交互的实际效果。
场景:分析一张城市街景的高清大图,寻找其中的所有车辆。
全局初筛:
- 上传图片后,系统以默认阈值进行全图检测。结果可能显示了很多车辆,但远处的小车可能因为置信度不够高而没有标出。
缩放与拖拽观察:
- 你觉得图片右下角的停车场区域值得细看。用鼠标滚轮放大该区域,并拖拽画面使其居中。现在可以清晰地看到每一辆车的轮廓。
框选区域再检测:
- 你注意到放大后,仍有几辆颜色与背景接近的车没有被识别出来。
- 这时,你使用框选工具,将那片漏检的区域框起来。
- 松开鼠标的瞬间,系统后台只对这个框内的像素进行了一次新的检测。由于这次检测的“视野”更聚焦,且我们可以在后端临时为这次请求调低检测阈值,之前漏掉的车辆很可能就被成功识别出来了。
这种“总-分-精”的三段式分析流程,完美结合了机器的自动化与人类的判断力,让目标检测从一项批处理任务,变成了一个可探索、可交互的分析过程。
4. 总结:让AI工具更“顺手”
回顾一下,EagleEye通过整合DAMO-YOLO TinyNAS毫秒级检测引擎与支持缩放/拖拽/框选的Streamlit交互大屏,实现了一个既强大又易用的智能视觉分析系统。
它的核心价值在于:
- 提升分析精度:区域再检测功能,允许用户对可疑区域进行“重点关照”,有效减少漏检。
- 优化操作效率:无需反复上传裁剪后的图片,所有交互在一个界面内无缝完成,流程大幅简化。
- 增强用户体验:直观的交互降低了使用门槛,让不熟悉深度学习的技术人员也能轻松进行精细化视觉分析。
未来,我们计划将这种交互模式扩展到视频流分析(支持在视频帧上框选)和多模型对比分析(框选区域后用不同模型检测)等场景。我们的目标是,让AI工具不再是黑盒,而是一个能够与用户流畅对话、协同工作的“白盒”助手。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。