使用 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 版权协议,转载请附上原文出处链接和本声明