开启辅助访问
 找回密码
 立即注册

晶晨Amlogic C308X 4T-AI算力YOLOV3移植攻略(1)

HWCEJgmU 回答数5 浏览数1187
2021年北半球的春天很快到来了,马上就春节放假,利用这几天在深圳的时间,久违写点很肤浅的技术文章,是因为太久不写开发攻略了,年纪也大了。写晶晨Amlogic C308X某方面的开发攻略之前,聊聊我们选这个平台的一些现实的因素。2020发生太多太多的负面消息了,新冠病毒,美国打压,海思缺芯片,晶圆短缺,2020年底全世界IC涨价,一波接一波冲击大大小小的科技公司和相关产业链等等,“活着”是很现实的话题。为了“活着”,很多公司和工厂只能给员工放长假,包括我们的公司。
       2018年底和整个2019,我们花了很多资金和时间在海思Hi3519AV100的平台上开发,并在2019年底打开了局面,做的板子经过长时间的现场运行,开始进入大批量生产阶段,但是鼠年的疫情(人类文明史上出现过几次了),给了我们很大冲击,我们艰难的往前走,等到6月底,更大的危机出现了,由于受到美国的打压,台积电不能给海思生产高端芯片,特别是12nm工艺的Hi3519AV100和Hi3559AV100,这个釜底抽薪的打击,一下子,彻底把我们打懵了,我们最专注的平台海思Hi3519AV100芯片被市场炒到3000元一台,另外一台更高端的Hi3559AV100更是炒到6000元一台芯片,整个市场乱套了。我们6月份给代理下的1包订单,7月继续要2包的订单,代理根本交不出货。市场报价从250不含票,没几天就涨到300,再过几天就500问你要不要。我们当时跟南京的客户签订1000套的板子的合同,这种芯片价格根本没饭吃,而我库存只能先给他们生产500套,后面500套的预付款只能退还给客户。这时其他江苏的客户也在给我们下单,北京另外一台新的客户做电力系统监控的,之前我们给他们设计的样机正在测试,也委托我们先备1包Hi3519AV100,只要代理有芯片,就会预先打完款给我们去采购芯片。看着大好的局面,就这样丢了,本人当时相当难受,到处找人都没什么卵用,越到后面,这些海思芯片炒得更离谱,报价1000元一台芯片,2000元了要不要,不要就马上到3000了,到9月份还真的到3000元一台Hi3519AV100芯片,6000元一台Hi3559AV100芯片,利润比卖白粉还高!海思也管不了 ,听说大海思还想办法从市场把这些高端的芯片抢回去,因为华为也在搞AI产品。没法玩了,2020年8月份,合作的代理给我们推荐了晶晨最新推出的C308X AI芯片。我们做了大量的平台对比,认真看了C308X资料后,决定冒冒险,当时的情形也容不得我们挑三拣四了,现成的Hi3519AV100客户都要求我们帮找找国产的方案替换Hi3519AV100。我们知道国外的TI 用在ADAS的 TDA4VM很强大,我们没实力搞;国外的安霸的工业级CV28-CV22-CV25-CV2S系列的也很强大,ISP也相当牛,这个平台也太难搞; 国外的NXP也有一款i.MX 8M Plus ,这款面向工业级和车载的也相当强大,我们更没实力搞。台湾MTK背景的sigmstar SSC339G非国产,AI性能一般,才1.0T算力,不过他们的ISP过得去;RK的RV1126 AI性能也是很一般,ISP更是一般般;其他旭日地平线君正的懒得去找了,最后或是看上晶晨Amlogic C308X,因为C308X 是ARM 双CORTEX-A55,4T算力不错,国产,带ISP,带H.265编码,低功耗,不但支持CAFFE2,还支持Tensorflow,Tensorflow lite, Darknet, Onnxc Caffe, Pytorch,Keras backend,OpenCL, OpenVX等等。晶晨另外一款A311D我们也对比了一下,5T算力,但是没有ISP这些功能,基本用不上,纯粹拿来做视频分析盒子。Hi3519AV100缺货出问题后,我们很多客户转去学习A311D,采购那些(网页做得很好的开发板供应商)的板子,给到的资料比较坑,无法自由开发,难怪这么便宜。我们桐烨科技幸好得到晶晨原厂的团队支持,提供很多SDK资料和DDK资料等等,我们2020年8月中旬就开始动手做了。
      说实在,晶晨Amlogic C308X 虽然ARM是双核CORTEX-A55,但是其他总体性能确实不如海思Hi3519AV100,AI性能,特别是CAFFE架构,Hi3519AV100  2T算力比晶晨的4T算力还牛!因为海思发布020版本的SDK后,把这个2T算力发挥极致,而且深度学习精度得到提高,这一点C308X啊A311D啊,什么3399PRO啊,RV1126啊都无法比,这是肯定的。还有重要的ISP也不如海思,是的,国内的芯片,目前这两年,包括MTK背景的sigmstar 的ISP也不如海思。他们都想对标海思,都在努力把ISP、AI、H.265编解码做到海思的高度,填补海思缺芯的尴尬局面。C308X相对接近海思Hi3519AV100 ,价格比正常的Hi3519AV100 还 便宜一半,在晶晨原厂的热情支持下,2020年9月中旬,我们很快就做出4K(800万/3840*2160/30帧) IPC样机,支持SONY 星光级IMX334。然后我们把我们的C308X IPC模组进行高低温测试,在高温测试的时候,发现我们做的C308X-IPC模组在65度高温3天还没死机,而代理卖给我们的杭州某个大IPC供应商的C308X IPC(他们7月份就已经大批量出货)不到30分钟就GAME OVER了(运行同样的程序,打开NPU  AI运行人脸检测,WEB实时播放1080P视频),这给了我们很大信心。我们裸露的C308X-IPC模组更是能做到70度高温运行几天都没死机,我们做的产品大部分都是户外,那些在室内运行都要加风扇的芯片方案我们都不考虑,花瓶,放不出户外。
       本老人罗嗦了半天,总算说明白为啥要选C308X这个芯片做4K AI IPC,唯一让人遗憾的C308X做不到2路4K,然后IPC-SDK原厂没做好1000M网口驱动,本来C308X是支持1000M的。下面说说C308X的AI移植攻略,其他SDK移植内容太多,无法逐一写下来。接触了很多客户,他们也一直提出这个问题,都很关心这个新平台如何AI移植到板子去,我们也最关心,最后决定让本公司软件工程师根据原厂提供的资料,整理这个C308X的YOLOV3移植攻略。首先声明:我们对深度学习算法移植只能说是皮毛,因为我们公司重点是硬件设计,底层驱动设计,SDK打包,简单LINUX APP等等工作,所以下面的移植工作有问题的地方,还得包涵。
      这里插个广告,虽然受到美国打压(这个蓝色星球太多灾难了,目前还搞得这么乱),但是我们的日子还得过下去,这些都是我们做的板子:

C308X+IMX334 +4K镜头
https://item.taobao.com/item.htm?spm=a1z10.1-c.w137644-21441012139.44.61b351a12P3Ebw&id=628474396097

C308X+IMX334+12MP镜头

C308X+IMX335+星光镜头
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21441012144.30.61b351a12P3Ebw&id=633475132130

C308X 开发板
https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-21441012157.60.13a37760DB1aEU&id=637660538431

C308X核心板
https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-21441012157.57.13a377607htTcn&id=634224297569

项目合作联系方式:QQ:2505133162,电话:0755-83660725
公司网站:http://www.tongyetech.com/
淘宝主页:https://shop472233692.taobao.com/

安装

1.1模型安装
git clone https://github.com/pjreddie/darknet
直接使用上边的命令下载yolov3安装包。下载完以后,进入到安装包路径内
cd darknet
如果机器有使用GPU加速的环境,以及安装OPENCV了,需要做一下修改
gedit Makefile
使用gedit打开编译文件,将文件前几行中,对应的GPU、CUDNN、OPENCV由0变为1;
GPU=1
CUDNN=1
OPENCV=1
对Makefile修改结束以后,就可以进行安装
Make -j
下载yolov3权重文件
wget  https: //http://pjreddie.com/media/files/yolov3.weights
1.2 运行Demo

运行Demo查看运行是否成功。
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg


  • 训练自个的模型
2.1创建相关文件夹及txt文件
在darknet/scripts/目录下按下列文件夹结构,将训练数据集放到各个文件夹下面,生成4个训练、测试和验证txt文件列表
VOCdevkit
—VOC2007
——Annotations
——ImageSets
———Layout
———Main
———Segmentation
——JPEGImages
Annotations中是所有的xml文件
JPEGImages中是所有的训练图片
Main中是4个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。
如下图所示:

2.2修改/darknet/scripts/voc_label.py文件
第一处修改第七行:
sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
将“('2012', 'train'), ('2012', 'val'),”删除掉,改为
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
第二处修改第9行:
修改为自个检测目标类别名称
classes = ["自个的目标类别名称"]

2.2运行voc_label.py文件
完成修改以后可运行文件,生成yolov3训练时使用的labels
python voc_label.py
运行结束以后,可以在/darknet/scripts/VOCdevkit/VOC2007文件夹内看到labels文件夹,并且在/darknet/scripts文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt三个文件。到此,数据准备完成。

2.3修改cfg/voc.data文件
classes= 5               //修改为训练分类的个数
train  = /home/arm/c308x/darknet/scripts/2007_train.txt          //修改为数据阶段生成的2007_train.txt文件路径
valid  = /home/arm/c308x/darknet/scripts/2007_val.txt           //修改为数据阶段生成的2007_val.txt文件路径
names = data/voc.names
backup = backup
2.4修改data/voc.names
在上边修改的文件内有一台data/voc.names文件,里边保存目标分类的名称,修改为自个类别的名称即可
2.5修改cfg/yolov3-voc.cfg
文件开头处的修改如下:
# Testing
#batch=1
#subdivisions=1
# Training
batch=32                //每次迭代要进行训练的图片数量 ,在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起的训练震荡越小。
subdivisions=16          //源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练
height=416              //输入图片高度,必须能被32整除
width=416               //输入图片宽度,必须能被32整除
channels=3              //输入图片通道数
momentum=0.9            //冲量
decay=0.0005            //权值衰减
angle=0                 //图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度   
saturation = 1.5        //饱和度变化大小
exposure = 1.5          //曝光变化大小
hue=.1                  //色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1
learning_rate=0.001     //学习率
burn_in=1000
max_batches = 120200    //训练次数
policy=steps            //调整学习率的策略
steps=40000,80000       //根据batch_num调整学习率,若steps=100,25000,35000,则在迭代100次,25000次,35000次时学习率发生变化,该参数与policy中的steps对应
scales=.1,.1             //相对于当前学习率的变化比率,累计相乘,与steps中的参数个数保持一致;
注意:如果修改max_batches总的训练次数,也需要对应修改steps,适当调整学习率。
具体的含义可以查看yolov3网络中参数的解读

第二处修改filters:
最后一台卷积层中filters,按照filter=5*(classes+5)来进行修改。如果类目为5,则为3*(5+5)=30。
[convolutional]
size=1
stride=1
pad=1
filters=30      //计算公式为:filter=3*(classes+5)
activation=linear
#只要修改classes上面的convolutional层的filters,#filters = 3*(classes + 5),一共有三处
第三处修改classes类别数:
直接搜索关键词“classes”即可,全文就一台。
classes=5
注意:#yolov3-voc.cfg有3个YOLO层,这里我只放上来了一台,文件里面一共有三个classes,改为5(类别的个数)
2.6下载官方提供的预训练模型(权重):
进入到darknet文件夹内
cd  /home/arm/c308x/darknet
运行如下命令下载
wget https://pjreddie.com/media/files/darknet53.conv.74


  • 训练
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg  darknet53.conv.74 >> log.txt
输入上边的指令就可以进行训练,在命令最后的命令>> log.txt是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看。
4. 测试
./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/dog.jpg
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]
按照上边的规整进行填写即可。
5.acuity-toolkit 模型工具安装
将文件acuity-toolkit-binary-5.14.1.tgz拷贝到虚拟机中解压,运行如下命令:
tar -zxvf acuity-toolkit-binary-5.14.1.tgz

(这里补充一下,要很好的运行模型转换工具acuity-toolkit,必须单独使用一台很好的电脑,I7+10G以上内存,否则Tensorflow模型转换容易死机)
5.1 依赖工具安装
Step 1. 环境准备
Ubuntu 16.04 系统 64 位的计算机(如果是虚拟机, PC配置要很好,RAM 内存设置>8GB)
Step 2. 安装 python3 以及 pip 等工具
sudo apt-get install python3 python3-pip python3-virtualenv
Step 3.修改文件requirements.txt
如下图所示修改:

Step 4. 安装相关依赖包
获取 acuity-toolkit 工具包,进入根目录。
执行: for req in $(cat requirements.txt); do pip3 install $req; done
如果下载速度过慢,可使用如下命令:
for req in $(cat requirements.txt); do pip3 install $req -i https://pypi.tuna.tsinghua.edu.cn/simple; done
Step 5.Check 环境
python3 bin/checkenv.py
注: check 成功会有: Env Pass: Env check SUCCESS!!!打印
5.2修改模型转换脚本文件
进入到如下目录:
cd /home/arm/c308x/acuity-toolkit-binary-5.14.1/
拷贝conversion_scripts文件夹,并重命名为yolov3,如下图所示
运行命令:cp conversion_scripts -fr yolov3

将yolov3-voc.cfg文件和yolov3-voc_final.weights文件拷贝到model文件夹中,如下所示

修改0_import_model.sh脚本文件,如下图所示:

修改1_quantize_model.sh脚本文件,如下所示:

上图中data/validation_tf.txt 是给定的量化输入图片路径,如: ./dog.jpg。建议提供 50-200 张左右,尽量是模型运行时场景的图片,或者是训练模型验证集里的图片,确保统计出的最大/最小值为实际运行场景的最大/最小值范围,这样量化效果会更佳

修改2_export_case_code.sh脚本文件,如下图所示:


  • 生成case代码
按如下执行顺序执行脚本文件:
Step1: sh 0_import_model.sh
Setp2: sh 1_quantize_model.sh
Step3: sh 2_export_case_code.sh

生成的代码在yolov3的同级目录,如下图所示

将其拷贝到/home/arm/c308x/buildroot_sdk_643目录下即可

7.编译运行case代码
7.1拷贝build_vx.sh文件
进入到/home/arm/c308x/buildroot_sdk_643目录下,拷贝一份conversion_scripts_nbg_unify文件夹里面的build_vx.sh文件到yolov3_nbg_unify中。

7.2修改build_vx.sh文件

修改yolov3_nbg_unify中的build_vx.sh文件,在开头添加交叉编译器路径

7.3生成case代码
进入到yolov3_nbg_unify,执行./build_vx.sh arm64 编译即可

7.4运行case 代码中的yolov3
将bin_r 中的可执行文件yolov3 ,以及network_binary.nb文件和dog.jpg图片 拷贝到c308x板子上,运行即可,如下图所示:

7.5 case代码介绍
network_binary.nb:生成的 nbg 文件,默认生成 network_binary.nb。可自行改名。

vnn_yolov3.c/vnn_yolov3.h: 模型创建和释放对应的头文件和实现。(转 case 代码时候,会生成对应名称的 vnn_modelname.c)

vnn_pre_process.c/vnn_pre_process.h :模型前处理文件, case 代码中是在此文件中对读入的图片进行的减均值除以 scale 并进行量化操作。可以复用文件中接口,也可以自行实现量化。

vnn_post_process.c/vnn_post_process.h: 模型后处理文件, case 代码是在此文件中获取输出结果并将结果从量化数据转成 float32 数据,并对输出结果做了top 的处理(由于是单一模板,所有 case 代码均是做的 top5 后处理)。
可以根据模型需要,自行添加后处理流程。

7.6 buildroot_sdk目录分析
通过查看build_vx.sh脚本文件内容,可知转出来的case 代码编译依赖 buildroot_sdk, buildroot_sdk里面包含编译所需的头文件,库文件以及其他资源

8.npu_643驱动分析
npu_643驱动功能作用:提供板子上nnsdk运行环境,相当于上文中7.6章节提到的buildroot_sdk。



目录                                     说明
applib                           nn sdk相关头文件
build                            驱动galcore.ko文件存放目录
hal                                      npu kernel driver
nnsdk                                    nn sdk 库以及头⽂件
sdk                                                sharelib依赖库头文件
sharelib/lib64         64bit nn sdk依赖库
sharelib/lib32         32bit nn sdk依赖库

如上图所示,applib里面的头文件和buildroot_sdk_643\buildroot_sdk\acuity-ovxlib-dev\include里面的头文件是一样的。sdk里面的头文件和buildroot_sdk_643\buildroot_sdk\build\sdk\include是一样的,sharelib里面的库文件和buildroot_sdk_643\buildroot_sdk\build\sdk\drivers里面是一样的,所以说npu_643驱动和buildroot_sdk的作用是一样的,都是提供了nnsdk运行环境。
使用道具 举报
| 来自上海 用Deepseek满血版问问看
大豆农民 | 来自北京
咨询下作者,C308跑模型速度和A311D比如何?我看的资料似乎快一些
用Deepseek满血版问问看
回复
使用道具 举报
minyan | 未知
这个pyton环境就不好安装,有没有docker的环境?
回复
使用道具 举报
侬本多情 | 来自北京
没对比过,C308X重点在IPC产品。不适合用在盒子视频分析的产品。
回复
使用道具 举报
hphp123 | 来自北京
没有试过docker的环境,python环境安装有很多网络文章可以参考吧?
回复
使用道具 举报
gj8316 | 来自上海
我找到了docker环境
回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影