X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
玄铁RISC-V活动专区
[经验分享] 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A YOLOX初体验与USB摄像头测试
DDZZ669
2023-10-4 16:46
楼主
本篇参考官网文档,来尝试YOLOX移植,以及通过USB摄像头,测试实时的物体检测。 # 1 YOLOX移植 ## 1.1 YOLOX目标检测简介 YOLOX是YOLO的无锚版本,设计更简单,但性能更好!它旨在弥合研究与工业界之间的差距。 这个存储库是 PyTorch 版本 YOLOX 的实现,还有一个MegEngine实现。 ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/1.png) ## 1.2 准备python3虚拟环境 安装一些需要用的软件 ```sh sudo apt install wget git vim sudo apt install python3-pip sudo apt install python3.11-venv ``` 安装 SHL 库,从github的T-head-Semi中下载: ```sh wget https://github.com/T-head-Semi/csi-nn2/releases/download/v2.4-beta.1/c920.tar.gz tar xf c920.tar.gz cp c920/lib/* /usr/lib/riscv64-linux-gnu/ -rf ``` 如果通过板子如果无法访问github,可尝试先在Windows电脑上下载此压缩包,再拷贝到板子中。 然后在一个合适的位置(我的是~/Desktop/tfcard/yoloxTest/),创建 python虚拟环境,后续YOLOX 的测试在 python虚拟环境中进行: ```sh cd ~/Desktop/tfcard/yoloxTest/ python3 -m venv #创建虚拟环境 #激活虚拟环境 source ~/Desktop/tfcard/yoloxTest/ort/bin/activate #退出当前虚拟环境 deactivate ``` ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/2.png) python 虚拟环境创建完成后,可以在命令行的最前面看到环境的名称,如上图。 在 python 虚拟环境,可以直接通过 pip install 安装纯 python 包。 ## 1.3 获取 YOLOX 模型 ### 1.3.1 下载源码和模型 github 上下载源码和模型: ```sh git clone https://github.com/Megvii-BaseDetection/YOLOX.git cd YOLOX/demo/ONNXRuntime wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx ``` 修改源码,使用 HHB-onnxruntime 执行模型,因此切换到onnxruntime 示例目录,修改文件demo/ONNXRuntime/onnx_inference.py 的开头新增两行代码: ```python import sys sys.path.insert(0, "../../") ``` ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/3.png) 代码中使用 sys.path.insert 指定搜索路径,以此免去从源码中安装 YOLOX 的安装包的操作。 ### 1.3.2 安装依赖 目前RISC-V 体系结构的 python 生态还有欠缺,可以下载预编译好的 python 包: ```sh git clone -b python3.11 https://github.com/zhangwm-pt/prebuilt_whl.git cd prebuilt_whl ``` 然后手动安装: ```sh pip install numpy-1.25.0-cp311-cp311-linux_riscv64.whl pip install opencv_python-4.5.4+4cd224d-cp311-cp311-linux_riscv64.whl pip install kiwisolver-1.4.4-cp311-cp311-linux_riscv64.whl pip install Pillow-9.5.0-cp311-cp311-linux_riscv64.whl pip install matplotlib-3.7.2.dev0+gb3bd929cf0.d20230630-cp311-cp311-linux_riscv64.whl pip install pycocotools-2.0.6-cp311-cp311-linux_riscv64.whl pip3 install loguru-0.7.0-py3-none-any.whl pip3 install torch-2.0.0a0+gitc263bd4-cp311-cp311-linux_riscv64.whl pip3 install MarkupSafe-2.1.3-cp311-cp311-linux_riscv64.whl pip3 install torchvision-0.15.1a0-cp311-cp311-linux_riscv64.whl pip3 install psutil-5.9.5-cp311-abi3-linux_riscv64.whl pip3 install tqdm-4.65.0-py3-none-any.whl pip3 install tabulate-0.9.0-py3-none-any.whl ``` 安装后可以使用pip list查看下已安装的包: ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/4.png) ### 1.3.3 安装 HHB-onnxruntim **ONNX** (Open Neural Network Exchange),是由LF AI & Data Foundation发起并维护的一种AI模型格式,用于在各种深度学习训练推理框架之间转换的一个通用表示格式。 ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/5.png)**ONNX Runtime**是微软发起的基于ONNX模型格式的推理运行时框架,目前已是ONNX社区流水线的核心组件,以及ONNX运行时的事实标准。 **HHB-onnxuruntime** 是移植了 SHL 后端(execution providers),让onnxruntime能复用到SHL中针对玄铁CPU的高性能优化代码。 HHB的相关介绍见:[HHB 用户手册](https://www.yuque.com/za4k4z/oxlbxl) github下载对应的whl文件进行安装: ```sh wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl/onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl pip install onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl ``` 在示例目录中执行 onnx_inference.py 示例: ```sh python3 onnx_inference.py -m yolox_s.onnx -i test.jpg -o outdir -s 0.3 --input_shape 640,640 ``` 参数说明: - -m:指定模型:也就是刚才下载的yolox_s.onnx - -i:指定图片:自己找一张图片,尺寸应该无要求,我的是test.jpg,一个道路上有汽车和行人的图片 - -o:指定输出目录:outdir,不需要提前新建空目录,会自动生成 - -s:指定检测的阈值:0.3 - --input_shape:指定检测时使用的图片尺寸,这里好像是固定的640,640,填图片实际尺寸会报错 示例正常执行后,会在 outdir 目录下生成结果图片 soccer.jpg。图片中会用框画出检测到的目标,并标注概率,效果如下图: ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/6.png) # 2 USB摄像头实时物体识别 ## 2.1 USB摄像头基础测试 安装 guvcview ,并使用相应的命令查看USB 摄像头的图像流: ```sh sudo apt-get install guvcview guvcview ``` 实测效果如下,如果视频的演示不对(我的一开始画面是绿色的),可以修改Camera Output的格式试试: ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/7.png) 也可以使用使用OpnenCV来读取摄像头,测试程序opencv-camera.py代码如下: ```sh import cv2 # 创建VideoCapture对象,参数为0表示使用本地摄像头 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() #从摄像头中读取一帧图像 cv2.imshow('Local Camera', frame) #显示图像 # 按下q键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() ``` 运行程序: ```sh source ~/Desktop/tfcard/yoloxTest/ort/bin/activate python3 opencv-camera.py ``` 也是可以输出摄像头图像的,我这个摄像头的输出画面就是上下反的,所以这里会显示反的画面,是正常的: ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/8.png) ## 2.2 修改为实时识别 ```python #前面省略相同的部分... input_shape = (640,640) model = "yolox_s.onnx" score_thr = 0.3 session = onnxruntime.InferenceSession(model) def onxx_process(origin_img): img, ratio = preprocess(origin_img, input_shape) ort_inputs = {session.get_inputs()[0].name: img[None, :, :, :]} output = session.run(None, ort_inputs) predictions = demo_postprocess(output[0], input_shape)[0] boxes = predictions[:, :4] scores = predictions[:, 4:5] * predictions[:, 5:] boxes_xyxy = np.ones_like(boxes) boxes_xyxy[:, 0] = boxes[:, 0] - boxes[:, 2]/2. boxes_xyxy[:, 1] = boxes[:, 1] - boxes[:, 3]/2. boxes_xyxy[:, 2] = boxes[:, 0] + boxes[:, 2]/2. boxes_xyxy[:, 3] = boxes[:, 1] + boxes[:, 3]/2. boxes_xyxy /= ratio dets = multiclass_nms(boxes_xyxy, scores, nms_thr=0.45, score_thr=0.1) if dets is not None: final_boxes, final_scores, final_cls_inds = dets[:, :4], dets[:, 4], dets[:, 5] origin_img = vis(origin_img, final_boxes, final_scores, final_cls_inds, conf=score_thr, class_names=COCO_CLASSES) if __name__ == '__main__': # 创建VideoCapture对象,参数为0表示使用本地摄像头 cap = cv2.VideoCapture(0) cap.set(3, 640) #width cap.set(4, 640) #height print("start capture") idx = 0 while True: ret, frame = cap.read() #从摄像头中读取一帧图像 idx = idx + 1 if idx > 10: onxx_process(frame) cv2.imshow('Local Camera', frame) #显示图像 #后面省略相同的部分... ``` 实测效果图如下: ![](https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic2/LiPi4A/6/9.png) 演示视频:
video
实际效果每处理一帧的速度比较慢,可能是还没使用NPU的原因。 # 3 总结 本篇介绍了如何移植YOLOX程序,测试了对一张图片中的物体识别,然后通过USB摄像头,测试实时的物体检测效果。
点赞
回复评论 (1)
沙发
火辣西米秀
RISC-V 体系结构的 python 生态链环境确实还需要进一步发展发展,是用的人少么
点赞
2023-10-6 08:38
最新活动
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
随便看看
贪吃蛇 for esp32(是时候表演真正的技术了)
请问MAX232和MAX487的区别
【项目外包】FPGA与ARM通讯
DIY TI电源管理应用
SINA31S第一次上电
电阻选择多少瓦合适?
6410 camera demo程序
我使用的是lm4f120xl开发板,自己在CCS6.0 新建了工程,连上电脑debug,总是提示有...
出自己制作的XDS100V1 DSP仿真器 特价80
叔叔的幼儿园要做一个门禁系统,求各位前辈们给个方案
奇怪——S3C6410内部上拉拉不上去,谁帮我拉下……
stm32定时器中让预装载寄存器值立即改变影子寄存器装载值吗
MSP430G2553的VCC和IO口高电平是什么关系?
预告:下周Hercules精品课件上线!
EVC下的配置问题
USB 盘访问的问题
J1939故障码DTC中转换方式怎么选择?
CE6.0编译问题
vxworks下不能访问优盘的问题
51波特率计算 tool
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复