文章目录
QG2101 使用说明
写在最前面
关于 <> 符号
出现在
<something>
中的片段为我实际开发中修改对应片段中变量后执行的命令,提供给大家作为开发时候的参考和对比
关于各片段
下文中没有特殊说明的均为在终端可执行的命令
有修改或添加说明的需要在修改或添加完成后保存并关闭
关于 ‘’’ 符号
有部分片段在 clone 下来的初始环境中就已经被满足,对于在
'''
something
'''
中对应的的命令片段,用户可以先检查对应文件或修改是否已经存在,若存在则可以跳过该步骤;否则必须执行该步骤
编译环境配置
全程必须使用bash进行操作
sudo apt install build-essential subversion git libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32ncurses-dev lib32z1 gperf bc
开发环境获取
准备 ssh 密钥
如果没有可以用下述指令自行生成,生成细节详见 Google
ssh-keygen
上传公钥并准备私钥
登录
http://gitlab.senslab.com:81
上传公钥 id_rsa_senslab.pub 的内容到 gitlab 账户
私钥 id_rsa_senslab 放到 ~/.ssh
cd ~/.ssh
sudo chmod 600 id_rsa_senslab
cd ~/
git config --global user.email <l565353780l@163.com>
git config --global user.name <Lichanghao>
vi ~/.ssh/config
添加
Host gitlab.senslab.com
User <Lichanghao>
Hostname gitlab.senslab.com
PreferredAuthentications publickey
IdentityFile /home/chli/.ssh/id_rsa_senslab
IdentitiesOnly yes
运行
git clone ssh://git@gitlab.senslab.com:2222/QG2101/repo.git
cd repo
vim repo
修改
REPO_URL = 'ssh://<Lichanghao>@gitlab.senslab.com:2222/QG2101/manifest.git'
运行
python2 repo init -u ssh://git@gitlab.senslab.com:2222/QG2101/QGLinux/manifest.git -b master -m release.xml
python2 repo sync
python2 repo start QG2101 --all
cd software
软件包开发根目录
在这之后,所有的开发工作均在下述目录下完成
<path-to-repo>/software/
不知命令该在哪个目录下运行
命令运行目录均为虚拟机中的
<path-to-repo>/software/
文件夹下
根据开发板 sensor 设置驱动
该部分以我的环境配置作为代码样例,具体环境为
version QG v2101
lunch v2101-perf2-loki
sensor sc5238
复制驱动文件
'''
cp <path-to-sc5238_mipi.c> lichee/linux-4.9/drivers/media/platform/sean-vin/modules/sensor/<sc5238_mipi.c>
'''
修改驱动信息
vim device/config/chips/v2101/configs/<perf2>/board.dts
根据 sensor 的原理图修改
从上到下依次对应:驱动文件名,I2C_ADDR 值,DOVDD 标准电压,AVDD 标准电压,DVDD 标准电压
I2C_ADDR 值可在驱动文件中查询
电压对应关系为 <1000000> <==> 1.0V
具体细节参见对应 sensor 的数据手册第二页
sensor0_mname = "<sc5238_mipi>";
sensor0_twi_addr = <<0x64>>;
sensor0_iovdd_vol = <<1800000>>;
sensor0_avdd_vol = <<2800000>>;
sensor0_dvdd_vol = <<1500000>>;
修改 sensor Makefile
'''
vim lichee/linux-4.9/drivers/media/platform/sean-vin/modules/sensor/Makefile
'''
添加
'''
obj-m += <sc5238_mipi.o>
'''
修改 modules.mk
vim target/qigan/<v2101-perf2>/modules.mk
修改
FILES+=$(LINUX_DIR)/drivers/media/platform/sean-vin/modules/sensor/<sc5238_mipi.ko>
修改目标 /etc/init.d/S00mpp
vim target/qigan/<your-lunch-env-name>/busybox-init-base-files/etc/init.d/S00mpp
修改
insmod $MODULES_DIR/<your-driver-basename>.ko
rmmod $MODULES_DIR/<your-driver-basename>.ko
for chLi:
vim target/qigan/<v2101-perf2>/busybox-init-base-files/etc/init.d/S00mpp
insmod $MODULES_DIR/sc5238_mipi.ko
rmmod $MODULES_DIR/sc5238_mipi.ko
修改目标 isp_cfg build.mk
vim softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/build.mk
在上下两处类似地方处添加
ifeq ($(strip $(SENSOR_NAME)), <your-driver-type>)
TARGET_CFLAGS += -DSENSOR_<YOUR-DRIVER-TYPE>=1
endif
for chLi:
vim softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/build.mk
ifeq ($(strip $(SENSOR_NAME)), sc5238)
TARGET_CFLAGS += -DSENSOR_SC5238=1
endif
修改目标 middleware Makefile
vim package/qigan/eyesee-mpp/middleware/Makefile
添加
else ifeq ($(CONFIG_<your-driver-type>),y)
SENSOR_NAME:=<your-driver-type>
for chLi:
无需添加
vim package/qigan/eyesee-mpp/middleware/Makefile
else ifeq ($(CONFIG_sc5238),y)
SENSOR_NAME:=sc5238
修改 middleware Config.in
vim package/qigan/eyesee-mpp/middleware/Config.in
修改
config <your-driver-type>
bool "use sensor <your-driver-type>"
help
<your-driver-type> is for ipc.
for chLi:
无需执行
vim package/qigan/eyesee-mpp/middleware/Config.in
config sc5238
bool "use sensor sc5238"
help
sc5238 is for ipc.
添加 ISP 效果文件
mkdir softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/SENSOR_H/<your-driver-type>
cp <your-driver-type>_Y<camera-angle>_F<camera-FOV>_<options>.h softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/SENSOR_H/<your-driver-type>/<your-driver-type>_Y<camera-angle>_F<camera-FOV>_<options>.h
for chLi:
无需执行
mkdir softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/SENSOR_H/sc5238
cp <path-to-sc5238_Y30_F1.8_mipi_init_day.h> softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/SENSOR_H/sc5238/sc5238_Y30_F1.8_mipi_init_day.h
cp <path-to-sc5238_Y30_F1.8_mipi_init_nig_0821.h> softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/SENSOR_H/sc5238/sc5238_Y30_F1.8_mipi_init_nig_0821.h
include 效果头文件
vim softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/isp_ini_parse.c
添加
#ifdef SENSOR_<YOUR-DRIVER-TYPE>
#include "SENSOR_H/<your-driver-type>/<your-.h-file-name>"
#endif
在 struct isp_cfg_array cfg_arr[] 中添加
#ifdef SENSOR_SC5238
{"<your-driver-basename>", "<your-.h-file-basename>", <your-camera-width>, <your-camera-height>, <your-camera-fps>, 0, <dict-idx>, &<your-driver-basename>_<options>},
#endif
for chLi:
无需执行
vim softqg/eyesee-mpp/middleware/v2101/media/LIBRARY/libisp/isp_cfg/isp_ini_parse.c
#ifdef SENSOR_SC5238
#include "SENSOR_H/sc5238/sc5238_Y30_F1.8_mipi_init_day.h"
#include "SENSOR_H/sc5238/sc5238_Y30_F1.8_mipi_init_nig_0821.h"
#endif
(在 struct isp_cfg_array cfg_arr[] 中添加)
#ifdef SENSOR_SC5238
{"sc5238_mipi", "sc5238_Y30_F1.8_mipi_init_day", 2560, 1920, 20, 0, 0, &sc5238_mipi_init_day},
{"sc5238_mipi", "sc5238_Y30_F1.8_mipi_init_nig_0821", 2560, 1920, 20, 0, 1, &sc5238_mipi_init_night},
#endif
编译 Loki 系统
初始化编译环境
可以使用环境已符合所有标准的 LinuxVM 虚拟机系统或参考如下步骤自行修复所有依赖问题(DOING)
source build/envsetup.h
lunch <your-env-type>
for chLi:
source build/envsetup.h
lunch
4 # which is v2101-perf2-loki
编译 .img 系统镜像
make -j
文件依赖修复
如果报错,则运行此段
cd out/<v2101-perf2>/compile_dir/host
cd m4-1.4.17
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
cd ..
cd bison-3.0.4
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
cd ..
cd findutils-4.4.2
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' gnulib/lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> gnulib/lib/stdio-impl.h
sed -i '/unistd/a #include <sys/sysmacros.h>' gnulib/lib/mountlist.c
cd ..
sudo vi /usr/include/sys/types.h
在开头添加
#include <sys/sysmacros.h>
运行
vi u-boot-2018.03/include/compiler.h
注释
typedef uint64_t __u64;
运行
cd ../../../..
make -j
生成 .img 文件
pack
编译过后系统镜像位于
out/<your-lunch-env-name>/*.img
for chLi:
out/<your-lunch-env-name>/*.img
烧录 Loki 系统
通过串口连接开发板
打开设备管理器查看开发板对应的串口 COM 编号
打开 secureCRT 以串口模式连接开发板
协议 : Serial
端口 : COM<your-COM-id>
波特率 : 115200
取消选中 RTS/CTS
制作烧录卡并烧录
开发板在拔插 TF 卡的时候必须关机,否则会有小概率出现乱码等情况
将 TF 卡通过读卡器与 Windows 电脑连接,解压位于虚拟机的
<path-to-repo-folder>/tools/
中的
ProductCardTool_CN
工具,在 Windows 上将编译好的 .img 文件以
量产卡
模式烧录到 TF 卡上
将 TF 卡插回开发板,给开发板上电,开发板会
自动进行系统烧录
大约5分钟会烧录完成,烧录结束后板子不会自动重启,也不会有完成提示,可供参考的烧录完成标准为
串口不再有输出信息超过2分钟
恢复 TF 卡
将 TF 卡通过读卡器与 Windows 电脑连接,使用
ProductCardTool_CN
工具,点击恢复即可
若需要在开发板上运行按照下述步骤编译好的软件包,则可以先不拔下 TF 卡
编译软件包
使用 CMake
添加环境变量
编译
按照自己创建的项目进行构建即可,其中编译工具使用 arm-openwrt-linux-[g++, gcc]
make -j
清除
make clean
注:若出问题可尝试用此方式添加路径
sudo sh -c "echo '/home/linux/repo/software/prebuilt/gcc/linux-x86/arm/toolchain-sean-glibc/toolchain/lib' >> /etc/ld.so.conf"
sudo ldconfig
vi ~/.bashrc
添加
export PATH="$PATH:/home/linux/repo/software/prebuilt/gcc/linux-x86/arm/toolchain-sean-glibc/toolchain/bin/"
使用 QG SDK
复制软件包到虚拟机中的编译框架
qgdemo 文件夹名称可以修改
mkdir softqg/eyesee-mpp/middleware/v2101/sample/qgdemo/
cp <path-to-your-code-folder> softqg/eyesee-mpp/middleware/v2101/sample/qgdemo/<your-code-folder-name>
for chLi:
cp <path-to-sample_detect> softqg/eyesee-mpp/middleware/v2101/sample/qgdemo/sample_detect
修改 v2101 loki.mk
vim softqg/eyesee-mpp/middleware/v2101/loki.mk
在 all 与 @echo build eyesee-mpp-middleware done! 中间添加
make -C sample/qgdemo/<your-code-folder-name> -f loki.mk all
在 clean 与 @echo clean eyesee-mpp-middleware done! 中间添加
make -C sample/qgdemo/<your-code-folder-name> -f loki.mk clean
for chLi:
vim softqg/eyesee-mpp/middleware/v2101/loki.mk
make -C sample/qgdemo/sample_detect -f loki.mk all
make -C sample/qgdemo/sample_detect -f loki.mk clean
编译软件包
mkmpp
编译好的软件包生成路径为
softqg/eyesee-mpp/middleware/v2101/sample/qgdemo/<your-code-folder-name>/<your-project-name>
for chLi:
softqg/eyesee-mpp/middleware/v2101/sample/qgdemo/sample_detect/sample_nna
运行软件包
将编译好的软件包放入 TF 卡,并将 TF 卡插回开发板
通过串口在开发板上运行
mount -t vfat /dev/mmcblk0p1 /mnt/extsd
cd /mnt/extsd
./<your-compiled-software>
开启 rtsp 服务
用网线将开发板接入局域网,通过串口在开发板上运行
ifconfig
查看开发板此时的 ip;若需要修改 ip 可以运行
ifconfig <new-ip-to-your-board>
推荐采用以下两种情形之一,均经过测试;其他方案请自行尝试
Windows 主机与开发板通过网线直连,并修改开发板的 ip,使其处于 192.168.1 的 ip 频段
使用交换机的 DHCP 功能实现 Windows 主机与开发板均处于 192.168.1 的 ip 频段局域网中,此时ip会自动进行分配,不需要自行设置
Windows 主机与开发板可以互相 ping 通,则可以使用 rtsp 功能
下载并安装 VLC,在 VLC 中打开网络串流
rtsp://<ip-to-your-board>:8890/senslab
生成 NNA 模型
获取模型转换器
mkdir AI_SDK
cd AI_SDK
git clone ssh://git@gitlab.senslab.com:2222/AI_SDK/nnatransferdocker.git
git clone ssh://git@gitlab.senslab.com:2222/AI_SDK/tool_chain.git
git clone ssh://git@gitlab.senslab.com:2222/AI_SDK/caffe.git
git clone ssh://git@gitlab.senslab.com:2222/AI_SDK/ai_sample.git
在 LinuxVM 虚拟机安装 Anaconda3
详见 Google
以下步骤若在安装有 Ubuntu16.04 的带有 GPU 的主机上,模型转换时间大约缩短一半,环境配置方式完全相同
创建虚拟环境
conda create -n py35 python=3.5.2
conda activate py35
pip install --upgrade pip
pip install numpy xlwt scipy matplotlib opencv-python
设为默认环境
vim ~/.bashrc
在最后添加
conda activate py35
编译 caffe
cd caffe
详见
https://blog.youkuaiyun.com/qq_49466306/article/details/109716146
Makefile.config 的设置由以下几项覆盖上文中修改
# USE_CUDNN := 1
CPU_ONLY := 1
USE_OPENCV := 0
# OPENCV_VERSION := 3
去掉所有 OpenCV 相关的设置或路径
构建模型包
cd ../tool_chain
tar -zxvf QG_NNA_TRANSFER_v1.6.0_Beta_20200917.tar.gz
cd QG_NNA_TRANSFER/input
mkdir <your-model-name>
cd <your-model-name>
for chLi:
cd ../tool_chain
tar -zxvf QG_NNA_TRANSFER_v1.6.0_Beta_20200917.tar.gz
cd QG_NNA_TRANSFER/input
mkdir yolov3
cd yolov3
mkdir imgs
mkdir imgs/imgs_s
mkdir imgs/imgs_m
mkdir imgs/test_images_folder
mkdir models
touch net_cfg.json
cp <.caffemodel & .prototxt> models/
cp <test-image-jpg> imgs/imgs_s
cp <20-test-image-jpgs> imgs/imgs_m
cp <20-test-image-jpgs> imgs/test_images_folder
vim net_cfg.json
参考如下示例构建自己的 json 文件
{
"nets": {
"yolov3": {
"enable": 1,
"image_mode": 0,
"multi_pics_mode": 1,
"weight_enhancement": 0,
"act_enhancement": 0,
"platform": "caffe",
"use_new_api": false,
"test_net": 0,
"build_new_int2fp32_net": 0,
"image": {
"input_image_single": "./imgs/imgs_s/3.jpg",
"input_image_multi": "./imgs/imgs_m",
"images_for_test": "./imgs/test_images_folder"
},
"pre_process": {
"bgr_rgb": "BGR",
"channel": 3,
"size": [
416,
416
],
"mean": [
0,
0,
0
],
"ratio": [
0.00390625,
0.00390625,
0.00390625
]
},
"post_process": {
"enable": 1,
"min_score": "",
"face_save_path": "",
"wt_bs_path": "",
"face_read_path": ""
},
"caffe": {
"caffemodel_filename": "./models/yolov3.caffemodel",
"prototxt_filename": "./models/yolov3.prototxt",
"out_layer_name": [
"layer82-conv",
"layer94-conv",
"layer106-conv"
],
"output_dir": ""
},
"pytorch": {},
"tensorflow": {},
"data_analysis": 1
}
}
}
cd ../..
python nnaTransfer.py -n <your-model-name>
for chLi:
cd ../..
python nnaTransfer.py -n yolov3
运行 NNA 模型测试
生成编译目录
cd ../../ai_sample/root/compile/net
mkdir yolov3
cd yolov3
mkdir src
mkdir test
touch Makefile
cp ../../../../../tool_chain/QG_NNA_TRANSFER/output/net_yolov3.* src/
cp ../samplemodel/test/* test/
cd test
mv test_samplemodel.cpp test_yolov3.cpp
vim test_yolov3.cpp
修改
#include "net_samplemodel.h"
to
#include "net_yolov3.h"
strcpy(net.wt_file,"net_samplemodel_wt_bs.bin");
to
strcpy(net.wt_file,"net_yolov3_wt_bs.bin");
net.fm_mem.size = SAMPLEMODEL_FM_SIZE;
net.wt_mem.size = SAMPLEMODEL_WT_SIZE;
to
net.fm_mem.size = YOLOV3_FM_SIZE;
net.wt_mem.size = YOLOV3_WT_SIZE;
samplemodel_run(out_buf, net.fm_mem.addr_vir, net.wt_mem.addr_vir);
to
yolov3_run(out_buf, net.fm_mem.addr_vir, net.wt_mem.addr_vir);
cd ..
vim src/net_yolov3.cpp
修改
#define DEBUG_FAKE_MEM (<number>)
注:
<number> = 0 : 单层对比
<number> = 1 : 贯穿运行
vim Makefile
添加
NET_NAME = yolov3
include ../../config.mk
include ../common/net_common.mk
编译可执行测试文件
将编译器添加到 PATH 路径
locate arm-openwrt-linux-muslgnueabi-g++
vim ~/.bashrc
添加
export PATH="/home/linux/senslab/repo/software/prebuilt/gcc/linux-x86/arm/toolchain-sean-musl/toolchain/bin/:${PATH}"
source ~/.bashrc
make FIXED_TEST=1
构建可执行文件结构
cd ../../../../../tool_chain/QG_NNA_TRANSFER/output/
cp ../../../ai_sample/root/compile/net/yolov3/xyolov3 ./
mkdir out_yolov3
cd ..
当前路径下的 output 文件夹即为可以在开发板上运行的有效文件结构
可以直接拷贝到开发板进行运行,网络输出会保存在
/output/out_yolov3/
文件夹中
构建 YOLOv3 检测框架