基于计算机视觉的工地钢筋计数

手动钢筋计数是一项耗时的任务,而且容易出错和不一致。但是,你可以使用计算机视觉自动进行钢筋计数。你可以使用经过微调的计算机视觉模型来计算单个钢筋,这对于构建库存管理和质量验证系统非常有用

在这篇博文中,我们将学习如何使用计算机视觉自动进行钢筋计数。我们将构建的钢筋计数系统使用摄像头捕捉钢筋排列的图像,并应用使用 Roboflow 构建和托管的计算机视觉模型来分析和解释视觉数据。

Roboflow Universe 上已经有一个可用于钢筋计数的公共模型,因此我们不必训练模型。相反,我们可以使用现有的模型。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、钢筋计数 API

在我们的最终应用程序中,用户将实时获取钢筋图像,这些图像存储在服务器上。之后,我们可以调用钢筋计数模式来检测和计算每幅图像中的钢筋总数。下图显示了我们的应用程序的结构。

对于这个项目,我们将使用 Roboflow Universe 提供的钢筋计数 API 和 Roboflow 托管 API,用于基于 PHP 部署钢筋计数应用程序。

Roboflow Universe 的钢筋计数项目是在钢筋数据集上进行训练的。该项目的训练模型可通过托管推理 API 和其他部署方法获得预测。

训练后的模型能够使用图像中的边界框准确检测钢筋,并可进一步利用这些钢筋来构建我们的应用程序。

2、构建应用程序

要构建应用程序,我们将在 PHP 应用程序中使用 Roboflow 托管 API。首先,我们需要获取所需的信息,例如模型 ID 和 API 密钥,这可以通过访问项目页面上的 API 文档链接来完成。

以下是测试模型的简单 PHP 代码。我们将使用下图来测试应用程序。

以下是我们可以用来测试模型的代码:

<?php// Base 64 Encode Image
$data = base64_encode(file_get_contents("rebar.jpg"));$api_key = "API_Key"; // Set API Key
$model_endpoint = "rebar-dataset-qchab/2"; // Set model endpoint (Found in Dataset URL)// URL for Http Request
$url = "https://detect.roboflow.com/" . $model_endpoint
. "?api_key=" . $api_key
. "&name=rebar.jpg";// Setup + Send Http request
$options = array('http' => array ('header' => "Content-type: application/x-www-form-urlencoded\r\n",'method'  => 'POST','content' => $data));$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
?>

运行上述代码将生成以下输出:

{"time":0.05434697300006519,"image":{"width":640,"height":640},"predictions":[{"x":137.5,"y":284.0,"width":21.0,"height":28.0,"confidence":0.8618741035461426,"class":"0","class_id":0,"detection_id":"c146c502-0a99-41c8-b9c1-b62df14dc875"},{"x":248.0,"y":517.0,"width":22.0,"height":30.0,"confidence":0.8511471748352051,"class":"0","class_id":0,"detection_id":"838f948f-93a2-4551-a85e-db9942ad6b80"},{"x":182.5,"y":428.0,"width":21.0,"height":30.0,"confidence":0.8510258197784424,"class":"0","class_id":0,"detection_id":"c4dc9cf0-aec2-4f80-b9c7-ae4cb8fcb93d"},{"x":221.5,"y":498.5,"width":21.0,"height":29.0,"confidence":0.8491973876953125,"class":"0","class_id":0,"detection_id":"eb2fff69-dbf7-496b-b33d-8753bea8a4ae"},...

结果以 JSON 格式返回,此信息将在我们的 PHP 代码中用于在检测到的钢筋实例上绘制边界框并计算钢筋总数。

3、构建用户界面

我们现在将构建以下界面,该界面将允许用户浏览和上传捕获的图像,然后运行预测以检测和计算图像中的钢筋。

选择图像并单击“运行预测”按钮后,将显示结果输出。如下图所示,应用程序在每个检测到的对象上绘制一个边界框,并显示检测到的总对象数:

现在让我们了解构建应用程序的代码。代码分为以下几个部分:

  • 表单提交检查
  • 图像处理
  • HTML 输出
  • 显示结果

表单提交检查:首先,我们指定一个条件语句来检查表单是否已通过 POST 方法提交以及是否已上传图像文件:

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["image"])) {// Image processing code} else {// Default response if no image is uploaded
}

此条件确保仅当表单提交了图像文件时才会执行后续代码。

图像处理:在 if 块中,代码处理上传的图像。以下是处理图像的代码。

$image_data = file_get_contents($_FILES["image"]["tmp_name"]);$base64_image = base64_encode($image_data);$api_key = "API_KEY"; // Set API Key$model_endpoint = "rebar-dataset-qchab/2"; // Set model endpoint (Found in Dataset URL)// URL for Http Request$url = "https://detect.roboflow.com/" . $model_endpoint . "?api_key=" . $api_key;// Setup + Send Http request$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded\r\n",'method' => 'POST','content' => $base64_image));$context = stream_context_create($options);$result = file_get_contents($url, false, $context);// Decode JSON response$response = json_decode($result, true);

首先,我们的代码读取上传的图像文件的内容并将其转换为 base64 编码的字符串。随后,代码设置访问机器学习模型端点的基本参数,包括 API 密钥和来自 Roboflow 的模型端点 URL。

我们的代码构建一个包含必要标头和内容的 HTTP 请求,封装 base64 编码的图像数据。然后使用 POST 方法将此请求分派到指定的模型端点。在收到来自模型端点的响应(通常包含有关图像中检测到的对象的信息)后,JSON 响应将解码为关联数组,以便在应用程序中进一步处理。

HTML 输出:HTML 标记用于显示用于上传图像的表单并在 HTML 画布中显示处理后的图像。

    <h2>Rebar Counting Application</h2><form action="" method="post" enctype="multipart/form-data"><input type="file" name="image" accept="image/*"><button type="submit">Run Prediction</button><br/><br/></form><div id="canvas-container"><canvas id="canvas"></canvas></div><br/><div><label for="object-count">Total Objects Detected:</label><input type="text" id="object-count" readonly value="<?= count($response["predictions"]) ?>"></div>

此 HTML 标记包含一个表单,其中有一个用于上传图像的输入字段和一个提交按钮。它还包括一个画布元素,其中将显示带有边界框的处理后的图像。用户界面中的文本框显示检测到的对象的数量。此外,用于加载图像和绘制边界框的 JavaScript 代码包含在 HTML 中:

 <script>var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");// Load image if available<?php if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["image"])): ?>var img = new Image();img.onload = function() {canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);// Draw bounding boxesvar predictions = <?= json_encode($response["predictions"]) ?>;var color = "rgb(103, 251, 25)"; // Red color for bounding boxespredictions.forEach(function(prediction) {var x1 = prediction.x - prediction.width / 2;var y1 = prediction.y - prediction.height / 2;var x2 = prediction.x + prediction.width / 2;var y2 = prediction.y + prediction.height / 2;// Draw bounding boxctx.beginPath();ctx.rect(x1, y1, x2 - x1, y2 - y1);ctx.strokeStyle = color;ctx.stroke();});// Update object countdocument.getElementById("object-count").value = predictions.length;};img.src = "data:image/jpeg;base64,<?= $base64_image ?>";<?php endif; ?></script>

仅当表单随图片一起提交时,才会执行此 JavaScript 代码。它会将图片加载到画布上,并根据从模型端点收到的响应在检测到的对象周围绘制边界框。您可以参考本指南了解如何从推理 API JSON 输出中绘制边界框。

以下是此博客文章的完整代码。将此代码保存在 .php 文件中并在 Web 服务器环境中执行。

<?phpif ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["image"])) {// Base 64 Encode Image$image_data = file_get_contents($_FILES["image"]["tmp_name"]);$base64_image = base64_encode($image_data);$api_key = "API_KEY"; // Set API Key$model_endpoint = "rebar-dataset-qchab/2"; // Set model endpoint (Found in Dataset URL)// URL for Http Request$url = "https://detect.roboflow.com/" . $model_endpoint . "?api_key=" . $api_key;// Setup + Send Http request$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded\r\n",'method' => 'POST','content' => $base64_image));$context = stream_context_create($options);$result = file_get_contents($url, false, $context);// Decode JSON response$response = json_decode($result, true);
} else {$response = array("predictions" => []);
}// Create canvas size
$canvas_width = 400; // Specify canvas width
$canvas_height = 400; // Specify canvas height// Start HTML output
?>
<!DOCTYPE html>
<html>
<head><title>Image with Bounding Boxes</title><style>#canvas-container {width: <?= $canvas_width ?>px;height: <?= $canvas_height ?>px;overflow: auto;}#canvas {width: <?= $canvas_width ?>px;height: <?= $canvas_height ?>px;}</style>
</head>
<body style="padding-left: 50px;"><h2>Rebar Counting Application</h2><form action="" method="post" enctype="multipart/form-data"><input type="file" name="image" accept="image/*"><button type="submit">Run Prediction</button><br/><br/></form><div id="canvas-container"><canvas id="canvas"></canvas></div><br/><div><label for="object-count">Total Objects Detected:</label><input type="text" id="object-count" readonly value="<?= count($response["predictions"]) ?>"></div><script>var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");// Load image if available<?php if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["image"])): ?>var img = new Image();img.onload = function() {canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);// Draw bounding boxesvar predictions = <?= json_encode($response["predictions"]) ?>;var color = "rgb(103, 251, 25)"; // Red color for bounding boxespredictions.forEach(function(prediction) {var x1 = prediction.x - prediction.width / 2;var y1 = prediction.y - prediction.height / 2;var x2 = prediction.x + prediction.width / 2;var y2 = prediction.y + prediction.height / 2;// Draw bounding boxctx.beginPath();ctx.rect(x1, y1, x2 - x1, y2 - y1);ctx.strokeStyle = color;ctx.stroke();});// Update object countdocument.getElementById("object-count").value = predictions.length;};img.src = "data:image/jpeg;base64,<?= $base64_image ?>";<?php endif; ?></script>
</body>
</html>

4、结束语

这篇博文展示了如何使用 Roboflow 世界中的钢筋计数 API 构建钢筋检测和计数应用程序,该应用程序结合使用了 Roboflow 托管 API 和 PHP 代码。

该应用程序有效地识别和检测钢筋实例,并显示总计数。为了扩展其功能,可以通过集成数据库来增强应用程序,以永久存储钢筋批次的批号及其各自的计数。然后可以以各种方式利用这些存储的数据来增强应用程序的实用性和分析能力。


原文链接:钢筋计数AI应用 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成树(STP)协议

一、生成树的技术背景 1、交换机单线路上链,存在单点故障,上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,网络将面临断网。 总结:以下网络不够健壮,不具备冗余性。 2、因此引入如下网络拓扑结构: 上述冗余拓扑能够解决单点故障问题,但同时冗拓扑也带来了…

【Godot4.2】MLTag类:HTML、XML通用标签类

概述 HTML和XML采用类似的标签形式。 之前在Godot中以函数库形式实现了网页标签和内容生成。能用&#xff0c;但是缺点也很明显。函数之间没有从属关系&#xff0c;但是多有依赖&#xff0c;而且没有划分出各种对象和类型。 如果以完全的面向对象形式来设计标签类或者元素类…

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合

一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500&#xff0c;w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中&#xff0c;可以使用VideoCapture来读取视频文件&#xff0c;或是摄像头数…

华为USG6000V防火墙安全策略用户认证

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1&#x1f923;防火墙FW1web服务配置 2.网络配置 要求1&#xff1a;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 要求2&#xff1a;生产区不…

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…

拒绝废话:computed、watch和methods的区分和使用场景

computed、watch和methods是用于处理数据和响应数据变化的不同方式&#xff0c;三者之间有什么不同呢&#xff0c;贝格前端工场作为10年前端老司机&#xff0c;用浅显的语言给大家分享一下。 computed&#xff1a; computed属性是用来定义一个基于依赖的响应式属性。它会根据…

OrangePi 学习摘录

文章目录 1. 参考2. 开发板 Orange-Pi-CM4 预览3. 烧录 Linux 镜像到 TF 卡中4. 制作桌面版镜像qemu/chroot 5. Armbian6. 编译 1. 参考 淘宝 香橙派官网 Orange-Pi-3B Orange-Pi-CM4 基于docker构建香橙派zero系统构建环境 2. 开发板 Orange-Pi-CM4 预览 3. 烧录 Linux 镜像…

微信小程序基本语法

官网 https://developers.weixin.qq.com/miniprogram/dev/framework/ 视频教程&#xff1a;尚硅谷微信小程序开发教程&#xff0c;2024最新微信小程序项目实战&#xff01; 仿慕尚花坊项目源码&#xff1a;https://gitee.com/abcdfdewrw/flower-workshop 目录 一&#xff0c;初…

【深度学习】BeautyGAN: 美妆,化妆,人脸美妆

https://www.sysu-hcp.net/userfiles/files/2021/03/01/3327b564380f20c9.pdf 【深度学习】BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversaria…

交叉编译ethtool(ubuntu 2018)

参考文章&#xff1a;https://www.cnblogs.com/nazhen/p/16800427.html https://blog.csdn.net/weixin_43128044/article/details/137953913 1、下载相关安装包 //ethtool依赖libmul git clone http://git.netfilter.org/libmnl //ethtool源码 git clone http://git.kernel.or…

国家护网行动面试题总结

一、信息收集流程 1.获取域名的 whois 信息 , 获取注册者邮箱姓名电话等。 2.通过站长之家、明小子、 k8 、站长之家等查询服务器旁站以及子域名站点&#xff0c;因为主站一般 比较难&#xff0c;所以先看看旁站有没有通用性的 cms 或者其他漏洞。 3、通过 DNS 域传送…

PriorityQueue 阅读记录

1、前言 1、优先队列&#xff0c;底层通过数组来构造树&#xff08;二叉树) 来实现的。 2、默认是最小堆&#xff08;取出来的是最小值)&#xff0c;可以通过传入一个比较器 comparator 来构造一个最大堆。 3、传入的参数不能为空&#xff0c;否则抛出NPE问题。 4、最大堆的…

Study--Oracle-07-ASM自动存储管理(一)

一、ASM实例和数据库实例对应关系 1、ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能&#xff0c;这是Oracle自己提供的卷管理器&#xff0c;主要用于替代操作系统所提供的LVM&#xff0c;它不仅支持单实例&#xff0c;同时对RAC的支持也是非常好。ASM可…

汽车开发阶段(OTS/VFF/PVS/OS/SOP)

OTS&#xff1a;即英语中的Off Tooling Sample&#xff0c;通常被称为工装样件。它指的是通过配套设备、工装夹具以及模具制造出来的样品&#xff0c;但并不强调生产的时间效率&#xff0c;主要用于验证产品的设计能力。 VFF&#xff1a;在德语中表示为Vorserien Freigabefahr…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读、捕获文件格式转换错误ExcelDataConvertException

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

C++基础知识:C++内存分区模型,全局变量和静态变量以及常量,常量区,字符串常量和其他常量,栈区,堆区,代码区和全局区

1.C内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff08;在编译器中所书写的代码都会存放在这个空间。&#xff09; 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分…

Mysql具体数据操作和表的约束(上)

表中数据的增删改查 插入数据(添加数据) 1.按指定字段插入数据:insert into <表名> (字段1,字段2,...) values (),(),.... 注意1:values后面的括号是指行数(几条记录),一个括号表示插入一条记录,多个括号以此类推 注意2:values后面括号内部插入的数据…

【python学习】第三方库之pandas库的定义、特点、功能、使用场景和代码示例

引言 pandas是一个强大的Python库&#xff0c;用于数据分析和数据处理。它基于NumPy&#xff0c;提供了灵活的数据结构&#xff08;Series和DataFrame&#xff09;和数据操作功能&#xff0c;是数据科学和机器学习中不可或缺的工具 文章目录 引言一、安装pandas第三方库二、pan…

nginx反向代理实例

一. 准备工作 1.1 ngnix的安装 nginx基本概念和安装-CSDN博客 1.2 安装tomcat tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;适用于中小型系统和并发访问用户不是很多的情况。 前往官网网站&#xff1a;Apache Tomcat - Ap…

C++迈向精通:模板中的引用与remove_reference原理

remove_reference 原理 模板中的引用参数 在模板中&#xff0c;双 &‘ 会被解析为“引用”&#xff0c;这个“引用”可以是“左值”引用&#xff0c;也可以是“右值”引用。 例如&#xff1a; template <typename T> void func(T &&a) {std::cout <&l…