QG2101 快速开发指南

22 篇文章 0 订阅
7 篇文章 0 订阅

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.csdn.net/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 检测框架


尽情享用吧~

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值