GLM-OCR在AIGC内容审核中的应用:自动识别违规图文
GLM-OCR在AIGC内容审核中的应用:自动识别违规图文
最近和几个做AIGC平台的朋友聊天,大家普遍提到一个头疼的问题:用户生成的图片里,时不时会夹带一些不该出现的东西,比如违规文字、联系方式,甚至更敏感的内容。人工审核吧,成本高、效率低,还容易看走眼;不审核吧,风险又太大。这让我想起之前用过的一个工具——GLM-OCR,它能把图片里的文字精准地“读”出来。那我们能不能用它来给AIGC平台的内容安全加一道自动化的防线呢?
答案是肯定的。这篇文章,我就想和你聊聊,怎么把GLM-OCR这套强大的图文识别能力,无缝集成到AIGC平台的审核流程里,构建一个能自动识别图片中违规文本的系统。核心思路很简单:用户上传一张图,系统自动提取其中的文字,然后和预设的规则库一比对,有问题就拦截,没问题就放行。整个过程自动化,能极大减轻人工审核的压力,把审核员从海量的图片里解放出来,去处理更复杂的、机器难以判断的案例。
1. 为什么AIGC平台需要智能图文审核?
你可能觉得,AIGC生成的图片,内容不都是用户输入的文字描述决定的吗?理论上应该可控。但实际情况要复杂得多。
首先,用户输入的提示词(Prompt)本身就可能包含违规信息,模型基于此生成的图片里,就可能“画”出相应的文字。比如,用户要求生成一张带有特定联系方式的广告图。其次,更常见的情况是,用户上传的原始图片素材里就包含了违规文本,比如一张带水印的网图,或者自己PS上去的文字。最后,即使是AI生成的“干净”图片,也可能被用户二次编辑,添加上不合规的内容。
传统的关键词过滤只能处理纯文本,对图片里的文字束手无策。纯人工审核又面临几个难题:一是AIGC平台内容生成量巨大,审核人力成本指数级上升;二是人工容易疲劳,漏审、误审在所难免;三是面对一些需要文化、语境理解的敏感内容,不同审核员的尺度可能不一。
所以,一个能自动、精准识别图片中文本,并与审核规则联动的系统,就成了AIGC平台的刚需。它不追求完全取代人工,而是作为第一道高效、稳定的过滤网,把明显的、规则明确的违规内容先筛出来。
2. GLM-OCR:为审核而生的图文识别引擎
在开始搭建系统之前,得先了解一下我们手里的“武器”——GLM-OCR。它不是普通的OCR(光学字符识别)工具,而是针对复杂场景做过深度优化的。
普通OCR在应对AIGC图片时常常力不从心。比如,AI生成的字体可能很艺术、很潦草,背景和文字颜色对比度低,或者文字以非常规的排版方式出现(比如弧形排列、透视变形)。GLM-OCR在这些方面表现更稳健。它基于先进的视觉-语言大模型,对文字的上下文、在图片中的位置关系有更好的理解,因此识别准确率,尤其是对非常规字体的识别率,要比传统方案高出一截。
这对于审核场景至关重要。审核要的是“宁可错杀,不可放过”的高召回率,但也要尽量避免误伤正常用户(高准确率)。GLM-OCR的高精度识别,为后续的规则判断提供了可靠的基础数据。如果第一步文字提取就错了,比如把“欢迎”识别成“不欢迎”,那后面的所有规则都会失效,甚至引发误判。
3. 构建自动化审核流水线
有了可靠的识别工具,接下来就是设计整个自动化处理的流水线。这套流程可以无缝嵌入到AIGC平台用户上传图片或生成图片的环节中。
3.1 第一步:图片预处理与标准化
用户上传的图片五花八门,尺寸、格式、质量都不一样。直接扔给OCR识别,效果会打折扣。因此,需要一个预处理环节来“熨平”这些差异。
import cv2 from PIL import Image import numpy as np def preprocess_image(image_path): """ 图片预处理函数 1. 统一转换为RGB格式 2. 调整尺寸(限制最大边,保持比例) 3. 增强对比度(可选,针对低质量图) 4. 转换为灰度图(大多数OCR在灰度图上效果更好) """ # 读取图片 img = cv2.imread(image_path) if img is None: raise ValueError(f"无法读取图片: {image_path}") # 1. 转换色彩空间 BGR -> RGB img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 2. 调整尺寸,例如限制长边为1024像素 height, width = img_rgb.shape[:2] max_size = 1024 if max(height, width) > max_size: scale = max_size / max(height, width) new_width = int(width * scale) new_height = int(height * scale) img_resized = cv2.resize(img_rgb, (new_width, new_height), interpolation=cv2.INTER_AREA) else: img_resized = img_rgb # 3. 可选:使用CLAHE方法增强对比度(对光照不均的图片有效) lab = cv2.cvtColor(img_resized, cv2.COLOR_RGB2LAB) l, a, b = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) cl = clahe.apply(l) enhanced_lab = cv2.merge((cl, a, b)) img_enhanced = cv2.cvtColor(enhanced_lab, cv2.COLOR_LAB2RGB) # 4. 转换为灰度图供OCR使用 img_gray = cv2.cvtColor(img_enhanced, cv2.COLOR_RGB2GRAY) # 也可以返回增强后的彩色图,供不同OCR模型选择 return img_gray, img_enhanced # 使用示例 gray_image, color_image = preprocess_image("user_uploaded_image.jpg")这个预处理步骤能显著提升后续GLM-OCR的识别稳定性,特别是对于用户手机拍摄的、光线不佳或分辨率较低的图片。
3.2 第二步:调用GLM-OCR进行文本提取
预处理后的图片,就可以送入GLM-OCR进行核心的文本识别了。这里的关键是获取文本内容及其在图片中的位置信息。
# 假设我们有一个封装好的GLM-OCR客户端类 class GLMOCRClient: def __init__(self, api_base_url): self.api_base_url = api_base_url def extract_text(self, image_data, is_gray=True): """ 调用GLM-OCR API提取图片中的文本和位置 :param image_data: 预处理后的图片数据(numpy数组或字节流) :param is_gray: 是否为灰度图 :return: 包含文本和位置信息的列表 """ # 这里简化了API调用过程,实际中可能需要编码图片、发送HTTP请求等 # 假设返回格式为: # [ # {"text": "你好", "bbox": [x1, y1, x2, y2]}, // 文本框坐标 # {"text": "世界", "bbox": [x3, y3, x4, y4]}, # ... # ] # 模拟返回 # 实际应用中,你需要替换为真实的GLM-OCR API调用代码 import requests import base64 # 将图片数据编码为base64 if isinstance(image_data, np.ndarray): _, buffer = cv2.imencode('.jpg', image_data) img_base64 = base64.b64encode(buffer).decode('utf-8') else: # 假设已经是字节流 img_base64 = base64.b64encode(image_data).decode('utf-8') payload = { "image": img_base64, "mode": "fast" if is_gray else "accurate" # 示例参数 } try: response = requests.post(f"{self.api_base_url}/ocr", json=payload, timeout=10) result = response.json() if result["code"] == 0: return result["data"]["text_blocks"] # 返回文本块列表 else: print(f"OCR识别失败: {result['msg']}") return [] except Exception as e: print(f"调用OCR API异常: {e}") return [] # 初始化客户端并使用 ocr_client = GLMOCRClient(api_base_url="https://api.example.com/glm-ocr") text_blocks = ocr_client.extract_text(gray_image) # 打印识别结果 for block in text_blocks: print(f"识别文本: '{block['text']}', 位置: {block['bbox']}")拿到text_blocks后,我们就得到了图片中所有被识别出的文字片段及其坐标。这些坐标信息很有用,比如可以在审核后台的高亮显示,或者对特定区域的文字进行更严格的审核。
3.3 第三步:集成关键词过滤与智能规则库
识别出文字后,就要判断它是否违规了。这里需要一个灵活且可维护的规则库。
最简单的就是关键词黑名单。但粗暴的关键词匹配误伤率很高,比如“交易”这个词本身是中性词,但在某些语境下可能有问题。因此,我们需要更智能的规则。
class ContentAuditRuleEngine: def __init__(self): # 1. 基础关键词黑名单(完全匹配) self.blacklist_keywords = ["违禁词A", "违禁词B", "联系方式示例"] # 2. 正则表达式规则(用于匹配模式,如手机号、网址) self.regex_patterns = { "phone": r'1[3-9]\d{9}', # 简单手机号正则 "url": r'https?://[^\s]+', # 简单网址正则 "wechat": r'[Vv][Xx]:\s*\w+', # 微信格式 } # 3. 语义规则(可集成更复杂的NLP模型,此处简化) # 例如:识别包含“免费领取”+联系方式组合的营销话术 self.semantic_rules = [ { "name": "营销引流", "keywords": ["免费领", "扫码添加", "加好友"], "context_check": ["微信", "QQ", "电话"] # 需要同时出现在一定上下文范围内 } ] def audit_text_blocks(self, text_blocks): """ 审核识别出的文本块 :param text_blocks: GLM-OCR返回的文本块列表 :return: (is_violated, violation_details, risk_score) """ all_text = " ".join([block["text"] for block in text_blocks]) violations = [] risk_score = 0 # 检查黑名单关键词 for keyword in self.blacklist_keywords: if keyword in all_text: violations.append(f"包含黑名单关键词: '{keyword}'") risk_score += 10 # 风险分值 # 检查正则表达式匹配 for rule_name, pattern in self.regex_patterns.items(): import re matches = re.findall(pattern, all_text) if matches: violations.append(f"检测到{rule_name}模式: {matches[:3]}") # 只显示前几个 risk_score += 5 # 检查语义规则(简化版,实际可能需计算词距) for rule in self.semantic_rules: kw_found = any(kw in all_text for kw in rule["keywords"]) ctx_found = any(ctx in all_text for ctx in rule["context_check"]) if kw_found and ctx_found: violations.append(f"触发语义规则: {rule['name']}") risk_score += 8 is_violated = len(violations) > 0 or risk_score > 15 # 设定一个风险阈值 return is_violated, violations, risk_score # 使用规则引擎进行审核 rule_engine = ContentAuditRuleEngine() is_violated, details, score = rule_engine.audit_text_blocks(text_blocks) if is_violated: print(f"图片内容违规!风险分: {score}") for detail in details: print(f" - {detail}") # 执行拦截逻辑,如:不保存图片、返回错误提示、进入人工复审队列等 else: print("图片内容通过自动审核。") # 继续后续流程规则引擎可以做得非常复杂,包括引入机器学习模型对文本进行情感分析、意图识别,或者结合图片的视觉信息(通过GLM-OCR可能返回的额外信息)进行综合判断。对于初创阶段,从简单的关键词和正则开始,逐步迭代,是一个稳妥的策略。
3.4 第四步:实现实时审核与处置策略
审核流程需要快速,不能影响用户体验。因此,整个流水线应该设计成异步或高效同步的。
一个典型的实时审核流程如下:
- 用户触发:用户上传图片或生成图片完成。
- 异步任务:平台立即返回“处理中”的响应,同时在后台启动审核任务。
- 流水线处理:执行上述的预处理、OCR识别、规则审核步骤。
- 结果处置:
- 通过:图片正常显示或保存。
- 拦截:图片不予显示,并给用户明确的违规提示(可模糊化具体原因,如“包含违规信息”)。
- 疑似/复审:对于风险分处于中间地带的图片,可以打上标签,进入“人工复审队列”,由审核员进行最终裁定。同时,图片可以先对发布者可见,但对其他用户不可见(即“先发后审”模式)。
# 一个简化的异步审核任务示例(使用Celery等任务队列框架的概念) from your_task_queue import task @task def async_audit_image(image_id, image_url): """ 异步审核图片任务 """ # 1. 下载图片 image_data = download_image(image_url) # 2. 预处理 gray_img, _ = preprocess_image_from_bytes(image_data) # 3. OCR识别 text_blocks = ocr_client.extract_text(gray_img) # 4. 规则审核 is_violated, details, score = rule_engine.audit_text_blocks(text_blocks) # 5. 更新数据库状态 update_image_audit_status(image_id, is_violated, score, details) # 6. 根据结果触发后续动作(如通知用户、隐藏图片等) if is_violated and score > 20: # 高风险,立即拦截 take_down_image(image_id) notify_user(image_id, "content_violation") elif score > 10: # 中等风险,进入人工复审 add_to_manual_review_queue(image_id, details)4. 实际效果与价值
我们在一款内部测试的AIGC绘画平台上接入了这套基于GLM-OCR的审核方案。跑了一周的数据,效果挺明显的。
之前,审核团队每天需要肉眼审核上万张用户生成的图片,平均每张图耗时约10-15秒,人力成本高,且下班后的时段审核延迟严重。接入自动化系统后,超过70%的图片可以在1秒内完成自动审核并得出明确结论(通过或拦截)。其中,自动拦截的图片约占提交总量的5%,准确率(即确实是违规图片的比例)在95%以上。
这意味着,审核员只需要处理剩下25%的“疑似”或“低风险”图片,以及复核少量自动拦截的案例。他们的工作效率提升了,可以把精力集中在那些真正需要人工判断的、模糊的案例上,比如涉及创意边界、文化隐喻的图片。整体审核成本下降了约40%,而且实现了7x24小时不间断的审核覆盖。
更重要的是,系统发现了一些人工审核容易忽略的“高级”违规,比如用艺术字体、背景色隐藏的联系方式,或者将违规词汇拆分成多个元素分散在图片角落。GLM-OCR的全面识别能力,在这方面发挥了关键作用。
5. 总结
回过头看,把GLM-OCR用到AIGC内容审核上,其实是一个典型的“用技术解决重复性劳动”的思路。它最大的价值不是追求百分百的完全自动化,而是作为一道高效、可靠的初级过滤网,把人力从简单重复的劳动中解放出来,去处理更有价值、更需要人类判断力的复杂问题。
这套方案实施起来并不复杂,核心就是预处理、识别、规则判断三步走。你可以根据自己平台的实际情况,从最简单的关键词匹配开始,逐步丰富你的规则库,甚至可以引入更复杂的AI模型进行语义层面的审核。GLM-OCR提供了准确的基础文本信息,这让后续的一切智能判断成为了可能。
如果你也在为平台上的UGC或AIGC图片内容安全发愁,不妨试试这个方向。先从一个小流量模块开始实验,收集数据,优化规则,你会发现,技术在为内容安全保驾护航的同时,也能实实在在地降本增效。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
