- 2025-01-07
-
回复了主题帖:
【嵌入式AI挑战营】03GCC交叉编译环境安装
lugl4313820 发表于 2025-1-7 15:43
大佬,rknn是大佬你自己训练出来的吗?能不能教一下我。
目前的不是 我也在摸索训练转onnx还行 在转rknn遇到问题了
-
发表了主题帖:
【嵌入式AI挑战营】04RKNN-MODEL-Zoo-YOLOv5测试
Rknn_Model_YOLO
简介
跟着教程学习RV1106的算法模型的开发与使用,那么今天学习的就是最终的YOLO算法模型的开发与使用。梳理下过程,前面的安装环境一步也不能少,少了后面就会一直报错,就需要在安装。1.需要下载模型算法(ONNX)2.将模型算法导出成RKNN,使用的工具和环境是RKNN-Toolkit2。3.使用交叉编译,编译出rv1106可以执行的文件。4.运行交叉编译的可执行文件,该文件再去调用.RKNN算法模型去进行图像的识别。
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RKNN-Test/#63-%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F
一、导出 RKNN 模型
1.下载 rknn_model_zoo
git clone https://github.com/airockchip/rknn_model_zoo.git
2.获取 Yolov5 ONNX模型文件
cd <rknn_model_zoo Path>/rknn_model_zoo/examples/yolov5/model chmod a+x download_model.sh
./download_model.sh
3.执行 rknn_model_zoo/examples/yolov5/python 目录下的模型转换程序 convert.py,使用方法:
conda activate RKNN-Toolkit2
cd <rknn_model_zoo Path>/rknn_model_zoo/examples/yolov5/python
python3 convert.py ../model/yolov5s.onnx rv1106
二、编译和构建
1.设置如下环境变量:
下载SDK https://gitee.com/LuckfoxTECH/luckfox-pico
export PATH=/home/buildroot/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
蓝色字部分根据自己放置的文件位置进行更改。
2.执行 rknn_model_zoo 目录下的 build-linux.sh 脚本。该脚本将编译例程:
chmod +x ./build-linux.sh
./build-linux.sh -t rv1106 -a armv7l -d yolov5
编译过程:
3.交叉编译完成后在 rknn_model_zoo 目录下会生成一个 install 目录,包含编译出来的程序和库文件。
lib model rknn_yolov5_demo
三、运行程序
1.先将整个 rknn_yolov5_demo 目录传输至开发板,然后执行下面指令运行程序:
cd /root/rknn_yolov5_demo/
./rknn_yolov5_demo model/yolov5.rknn model/bus.jpg
2.推理完成后生成图片 out.png
# ls
lib model out.png rknn_yolov5_demo
四、实验结果
图片测试
水果推理测试
动物识别测试
-
发表了主题帖:
【嵌入式AI挑战营】03GCC交叉编译环境安装
交叉编译环境GCC安装和程序编译
一、SDK下载安装
困扰我时间挺长的一个SKD开发环境安装,Buildroot 系统的交叉编译工具链可在 SDK 中获取。然后下载这个工具链内容,尝试按照教程安装,但发现它这个链接下的内容应该不是工具链,之后进行了漫长的工具链查找阶段。但是教程是对的。。
https://wiki.luckfox.com/zh/Luckfox-Pico/Cross-Compile/ 交叉编译程序教程
但安装后发现是自己忽略了什么,因为在入门指南和资料下载内有相关的链接。再次按照安装教程进行程序安装。
https://wiki.luckfox.com/zh/Luckfox-Pico/Download
下载SDK的地址如图所示:
https://github.com/LuckfoxTECH/luckfox-pico
https://gitee.com/LuckfoxTECH/luckfox-pico
交叉编译器安装后测试
以程序 hello.c 为例,编译出对应的可执行文件,文件执行效果是在终端上打印 hello world 。hello.c 代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world\n");
return 0;
}
编译成功。
ONNX转换到RKNN模型
转换代码convert.py
import sys
from rknn.api import RKNN
DATASET_PATH = '../model/dataset.txt'
DEFAULT_RKNN_PATH = '../model/facenet.rknn'
DEFAULT_QUANT = True
def parse_arg():
if len(sys.argv) < 3:
print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]));
print(" platform choose from [rk3562, rk3566, rk3568, rk3576, rk3588, rk1808, rv1109, rv1126]")
print(" dtype choose from [i8] for [rk3562, rk3566, rk3568, rk3576, rk3588]")
print(" dtype choose from [u8] for [rk1808, rv1109, rv1126]")
exit(1)
model_path = sys.argv[1]
platform = sys.argv[2]
do_quant = DEFAULT_QUANT
if len(sys.argv) > 3:
model_type = sys.argv[3]
if model_type not in ['i8', 'u8', 'fp']:
print("ERROR: Invalid model type: {}".format(model_type))
exit(1)
elif model_type in ['i8', 'u8']:
do_quant = True
else:
do_quant = False
if len(sys.argv) > 4:
output_path = sys.argv[4]
else:
output_path = DEFAULT_RKNN_PATH
return model_path, platform, do_quant, output_path
if __name__ == '__main__':
model_path, platform, do_quant, output_path = parse_arg()
# Create RKNN object
rknn = RKNN(verbose=False)
# Pre-process config
print('--> Config model')
rknn.config(mean_values=[[104, 117, 123]], std_values=[[1, 1, 1]], target_platform=platform)
print('done')
# Load model
print('--> Loading model')
ret = rknn.load_onnx(model=model_path)
if ret != 0:
print('Load model failed!')
exit(ret)
print('done')
# Build model
print('--> Building model')
ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)
if ret != 0:
print('Build model failed!')
exit(ret)
print('done')
# Export rknn model
print('--> Export rknn model')
ret = rknn.export_rknn(output_path)
if ret != 0:
print('Export rknn model failed!')
exit(ret)
print('done')
# Release
rknn.release()
这个代码针对不同的程序需要进行改动,才可以进行使用。
-
发表了主题帖:
【嵌入式AI挑战营】02神经网络开发环境安装
算法模型环境安装和ONNX模型获取
RKNN-Toolkit2
PC端使用虚拟机软件,在虚拟机软件上安装的是ubuntu22.04系统,然后再这个ubuntu系统上安装RKNN-Toolkit2工具软件。
1.下载rknn-toolkit2程序包
git clone https://github.com/rockchip-linux/rknn-toolkit2
安装python环境
sudo apt-get update
sudo apt-get install python3 python3-dev python3-pip
sudo apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
安装RKNN-Toolkit2的依赖包
在此过程中很难安装,安装过程中经常会中断,使用国内的程序源也不太好使。
pip3 install -r rknn-toolkit2/packages/requirements_cp310-1.6.0.txt
安装的依赖库如图所示,在使用上面的安装命令失败后,我使用的是单独的安装命令,一个个的依赖库进行安装。
如 pip3 install torch==1.10.1
其中torch是主要问题,他 经常会中断安装。
安装RKNN-Toolkit2
pip3 install rknn-toolkit2/packages/rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl
程序验证
如图所示,调用不出来rknn.api安装失败。
重新安装,失败了很多次终于是成功了。
如图所示依赖库安装成功,程序调用没有问题。
人脸检测环境部署
其实使用一个环境就可以,我一开始也是没有摸清脉络,所以按照教程分别安装了相应的开发环境。
获取facenet源码
git clone https://github.com/bubbliiiing/facenet-pytorch.git
进入源码目录
cd facenet-pytorch
搭建模型训练环境
conda create -n facenet python=3.6
进入conda虚拟环境并安装运行的依赖库
conda activate facenet
pip install -r requirements.txt
工程文件夹下创建ONNX文件的Python脚本文件
from nets.facenet import Facenet
from torch import onnx
import torch
model_path='model_data/facenet_mobilenet.pth' #模型路径
model = Facenet(backbone="mobilenet",mode="predict",pretrained=True) #模型初始化
device = torch.device('cpu')
model.load_state_dict(torch.load(model_path, map_location=device), strict=False)
example=torch.rand(1,3,160,160) #给定一个输入
torch.onnx.export(model,example,'model_data/facenet.onnx',verbose=True,opset_version=9) #导出
执行脚本文件获取ONNX
python export_onnx.py
依赖库安装过程
编写的获取onnx.py文件
运行程序
得到了facenet.onnx文件,如图所示:
人脸特征提取环境部署
获取 facenet 源码
git clone https://github.com/bubbliiiing/facenet-pytorch.git
2.进入源码目录
cd facenet-pytorch
3.搭建模型训练环境
conda create -n facenet python=3.6
输入 y 同意安装基础 python 工具包。
4.进入 Conda 虚拟环境并安装运行的依赖库
conda activate facenet
pip install -r requirements.txt
在 model_data 文件夹下存放有训练好的 .pth 权重文件。
5.在工程文件夹下创建导出 ONNX 文件的python脚本export_onnx.py
from nets.facenet import Facenet
from torch import onnx
import torch
model_path='model_data/facenet_mobilenet.pth' #模型路径
model = Facenet(backbone="mobilenet",mode="predict",pretrained=True) #模型初始化
device = torch.device('cpu')
model.load_state_dict(torch.load(model_path, map_location=device), strict=False)
example=torch.rand(1,3,160,160) #给定一个输入
torch.onnx.export(model,example,'model_data/facenet.onnx',verbose=True,opset_version=9) #导出
6.执行脚本获取 ONNX 文件(facenet conda 环境下)
python export_onnx.py
在 <工程文件夹>/model_data 可以获取到装换后的 ONNX 文件。
物体识别环境部署
1.获取 Yolov5 源码
git clone https://github.com/airockchip/yolov5.git
2.进入 Yolov5 源码目录
cd yolov5
3.搭建模型训练环境
conda create -n yolov5 python=3.9
输入 y 同意安装基础 python 工具包。
4.进入 Conda 虚拟环境并安装运行的依赖库
conda activate yolov5
pip install -r requirements.txt
注意:如果无法完整下载依赖的软件包请尝试设置 pip 的镜像源。
5.从默认文件中导出 ONNX 文件(yolov5 conda 环境下)
python export.py --rknpu --weight yolov5s.pt
如果工程目录下没有 yolov5s.pt 的权重文件,会自动拉取文件并转换。在工程文件夹下会生成yolov5s.onnx和RK_anchors.txt文件,在物体识别的源码post_process 函数会使用到 RK_anchors.txt 中的参数。生成的 yolov5s.onnx 模型相比标准的 Yolov5 模型去除了 RKNPU 不兼容的结果提取部分,在应用源码中使用 CPU 来实现,如果使用自己训练的模型需要注意执行 export.py 程序需要添加 --rknpu 参数,在 RKNPU 的应用中才能获取到真正需要的数据。
python export.py --rknpu --weight xxx.pt
将 xxx.pt 替换为训练获取到的.pt权重文件,训练自己需要的模型参考 yolov5官方教程。
安装过程,如图所示:
-
发表了主题帖:
【嵌入式AI挑战营】01远程视频显示
串口登录
账号:root
密码:luckfox
使用ifconfig命令查看IP地址,IP地址需要链接网线,且板端没有屏幕所以需要使用串口调试的方式进行查看。获得的IP地址可以用于远程登录,远程文件传输和视频流的传送。
远程登录
远程登录后,查看摄像头文件是否有(rkipc.Ini),ethaddr.txt lost+found image.bmp video0 video2 rkipc.ini video1.
视频流显示
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-Plus-Mini/Luckfox-Pico-pinout/CSI-Camera
官方教程链接。官方教程ip地址应该是内网默认的一个IP地址,在这我使用的方式是,开发板连接的路由器,电脑也连接的路由器,在电脑端没有配置ip的地址。使用VLC软件显示视频画面。
- 2024-11-21
-
回复了主题帖:
入围名单公布:嵌入式工程师AI挑战营(进阶)的挑战者们,领取板卡啦
个人信息已确认,领取板卡,可继续完成任务。
- 2024-11-18
-
回复了主题帖:
【米尔-全志 T527 开发板-试用评测】-OpenCV行人检测
Jacktang 发表于 2024-11-16 09:15
OpenCV行人检测代码不会这么少吧
调用库调用完了 不就很简洁了嘛
-
回复了主题帖:
【米尔-全志 T527 开发板-试用评测】-OpenCV手势识别
也可以的
- 2024-11-15
-
发表了主题帖:
【米尔-全志 T527 开发板-试用评测】-OpenCV手势识别
一、软件环境安装
1.安装OpenCV
sudo apt-get install libopencv-dev python3-opencv
2.安装pip
sudo apt-get install python3-pip
二、OpenCV手势识别步骤
1.图像获取:从摄像头或其他图像源获取手部图像。使用OpenCV的VideoCapture类可以捕获视频流,或者使用imread函数加载图像。
2.图像预处理:对图像进行预处理,以提高特征提取的准确性。常用的预处理操作包括灰度化、滤波、边缘检测、二值化、噪声去除和形态学处理等。
灰度化:将彩色图像转换为灰度图像,去除颜色信息,简化图像。
滤波:使用滤波器去除图像中的噪声。
边缘检测:使用边缘检测算法提取图像中的边缘信息。
二值化:将灰度图像转换为二值图像,将像素值分为黑色和白色。
形态学处理:使用形态学操作增强手势轮廓。
3.特征提取:从预处理后的图像中提取手部特征。常用的特征包括形状特征、纹理特征和运动轨迹特征等。
形状特征:提取手部轮廓、面积、周长、质心等形状特征。
纹理特征:提取手部皮肤纹理、皱纹等纹理特征。
运动轨迹特征:提取手部运动轨迹、速度、加速度等运动轨迹特征。
4.分类和识别:使用机器学习算法对提取的特征进行分类,以识别特定的手势。
三、代码实现
# -*- coding: utf-8 -*-
import cv2
def reg(x):
o1 = cv2.imread('paper.jpg',1)
o2 = cv2.imread('rock.jpg',1)
o3 = cv2.imread('scissors.jpg',1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
xgray = cv2.cvtColor(x,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
xret, xbinary = cv2.threshold(xgray,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy = cv2.findContours(binary2,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy = cv2.findContours(binary3,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
xcontours, hierarchy = cv2.findContours(xbinary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]
x = xcontours[0]
ret=[]
ret.append(cv2.matchShapes(x,cnt1,1,0.0))
ret.append(cv2.matchShapes(x,cnt2,1,0.0))
ret.append(cv2.matchShapes(x,cnt3,1,0.0))
max_index = ret.index(min(ret)) #计算最大值索引
if max_index==0:
r="paper"
elif max_index==1:
r="rock"
else:
r="sessiors"
return r
t1=cv2.imread('test1.jpg',1)
t2=cv2.imread('test2.jpg',1)
t3=cv2.imread('test3.jpg',1)
# print(reg(t1))
# print(reg(t2))
# print(reg(t3))
# ===========显示处理结果==================
org=(0,60)
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale=2
color=(255,255,255)
thickness=3
cv2.putText(t1,reg(t1),org,font,fontScale,color,thickness)
cv2.putText(t2,reg(t2),org,font,fontScale,color,thickness)
cv2.putText(t3,reg(t3),org,font,fontScale,color,thickness)
cv2.imshow('test1',t1)
cv2.imshow('test2',t2)
cv2.imshow('test3',t3)
cv2.waitKey()
cv2.destroyAllWindows()
四、实践
1.程序运行
2. 原始图片
3、识别结果
识别出剪刀 石头 布
-
发表了主题帖:
【米尔-全志 T527 开发板-试用评测】-OpenCV行人检测
一、软件环境安装
1.安装OpenCV
sudo apt-get install libopencv-dev python3-opencv
2.安装pip
sudo apt-get install python3-pip
二、行人检测概论
使用HOG和SVM构建行人检测器的关键步骤包括:
准备训练数据集:训练数据集应包含大量正样本(行人图像)和负样本(非行人图像)。
计算HOG特征:对于每个图像,计算HOG特征。HOG特征是一个一维向量,其中每个元素表示图像中特定位置和方向的梯度强度。
训练SVM分类器:使用HOG特征作为输入,训练SVM分类器。SVM分类器将学习区分行人和非行人。
评估模型:使用测试数据集评估训练后的模型。计算模型的准确率、召回率和F1分数等指标。
三、代码实现
import cv2
import time
def detect(image,scale):
imagex=image.copy() #函数内部做个副本,让每个函数运行在不同的图像上
hog = cv2.HOGDescriptor() #初始化方向梯度直方图描述子
#设置SVM为一个预先训练好的行人检测器
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
#调用函数detectMultiScale,检测行人对应的边框
time_start = time.time() #记录开始时间
#获取(行人对应的矩形框、对应的权重)
(rects, weights) = hog.detectMultiScale(imagex,scale=scale)
time_end = time.time() #记录结束时间
# 绘制每一个矩形框
for (x, y, w, h) in rects:
cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
print("sacle size:",scale,",time:",time_end-time_start)
name=str(scale)
cv2.imshow(name, imagex) #显示原始效果
image = cv2.imread("back.jpg")
detect(image,1.01)
detect(image,1.05)
detect(image,1.3)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、实际操作
-
发表了主题帖:
【米尔-全志 T527 开发板-试用评测】-OpenCV人脸识别
OpenCV人脸识别
一、软件环境安装
1.安装OpenCV
sudo apt-get install libopencv-dev python3-opencv
2.安装pip
sudo apt-get install python3-pip
3.安装依赖库
pip install opencv-contrib-python
face模块实际上并不是opencv库的一部分。更确切地说,face是部分的的opencv-contrib库。所以,需要安装opencv-contrib库
二、基本流程
1.人脸检测:
首先需要检测图像中的人脸。OpenCV提供了基于Haar级联分类器的detectMultiScale函数来进行人脸检测。这个函数可以在图像的不同尺度上查找可能的人脸区域。
2.人脸特征提取:
一旦检测到人脸,接下来需要提取人脸的特征。这一步是为了将人脸表示为一个特征向量,该向量可以用于后续的识别过程。
3.训练分类器:
使用提取的特征向量和相应的标签来训练一个分类器。OpenCV提供了多种机器学习算法,如支持向量机(SVM)、k最近邻(k-NN)等,来训练分类器。
4.人脸识别:
在测试阶段,对于新的图像,首先检测图像中的人脸,然后提取其特征,并使用训练好的分类器进行识别。
三、程序代码
# -*- coding: utf-8 -*-
import cv2
import numpy as np
# 读取训练图像
images=[]
images.append(cv2.imread("f01.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f02.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f11.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f12.png",cv2.IMREAD_GRAYSCALE))
# 给训练图像贴标签
labels=[0,0,1,1]
# 读取待识别图像
predict_image=cv2.imread("fTest.png",cv2.IMREAD_GRAYSCALE)
# 识别
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels))
label,confidence= recognizer.predict(predict_image)
# 打印识别结果
print("识别标签label=",label)
print("置信度confidence=",confidence)
四、实验过程
NumPy(Numeric Python)是Python的一种开源的数值计算扩展,也是Python科学计算的基础库
1.程序对应图像如下:
2.运行程序的结果
3.程序对应的彩色图像
4.运行程序结果
5.注意事项
图片的像素大小有要求,要求训练图像的像素大小与检测图像的大小相同
注意更改图像的名称
-
回复了主题帖:
【米尔-全志 T527 开发板-试用评测】-FacenetPytorch人脸识别
Jacktang 发表于 2024-11-15 07:30
人脸识别的算法还真多
说的安装facenet_pytorch库的步骤还不太明白
1.GitHub下载程序
2。更改facenet。py程序
3。运行preditct。py
4.输入想要对比图片的文件夹名称和文件名称
5.环境安装 就是缺啥按啥
- 2024-11-14
-
发表了主题帖:
【米尔-全志 T527 开发板-试用评测】-FacenetPytorch人脸识别
一、facenet_pytorch算法实现人脸识别
深度神经网络
简介
Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了 FaceNet 模型的 PyTorch 实现,可以用于训练自己的人脸识别模型。FaceNet 是由 Google 研究人员提出的一种深度学习模型,专门用于人脸识别任务。
在利用PyTorch神经网络算法进行人脸图像对比的实验设置中,我们专注于对比环节,而不涉及实际项目的完整实现细节。但为了贴近实际应用,我们可以构想以下流程:
1)捕捉新人脸图像:首先,我们使用摄像头或其他图像采集设备捕捉一张新的人脸照片。
2)加载存储的人脸图像:接着,从数据库中加载所有已存储的人脸图像。这些图像是之前采集并存储的,用于与新捕捉到的人脸照片进行对比。
3)构建神经网络模型:为了实现对比功能,我们需要一个预先训练好或自定义的神经网络模型。这个模型能够提取人脸图像中的关键特征,使得相似的图像在特征空间中具有相近的表示。
4)特征提取:利用神经网络模型,对新捕捉到的人脸照片和存储的每一张人脸图像进行特征提取。这些特征向量将用于后续的对比计算。
5)计算相似度:采用合适的相似度度量方法(如余弦相似度、欧氏距离等),计算新照片特征向量与存储图像特征向量之间的相似度。
6)确定匹配图像:根据相似度计算结果,找到与新照片相似度最高的存储图像,即认为这两张图像匹配成功。
7)输出匹配结果:最后,输出匹配成功的图像信息或相关标识,以完成人脸对比的实验任务。
核心组件
MTCNN:Multi-task Cascaded Convolutional Networks,即多任务级联卷积网络,专门设计用于同时进行人脸检测和对齐。它在处理速度和准确性上都有出色的表现,是当前人脸检测领域的主流算法之一。
FaceNet:由Google研究人员提出的一种深度学习模型,专门用于人脸识别任务。FaceNet通过将人脸图像映射到一个高维空间,使得同一个人的不同图像在这个空间中的距离尽可能小,而不同人的图像距离尽可能大。这种嵌入表示可以直接用于人脸验证、识别和聚类。
功能
支持人脸检测:使用MTCNN算法进行人脸检测,能够准确识别出图像中的人脸位置。
支持人脸识别:使用FaceNet算法进行人脸识别,能够提取人脸特征并进行相似度计算,实现人脸验证和识别功能。
二、安装facenet_pytorch库
更新系统
更新ubuntu系统,详情查看米尔提供的资料文件
更新系统软件
apt-get update
安装git等支持软件
sudo apt-get install -y python3-dev python3-pip libopenblas-dev libssl-dev libffi-dev git cmake
安装Pytorch支持工具
# 克隆 PyTorch 源代码
git clone --recursive https://github.com/pytorch/pytorch
# 进入 PyTorch 目录
cd pytorch
# 安装 PyTorch (需要根据你的需求选择 CUDA 版本,如果不需要 GPU 支持则不需要 --cuda 参数)
pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html
# 测试 PyTorch 安装
python3 -c "import torch; print(torch.__version__)"
5.安装facenet_pytorch
pip3 install facenet_pytorch
三、CSDN参考案例
1.代码实现
############face_demo.py#############################
import cv2
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
# 获得人脸特征向量
def load_known_faces(dstImgPath, mtcnn, resnet):
aligned = []
knownImg = cv2.imread(dstImgPath) # 读取图片
face = mtcnn(knownImg) # 使用mtcnn检测人脸,返回人脸数组
if face is not None:
aligned.append(face[0])
aligned = torch.stack(aligned).to(device)
with torch.no_grad():
known_faces_emb = resnet(aligned).detach().cpu()
# 使用ResNet模型获取人脸对应的特征向量
print("\n人脸对应的特征向量为:\n", known_faces_emb)
return known_faces_emb, knownImg
# 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一张人脸
def match_faces(faces_emb, known_faces_emb, threshold):
isExistDst = False
distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
print("\n两张人脸的欧式距离为:%.2f" % distance)
if (distance < threshold):
isExistDst = True
return isExistDst
if __name__ == '__main__':
# help(MTCNN)
# help(InceptionResnetV1)
# 获取设备
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# mtcnn模型加载设置网络参数,进行人脸检测
mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3],
keep_all=True, device=device)
# InceptionResnetV1模型加载用于获取人脸特征向量
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
MatchThreshold = 0.8 # 人脸特征向量匹配阈值设置
known_faces_emb, _ = load_known_faces('yz.jpg', mtcnn, resnet) # 已知人物图
faces_emb, img = load_known_faces('yz1.jpg', mtcnn, resnet) # 待检测人物图
isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人脸匹配
print("设置的人脸特征向量匹配阈值为:", MatchThreshold)
if isExistDst:
boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)
print('由于欧氏距离小于匹配阈值,故匹配')
else:
print('由于欧氏距离大于匹配阈值,故不匹配')
此代码是使用训练后的模型程序进行使用,在程序中需要标明人脸识别对比的图像。
2.实践过程
第一次运行时系统需要下载预训练的vggface模型,下载过程较长,后面就不需要在下载了运行会很快。如图所示:
3.程序运行异常呗终止
运行程序,提示killed,系统杀死了本程序的运行,经过多方面的测试,最终发现是识别的图片过大,使得程序对内存消耗过大导致。后将图片缩小可以正常运行了。
以下是对比图像和对比结果。
四、gitHub开源代码
首先下载代码文件
代码库中,大致的介绍了facenet算法的训练步骤等。
代码实现
以下是facenet的python代码,注意需要更改下面的一条程序"cuda" False,因为t527使用的是cpu,芯片到时自带gpu但是cuda用不了,因为cuda是英伟达退出的一种计算机架构。
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.backends.cudnn as cudnn
from nets.facenet import Facenet as facenet
from utils.utils import preprocess_input, resize_image, show_config
#--------------------------------------------#
# 使用自己训练好的模型预测需要修改2个参数
# model_path和backbone需要修改!
#--------------------------------------------#
class Facenet(object):
_defaults = {
#--------------------------------------------------------------------------#
# 使用自己训练好的模型进行预测要修改model_path,指向logs文件夹下的权值文件
# 训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
# 验证集损失较低不代表准确度较高,仅代表该权值在验证集上泛化性能较好。
#--------------------------------------------------------------------------#
"model_path" : "model_data/facenet_mobilenet.pth",
#--------------------------------------------------------------------------#
# 输入图片的大小。
#--------------------------------------------------------------------------#
"input_shape" : [160, 160, 3],
#--------------------------------------------------------------------------#
# 所使用到的主干特征提取网络
#--------------------------------------------------------------------------#
"backbone" : "mobilenet",
#-------------------------------------------#
# 是否进行不失真的resize
#-------------------------------------------#
"letterbox_image" : True,
#-------------------------------------------#
# 是否使用Cuda
# 没有GPU可以设置成False
#-------------------------------------------#
"cuda" : False,
}@classmethod
def get_defaults(cls, n):
if n in cls._defaults:
return cls._defaults[n]
else:
return "Unrecognized attribute name '" + n + "'"
#---------------------------------------------------#
# 初始化Facenet
#---------------------------------------------------#
def __init__(self, **kwargs):
self.__dict__.update(self._defaults)
for name, value in kwargs.items():
setattr(self, name, value)
self.generate()
show_config(**self._defaults)
def generate(self):
#---------------------------------------------------#
# 载入模型与权值
#---------------------------------------------------#
print('Loading weights into state dict...')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.net = facenet(backbone=self.backbone, mode="predict").eval()
self.net.load_state_dict(torch.load(self.model_path, map_location=device), strict=False)
print('{} model loaded.'.format(self.model_path))
if self.cuda:
self.net = torch.nn.DataParallel(self.net)
cudnn.benchmark = True
self.net = self.net.cuda()
#---------------------------------------------------#
# 检测图片
#---------------------------------------------------#
def detect_image(self, image_1, image_2):
#---------------------------------------------------#
# 图片预处理,归一化
#---------------------------------------------------#
with torch.no_grad():
image_1 = resize_image(image_1, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
image_2 = resize_image(image_2, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
photo_1 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_1, np.float32)), (2, 0, 1)), 0))
photo_2 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_2, np.float32)), (2, 0, 1)), 0))
if self.cuda:
photo_1 = photo_1.cuda()
photo_2 = photo_2.cuda()
#---------------------------------------------------#
# 图片传入网络进行预测
#---------------------------------------------------#
output1 = self.net(photo_1).cpu().numpy()
output2 = self.net(photo_2).cpu().numpy()
#---------------------------------------------------#
# 计算二者之间的距离
#---------------------------------------------------#
l1 = np.linalg.norm(output1 - output2, axis=1)
plt.subplot(1, 2, 1)
plt.imshow(np.array(image_1))
plt.subplot(1, 2, 2)
plt.imshow(np.array(image_2))
plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
plt.show()
return l1
代码实现
此代码调用的签名的代码,但其可以直接的去调用图片进行人脸识别。
from PIL import Image
from facenet import Facenet
if __name__ == "__main__":
model = Facenet()
while True:
image_1 = input('Input image_1 filename:')
try:
image_1 = Image.open(image_1)
except:
print('Image_1 Open Error! Try again!')
continue
image_2 = input('Input image_2 filename:')
try:
image_2 = Image.open(image_2)
except:
print('Image_2 Open Error! Try again!')
continue
probability = model.detect_image(image_1,image_2)
print(probability)
程序运行
运行程序后首先显示的是程序的配置信息,然后可以输入图像对比检测的内容。以下是图像识别的效果和对比的准确率。
五、参考文献
CSDN博客
https://blog.csdn.net/weixin_45939929/article/details/124789487?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-124789487-blog-142987324.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.2&utm_relevant_index=4
官方源码来源
https://gitcode.com/gh_mirrors/fac/facenet-pytorch/overview
- 2024-11-06
-
回复了主题帖:
嵌入式工程师AI挑战营(进阶):在RV1106部署InsightFace算法的多人实时人脸识别实战
InsightFace是由旷视科技(Megvii)开发的一款高效的人脸识别、人脸检测和人脸对齐算法库。
开发环境搭建,安装Python和相关的依赖库,在ubuntu PC系统进行人脸识别算法的开发。
使用RKNN-Toolkit2进行算法程序的转换,因为RKNN是在电脑端进行应用的,在嵌入式端无法直接运行。所以需要使用工具进行算法程序的转换。
实际开发,在pc端进行人脸识别算法的开发和训练,最终将算法程序部署到rv1106电路板上进行实际的使用和调试。
- 2024-10-16
-
回复了主题帖:
【新定义TBK-RD8T3x 触摸滑条和按键评估板】三、触摸滑动触摸&RDS魔盒
程英茂 发表于 2024-10-16 07:48
提出了问题,之后忽然找到了答案,
厉害厉害 这几天没看消息 错过了
- 2024-09-19
-
回复了主题帖:
【 匠芯创D133CBS】-小火苗-PWM测试
Jacktang 发表于 2024-9-14 07:46
用不了其他引脚进行PWM测试,这个最后怎么处理的呢
蜂鸣器用的是PWM1 用的蜂鸣器
-
回复了主题帖:
【 匠芯创D133CBS】-网络通讯测试
Jacktang 发表于 2024-9-15 08:48
评估板不知道怎么回事下载不了其编译后的镜像,这个是个小遗憾
是啊
- 2024-09-13
-
发表了主题帖:
【 匠芯创D133CBS】-小火苗-PWM测试
PWM工作原理
PWM 信号
< class="p" style="">PWM 信号通常由一列占空比不同的矩形脉冲构成,其占空比可以调节。用数字输出来控制 PWM 占空比,占空比提高意味着高电平脉宽增大,输出的能量就会增加,PWM 就相当于一个 功率版的 DA 转换模块。下图是一个典型的 PWM 信号波形:
图典型的 PWM 信号波形
< class="p" style="">占空比的计算方法: 占空比 = (脉宽时间 / 周期) * 100%
< class="p" style="">结合上图,我们可以说: 脉宽时间 1 相比 脉宽时间 2 提供较小的占空比。
< class="p" style="">PWM 通常用于背光亮度调节、电机控制、舵机控制等。本文仅限于 PWM 调节背光的功能,通过调节 PWM 中的占空比,达到控制 LED 背光电流的通和断,进而可调整背光亮度。
PWM驱动配置
打开VsCode软件,打开该文件,在VsCode下打开终端,输入list命令查看系统,使用lunch 11 选择程序系统。
在文件夹下打开win_cmd.bat终端,因为VsCode打开menuconfig配置文件的时候显示和操作会很卡。所以直接用电脑自带的终端打开。
编译
使用终端命令scons进行编译
下载
测试
查看手册和板子原理图,PWM引脚接入蜂鸣器,其余的PWM引脚被其他功能复用,所以在此使用不了其他引脚进行PWM测试。
-
发表了主题帖:
【 匠芯创D133CBS】-网络通讯测试
一、MAC 使用指南
支持全双工/半双工
支持 100/10 Mbps,部分 SoC 支持 1000 Mbps
支持 RMII 接口,部分 SoC 支持 RGMII 接口
支持内部 DMA
TXFIFO/RXFIFO 的大小均为 2048 Byte,均支持阈值模式和存储-转发模式
支持 VLAN 哈希过滤
支持 64-bit 哈希地址过滤、完美地址过滤(支持 8 个地址寄存器)
支持源地址的插入/替换,VLAN 的插入/替换/删除,CRC 的插入/替换/删除
支持接收校验和错误检测
支持发送校验和计算
二、以太网介绍
以太网(Ethernet)是一种计算机局域网组网技术,基于 IEEE802.3 标准,它规定了包括物理层的连线(RJ45),电气信号(PHY)和媒体访问层(MAC)协议等, 以太网的特征是有线网络,网络中的各终端必须通过网线进行连接,以太网模块可以简单的理解为 MAC 通过 MII 总线控制 PHY 共同完成终端之间数据交换的一种设备。
使用拓扑
一个典型的以太网电路至少需要如下器件的参与
RJ45 连接器
网络变压器
晶振
PHY 收发器
MAC 控制器
AP 处理器
D211 集成 MAC 控制器模块,AP 内部也可以提供 PHY 收发器所需的时钟,从而不使用外部晶振模块。
如果要提升硬件的防静电能力,外部一般会增加 ESD 保护电路。
三、MAC 架构
图模块架构
图MAC 架构
图PHY 架构
四、程序开发--上点干货
五、测试过程
1、镜像选择
Built-in configs:
8. d13x_demo88-nand_baremetal_bootloader
9. d13x_demo88-nand_rt-thread_helloworld
10. d13x_demo88-nor_baremetal_bootloader
11. d13x_demo88-nor_rt-thread_helloworld
12. d13x_kunlunpi88-nor_baremetal_bootloader
13. d13x_kunlunpi88-nor_rt-thread_helloworld
以上六种程序系统适配当前的开发板,d13x_demo88-nand_rt-thread_helloworld系统更适合开发网口程序,但是我的评估板不知道怎么回事下载不了其编译后的镜像,问官方也未得到反馈。后面使用的是d13x_kunlunpi88-nor_rt-thread_helloworld系统进行的实验。
Lwip简介
LWIP是一个轻量的开源的TCP/IP协议栈,专为嵌入式系统设计,在RTOS应用非常多。
特点:LwIP可以在有无操作系统的情况下运行,重点是在保持TCP协议主要功能的基础上减少对RAM的占用,通常只需十几KB的RAM和40K左右的ROM即可运行。
应用:适用于资源受限的嵌入式设备,如云台接入、无线网关、远程模块等。
接口:提供RAW API、NETCONN API和SOCKET API三种编程接口,方便开发者根据需求选择使用。
优势:代码量小、可配置性强、支持多平台,广泛应用于物联网项目中
- 2024-09-12
-
发表了主题帖:
【 匠芯创D133CBS】-小火苗-CAN通讯测试实验
一、CAN配置
驱动配置
Board options --->
Using CAN0
Using CAN1
luban-lite CAN 的 driver 层是基于 RT-Thread 的 CAN 驱动框架实现的,所以需要使能 RT-Thread 的 CAN 驱动框架:
RT-Thread options --->
RT-Thread Components --->
Device Drivers --->
Using CAN device drivers
Enable CAN hardware filter
[ ] Enable CANFD support
EEWORLDIMGTK0
二、CAN 测试程序配置
在 Luban-Lite 根目录下执行 scons --menuconfig,进入 menuconfig 的功能配置界面,按如下选择:
Drivers options --->
Drivers examples --->
Enable CAN driver test command
三、程序编译
程序经过以上配置后编译程序系统便带有了RTC的例程,编译命令为scons。如图所示:
四、程序下载
程序下载使用USB下载会很快,首先连接好设备后,按住BOOT按键不松手再按RESET按键,下载软件便可以发现设备。
五、CAN 收发测试
正常模式收发测试
将测试板上的 CAN0 接口连接到CAN分析仪上。执行 sample 命令,CAN0 会向 CAN1 发送数据,CAN分析仪会打印接收到的数据。
aic /> can_sample
回环模式收发测试
在打开 test_can 的编译后,板子上可直接运行 test_can 命令:
aic /> test_can
test_can - test CAN send frame to itself (loopback mode)
Usage:
test_can <can_name> frame_id#frame_dataFor example:
test_can can1 1a3#11.22.9a.88.ef.00
执行命令,CAN 设备会向自己发送数据,并会打印接收到的数据。
aic /> test_can can1 1a3#11.22.9a.88.ef.00 # 设置 CAN1 为接收端和发送端,发送数据帧 1a3#11.22.9a.88.ef.00
The can1 received thread is ready...
received msg:
ID: 0x1a3 DATA: 11 22 9a 88 ef 00
以上是官方的教程,实操如图所示:
六、相关资料
电路引脚,如图所示: