运用Tensorflow进行目标检测

对象检测是一种计算机视觉技术,它使软件系统能够从给定的图像或视频中检测、定位并跟踪物体。对象检测的一个特殊属性是它能识别对象的类别(如人、桌子、椅子等)并在给定图像中指出其具体位置坐标。这个位置通常通过在物体周围绘制一个边界框来指出。边界框可能会也可能不会准确地定位物体的位置。在图像内定位物体的能力定义了用于检测的算法的性能。人脸检测就是对象检测的一个例子。

通常,对象检测任务分为三个步骤:

  • 生成输入的小片段,如下图所示。你可以看到,大量的边界框覆盖了整个图像。
  • 对每个分割的矩形区域进行特征提取,以预测矩形是否包含有效物体。
  • 将重叠的框合并成一个单一的边界矩形(非极大值抑制)。

TensorFlow是一个用于数值计算和大规模机器学习的开源库,它简化了获取数据、训练模型、提供预测和完善未来结果的过程。TensorFlow集合了机器学习和深度学习模型与算法,使用Python作为方便的前端,并在优化的C++中高效运行。

使用TensorFlow进行对象检测,如上所述,使用这个API不一定需要了解神经网络和机器学习的知识,因为我们主要使用API中提供的文件。我们需要的只是一些Python知识和完成这个项目的热情。

按照以下步骤进行:

第1步:创建一个名为ObjectDetection的文件夹,并用VS Code打开。

第2步:通过在VS Code的终端输入以下命令,从Github仓库下载Tensorflow API

git clone https://github.com/tensorflow/models

第3步:设置虚拟环境

python -m venv --system-site-packages .\venv
  • 激活环境
.\venv\Scripts\activate
  • 将pip版本升级到最新
python -m pip install --upgrade --ignore-installed

第4步:安装依赖项

  • 安装并升级tensorflow
pip install tensorflow
pip install --upgrade tensorflow
  • 安装matplotlib
pip install pillow Cython lxml jupyter matplotlib
  • 导航到models文件夹中的research子文件夹。
cd \models\research\

第5步:现在我们需要下载Protocol Buffers(Protobuf),这是谷歌的一种语言中立、平台中立的扩展机制,用于序列化结构化数据,可以想象成XML,但更小、更快、更简单。

  • 在models文件夹的research子文件夹中提取从上述链接下载的zip的内容,并访问bin文件夹,复制那里的protoc.exe的路径。
  • 然后打开“编辑系统环境变量”并点击“环境变量”。
    (i) 在系统变量下选择’path’并点击编辑。
    (ii) 点击新建并粘贴’protoc.exe’的复制路径。
    第6步:然后在VS Code的终端运行这个命令
protoc object_detection/protos/*.proto --python_out=.

第7步:在同一文件夹中创建一个名为detect.py的新Python文件,并粘贴下面给出的代码:

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
import pathlib
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
from IPython.display import display
from object_detection.utils import ops as utils_ops
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util# 当前目录不是models时,改变当前工作目录
while "models" in pathlib.Path.cwd().parts:os.chdir('..')# 加载模型函数
def load_model(model_name):base_url = 'http://download.tensorflow.org/models/object_detection/'model_file = model_name + '.tar.gz'model_dir = tf.keras.utils.get_file(fname=model_name, origin=base_url + model_file,untar=True)model_dir = pathlib.Path(model_dir)/"saved_model"model = tf.saved_model.load(str(model_dir))return model# 路径到标签文件
PATH_TO_LABELS = 'models/research/object_detection/data/mscoco_label_map.pbtxt'
# 创建类别索引
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)# 模型名称
model_name = 'ssd_inception_v2_coco_2017_11_17'
# 加载检测模型
detection_model = load_model(model_name)# 为单个图像运行推理的函数
def run_inference_for_single_image(model, image):image = np.asarray(image)# 输入需要是张量,使用`tf.convert_to_tensor`进行转换。input_tensor = tf.convert_to_tensor(image)# 模型期望图像的批量,所以使用`tf.newaxis`添加一个轴。input_tensor = input_tensor[tf.newaxis,...]# 运行推理model_fn = model.signatures['serving_default']output_dict = model_fn(input_tensor)# 所有输出都是批量张量。# 转换为numpy数组,并取索引[0]来去除批量维度。# 我们只对前num_detections个检测感兴趣。num_detections = int(output_dict.pop('num_detections'))output_dict = {key:value[0, :num_detections].numpy() for key,value in output_dict.items()}output_dict['num_detections'] = num_detections# detection_classes应该是整数。output_dict['detection_classes'] = output_dict['detection_classes'].astype(np.int64)# 处理带有掩模的模型:if 'detection_masks' in output_dict:# 将边框掩模调整到图像大小。detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(output_dict['detection_masks'], output_dict['detection_boxes'],image.shape[0], image.shape[1])      detection_masks_reframed = tf.cast(detection_masks_reframed > 0.5,tf.uint8)output_dict['detection_masks_reframed'] = detection_masks_reframed.numpy()return output_dict# 展示推理的函数
def show_inference(model, frame):# 从摄像头获取画面并将其转换为数组image_np = np.array(frame)# 实际检测。output_dict = run_inference_for_single_image(model, image_np)# 对检测结果进行可视化。vis_util.visualize_boxes_and_labels_on_image_array(image_np,output_dict['detection_boxes'],output_dict['detection_classes'],output_dict['detection_scores'],category_index,instance_masks=output_dict.get('detection_masks_reframed', None),use_normalized_coordinates=True,line_thickness=5)return(image_np)# 现在我们打开摄像头并开始检测物体
import cv2
video_capture = cv2.VideoCapture(0)
while True:# 逐帧捕获re,frame = video_capture.read()Imagenp=show_inference(detection_model, frame)cv2.imshow('object detection', cv2.resize(Imagenp, (800,600)))if cv2.waitKey(1) & 0xFF == ord('q'):break video_capture.release()
cv2.destroyAllWindows()

第7步:对于实时对象检测,我们还需要一个额外的依赖库:OpenCV。因此,要安装OpenCV,请在终端运行以下命令。

pip install opencv-python

第8步:现在我们已经准备就绪,可以执行设置并进行对象检测了。执行’detect.py’文件。

python detect.py

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

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

相关文章

探究java反射取值与方法取值性能对比

探究java反射取值与方法取值性能对比 由于我开发框架时,经常需要对象取值。常用的取值方式有: 反射取值方法调用取值 环境 同一台电脑: jdk 21.0.2 idea 2023.3.3 1. 测试代码(常用) 1.1 反射取值 public stat…

u-boot增加自定义命令

0、说明 本文基于U-Boot 2022.01-v2.07版本进行分析。 1、u-boot编译流程简要分析 2、u-boot启动流程简要分析 3、u-boot增加自定义命令 3.1、u-boot命令行实现简要分析 1)cli_init命令行初始化 cli_init定义在common\cli.c中:void cli_init(void) {…

C++基础入门 --- 练习案例【1-10】

文章目录 C基础入门 --- 练习案例1.三只小猪称体重2.猜数字3.水仙花数4.敲桌子5.乘法口诀表6.五只小猪称体重7.数组元素逆置8.考试成绩统计9.冒泡排序10.结构体数组排序 C基础入门 — 练习案例 1.三只小猪称体重 说明:有三只小猪分别为A、B、C,分别输入三只小猪的…

【Web】浅浅地聊JDBC java.sql.Driver的SPI后门

目录 SPI定义 SPI核心方法和类 最简单的SPIdemo演示 回顾JCBC基本流程 为什么JDBC要有SPI JDBC java.sql.Driver后门利用与验证 SPI定义 SPI: Service Provider Interface 官方定义: 直译过来是服务提供者接口,学名为服务发现机制 它通…

acme.sh申请ssl免费证书

参考 https://blog.csdn.net/fyhju1/article/details/120452141 获取域名服务商AccessKey ID及AccessKey Secret https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair 安装ACME curl https://get.acme.sh | sh source ~/.bashrc如果使用root用户进行安装&…

如何在windows上像linux的ssh一样远程访问其它windows

主要分成两部分: 1. 如何远程执行指令 使用psexec,示例如下: PsExec64.exe \\远程计算机ip -u 用户名 -p 密码 -i cmd.exe 这样你就能连接到远程计算机上执行命令了,效果如下 2. 如何远程拷贝文件 分成两步: net…

【语法基础练习】1.变量、输入输出、表达式与顺序语句

🌸博主主页:釉色清风🌸文章专栏:算法练习🌸今日语录:You don’t know until you try. 文章简介:下面的题目是AcWing网站语法基础练习篇的第一小节,内容基础,难度&#xf…

计算机组成原理-累加器实验——沐雨先生

一、实验目的 1.理解累加器的概念和作用 2.连接运算器、存储器和累加器,熟悉计算机的数据通路 3.掌握使用微命令执行各种操作的方法。 二、实验要求 1.做好实验预习,读懂实验电路图,熟悉实验元器件的功能特性和使用方法。在实验之前设计…

list链表的创建,排序,插入, test ok

1. 链表的建立&#xff0c;打印 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stack> #include <iostream> #include <string.h> #include <string>using namespace std;struct node {int data;s…

Vue项目性能分析工具: vue-cli-plugin-webpack-bundle-analyzer

在优化项目的时候&#xff0c;每次打包后只知道包文件大&#xff0c;却不知道那个文件大&#xff0c;那个文件还有优化的空间&#xff0c;所以&#xff0c;推荐一款工具&#xff0c;只要在项目中安装配置一下&#xff0c;便可以一目了然的呈现出打包后资源所占的比例&#xff0…

【贪心算法】摆动序列

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

【vue项目适配可借助于插件lib-flexible 和postcss-px2rem】

前言&#xff1a;vue项目适配可借助于插件lib-flexible 和postcss-px2rem。 lib-flexible插件的作用&#xff1a;根据屏幕尺寸不同设置html根标签的字体大小&#xff0c;1rem即等于根标签的字体大小。 postcss-px2rem插件的作用&#xff1a;将px转为rem,如此以来我们可以在开…

Python与HTTP服务交互

Python与HTTP服务交互&#xff0c;可以通过http.client requests RissionPage等。 http.client标准库 http.client 是Python标准库中的一个模块&#xff0c;用于发送HTTP请求。这个模块提供了一个低级别的接口&#xff0c;允许你手动构建HTTP请求并处理响应。下面是对 http.c…

(科目三)数据库基础知识

1、基本概念 1.1 数据库 1、数据、信息和数据处理 数据是指表达信息的某种物理符号&#xff1b; 信息是对客观事物的反映&#xff0c;是为某一特定目的二提供的决策数据&#xff1b; 数据处理是指将数据转换成信息的过程&#xff0c;是对各类型的数据进行收集、整理、存储、…

军用技术民用开花,Shokz韶音要做下一个“AirPods”

Shokz韶音对打造消费级骨传导耳机的执念始于2007年。 在这之前&#xff0c;它已经成为亚洲最大的军用耳机生产商&#xff0c;以代工订单为主的商业模式是Shokz韶音的主营业务。虽然Shokz韶音靠代工赚得了第一桶金&#xff0c;但军用耳机的垂直细分市场容量有限&#xff0c;市场…

java构造函数

Java中的构造函数是一种特殊类型的方法&#xff0c;用于在创建对象时初始化对象的状态。构造函数与类同名&#xff0c;没有返回类型&#xff0c;并且在创建对象时自动调用。它可以用于执行必要的初始化操作&#xff0c;例如设置对象的初始值、分配内存等。以下是一个简单的Java…

Python 实现冒泡排序算法

Python 实现冒泡排序算法 下面是用 Python 实现的冒泡排序算法示例代码&#xff1a; def bubble_sort(arr):n len(arr)# 遍历数组元素for i in range(n):# 每次遍历都将最大的元素移动到最后for j in range(0, n-i-1):# 如果相邻的元素逆序&#xff0c;则交换它们if arr[j] …

Kafka数据推送配置 | 如何设置账号密码验证?

背景&#xff1a;之前资产信息用网络接口进行数据推送&#xff0c;但是接口推送需要验证而且反应较慢。Kafak中间件提供了另一种可行的数据推送方式&#xff0c;它可以进行消息队列推送&#xff0c;且反应速度快。但是Kafka需部署在公网环境&#xff0c;并进行登录验证&#xf…

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …

网络信息安全:11个常见漏洞类型汇总

一、SQL注入漏洞 SQL注入攻击&#xff08;SQL Injection&#xff09;&#xff0c;简称注入攻击、SQL注入&#xff0c;被广泛用于非法获取网站控制权&#xff0c;是发生在应用程序的数据库层上的安全漏洞。 在设计程序&#xff0c;忽略了对输入字符串中夹带的SQL指令的检查&…