目录三、VLM多模态方案四、AI质检工作台搭建1.构建Gradio界面1初始化代码2创建页签Tabs3布局4相关的控件2.页面逻辑1缺陷检测yolo检测VLM检测2检测记录3统计分析4数据导出五、Bad Cases持续改善三、VLM多模态方案VLM是用提示词的方式描述了6种缺陷的样式并让大模型根据样式的描述将缺陷按照规则框起来。主要逻辑如下response self.client.chat.completions.create( modelself.model_name, messages[ { role: user, content: [ {type: text, text: prompt}, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{b64_image} }, }, ], } ], max_tokens1024, temperature0.1, ) reply response.choices[0].message.content.strip()先将图片转化成Base64。用提示词的方式描述缺陷的类型并规定了传出的类型放入多模态大模型中进行推理。解析推理内容reply将Box框绘制在图片上并输出出来。大家看下效果。对比下来感觉在这个问题上yolo的速度更快效果更好。VLM是偏通用的而yolo偏专业二者可以互补。如在这个案例中实时的检测用yolo让VLM来做辅助分析。四、AI质检工作台搭建如上所示是工作台的完整设计。包含了界面的搭建两种缺陷的检测数据库的记录检测记录统计记录数据导出。1.构建Gradio界面1初始化代码gr.Blocks创建了一个 Web 应用根容器。with gr.Blocks( # 1.浏览器标签页显示的标题(类似 HTML 的title )。 titleAI质检工作台, # 2.使用 Gradio 内置主题 Soft 配色柔和、有圆角阴影。Gradio 还提供Default 、Base 、Monochrome 等预设主题,也可以自定义颜色。 themegr.themes.Soft(), # 凡是带elem_classesresult-text 的组件,文字都用等宽字体 css .result-text { font-family: Consolas, Courier New, monospace; } ) as app: gr.Markdown(# AI质检工作台 - 钢铁表面缺陷检测) gr.Markdown(支持 **YOLO目标检测** 和 **Qwen-VL多模态大模型** 两种检测引擎, 可对比分析)2创建页签Tabs使用此方法创建上面设计图给出的四个标签缺陷检测检测记录统计分析和数据导出四个页签with gr.Tabs(): with gr.Tab(缺陷检测): #.... with gr.Tab(检测记录): #....3布局gr.Row()为水平布局的容器有三列宽度比例为212# 水平布局 with gr.Row(): with gr.Column(scale2): # 左列 ...... with gr.Column(scale1): # 中列 ...... with gr.Column(scale2): # 右列 ......4相关的控件# 图片组件 上传,显示图片 input_image gr.Image( label上传钢铁表面图片, typenumpy, height300, ) # 单选按钮多选一 model_type gr.Radio( choices[YOLO, VLM (Qwen-VL)], valueYOLO, label选择检测引擎, ) # 滑动条拖动选择数值 conf_slider gr.Slider( minimum0.05, maximum0.95, value0.25, step0.05, labelYOLO置信度阈值, visibleTrue, ) # gr.Accordion为折叠框 # gr.Textbox 文本框输入/显示文本 with gr.Accordion(VLM API配置, openFalse): vlm_api_key gr.Textbox( labelAPI Key, valueos.environ.get(DASHSCOPE_API_KEY, ), placeholder未设置DASHSCOPE_API_KEY环境变量, 请手动填入, typepassword, # interactiveTrue, 只读 ) ...... # 按钮 review_btn gr.Button(提交审核) review_btn.click( fnsave_review, #绑定的函数 inputs[current_log_id, review_status, review_note], outputs[review_result], ) # 下拉框 rec_model_filter gr.Dropdown( choices[全部, yolo, vlm], value全部, label模型筛选, )2.页面逻辑1缺陷检测yolo检测从文件夹里拖动一张照片到左上角位置 或者 在左下角选择测试图片并点击【加载选中图片】按钮点击【开始检测】按钮右上角显示检测结果和检测详情主要逻辑# Step 1:加载model,model_path是之前训练好的best.pt的路径 model YOLO(model_path) # Step 2: 推理 results self.model.predict( sourceimage_path, # 图片路径 confconf, # 置信度 iouiou, verboseFalse, # augmentTrue, # 开启TTA ) # Step 3: 解析推理结果 boxes [] if len(results) 0 and results[0].boxes is not None: det_boxes results[0].boxes xyxy det_boxes.xyxy.cpu().numpy() confs det_boxes.conf.cpu().numpy() classes det_boxes.cls.cpu().numpy() for box, c, cls_id in zip(xyxy, confs, classes): cls_id int(cls_id) boxes.append(DetectionBox( class_idcls_id, #缺陷Id class_nameCLASS_NAMES.get(cls_id, fclass_{cls_id}), #缺陷名称 confidencefloat(c), #置信度 x1float(box[0]), y1float(box[1]), #坐标 x2float(box[2]), y2float(box[3]), )) # Step 4: 将推理内容整理成DetectionResult的格式 result DetectionResult( model_typeyolo, image_pathimage_path, boxesboxes, inference_timeelapsed, ) # Step 5:将框绘制到图片上并保存图片 result.annotated_image self._draw_boxes(image_path, boxes)VLM检测图片不变【选择检测引擎】切换为VLM再看一下检测结果主要逻辑推理过程和上面VLM多模态检测方案一样。这里主要讲下如何处理数据的。boxes [] defect_types [] description reply try: boxes, defect_types, description self._parse_bbox_response( reply, img_width, img_height ) except (json.JSONDecodeError, KeyError, IndexError, TypeError): description fVLM原始回复 (JSON解析失败):\n{reply} # 把数据整理成统一格式 result DetectionResult( model_typevlm, image_pathimage_path, boxesboxes, vlm_textdescription, vlm_defect_typesdefect_types, inference_timeelapsed, ) # 在图片上绘制框 result.annotated_image self._draw_boxes(image_path, boxes)# 解析Json json_str self._extract_json(reply) parsed json.loads(json_str) ....... for item in parsed: bbox_2d item.get(bbox_2d) label item.get(label, unknown) description item.get(description, ) if not bbox_2d or len(bbox_2d) ! 4: continue x1, y1, x2, y2 self._convert_bbox(bbox_2d, img_width, img_height) class_id CLASS_NAME_TO_ID.get(label, -1)--------------------------------------------------------------------在人工审核处提交审核结果收集bad Case。2检测记录在第一行筛选模型和审核状态点击【刷新记录】从数据库加载检测记录。将检测记录列表的ID再进行详细审核输入ID点击【查看详情】从数据库中加载出某次记录的结果。填入审核需要的内容【提交审核】。--------------------------------------------------------------------之所以能加载出检测记录是因为在上一步缺陷检测的时候将检测记录记载到sqlite3这个轻量级数据库里了。# 打开数据库 def _get_conn(self): conn sqlite3.connect(self.db_path) conn.row_factory sqlite3.Row try: yield conn conn.commit() except Exception: conn.rollback() raise finally: conn.close() # 存储数据 with self._get_conn() as conn: conn.execute( INSERT INTO detection_log (image_path, image_name, model_type, num_detections, detections_json, vlm_text, vlm_defect_types, inference_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?) , ( data.get(image_path, ), image_name, data.get(model_type, unknown), len(data.get(boxes, [])), json.dumps(data.get(boxes, []), ensure_asciiFalse), data.get(vlm_text, ), json.dumps(data.get(vlm_defect_types, []), ensure_asciiFalse), data.get(inference_time, 0), )) log_id conn.execute(SELECT last_insert_rowid()).fetchone()[0] # 后面省略...sql语句大同小异3统计分析点击【生成统计报告】查看统计报告。读取数据库内保存的数据将数据查出来然后用特定的格式展示出来。4数据导出导出误检和漏检的图片# 导出图片和记录bad_cases是从数据库读出的badCases exported [] for record in bad_cases: # 拷贝图片 img_path record[image_path] if os.path.exists(img_path): dst os.path.join(output_dir, images, record[image_name]) shutil.copy2(img_path, dst) exported.append({ id: record[id], image_name: record[image_name], model_type: record[model_type], review_status: record[review_status], review_note: record[review_note], num_detections: record[num_detections], detections: record[detections_json], vlm_text: record[vlm_text], created_at: record[created_at], }) # 写入CSV csv_path os.path.join(output_dir, bad_cases.csv) if exported: with open(csv_path, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesexported[0].keys()) writer.writeheader() writer.writerows(exported) # 写入导出信息 export_info { export_time: datetime.now().isoformat(), total_bad_cases: len(exported), wrong_count: sum(1 for r in exported if r[review_status] wrong), missed_count: sum(1 for r in exported if r[review_status] missed), model_type_filter: model_type or all, } with open(os.path.join(output_dir, export_info.json), w, encodingutf-8) as f: json.dump(export_info, f, ensure_asciiFalse, indent2) print(f导出完成:) print(f Bad Case 总数: {len(exported)}) print(f 误检(wrong): {export_info[wrong_count]}) print(f 漏检(missed): {export_info[missed_count]}) print(f 导出目录: {output_dir})五、Bad Cases持续改善模型上线后性能会逐渐衰减:• 产线环境变化(光照、材料批次、设备老化)• 新缺陷类型出现• 边缘case 积累我们需要把这些Bad Case 定期的导出用于后续的训练。完整流程是模型检测--人工审核(标记误检/漏检)--导出Bad Case--人工重新标注--合并到训练集--重训练
企业数字化 ERP 产品动态
相关推荐
3步在macOS安装Harp:让Claude Code与Codex并排工作的最快方式 【免费下载链接】harp Run many Claude Code and Codex agents side by side, in one sidebar that tells you which one needs you. An unofficial fork of Warp. 项目地址: https://gitcode.com/gh_mirrors/harp15/harp 点击查看 免费下载 Harp 是一款专为多 AI … · 2026/11/4 23:44:07
脚本库管理实操:从安装社区脚本到离线导入 脚本库管理实操:从安装社区脚本到离线导入 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪 | 桌… · 2026/11/8 12:35:04
ContextMenuManager 右键菜单管理:选对版本、清理冗余、快速上手完整指南 ContextMenuManager 右键菜单管理:选对版本、清理冗余、快速上手完整指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager
ContextMenuManager 是一款… · 2026/11/5 1:22:36
哈尔滨在哪能考电工证千万别踩坑,实操考试心里没底怕挂科 哈尔滨在哪能考电工证千万别踩坑,实操考试心里没底怕挂科 实操考试心里没底怕挂科,这几乎是每个想考电工证的人都会有的想法。特别是对那些在工地、车间一线工作的工人来说,电工证不仅是一张证书,更是他们工作的通行证。但问题来了:… · 2026/11/11 3:11:13
电工证要复审了丢了怎么补救 电子证书帮你解决燃眉之急 电工证要复审了丢了怎么补救 电子证书帮你解决燃眉之急 工地太忙根本没时间复习考试,现在电工证要复审了,结果发现证书丢了,这事儿可真让人头疼。特别是三门峡房建工程的工友,经常在项目赶工期时被各种琐事牵绊,证书丢了不仅影响复审进度,还可能影响后… · 2026/11/11 3:11:13
电工证要复审了丢了?值不值得考?别等丢了才慌! 电工证要复审了丢了?值不值得考?别等丢了才慌! 急需特种作业证才能上岗找工作,可偏偏这时候电工证要复审了,结果一不小心丢了,整个人都懵了。现在不是随便找个电工就能上岗的年代,特种作业证不光是入职门槛,更是你能否在这个行业立足的“身份证”。电… · 2026/11/11 3:11:13
电工证复审回执值不值得考?实操考试心里没底怕挂科怎么办? 电工证复审回执值不值得考?实操考试心里没底怕挂科怎么办? 实操考试心里没底怕挂科,这几乎是每个准备考电工证的学员都有的焦虑。尤其是像你这样,是驻马店中小施工企业负责人,需要为团队办理电工证复审回执,更要面对考试和复审双重压力。今天咱们不绕弯… · 2026/11/11 3:10:13
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43
_中职电工证最新政策解读 中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52
昆明电工证培训价格值不值得考?老电工告诉你真相 昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52
特种电缆张工网上查询全攻略:外省证如何转过来 特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47