【YOLOv3 预测】YOLOv3图像输入->处理->输出全过程

2023-05-16

文章目录

  • 1 数据输入输出代码详解
  • 2 yolo.detect_image详解
  • 3 感谢链接

1 数据输入输出代码详解

数据输入方式主要包括三种:

  • 读取本地一张图片(代码中predict状态)
  • 读取本地文件夹中所有图片(代码中dir_predict状态)
  • 视频输入状态(代码中video状态),视频输入又分为摄像头输入和本地视频输入两种,当video_path=0时表示检测摄像头。

将这三种输入方式归总到一个predict.py文件中,从全局角度看图像输入、处理、输出的全过程,其代码如下:

# -----------------------------------------------------------------------#
#   predict.py将单张图片预测、摄像头检测和目录遍历检测等功能
#   整合到了一个py文件中,通过指定mode进行模式的修改。
# -----------------------------------------------------------------------#
import time
import cv2
import numpy as np
from PIL import Image

from yolo import YOLO  # 从yolo.py文件中导入YOLO类,详见下一小节

if __name__ == "__main__":
    yolo = YOLO()  # 在这儿进行类的实例化,详见下一小节
    # ----------------------------------------------------------------------------------------------------------#
    #   mode用于指定测试的模式:
    #   'predict'表示单张图片预测,如果想对预测过程进行修改,如保存图片,截取对象等,可以先看下方详细的注释
    #   'video'表示视频检测,可调用摄像头或者视频进行检测,详情查看下方注释。
    #   'dir_predict'表示遍历文件夹进行检测并保存。默认遍历img文件夹,保存img_out文件夹,详情查看下方注释。
    # ----------------------------------------------------------------------------------------------------------#
    mode = "predict"
    # ----------------------------------------------------------------------------------------------------------#
    #   video_path用于指定视频的路径,当video_path=0时表示检测摄像头
    #   想要检测视频,则设置如video_path = "xxx.mp4"即可,代表读取出根目录下的xxx.mp4文件。
    #   video_save_path表示视频保存的路径,当video_save_path=""时表示不保存
    #   想要保存视频,则设置如video_save_path = "yyy.mp4"即可,代表保存为根目录下的yyy.mp4文件。
    #   video_fps用于保存的视频的fps
    #   video_path、video_save_path和video_fps仅在mode='video'时有效
    #   保存视频时需要ctrl+c退出或者运行到最后一帧才会完成完整的保存步骤。
    # ----------------------------------------------------------------------------------------------------------#
    video_path = 0      # video_path用于指定视频的路径,当video_path=0时表示检测摄像头
    video_save_path = ""
    video_fps = 25.0
    # -------------------------------------------------------------------------#
    #   test_interval用于指定测量fps的时候,图片检测的次数
    #   理论上test_interval越大,fps越准确。
    # -------------------------------------------------------------------------#
    test_interval = 100
    # -------------------------------------------------------------------------#
    #   dir_origin_path指定了用于检测的图片的文件夹路径
    #   dir_save_path指定了检测完图片的保存路径
    #   dir_origin_path和dir_save_path仅在mode='dir_predict'时有效
    # -------------------------------------------------------------------------#
    dir_origin_path = "img/"
    dir_save_path = "img_out/"

    if mode == "predict":
        '''
        1、如果想要进行检测完的图片的保存,利用r_image.save("img.jpg")即可保存,直接在predict.py里进行修改即可。 
        2、如果想要获得预测框的坐标,可以进入yolo.detect_image函数,在绘图部分读取top,left,bottom,right这四个值。
        3、如果想要利用预测框截取下目标,可以进入yolo.detect_image函数,在绘图部分利用获取到的top,left,bottom,right这四个值
        在原图上利用矩阵的方式进行截取。
        4、如果想要在预测图上写额外的字,比如检测到的特定目标的数量,可以进入yolo.detect_image函数,在绘图部分对predicted_class进行判断,
        比如判断if predicted_class == 'car': 即可判断当前目标是否为车,然后记录数量即可。利用draw.text即可写字。
        '''
        while True:
            img = input('Input image filename:')
            try:
                image = Image.open(img)
            except:
                print('Open Error! Try again!')
                continue
            else:
                r_image = yolo.detect_image(image)
                r_image.show()

    elif mode == "video":
        capture = cv2.VideoCapture(video_path)      # video_path用于指定视频的路径,当video_path=0时表示检测摄像头
        if video_save_path != "":
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
            out = cv2.VideoWriter(video_save_path, fourcc, video_fps, size)

        ref, frame = capture.read()
        if not ref:
            raise ValueError("未能正确读取摄像头(视频),请注意是否正确安装摄像头(是否正确填写视频路径)。")

        fps = 0.0
        while (True):
            t1 = time.time()
            # 读取某一帧
            ref, frame = capture.read()
            if not ref:
                break
            # 格式转变,BGRtoRGB
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            # 转变成Image
            frame = Image.fromarray(np.uint8(frame))
            # 进行检测
            frame = np.array(yolo.detect_image(frame))
            # RGBtoBGR满足opencv显示格式
            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

            fps = (fps + (1. / (time.time() - t1))) / 2
            print("fps= %.2f" % (fps))
            frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

            cv2.imshow("video", frame)
            c = cv2.waitKey(1) & 0xff
            if video_save_path != "":
                out.write(frame)

            if c == 27:
                capture.release()
                break

        print("Video Detection Done!")
        capture.release()
        if video_save_path != "":
            print("Save processed video to the path :" + video_save_path)
            out.release()
        cv2.destroyAllWindows()

    elif mode == "dir_predict":
        import os
        from tqdm import tqdm

        img_names = os.listdir(dir_origin_path)
        for img_name in tqdm(img_names):    # tqdm用来在长循环中添加一个进度提示信息
            if img_name.lower().endswith(
                    ('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
                image_path = os.path.join(dir_origin_path, img_name)
                image = Image.open(image_path)
                r_image = yolo.detect_image(image)
                if not os.path.exists(dir_save_path):
                    os.makedirs(dir_save_path)
                r_image.save(os.path.join(dir_save_path, img_name))

    else:
        raise AssertionError("Please specify the correct mode: 'predict', 'video', or 'dir_predict'.")

2 yolo.detect_image详解

包括模型初始化、模型推理得到预测结果,解码,非极大值抑制(确实是在解码后面),将结果可视化。
代码中包含各部分介绍及重要函数的参考链接。

import colorsys     # 用来给画框设置不同的颜色
import numpy as np
import torch
import torch.nn as nn
from PIL import ImageDraw, ImageFont
# yolov3网络结构,详解见参考链接https://blog.csdn.net/weixin_45377629/article/details/124080087
from nets.yolo import YoloBody      
#---------------------------------------------------------#
#   cvtColor将图像转换成RGB图像,防止灰度图在预测时报错。
#		代码仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB
#   get_anchors获得先验框
#   get_classes获得类别
#   preprocess_input归一化
#   resize_image对输入图像进行resize
#---------------------------------------------------------#
from utils.utils import (cvtColor, get_anchors, get_classes, preprocess_input, resize_image)
# 对网络预测结构进行解码,详解见参考链接https://blog.csdn.net/weixin_45377629/article/details/124144913
from utils.utils_bbox import DecodeBox


class YOLO(object):
    _defaults = {
        # --------------------------------------------------------------------------#
        #   使用自己训练好的模型进行预测一定要修改model_path和classes_path!
        #   model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt
        #
        #   训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
        #   验证集损失较低不代表mAP较高,仅代表该权值在验证集上泛化性能较好。
        #   如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改
        # --------------------------------------------------------------------------#
        "model_path": 'model_data/yolo_weights.pth',
        "classes_path": 'model_data/coco_classes.txt',
        # ---------------------------------------------------------------------#
        #   anchors_path代表先验框对应的txt文件,一般不修改。
        #   anchors_mask用于帮助代码找到对应的先验框,一般不修改。
        # ---------------------------------------------------------------------#
        "anchors_path": 'model_data/yolo_anchors.txt',
        "anchors_mask": [[6, 7, 8], [3, 4, 5], [0, 1, 2]],
        # ---------------------------------------------------------------------#
        #   输入图片的大小,必须为32的倍数。
        # ---------------------------------------------------------------------#
        "input_shape": [416, 416],
        # ---------------------------------------------------------------------#
        #   只有得分大于置信度的预测框会被保留下来
        # ---------------------------------------------------------------------#
        "confidence": 0.5,
        # ---------------------------------------------------------------------#
        #   非极大抑制所用到的nms_iou大小
        # ---------------------------------------------------------------------#
        "nms_iou": 0.3,
        # ---------------------------------------------------------------------#
        #   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize,
        #   在多次测试后,发现关闭letterbox_image直接resize的效果更好
        # ---------------------------------------------------------------------#
        "letterbox_image": False,
        # -------------------------------#
        #   是否使用Cuda
        #   没有GPU可以设置成False
        # -------------------------------#
        "cuda": True,
    }

    # ---------------------------------------------------#
    #   初始化YOLO
    # ---------------------------------------------------#
    def __init__(self, **kwargs):
        self.__dict__.update(self._defaults)
        for name, value in kwargs.items():
            setattr(self, name, value)

        # ---------------------------------------------------#
        #   获得种类和先验框的数量
        #	DecodeBox详解见:https://blog.csdn.net/weixin_45377629/article/details/124144913
        # ---------------------------------------------------#
        self.class_names, self.num_classes = get_classes(self.classes_path)
        self.anchors, self.num_anchors = get_anchors(self.anchors_path)
        self.bbox_util = DecodeBox(self.anchors, self.num_classes, (self.input_shape[0], self.input_shape[1]),
                                   self.anchors_mask)

        # ---------------------------------------------------#
        #   画框设置不同的颜色
        # ---------------------------------------------------#
        hsv_tuples = [(x / self.num_classes, 1., 1.) for x in range(self.num_classes)]
        self.colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples))
        self.colors = list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), self.colors))
        self.generate()  # 生成 yolov3 模型并加载权重

    # ---------------------------------------------------#
    #   生成模型,模型初始化,放到device上,加载模型参数,改成eval()模式
    # ---------------------------------------------------#
    def generate(self):
        # ---------------------------------------------------#
        #   建立yolov3模型,载入yolov3模型的权重
        # ---------------------------------------------------#
        self.net = YoloBody(self.anchors_mask, self.num_classes)
        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.net.load_state_dict(torch.load(self.model_path, map_location=device))
        self.net = self.net.eval()
        print('{} model, anchors, and classes loaded.'.format(self.model_path))

        if self.cuda:
            self.net = nn.DataParallel(self.net)
            self.net = self.net.cuda()

    # ---------------------------------------------------#
    #   检测图片
    # ---------------------------------------------------#
    def detect_image(self, image):
        image_shape = np.array(np.shape(image)[0:2])
        # ---------------------------------------------------------#
        #   在这里将图像转换成RGB图像,防止灰度图在预测时报错。
        #   代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB
        # ---------------------------------------------------------#
        image = cvtColor(image)
        # ---------------------------------------------------------#
        #   给图像增加灰条,实现不失真的resize
        #   也可以直接resize进行识别
        # ---------------------------------------------------------#
        image_data = resize_image(image, (self.input_shape[1], self.input_shape[0]), self.letterbox_image)
        # ---------------------------------------------------------#
        #   添加上batch_size维度,缺少这个维度,网络没法预测,preprocess_input表示数据归一化 image /= 255.0
        # ---------------------------------------------------------#
        image_data = np.expand_dims(np.transpose(preprocess_input(np.array(image_data, dtype='float32')), (2, 0, 1)), 0)

        with torch.no_grad():
            images = torch.from_numpy(image_data)  # 从numpy形式转成torch需要的形式
            if self.cuda:
                images = images.cuda()
            # ---------------------------------------------------------#
            #   将图像输入网络当中进行预测!    
            #	然后进行解码,可参考链接https://blog.csdn.net/weixin_45377629/article/details/124144913
            # ---------------------------------------------------------#
            outputs = self.net(images)
            outputs = self.bbox_util.decode_box(outputs)
            # ---------------------------------------------------------#
            #   将预测框进行堆叠,然后进行非极大抑制   功能:筛选出一定区域内,属于同一种类得分最大的方框
            #   此处可参考链接:https://blog.csdn.net/weixin_45377629/article/details/124202975
            # ---------------------------------------------------------#
            results = self.bbox_util.non_max_suppression(torch.cat(outputs, 1), self.num_classes, self.input_shape,
                                                         image_shape, self.letterbox_image, conf_thres=self.confidence,
                                                         nms_thres=self.nms_iou)

            if results[0] is None:
                return image

            top_label = np.array(results[0][:, 6], dtype='int32')  	# 预测框的种类
            top_conf = results[0][:, 4] * results[0][:, 5]  		# 预测框的置信度
            top_boxes = results[0][:, :4]  							# 预测框的坐标
		
		# ------------------------------#
		#   打印每个类别的数量
		# ------------------------------#
        print("top_label:", top_label)
        classes_num = np.zeros([self.num_classes])
        for i in range(self.num_classes):
        	num = np.sum(top_label == i):
        	if num > 0:
        		print(self.class_names[i], " : ", num)
        	classes_num[i] = num
        print("classes_num: ", classes_num)
        # ---------------------------------------------------------#
        #   设置字体与边框厚度
        # ---------------------------------------------------------#
        font = ImageFont.truetype(font='model_data/simhei.ttf',
                                  size=np.floor(3e-2 * image.size[1] + 0.5).astype('int32'))
        thickness = int(max((image.size[0] + image.size[1]) // np.mean(self.input_shape), 1))

        # ---------------------------------------------------------#
        #   图像绘制
        # ---------------------------------------------------------#
        for i, c in list(enumerate(top_label)):
            predicted_class = self.class_names[int(c)]
            box = top_boxes[i]
            score = top_conf[i]

            top, left, bottom, right = box

            top = max(0, np.floor(top).astype('int32'))
            left = max(0, np.floor(left).astype('int32'))
            bottom = min(image.size[1], np.floor(bottom).astype('int32'))
            right = min(image.size[0], np.floor(right).astype('int32'))

            label = '{} {:.2f}'.format(predicted_class, score)
            draw = ImageDraw.Draw(image)
            label_size = draw.textsize(label, font)
            label = label.encode('utf-8')
            print(label, top, left, bottom, right)

            if top - label_size[1] >= 0:
                text_origin = np.array([left, top - label_size[1]])
            else:
                text_origin = np.array([left, top + 1])

            for i in range(thickness):
                draw.rectangle([left + i, top + i, right - i, bottom - i], outline=self.colors[c])
            draw.rectangle([tuple(text_origin), tuple(text_origin + label_size)], fill=self.colors[c])
            draw.text(text_origin, str(label, 'UTF-8'), fill=(0, 0, 0), font=font)
            del draw

        return image

结果演示:
一张图片检测

3 感谢链接

https://www.bilibili.com/video/BV1Hp4y1y788?p=7
https://blog.csdn.net/weixin_44791964/article/details/105310627
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【YOLOv3 预测】YOLOv3图像输入->处理->输出全过程 的相关文章

  • Modbus通信工具学习记录

    Modbus通信工具学习记录 Modbus通信方式Serial PortSerial Port调试助手虚拟Serial Port驱动 TCPTCP调试助手 Modbus模拟工具Modbus PollModbus Slave通信测试后记 Mo
  • HandlerInterceptorAdapter

    HandlerInterceptorAdapter是什么 xff1f HandlerInterceptorAdapter是Spring框架提供的一个适配器 xff0c 通过继承它可以很方便的实现一个拦截器 xff1b HandlerInte
  • 我的Chrome插件

    1 AdBlock 用来屏蔽广告 xff0c 用过的人都说好 2 Flash Block Plus 用来限制Flash的播放 3 Flash Control 用来限制Flash的播放 4 Full Page Screen Capture 好
  • 网络协议栈基本知识

    https www cnblogs com mrlayfolk p 11965347 html 个人觉得原作者把网络协议栈讲解的很好 xff08 生动 xff0c 易理解 xff09 xff0c 所以在这里记录并分享 1 网络协议分层 按照
  • VS code 发送http请求

    下载rest http插件 xff0c 重启vscode 发送get请求 span class token annotation punctuation 64 hostname span span class token operator
  • AD 教程(一)

    写在前面 xff1a 本教程源自凡亿教育出品的 AD2019 从入门到精通 xff0c 笔记分为六部分 xff0c 如有错误之处 xff0c 请多指教 视频出处 一 元件库的创建 1 软件的安装2 AD工程的组成及创建3 元件库介绍 电阻容
  • docker 常用删除镜像和容器命令记录

    删除镜像命令 一 通过标签删除镜像 通过如下两个都可以删除镜像 xff1a 1 docker rmi image 或者 xff1a 1 docker image rm image 支持的子命令如下 xff1a f force 强制删除镜像
  • 树莓派安装ROS系统【第一篇】

    树莓派装ROS系统 xff08 第一篇 xff09 注 xff1a 第一篇 主要是撰写了树莓派安装ROS系统 xff0c 远程连接等操作 在网上扒拉了一些资料 xff0c 感觉各有优缺 xff0c 作为踩坑者要进行信息的筛选 xff0c 因
  • 使用Scala编写第一个Spark程序

    使用Scala编写第一个Spark程序 演示目标演示环境创建Spark工程本地运行Spark集群运行安装SparkSpark standaloneSpark on yarnyarn client模式yarn cluster模式运行结果 演示
  • Git常用命令及使用

    Git常用命令 根据分支名查询分支 根据分支名查询分支 span class token comment 根据输入的分支名模糊匹配本地和远程分支 span span class token function git span branch
  • Elasticsearch的安装与启动

    Elasticsearch的安装与启动 演示目标安装与启动配置远程服务器访问启动时异常与解决方法 演示目标 在Linux环境中安装并启动Elasticsearch 7 x版本 安装与启动 下载ES https www elastic co
  • 各软件下载地址

    常用软件下载地址 软件备注JDK各版本华为云高速下载
  • 使用VMware创建CentOS7虚拟机并设置网络环境(桥接、NAT、内网)

    使用VMware创建CentOS7虚拟机并设置网络环境 xff08 桥接 NAT 内网 xff09 演示目标演示环境创建虚拟机设置外网NAT模式桥接模式 设置内网 演示目标 使用VMware Workstation创建三台CentOS7虚拟
  • SOAP出现问题:由于 ContractFilter 在 EndpointDispatcher 不匹配,因此 Action 为“”的消息无法在接收方处理(已解决)

    场景 SOAPUI在服务器上正常运行 xff1b 用Java的Post请求调用时 xff0c 能够调通接口 xff0c 但出现问题 xff1a lt s Envelope xmlns s 61 http schemas xmlsoap or
  • 从0开始搭建Hadoop2.x高可用集群(HDFS篇)

    从0开始搭建Hadoop2 x高可用集群 xff08 HDFS篇 xff09 演示目标演示环境注意事项准备虚拟机关闭防火墙检查系统时间修改host设置免密登录卸载OpenJDK安装软件 准备HDFS配置cote site xml配置hdfs
  • 从0开始搭建Hadoop2.x高可用集群(YARN篇)

    从0开始搭建Hadoop2 x高可用集群 xff08 YARN篇 xff09 演示目标演示环境准备YARN配置yarn site xml配置mapred site xml拷贝配置 启动YARN集群验证高可用 xff08 HA xff09 演
  • 解决Win10菜单栏中搜索框无法搜索应用

    解决Win10菜单栏中搜索框无法搜索应用 如图 xff0c 在任务管理器中找到Windows资源管理器 xff0c 重新启动即可
  • 使用Java编写第一个MapReduce程序

    使用Java编写第一个MapReduce程序 演示目标演示环境搭建MR工程配置pom xml编写WordCountMapper java编写WordCountReducer java编写启动类Startup java打包工程 部署MR工程上
  • 一次函数和正比例函数的介绍

    一次函数 一次函数 xff1a 什么是一次函数 xff1f 图像展示一次函数和正比例函数 xff1a 例题一 xff1a y 61 2 x
  • STM32F103开发板霸道V2兼容指南者 从零开始(3)

    这里是对STM32学习路线的截图 xff0c 方便平时巩固32的知识 截图超多 xff0c 实操步骤都有 使用开发板为STM32F103 xff0c 后面四位影响不大 xff0c 在烧写上电的时候选好芯片即可 xff0c 下面有演示 在下小

随机推荐

  • Docker在ubuntu中安装与使用

    Docker是一种轻量级的虚拟化技术 xff0c 同时是一个开源的应用容器运行环境搭建平台 xff0c 可以让开发者以便捷方式打包应用到一个可移植的容器中 xff0c 然后安装至任何运行Linux或Windows等系统的服务器上 相较于传统
  • ROS定义自己的消息类型 自定义消息类型

    The massages which I need to record are 5 topics and 2 massege types I want to set them into one massege type and it is
  • 嵌入式行业职位分析

    嵌入式开发涵盖硬件软件 xff0c 开发链条很长 xff0c 要根据自己的实际情况选择适应的职位 嵌入式的职位大概有 xff1a 1 硬件工程师 xff1a 负责底层的硬件设计 xff0c 主要要用到 xff1a 1 处理器 xff1a A
  • 常见单片机对比

    各个厂商们也在速度 内存 功能上此起彼伏 xff0c 参差不齐 同时涌现出一大批拥有代表性单片机的厂商 xff1a Atmel TI ST MicroChip ARM 国内的宏晶STC单片机也是可圈可点 下面为大家带来51 MSP430 T
  • Maven关于阿里云的镜像配置地址选哪一个的问题

    网上很多文章介绍配置的地址是 xff1a lt mirror gt lt id gt alimaven lt id gt lt name gt aliyun maven lt name gt lt url gt http maven ali
  • 嵌入式Linux软件开发的三个分类

    一 嵌入式驱动工程师 xff1a 编写和移植各种芯片驱动 xff08 如音频芯片 xff09 xff0c 优化硬件设备驱动 xff08 如温湿度传感器 xff09 xff0c 得精通各种硬件接口协议 xff08 如I2C协议 xff09 系
  • 华为 联发科和台积电的关系及芯片制造产业中其他公司了解

    台积电 xff1a 全称台湾积体电路制造股份有限公司 xff0c 中文简称台积电 xff0c 英文简称 xff1a tsmc xff0c 是全球第一家专业集成电路 xff08 IC xff09 制造服务 xff08 晶圆代工foundry
  • 嵌入式Linux开发细分四个岗位

    嵌入式Linux开发从下到bai上分为 xff1a 嵌du入式硬件开发 嵌入式驱动开发 嵌入式系统zhi开发 嵌dao入式软件开发 一 嵌入式硬件开发 xff1a 熟悉电路等知识 xff0c 非常熟悉各种常用元器件 xff0c 掌握模拟电路
  • Android系国产手机操作系统汇总

    1 华为的Emotion UI系统 Emotion UI 简称EMUI 是华为基于Android 安卓 进行开发的情感化操作系统 拥有简化的用户界面 新的手势导航和HiVision的 AI 功能 xff0c 新系统在国内已经向部分机型推送更
  • 嵌入式开发学习路线 及书籍推荐

    嵌入式学习是一个循序渐进的过程 xff0c 如果是希望向嵌入式软件方向发展的话 xff0c 目前最常见的是嵌入式Linux方向 xff0c 关注这个方向 xff0c 大概分3个阶段 xff1a 1 嵌入式linux上层应用 xff0c 包括
  • Cat.1

    近日 xff0c 中国联通Cat 1芯片大规模采购招标结果出炉 xff0c 这是自年初 一夜走红 之后 xff0c Cat 1再次引发业界关注 实际上 xff0c Cat 1并不是一项新技术 xff0c 其早在十年前就已 出道 坐了十年 冷
  • LTE Cat1有什么用?基于4G LTE打造cat1,弥补NB-IoT和5G的空缺。

    简介 从目前蜂窝物联网发展的态势看 xff0c LTE Cat 1承担4G物联网连接主力的时机已经开启 其中 xff0c Category 1作为最低版参数配置的用户终端等级 xff0c 让业界能够低成本地设计 低配版 的4G终端 xff0
  • 前辈对于JAVA开发和嵌入式发表的一些看法

    提问一 xff1a 二战考研失败 xff0c 今年25 xff0c 在放弃考研 xff0c 学习编程 但是嵌入式orJAVA走哪条路好呢 xff1f 最近在B站看编程视频 xff0c 也刷到一些up主视频 xff0c 说是java市场饱和
  • ubuntu18.04 Realsense d435i SDK 和 ROS wrapper 安装以及相机imu和分别率参数更改

    Realsense d435i SDK 和 ROS wrapper 安装以及相机imu和分别率参数更改 一 SDK参考官方网站 1 Register the server s public key sudo apt span class t
  • vscode中配置git并上传项目到远程仓库

    首先你电脑上得下载git吧 在vscode中设置git 参考 成功后你就会看到 下面就是要把本地项目发布到远程仓库上去 xff08 1 xff09 现在gitee上建一个仓库 xff08 2 以终端操作为例 xff0c 感觉命令行操作更清晰
  • redis整理-kw

    缓存有哪些分类 本地缓存 xff1a 进程中的缓存 xff1b 分布式缓存 xff1a xff08 分布式 xff0c 理解为 xff0c 多个模块 xff0c 共同组成一个系统 xff0c 不一定在或者不在同台服务器上 xff09 多级缓
  • 定时任务报错Encountered invalid @Scheduled method ‘...‘: Exactly one of the ‘cron‘, ‘fixedDelay

    今天在搞定时任务 xff0c 突然报了这个问题 xff0c 发现是在使用 64 Scheduled这个注解时 xff0c 忘记设置参数了 xff0c 比如配置一个默认的延期时间fixedDelay 这里的fixedDelay单位是毫秒 xf
  • 超详细Jetson Xavier NX烧录系统镜像

    一 硬件准备 1 SD卡 xff08 至少32G xff09 和读卡器 xff0c 前者用于转载系统镜像 xff0c 后者用于镜像烧录 2 Jetson Xavier NX开发套件 二 软件准备 1 SDFormatter xff1a 用于
  • python、ros和socket通讯

    项目需要把笔记本的数据发送到小车的ros上 xff0c 我们采用socket通讯的方法 首先把通过socket把笔记本的数据发送到小车上 xff0c 然后通过消息发布和订阅的方式把数据传递到小车的ros上 一 通过socket发送笔记本上的
  • 【YOLOv3 预测】YOLOv3图像输入->处理->输出全过程

    文章目录 1 数据输入输出代码详解2 yolo detect image详解3 感谢链接 1 数据输入输出代码详解 数据输入方式主要包括三种 xff1a 读取本地一张图片 代码中predict状态 读取本地文件夹中所有图片 代码中dir p