您现在的位置是:网站首页> AI人工智能

CV计算机视觉领域MMLAB及其他相关技术收集

摘要

CV计算机视觉领域MMLAB及其他相关技术收集

MMLab简单介绍

视觉技术收集

MMLab一个简单的目标检测例子

MMLab视频教程

PaliGemma模型介绍

yolo技术收集

HyperLPR车牌识别

开源、免费的离线OCR软件Umi-OCR

ZXing.Net二维码开发库

PaddleOCR 简单 demo 入门(比EasyOCR效果好可比商业软件)

深度相机相关

机械臂相关

ML.NET微软官方的机器学习框架


MMLab简单介绍

MMLab 是由港中文的汤晓鸥教授建立的,是最早把深度学习应用于计算机视觉的研究机构之一。MMLab 算法库是 MMLab 实验室在 Github 上开源的一系列算法,涵盖了计算机视觉相关的多个领域,包括目标检测、3D 点云、图像分割、图像识别、视频理解和 AIGC 等。该算法库在学术界和工业界都被广泛使用,点击进入mmlab开源地址


MMLab (Multimedia Laboratory) 是一个开源的计算机视觉研究平台,由香港中文大学多媒体实验室开发维护。它提供了一系列用于图像、视频分析和处理的先进算法和模型。MMLab主要包含以下几个方向的工作:

图像分类 (Image Classification):

提供了各种用于图像分类任务的深度学习模型,如ResNet、MobileNet等,可以对图像进行分类识别。

目标检测 (Object Detection):

提供了多种目标检测算法和模型,如Faster R-CNN、YOLO、RetinaNet等,可以在图像或视频中检测和定位目标物体。

语义分割 (Semantic Segmentation):

提供了用于语义分割的算法和模型,如FCN、PSPNet、DeepLab等,可以对图像进行像素级别的分类,识别出图像中的不同物体和区域。

实例分割 (Instance Segmentation):

提供了实例分割算法和模型,如Mask R-CNN等,可以在图像中检测出不同的物体实例并为每个实例生成分割掩码。

关键点检测 (Keypoint Detection):

提供了用于检测物体关键点的算法和模型,如人体姿态估计、人脸关键点检测等。

视频分析 (Video Analysis):

提供了用于视频分析的算法和工具,如视频目标检测、视频分割、动作识别等。

低级视觉 (Low-level Vision):

提供了一些低级视觉任务的算法和模型,如图像复原、超分辨率、图像去噪等。


MClassification:OpenMMLab 图像分类工具箱和基准。

MMDetection:OpenMMLab 检测工具箱和基准测试。

MMDetection3D:OpenMMLab 的下一代通用 3D 对象检测平台。

MMRotate:OpenMMLab 旋转对象检测工具箱和基准测试。

MMSegmentation:OpenMMLab 语义分割工具箱和基准测试。

MMOCR:OpenMMLab 文本检测、识别和理解工具箱。

MMPose:OpenMMLab 姿态估计工具箱和基准测试。

MMHuman3D:OpenMMLab 3D 人体参数模型工具箱和基准测试。

MMSelfSup:OpenMMLab 自我监督学习工具箱和基准测试。

MMrazor:OpenMMLab 模型压缩工具箱和基准测试。

MMFewShot : OpenMMLab 少数镜头学习工具箱和基准测试。

MMAction2:OpenMMLab 的下一代动作理解工具箱和基准测试。

MMTracking:OpenMMLab 视频感知工具箱和基准测试。

MMFlow:OpenMMLab 光流工具箱和基准测试。

MMEditing:OpenMMLab 图像和视频编辑工具箱。

MMGeneration:OpenMMLab 图像和视频生成模型工具箱。

MMDeploy:OpenMMLab 模型部署框架。





一个简单的目标检测例子

安装包:

pip install mmcv-full pip install mmdet pip install opencv-python

代码:

import cv2 from mmdet.apis import init_detector, inference_detector # 配置文件路径和模型权重路径 config_file = 'path/to/config.py' checkpoint_file = 'path/to/checkpoint.pth' # 初始化检测器 model = init_detector(config_file, checkpoint_file) # 要检测的图像路径 img_path = 'image.jpg' # 读取图像 img = cv2.imread(img_path) # 进行检测 result = inference_detector(model, img) # 可以对检测结果进行进一步处理和展示 print(result)

请确保已经正确安装了相关的 MMLab 库及其依赖,并且将 'path/to/config.py' 和 'path/to/checkpoint.pth' 替换为实际的配置文件和模型权重文件路径,同时将 'image.jpg' 替换为你要检测的图像的真实路径。



MMLab视频教程

点击查看原视频



PaliGemma模型介绍

PaliGemma 是一种轻量级的开放视觉语言模型 (VLM),其灵感来自 PaLI-3,并基于 SigLIP 视觉模型和 Gemma 语言模型等开放组件。PaliGemma 将图片和文本作为输入,可以回答有关图片的问题并提供详细信息和上下文,这意味着 PaliGemma 可以对图片进行更深入的分析,并提供有用的数据洞见,例如为图片和短视频添加说明、对象检测以及读取图片中嵌入的文字。


PaliGemma 模型分为两组:通用模型集和研究导向模型集:

PaliGemma - 可针对各种任务进行微调的通用预训练模型。

PaliGemma-FT - 面向研究的模型,可根据特定研究数据集进行微调


点击进入体验站点


用Paligemma训练了一个识别x光片的大模型,轻松诊断骨折

视频中用到的代码

提示词:

ocr 表示进行ocr操作



深度相机相关

深度相机是一种可以获取场景深度信息的特殊相机。它除了可以像普通相机那样获取彩色图像外,还可以测量相机到场景中各个点的距离,从而获得一张深度图。

深度相机的工作原理主要有以下几种:

结构光:投射特定的光线图案到场景中,然后通过分析图案的变形计算深度。

双目视觉:模仿人眼,使用两个摄像头从不同角度拍摄,通过三角测量原理计算深度。

飞行时间法(ToF):发射脉冲光,通过测量光线飞行的往返时间计算深度。

光场相机:利用微透镜阵列记录光线方向,合成不同视角获得深度。


深度相机被广泛应用于:

3D扫描和建模

体感交互,如体感游戏

机器人避障与导航

无人驾驶环境感知

增强现实中的虚实遮挡等

一些常见的深度相机产品有微软的Kinect、英特尔的RealSense等。手机上使用的结构光和ToF深度sensor也越来越普及。

深度相机是3D视觉感知的重要传感器,为计算机赋予了理解三维世界的能力,推动了很多领域的发展。不过它在户外强光下效果会变差,距离也有限,还有待进一步改进。


深度相机通常需要配套的SDK(软件开发工具包)来开发应用程序。不同的深度相机厂商会提供自己的SDK,开放程度也有所不同。

一些深度相机的SDK是开源的,比如:

OpenNI (Open Natural Interaction):支持Kinect等多种设备,跨平台,由开源社区维护。

OpenKinect (libfreenect):专门用于Kinect的开源库,提供了底层的驱动程序。

RealSense SDK:英特尔官方提供,部分开源,支持RealSense系列深度相机。

Astra SDK:Orbbec公司的开源SDK,支持Astra系列深度相机。

DepthAI:Luxonis公司的开源SDK,支持其OAK系列深度相机。


还有一些SDK是闭源但可以免费使用的,比如:

Kinect for Windows SDK:微软官方提供,用于开发Kinect应用程序。

Zed SDK:Stereolabs公司的SDK,用于Zed系列双目深度相机。

Pico Zense SDK:7invensun公司的SDK,支持DCAM710等深度模组。


总的来说,深度相机SDK的开放程度取决于厂商的策略。开源SDK便于学习和二次开发,而闭源SDK通常集成了更多算法和工具。在选择深度相机时,除了硬件性能外,还需要考虑SDK能否满足开发需求。如果你有具体的应用场景,不妨对比几款深度相机的SDK,选择最适合的那一款。


Python例子:

以英特尔RealSense D435i深度相机为例,使用Python和pyrealsense2库获取物体的三维位置。

首先确保你已经安装了pyrealsense2库:

pip install pyrealsense2


然后可以运行以下示例代码:


import pyrealsense2 as rs

import numpy as np


# 配置深度和彩色流

pipeline = rs.pipeline()

config = rs.config()

# 设置深度图的分辨率为640x480,帧率为30fps,数据格式为16位深度值

config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# 设置彩色图的分辨率为640x480,帧率为30fps,数据格式为BGR三通道图像

config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)


# 启动数据流

pipeline.start(config)


try:

    while True:

        # 等待一对连贯的帧: 深度帧和彩色帧

        frames = pipeline.wait_for_frames()

        # 从帧集中获取深度帧

        depth_frame = frames.get_depth_frame()

        # 从帧集中获取彩色帧

        color_frame = frames.get_color_frame()

        # 如果没有获取到深度帧或彩色帧,则跳过本次循环

        if not depth_frame or not color_frame:

            continue


        # 将深度图像转换为numpy数组,方便后续处理

        depth_image = np.asanyarray(depth_frame.get_data())

        # 将彩色图像转换为numpy数组,方便后续处理

        color_image = np.asanyarray(color_frame.get_data())

        

        # 获取深度相机的内参(焦距、主点等)

        depth_intrin = depth_frame.profile.as_video_stream_profile().intrinsics

        # 获取彩色相机的内参(焦距、主点等)

        color_intrin = color_frame.profile.as_video_stream_profile().intrinsics

        # 获取深度相机到彩色相机的外参(旋转、平移等)

        depth_to_color_extrin = depth_frame.profile.get_extrinsics_to(color_frame.profile)

        

        # 从深度图像中获取物体的像素坐标(这里假设物体位于图像中心)

        px = int(depth_frame.width / 2)  # 物体在深度图像中的x坐标

        py = int(depth_frame.height / 2)  # 物体在深度图像中的y坐标

        

        # 获取该点的深度值(单位为米)

        depth = depth_frame.get_distance(px, py)

        

        # 将像素坐标和深度值转换为3D坐标(相对于深度相机)

        # rs.rs2_deproject_pixel_to_point()函数将2D像素坐标和深度值转换为3D点坐标

        # 输入参数分别为深度相机内参、像素坐标、深度值

        # 返回值为3D点坐标(x, y, z),单位为米

        depth_point = rs.rs2_deproject_pixel_to_point(depth_intrin, [px, py], depth)

        

        # 将3D坐标从深度相机坐标系转换到彩色相机坐标系

        # rs.rs2_transform_point_to_point()函数将3D点从一个坐标系转换到另一个坐标系

        # 输入参数分别为外参矩阵、3D点坐标

        # 返回值为转换后的3D点坐标

        color_point = rs.rs2_transform_point_to_point(depth_to_color_extrin, depth_point)

        # 输出物体的3D坐标

        print(f"Object position (relative to color camera): {color_point}")

finally:

# 停止数据流

pipeline.stop()


代码的主要流程如下:

1. 导入所需的库:`pyrealsense2`用于与RealSense深度相机通信,`numpy`用于处理图像数据。

2. 配置深度和彩色流:设置深度图和彩色图的分辨率、帧率和数据格式。

3. 启动数据流:通过`pipeline.start()`函数启动数据流。

4. 在循环中不断获取帧数据:

   - 通过`pipeline.wait_for_frames()`函数等待一对连贯的深度帧和彩色帧。

   - 从帧集中分别获取深度帧和彩色帧。

   - 如果没有获取到帧数据,则跳过本次循环。

5. 将帧数据转换为numpy数组:方便后续的处理和分析。

6. 获取相机的内参和外参:

   - 通过`depth_frame.profile.as_video_stream_profile().intrinsics`获取深度相机的内参。

   - 通过`color_frame.profile.as_video_stream_profile().intrinsics`获取彩色相机的内参。

   - 通过`depth_frame.profile.get_extrinsics_to(color_frame.profile)`获取深度相机到彩色相机的外参。

7. 获取物体的像素坐标:这里假设物体位于图像中心,可以根据需要修改。

8. 获取物体的深度值:通过`depth_frame.get_distance()`函数获取指定像素坐标处的深度值,单位为米。

9. 将像素坐标和深度值转换为3D坐标:

   - 通过`rs.rs2_deproject_pixel_to_point()`函数将2D像素坐标和深度值转换为相对于深度相机的3D点坐标。

   - 输入参数分别为深度相机内参、像素坐标、深度值。

   - 返回值为3D点坐标(x, y, z),单位为米。

10. 将3D坐标从深度相机坐标系转换到彩色相机坐标系:

    - 通过`rs.rs2_transform_point_to_point()`函数将3D点从深度相机坐标系转换到彩色相机坐标系。

    - 输入参数分别为外参矩阵、3D点坐标。

    - 返回值为转换后的3D点坐标。


11. 输出物体的3D坐标:输出物体相对于彩色相机的三维位置。

12. 停止数据流:在程序结束时通过`pipeline.stop()`函数停止数据流。

以上就是代码的详细注释和解释。这个示例演示了如何使用RealSense D435i深度相机和Python获取物体的三维位置。你可以在此基础上根据自己的需求进行修改和扩展。



以上就是代码的详细注释和解释。这个示例演示了如何使用RealSense D435i深度相机和Python获取物体的三维位置。你可以在此基础上根据自己的需求进行修改和扩展。

这个例子假设你想获取图像中心点处物体的三维位置。它首先从深度相机获取深度图和彩色图,然后:

获取图像中心点的像素坐标(px, py)。

使用get_distance()函数获取该点的深度值(单位为米)。

使用rs2_deproject_pixel_to_point()函数将像素坐标和深度值转换为相对于深度相机的3D坐标。

使用rs2_transform_point_to_point()函数将3D坐标从深度相机坐标系转换到彩色相机坐标系(因为彩色相机和深度相机的位置有偏移)。

最终输出的color_point就是物体相对于彩色相机的三维位置(单位为米)。你可以根据需要修改像素坐标(px, py)来获取其他位置的物体坐标。


注意这个例子假设你使用的是RealSense D435i深度相机,如果你使用的是其他型号或品牌的深度相机,需要相应地修改代码。

以下是一些可能的改进和扩展:

实时显示彩色图和深度图:可以使用OpenCV的imshow()函数实时显示彩色图和深度图,以便直观地观察。

检测物体:可以使用计算机视觉算法(如颜色阈值、边缘检测、模板匹配等)在彩色图中检测特定物体,然后获取其位置。

跟踪物体:可以使用跟踪算法(如卡尔曼滤波、粒子滤波等)实时跟踪物体的位置变化。

坐标转换:根据需要可以将物体的坐标转换到其他坐标系,如世界坐标系、机器人基坐标系等。

点云处理:可以将深度图转换为点云格式,然后使用PCL(点云库)进行进一步的处理和分析,如点云滤波、分割、识别等。

手势交互:可以识别用户的手势(如手掌、手指等),然后根据手势的位置和动作进行交互控制。

避障导航:可以将深度相机安装在移动机器人上,实时检测障碍物的位置,规划避障路径。


以上仅是一些思路,具体的实现还需要根据你的应用场景和需求来设计。总之,深度相机为我们提供了获取三维信息的便利手段,结合Python强大的库生态,可以实现许多有趣而实用的功能。




机械臂相关

Dobot是由深圳越疆科技有限公司开发的一系列机械臂产品,主要面向教育和轻量级工业应用领域。

点击进入公司主页

Dobot机械臂的主要特点包括:

多功能:集成了多种功能,如3D打印、激光雕刻、写字绘画等,通过更换末端工具可以实现不同的应用。

易用性:提供了图形化的编程界面和手持示教器,降低了机械臂编程和操作的难度,适合初学者学习和使用。

高精度:采用了高精度的伺服电机和谐波减速器,运动精度可达0.02mm,满足轻量级工业应用的需求。

开放性:提供了开放的API和SDK,支持多种编程语言,如Python、C++、MATLAB等,用户可以根据需求进行二次开发。

模块化:采用了模块化的设计,可以方便地更换和升级不同的组件,如控制器、末端工具等。


Dobot的主要产品包括:

Dobot Magician:一款多功能的桌面级机械臂,集成了3D打印、激光雕刻、写字绘画等功能。

Dobot M1:一款高精度的工业级机械臂,具有较大的负载能力和工作范围,适用于装配、点胶、打磨等应用。

Dobot CR系列:协作机器人系列,具有力觉反馈和安全防护功能,可以与人共同工作。

Dobot MG400:一款高性能的SCARA机器人,适用于高速装配、搬运、分拣等应用。

总的来说,Dobot机械臂以其多功能、易用性和开放性的特点,在教育和轻量级工业领域得到了广泛的应用。它为学生和初创企业提供了一个便捷、经济的机器人开发平台,加速了机器人技术的普及和应用。

image.png


Dobot机械臂的Python Demo

点击查看Dobot视频教程

【机械臂入门教程】机械臂视觉抓取从理论到实战



ML.NET微软官方的机器学习框架

点击查看源码

一个使用ML.NET和YOLOv5模型进行对象检测的示例。在这个例子中,我们将使用已经转换为ONNX格式的YOLOv5模型。


首先,确保你已经安装了以下NuGet包:


Microsoft.ML

Microsoft.ML.OnnxTransformer

Microsoft.ML.ImageAnalytics

然后,你可以使用以下代码:



using System;

using System.Collections.Generic;

using System.Drawing;

using System.IO;

using System.Linq;

using Microsoft.ML;

using Microsoft.ML.Data;


class Program

{

    static void Main(string[] args)

    {

        // 创建MLContext

        MLContext mlContext = new MLContext();


        // 定义输入和输出架构

        var inputSchema = new List<ColumnInfo>()

        {

            new ColumnInfo("bitmap", typeof(Bitmap), 640, 640),

        };

        var outputSchema = new List<ColumnInfo>()

        {

            new ColumnInfo("output", typeof(float[,,,]), new int[] { 1, 25200, 85 }),

        };


        // 加载ONNX模型

        string modelPath = "yolov5s.onnx";

        var emptyData = mlContext.Data.LoadFromEnumerable(new List<YoloV5BitmapData>());

        var pipeline = mlContext.Transforms.ResizeImages("bitmap", 640, 640)

            .Append(mlContext.Transforms.ExtractPixels("bitmap"))

            .Append(mlContext.Transforms.ApplyOnnxModel(modelPath, inputSchema, outputSchema));

        var model = pipeline.Fit(emptyData);


        // 加载和预处理输入图像

        string imagePath = "input_image.jpg";

        using (var bitmap = new Bitmap(Image.FromFile(imagePath)))

        {

            var pred = model.Transform(new YoloV5BitmapData() { Image = bitmap });

            var results = pred.GetColumn<float[,,,]>("output").First();


            // 后处理和显示检测结果

            var boxes = ParseYoloV5Output(results);

            DrawBoundingBoxes(bitmap, boxes);

            bitmap.Save("output_image.jpg");

        }

    }


    // 定义输入数据类

    class YoloV5BitmapData

    {

        [ColumnName("bitmap")]

        public Bitmap Image { get; set; }

    }


    // 解析YOLOv5输出

    static List<YoloV5Result> ParseYoloV5Output(float[,,,] results)

    {

        // 实现解析逻辑,根据YOLOv5的输出格式提取边界框和类别信息

        // ...

    }


    // 在图像上绘制边界框

    static void DrawBoundingBoxes(Bitmap bitmap, List<YoloV5Result> boxes)

    {

        // 实现绘制边界框的逻辑

        // ...

    }


    // 定义YOLOv5检测结果类

    class YoloV5Result

    {

        public RectangleF BoundingBox { get; set; }

        public string Label { get; set; }

        public float Confidence { get; set; }

    }

}

在这个示例中,我们使用了与YOLOv4类似的步骤。主要区别在于输入和输出的架构定义,因为YOLOv5的模型结构与YOLOv4略有不同。


我们加载了预训练的YOLOv5模型(yolov5s.onnx),并创建了一个包含图像预处理和模型应用的转换管道。然后,我们加载输入图像,并使用训练好的模型进行预测。预测结果是一个四维的浮点数数组,表示检测到的对象的边界框和类别信息。


接下来,我们需要实现ParseYoloV5Output方法来解析YOLOv5模型的输出。这个方法将根据YOLOv5的输出格式提取边界框坐标、类别标签和置信度得分。YOLOv5的输出格式与YOLOv4略有不同,所以解析逻辑需要相应调整。你可以参考YOLOv5的官方文档或实现来编写解析逻辑。


然后,我们实现DrawBoundingBoxes方法,将检测到的边界框绘制在输入图像上。你可以使用System.Drawing命名空间中的类和方法来绘制矩形框和文本标签。


最后,我们将绘制了边界框的图像保存到磁盘上。


请注意,这个示例只是一个基本的框架,你需要根据具体的需求和YOLOv5模型的细节来完善和优化代码。例如,你可能需要调整输入图像的大小、设置置信度阈值、应用非极大值抑制(NMS)等后处理步骤。


另外,确保你使用的YOLOv5模型已经正确地转换为ONNX格式,并且与ML.NET兼容。你可以使用官方提供的转换工具或第三方工具来完成转换过程。




















































Top