您现在的位置是:网站首页> AI人工智能
CV计算机视觉领域MMLAB及其他相关技术收集
- AI人工智能
- 2024-07-06
- 385人已阅读
CV计算机视觉领域MMLAB及其他相关技术收集
PaddleOCR 简单 demo 入门(比EasyOCR效果好可比商业软件)
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机械臂以其多功能、易用性和开放性的特点,在教育和轻量级工业领域得到了广泛的应用。它为学生和初创企业提供了一个便捷、经济的机器人开发平台,加速了机器人技术的普及和应用。
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兼容。你可以使用官方提供的转换工具或第三方工具来完成转换过程。
上一篇:优秀的开源项目
下一篇:AI智体创建经验收集