使用 YoloV5 和 AWS Rekognition 将便利贴同步到 Miro

使用 YoloV5 和 AWS Rekognition 将便利贴同步到 Miro

介绍

在我的办公桌前,我有我的笔记本电脑、两个大显示器、一支笔和一包便利贴。我喜欢使用便利贴!非常适合头脑风暴、计划和随机信息的提醒。

这些便利贴总是以某种方式出现在我的显示器上,这使得它们的表面非常昂贵,可用于粘贴纸片。

我们最近开始使用 Miro。我喜欢它!它非常适合头脑风暴、计划和复古。

我可以使用它作为我的 Post-Its-on-Monitors 情况的替代品吗?让我们创建一个服务来检测 Post-It,执行 OCR,并将该信息与 Miro 同步;这只是合乎逻辑的。所以让我们潜入水中。

标记和训练检测模型

在我们训练检测服务之前,我们需要创建一个数据集。我为我的便利贴拍了大约 40 张照片,并用 标签工作室 .

Labeling via Label Studio

我使用了 Label Studio Docker 映像。

 docker run -it -p 8080:8080 -v `pwd`/mydata:/label-studio/data heartexlabs/label-studio:latest

从 Label Studio,您可以导出 Yolo 数据集(包含所有图像的图像文件夹和包含所有标签的标签文件夹)。现在唯一剩下的就是将此数据集拆分为测试集和训练集。我选择了 80/20 拆分,这意味着 80% 的数据将用于训练目的,20% 用于测试目的。

YoloV5 使训练自定义检测模型变得超级容易。您需要做的就是创建一个配置文件来告诉 Yolo 您的数据在哪里(当然,您可以做的还不止这些)。但由于我此时过度设计了这一点,而不是仅仅在 Miro 中手动创建便签,所以我将坚持使用默认模型参数。

 git 克隆[ https://github.com/ultralytics/yolov5.git](https://github.com/ultralytics/yolov5.git)

我的配置文件( postit.yaml ) 好像:

 # Train/val/test 设置为 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, .. ]  
 path: mydata/media/upload/1 # 数据集根目录  
 train: images/train # 训练图像(相对于“路径”)  
 val: images/validate # val images (relative to 'path')  
 test: images/test # 测试图片(可选) # 类  
 nc: 1 # 类数  
 names: ['PostIt'] # 类名

我们将从您可以找到的 YOLOv5 (yolov5l6.pt) 的预训练检查点开始 这里 .

我们准备好训练了。我采用了 4 的批量大小、1000 像素的图像宽度和 50 个 epoch。我使用了 AWS ml.g4dn.xlarge 训练这个模型的实例(完成 50 个 epoch 大约需要 35 分钟)。

 python3 yolov5/train.py --batch-size 4 --img 1000 --epochs 50 --data yolov5-config/postit.yaml --weights yolov5l6.pt --project=runs/train --name training --exist -好的

Training results (Could have trained it longer / try variations — but for my purpose this was good enough) (x-axis as the 50 epochs)

训练结果将被保存,并显示最佳模型 跑步/训练/训练/权重/best.pt

Yeah! good enough on the validation set!

运行预测并执行 OCR

首先,需要加载YoloV5模型才能使用。

 导入系统  
 sys.path.append('yolov5') 从 models.common 导入 DetectMultiBackend  
 从 utils.datasets 导入 LoadImages  
 从 utils.general 导入(check_img_size,non_max_suppression,  
 scale_coords, xyxy2xywh)  
 从 utils.torch_utils 导入 select_device # 获取权重  
 post_it_model = '运行/训练/训练/权重/best.pt' # 加载模型  
 # (使用 yolov5 存储库中提供的帮助器)  
 模型 = DetectMultiBackend(post_it_model, dnn=False)

我曾有一个 YoloDetector 类 我打算在未来使用它,所以我决定使用它并使代码更易于阅读。

 检测器 = YoloDetector('runs/train/exp002/weights/best.pt') #nice

伟大的!现在我们有了一个检测器,让我们裁剪出各个检测以通过 AWS Rekognition for OCR 运行它们。每张图片我们得到 x, y 坐标和 宽度高度 相对于输入图像。

Looking good!

为了使用 AWS Rekognition,该文件需要位于 S3 上。

 s3_client = boto3.client('s3')  
 rekognition_client = boto3.client('rekognition') def upload_file(file_name, bucket, object_name=None):  
 如果 object_name 为无:  
 object_name = os.path.basename(file_name)  
 尝试:  
 response = s3_client.upload_file(file_name, bucket, object_name)  
 除了 ClientError 作为 e:  
 logging.error(e)  
 返回假  
 返回真 def 检测文本(图像,存储桶):  
 response=rekognition_client.detect_text(Image={'S3Object':{'Bucket':bucket,'Name':image}})  
 textDetections=response['TextDetections']  
      
 返回文本检测

伟大的!如果我们现在运行 检测文本 在上图中我们得到

 [{'检测到的文本':' **楷模** ',  
 '类型':'LINE',  
 “身份证”:0,  
 “信心”:98.6706314086914,  
 '几何':{'BoundingBox':{'宽度':0.6352776885032654,  
 “高度”:0.3025865852832794,  
 “左”:0.17596083879470825,  
 '顶部':0.3509500324726105},  
 '多边形':[{'X':0.17596083879470825,'Y':0.4877518117427826},  
 {'X':0.7732686996459961,'Y':0.3509500324726105},  
 {'X':0.8112385272979736,'Y':0.5167348384857178},  
 {'X':0.2139306217432022,'Y':0.6535366177558899}]}},  
 {'检测到的文本':' **楷模** ',  
 '类型':'字',  
 “身份证”:1,  
 '父 ID': 0,  
 “信心”:98.6706314086914,  
 '几何':{'BoundingBox':{'宽度':0.6352776885032654,  
 “高度”:0.3004652261734009,  
 “左”:0.17596083879470825,  
 '顶部':0.35201069712638855},  
 '多边形':[{'X':0.17596083879470825,'Y':0.4877518117427826},  
 {'X':0.7733631134033203,'Y':0.35201069712638855},  
 {'X':0.8112385272979736,'Y':0.5167348384857178},  
 {'X':0.2138361930847168,'Y':0.6524759531021118}]}}]

Rekognition 返回每行和每个单词的文本检测以及置信度分数和位置。对于这个小项目,检测到的行已经足够好(我没有对单个单词进行太多解析,并且相对

将结果发布到 Miro

现在我们已经知道了 Post-It 及其内容的位置,是时候将它们发布到 Miro 了。为此,您需要创建一个开发者帐户(请参阅设置)来创建令牌。 Miro 开发者页面实际上有一个不错的 指导 关于如何做到这一点。

 def create_payload(内容,x,y):  
 有效载荷 = {  
 “数据”: {  
 “内容”:内容,  
 “形状”:“方形”  
 },  
 “风格”: {  
 "fillColor": "light_pink",  
 “文本对齐”:“中心”,  
 “文本对齐垂直”:“顶部”  
 },  
 “位置”: {  
 “x”:x,  
 “和”:和,  
 “起源”:“中心”  
 }  
 }  
      
 返回有效载荷 def create_sticky(url,content, x, y,token):  
 headers = {"Content-Type": "application/json; charset=utf-8", "Authorization": f"Bearer {token}"}  
 数据 = create_payload(内容,x,y)  
 响应 = requests.post(url, headers=headers, json=data)  
 print("创建粘性 - 状态码", response.status_code)

我创建了两种方法: create_payload (,这将创建有效负载以创建 Post-It (x,y 和内容),以及 create_sticky ,这会将有效负载发布到仪表板(url)。

[ board_id](https://api.miro.com/v2/boards/%7Bboard_id%7D/sticky_notes) = "xxxxxxxx" # 按 id 选择板子  
 网址 = f"[ https://api.miro.com/v2/boards/{board_id}/sticky_notes](https://api.miro.com/v2/boards/%7Bboard_id%7D/sticky_notes) "

最后,循环将遍历所有检测,运行 OCR,并创建 Post-It。结果看起来像这样

跟原来一样。相对定位保持得很好。

结束的想法

我对结果很满意。总的来说,我只花了 3 个小时在这个小项目上从头到尾。有很多改进是可能的(我可能永远不会这样做,除非在这里列出它们)

  • 训练更多背景/尺寸/样式的便利贴;
  • 检测颜色;
  • 旋转检测;
  • 一种服务或应用程序,您可以在其中选择 Miro 板并用手机拍照。 YoloV5 有一个导出到 CoreML 的方法,因此可以不费吹灰之力地将 YoloV5 模型移植到 iPhone。在 iPhone 上,OCR 组件可能会被 Apple 的 API 取代。
  • 更好地解析 Rekognition 输出以考虑替代方案和/或使用更具挑战性的笔迹进行更多测试。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/33132/25481308

posted @ 2022-09-13 08:26  哈哈哈来了啊啊啊  阅读(83)  评论(0编辑  收藏  举报