- 2025-01-14
-
回复了主题帖:
《嵌入式软件的时间分析》读书活动:4 第四章读书笔记-软件时间理论
感觉 LET的一些思想和 MODBUS的设计思路 上是一致的,对适应不同速度 的设备有很大的好处,兼容性也更好
-
回复了主题帖:
《嵌入式软件的时间分析》读书活动:3 第三章读书笔记-操作系统
看大佬的帖子比看书好
-
回复了主题帖:
AI挑战营(进阶)单人比对与三人识别
wangerxian 发表于 2025-1-13 15:28
识别人脸的效果确实不错,看视频帧率也不低。
帧率还有优化空间,在这个应用下mpi的一些地方还能简化下
-
回复了主题帖:
《嵌入式软件的时间分析》读书活动:2 第二章读书笔记-处理器基本知识
书上这里的突发访问与多次单独访问这个翻译感觉 不好, 随机读取与连续读取不知是否更合适
-
回复了主题帖:
《嵌入式软件的时间分析》读书活动:1 第一章读书笔记-基础知识
汽车是那么喜欢V模型,喜欢得有点让人恶心
- 2025-01-12
-
发表了主题帖:
AI挑战营(进阶)单人比对与三人识别
本帖最后由 sgf201 于 2025-1-12 16:39 编辑
一,单人对比
生成rknn模型后,就可以部署在开发板上验证下效果了。
首先进行单人的匹配实验
代码中加入比对人脸,咱们选择帅气的joy
使用retinaface识别人脸后,依次计算特征值,然后计算与目标人脸的距离
for(int i = 0; i < od_results.count; i++)
{
// if(od_results.count >= 1)
// {
object_detect_result *det_result = &(od_results.results[i]);
sX = (int)((float)det_result->box.left *scale_x);
sY = (int)((float)det_result->box.top *scale_y);
eX = (int)((float)det_result->box.right *scale_x);
eY = (int)((float)det_result->box.bottom *scale_y);
cv::Rect roi(sX,sY ,
(eX - sX),
(eY - sY));
cv::Mat face_img = bgr(roi);
letterbox(face_img,facenet_input);
int ret = rknn_run(app_facenet_ctx.rknn_ctx, nullptr);
if (ret < 0) {
printf("rknn_run fail! ret=%d\n", ret);
return -1;
}
output = (uint8_t *)(app_facenet_ctx.output_mems[0]->virt_addr);
output_normalization(&app_facenet_ctx, output, out_fp32);
//float norm = get_duclidean_distance(reference_out_fp32,out_fp32);
// printf("@ (%d %d %d %d) %.3f\n",
// det_result->box.left ,det_result->box.top,
// det_result->box.right,det_result->box.bottom,
// norm);
// sprintf(show_text,"norm=%f",norm);
// cv::putText(bgr, show_text, cv::Point(sX, sY - 8),
// cv::FONT_HERSHEY_SIMPLEX,0.5,
// cv::Scalar(0,255,0),
// 1);
float norm = get_duclidean_distance(out_fp32, out_fp32_collection[0])
[localvideo]c2263a446e6ae6710b00bd84501ebb5c[/localvideo]
运行中发现提示下面的警告
查看人脸检测代码发现这里实际数字与警告的内容不相符,并没有达到128个脸,只是超过4个都 会报这个警告,后续多人测试中会尽量让镜头中的人脸在4个以内
二、三人识别
分别截取三个人的头像
设置了阈值为1.1,几乎没有误检
for(int i = 0; i < 3; i++){
cv::Mat image = cv::imread(image_path[i]);
cv::Mat facenet_input(facenet_height, facenet_width, CV_8UC3, app_facenet_ctx.input_mems[0]->virt_addr);
letterbox(image,facenet_input);
int ret = rknn_run(app_facenet_ctx.rknn_ctx, nullptr);
if (ret < 0) {
printf("rknn_run fail! ret=%d\n", ret);
return -1;
}
uint8_t *output = (uint8_t *)(app_facenet_ctx.output_mems[0]->virt_addr);
float* reference_out_fp32 = (float*)malloc(sizeof(float) * 512);
output_normalization(&app_facenet_ctx,output,reference_out_fp32);
out_fp32_collection[i] = reference_out_fp32;
}
while(1)
{
// get vi frame
h264_frame.stVFrame.u32TimeRef = H264_TimeRef++;
h264_frame.stVFrame.u64PTS = TEST_COMM_GetNowUs();
s32Ret = RK_MPI_VI_GetChnFrame(0, 0, &stViFrame, -1);
if(s32Ret == RK_SUCCESS)
{
void *vi_data = RK_MPI_MB_Handle2VirAddr(stViFrame.stVFrame.pMbBlk);
cv::Mat yuv420sp(height + height / 2, width, CV_8UC1, vi_data);
cv::Mat bgr(height, width, CV_8UC3, data);
cv::Mat model_bgr(model_height, model_width, CV_8UC3);
cv::cvtColor(yuv420sp, bgr, cv::COLOR_YUV420sp2BGR);
cv::resize(bgr, frame, cv::Size(width ,height), 0, 0, cv::INTER_LINEAR);
cv::resize(bgr, model_bgr, cv::Size(model_width ,model_height), 0, 0, cv::INTER_LINEAR);
memcpy(rknn_app_ctx.input_mems[0]->virt_addr, model_bgr.data, model_width * model_height * 3);
inference_retinaface_model(&rknn_app_ctx, &od_results);
// std::vector<std::pair<float, int>> distances; // 存储距离和对应的标签
// std::vector<std::pair<std::string, float>> detected_names_with_scores; // 存储人名和精度得分
// std::unordered_set<int> matched_indices; // 用于记录已匹配的标签索引
for(int i = 0; i < od_results.count; i++)
{
// if(od_results.count >= 1)
// {
object_detect_result *det_result = &(od_results.results[i]);
sX = (int)((float)det_result->box.left *scale_x);
sY = (int)((float)det_result->box.top *scale_y);
eX = (int)((float)det_result->box.right *scale_x);
eY = (int)((float)det_result->box.bottom *scale_y);
cv::Rect roi(sX,sY ,
(eX - sX),
(eY - sY));
cv::Mat face_img = bgr(roi);
letterbox(face_img,facenet_input);
int ret = rknn_run(app_facenet_ctx.rknn_ctx, nullptr);
if (ret < 0) {
printf("rknn_run fail! ret=%d\n", ret);
return -1;
}
output = (uint8_t *)(app_facenet_ctx.output_mems[0]->virt_addr);
output_normalization(&app_facenet_ctx, output, out_fp32);
//float norm = get_duclidean_distance(reference_out_fp32,out_fp32);
// printf("@ (%d %d %d %d) %.3f\n",
// det_result->box.left ,det_result->box.top,
// det_result->box.right,det_result->box.bottom,
// norm);
// sprintf(show_text,"norm=%f",norm);
// cv::putText(bgr, show_text, cv::Point(sX, sY - 8),
// cv::FONT_HERSHEY_SIMPLEX,0.5,
// cv::Scalar(0,255,0),
// 1);
for(int i=0; i<3;i++){
float norm = get_duclidean_distance(out_fp32, out_fp32_collection[i]);
//float norm = get_duclidean_distance(reference_out_fp32,out_fp32);
// printf("@ (%d %d %d %d) %.3f\n",
// det_result->box.left ,det_result->box.top,
// det_result->box.right,det_result->box.bottom,
// norm);
// sprintf(show_text,"norm=%f",norm);
// cv::putText(bgr, show_text, cv::Point(sX, sY - 8),
// cv::FONT_HERSHEY_SIMPLEX,0.5,
// cv::Scalar(0,255,0),
// 1);
if(norm<1.1){
cv::putText(bgr, names[i], cv::Point(sX, sY - 8),
cv::FONT_HERSHEY_SIMPLEX,0.5,
cv::Scalar(0,255,0),
1);
}
}
[localvideo]7e6b0ea0e914ee5afe6946cd4bb163c0[/localvideo]
历史帖子:
AI挑战营(进阶)onnx转rknn - 嵌入式系统 - 电子工程世界-论坛
AI挑战营(进阶):2.WSL2cuda+pytorch+insight初探 - 嵌入式系统 - 电子工程世界-论坛
AI挑战营(进阶):1.固件编译+yolov5demo编译运行 - 嵌入式系统 - 电子工程世界-论坛
- 2025-01-04
-
回复了主题帖:
AI挑战营(进阶) 三:获取onnx模型
大佬,
最后我在这两个项目里面找到了我们需要的onnx模型。
RetinaFace: https://github.com/bubbliiiing/retinaface-pytorch
ArcFace: https://github.com/yakhyo/face-reidentification/tree/main找这种仓库有什么方法吗?还是纯知识阅历呀
- 2024-12-25
-
回复了主题帖:
AI挑战营(进阶)onnx转rknn
Jacktang 发表于 2024-12-25 07:30
为什么还要更新这个example中的rknn模型呢
我是确认下我转出来的rknn是否可用
- 2024-12-24
-
发表了主题帖:
AI挑战营(进阶)onnx转rknn
一、安装rknn-toolkit
下载rknn-toolkit2.git
git clone https://github.com/airockchip/rknn-toolkit2.git
安装依赖项目
cd packages/x86_64/
pip install -r requirements_cp310-2.3.0.txt
报错如下:
看了下安装的pytorch发现版本对不上,我torch装的是2.4.0
回退rknntoolkit的版本到2.2.0
pip install -r requirements_cp310-2.2.0.txt
执行成功
pip install rknn_toolkit2-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
二、下载rknn_model_zoo
git clone https://github.com/airockchip/rknn_model_zoo.git
cd examples/yolov5/model
bash ./download_model.sh
python convert.py ../model/yolov5s_relu.onnx rk1106 i8 ../model/yolov5s_relu.rknn 命令报下面的错误
1106应该用rv
python convert.py ../model/yolov5s_relu.onnx rv1106 i8 ../model/yolov5s_relu.rknn
三、更新example中的rknn模型
替换模型后编译完成scp到小板子上运行如下:
- 2024-12-16
-
回复了主题帖:
AI挑战营(进阶):2.WSL2cuda+pytorch+insight初探
安装 rknn后开始报numpy没有int属性,查看报错是在insightface中,将face_analysis.py中下面使用int的地方修改为int32后,就不报错了
for i in range(len(faces)):
face = faces[i]
box = face.bbox.astype(np.int32)
color = (0, 0, 255)
cv2.rectangle(dimg, (box[0], box[1]), (box[2], box[3]), color, 2)
if face.kps is not None:
kps = face.kps.astype(np.int32)
- 2024-12-10
-
发表了主题帖:
AI挑战营(进阶):2.WSL2cuda+pytorch+insight初探
一、docker 运行ubuntu22尝试
个人pc是windows,参考牛人文章发现用的ubuntu22,首先考虑使用docker运行ubuntu22容器,这样即不影响其它已有环境,也不担心其它环境影响它
AI挑战营(进阶):1. InsightFace 快速上手 - 嵌入式系统 - 电子工程世界-论坛
docker之前已经有部署,docker pull ubuntu:22.04下载ubuntu22的image,成功运行
使用下面的命令可以安装cuda
apt install nvidia-cuda-toolkit*
apt install nvidia-cuda-dev
cuda安装完成后,发现nvida的驱动没有安装,于是安装了驱动
运行nvidia-smi后报未知错误,docker中运行ubuntu22来使用nvidia应该还是有问题的
二、WSL2中运行ubuntu22
在wsl2中新建ubuntu22的实例,可以直接在vscode远程中选择发行版
创建完成后,运行nvidia-smi,直接看到下面的输出
还是微软贴心。
安装cuda 11.8版本,查找官网发现下面的安装命令,运行成功
完成后运行nvcc -V,可以得到下面的输出,证明cuda安装成功。
使用命令安装pytorch
第一次安装时报错了,说sha值不对应,重新运行一次,安装成功
使用下面的命令安装insightface和onnxruntime_gpu
pip install insightface
pip install mxnet onnxruntime-gpu
运行人脸分割测试
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
app = FaceAnalysis(name="buffalo_sc",providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = cv2.imread('input.jpeg')
faces = app.get(img)
rimg = app.draw_on(img, faces)
cv2.imwrite("./output.jpg", rimg)
得到下面的图像
运行人脸识别
选取joey作为目标
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
app = FaceAnalysis(name="buffalo_sc",providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = cv2.imread('input.jpeg')
faces = app.get(img)
feats = []
for face in faces:
feats.append(face.normed_embedding)
feats = np.array(feats, dtype=np.float32)
target = cv2.imread('joy.png')
target_faces = app.get(target)
target_feat = np.array(target_faces[0].normed_embedding, dtype=np.float32)
sims = np.dot(feats, target_feat)
print(sims)
target_index = int(sims.argmax())
rimg = app.draw_on(img, [faces[target_index]])
cv2.imwrite("joy_output_target.jpg", rimg)
几张人脸得到的相似度如下:
[ 0.9816556 0.05519836 0.09217417 -0.2159264 0.02295483 0.21829614]
绘制结果如下:
- 2024-12-09
-
发表了主题帖:
AI挑战营(进阶):1.固件编译+yolov5demo编译运行
一、启动
开发板很漂亮,体积也很小巧,有个小疑问是没有找到DDR芯片的位置
板子自带可以启动的固件,只是flash体积比较小,看资料板子也支持ubuntu,找了一张64G的tf卡,烧录ubuntu镜像测试
使用SD卡启动选项,选取预编译的ubuntu固件,接到开发板后,成功进入系统
/下的体积并未能显示整个tf卡的体积,简单查找未找到扩充空间的方式。
本次挑战需要使用摄像头,查看ubuntu的/dev/目录并没有发现video设备,所以使用ubuntu固件做这次的挑战并不合适,未来再查找摄像头节点驱动的问题
下面更新flash中的固件,因为随机固件按说明有一定问题,使用板上flash也是需要更新下固件的
烧写成功后,成功进入系统
二、SDK编译与example编译运行
搭建开发环境时,为尽量避免对其它环境的影响,我使用了docker方式,按照使用说明加载docker image后,下载sdk的git仓库,使用-v方式映射目录,运行docker 容器如下图:
cd /home
build.sh
然后选择对应的开发板型号
编译成功如下图 example 编译与运行
从github clone官方的example,clone完成如下图:
example编译步骤:
export LUCKFOX_SDK_PATH=/home/
执行build.sh后选择要编译的demo
编译完成如下图:
三、运行
将install文件夹scp到开发板的/root/目录
然后执行
打开 vlc播放器播放rtsp://192.168.x.xx/live/0,看到下面图像:
-
回复了主题帖:
AI挑战营(进阶):1. InsightFace 快速上手
大佬厉害
- 2024-12-06
-
回复了主题帖:
AI挑战营(进阶):3. onnx2rknn
大佬大佬
-
回复了主题帖:
共读入围名单:《大语言模型:原理与工程实践》
sgf201 发表于 2024-11-21 16:58
个人信息无误,确认可以完成评测计划。
0101,管理员老大有看到不
- 2024-11-21
-
回复了主题帖:
共读入围名单:《大语言模型:原理与工程实践》
个人信息无误,确认可以完成评测计划。
-
回复了主题帖:
入围名单公布:嵌入式工程师AI挑战营(进阶)的挑战者们,领取板卡啦
个人信息已确认,领取板卡,可继续完成任务。
- 2024-11-18
-
回复了主题帖:
嵌入式工程师AI挑战营(进阶):在RV1106部署InsightFace算法的多人实时人脸识别实战
本帖最后由 sgf201 于 2024-11-18 20:02 编辑
申请理由:
1.InsightFace 是一个开源的深度人脸分析工具箱,实现了对人物信息的精确识别,使用它可实现高效的人脸识别、人脸检测和人脸对齐等功能,支持 2D 和 3D 的人脸分析任务,并且为了适应不同的应用场景,它针对训练和部署都进行了优化。
2.个人从事模型推相关部署工作,并在自研专用芯片上进行性能优化,使用过yolov5 yolov8等。insightFace的身份信息识别对我有较大的吸引力,同时在RV1106的使用中还可以通过横向对比了解RK在视觉方面功能部署上的优化方式,在自己的工作中借鉴
3.计划:
a.搭建开发环境,运行demo,实现图像和获取和保存
b.部署InsightFace算法,实现支持3人实时人脸识别并在平台上正常运行
c.分析可进行的性能优化点,确认rk的实现方案
d.进一步优化,提高推理与显示帧率
e.增加视频编码功能,实现一个支持3个预定义人员的智能监控
-
回复了主题帖:
共读颁奖:《大语言模型:原理与工程实践》
啥 情况 ,我没收到书啊