# hubu_garbage_classification **Repository Path**: innovation-lab/hubu_garbage_classification ## Basic Information - **Project Name**: hubu_garbage_classification - **Description**: 移植北京交通大学王东老师的pipeCNN,用于实现摄像头对垃圾实时进行分类。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-04-07 - **Last Updated**: 2022-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # hubu_garbage_classification ### 介绍 移植北京交通大学王东老师的pipeCNN,用于实现摄像头对垃圾实时进行分类。 * [演示视频1](https://www.bilibili.com/video/bv1ju411e7dj) * [演示视频2](https://www.bilibili.com/video/BV1G5411171Y) * 系统实物 ![](documents/png/system_photo.png) ### 1.硬件平台 1. Terasic DE10-standard (cyclone V) * [开发板介绍](http://www.terasic.com.cn/cgi-bin/page/archive.pl?Language=China&CategoryNo=180&No=1105#contents) ### 2.软件平台 1. 操作系统: Win10 64bits 2. 开发环境: Quartus II 18.1.0.625 Standard + AOCL 18.1.0.625 + SOCEDS 18.1.0.625 * [Quartus下载链接](http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/QuartusSetup-18.1.0.625-windows.exe) * [AOCL下载链接](http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/AOCLSetup-18.1.0.625-windows.exe) * [SOCEDS下载链接](http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/SoCEDSSetup-18.1.0.625-windows.exe) 3. 所需文件下载链接: * [百度网盘,提取码:HUBU](链接:https://pan.baidu.com/s/1SZwsnSOFodbl345N3YxtAw) ### 3.结构设计及控制方案 1. 使用Solidworks设计垃圾桶外形结构 ![](hardware/Control_Board_SW/p3.png) 2. 整体使用电池供电,设计供电电路;使用STM32控制垃圾桶的所有外设,包括1个补光灯电路板,2个舵机,3个红外传感器 ![](hardware/Control_board_PCB/Output_File/3D_TOP.png) 3. FPGA主控板使用GPIO控制STM32 | FPGA | GPIO[2] | GPIO[1] | GPIO[0] | GPIO[7] | | -------- | ----- | ---- | ----- | ---- | | **方向** | Output | Output | Output | Input | | **功能** | cmd[2] | cmd[1] | cmd[0] | sig_in | | STM32 | PB0 | PB1 | PB11 | PB10 | PA0 | PA1 | PA10 | PA2 | PA3 | PA9 | |---|---|---|---|---|---|---|---|---|---|---| | **方向** | Output | Output | Output | Input | Input | Input | Output | Input | Input | Input | | **功能** | 上面舵机控制线 | 下面舵机控制线 | 补光灯控制 | 红外1 | 红外2 | 红外3 | sig_out | cmd[0] | cmd[1] | cmd[2] | 4. STM32控制程序流程图 ![](hardware/Control_Board_Finally/stm32.png) ### 4.深度学习模型 #### (一)模型选取 1. pipeCNN已经实现了3个不同模型的host+device代码,分别是[AlexNET](https://zhuanlan.zhihu.com/p/116197079),[VGG16](https://zhuanlan.zhihu.com/p/116900199),[RESNET-50](https://zhuanlan.zhihu.com/p/31852747) 2. 经过实测发现,能在de10-standard上跑起来的,只有AlexNet和VGG16 3. 在imagenet数据集上,VGG16的正确率比AlexNet正确率高: ![](documents/png/imagenet.png) 4. 在DE10-standard开发板上,识别一张图片,ImageNet 耗时150ms,VGG16耗时1.93s ![](documents/png/interface_time.png) 5. 同样使用迁移学习,在我们准备的垃圾分类数据集上,只重新训练输出层参数。 * AlexNet Top-1准确率:65% Top-5准确率:85% * VGG16 Top-1准确率:75% Top-5准确率:95% 6. 最终选择使用VGG16 #### (二)数据集来源 1. [华为云人工智能大赛垃圾分类挑战杯训练集](https://competition.huaweicloud.com/information/1000007620/introduction?zhishi=) 2. [Kaggle平台](https://www.kaggle.com/) 3. 网络爬虫指定爬取 4. 自行拍摄照片 5. 垃圾种类及对应label值 ![](documents/png/garbage_types.png) #### (三)模型训练 1. 平台: python3.8 + Tensorflow 2.8 ``` 获取训练好的VGG16模型 vgg16 = tf.keras.applications.VGG16(input_shape=(224, 224, 3), include_top=True) ``` 2. 在我们准备的垃圾分类数据集上进行迁移学习,只重新训练输出层参数。 3. Bachsize试过25,32,64,128, 64效果最好,基本20个左右epoch之后正确率就不再增加了 #### (四)float32转有符号8位定点小数 1. 定点数有两个参数,即数据位宽,小数位位置。如果小数位位置值为0,表示全是整数;如果小数位位置值小于0,小数点右移;大于0,小数点左移 2. Matlab(R2016a) fit()函数,可以很方便地将float型数据转为指定参数的定点数据 3. 每一层都应该关联3个独立的定点参数: layer_in, layer_out, layer_weight 4. 对于某层的输出定点参数,应当与接下来一层输入定点参数相同 5. 可以将python中的numpy或者list数据通过scipy.io转存为Matlab可以直接load的Mat数据文件 6. pipeCNN需要的前面14层参数,需要按照Cafee的方式将多维数据打平。 【巨坑:Tensorflow与Caffe对多维数据的存储格式不同】 ``` # Tensorflow多维数据,按照Cafee的方式打平 for i in range(0, 13): o_weight_mat = model.variables[2 * i].numpy().tolist() weight_mat = [] for ii in range(len(o_weight_mat[0][0][0])): for jj in range(len(o_weight_mat[0][0])): for kk in range(len(o_weight_mat)): for mm in range(len(o_weight_mat[0])): weight_mat.append(o_weight_mat[kk][mm][jj][ii]) weight_name = 'weight' + str(i) weight_file_path = mat_dir + weight_name + '.mat' io.savemat(weight_file_path, {weight_name: weight_mat}) # weight layer 13 weightn_mat = model.variables[26].numpy().reshape(7, 7, 512, 4096) weight13_mat = [] for ii in range(4096): for jj in range(512): for kk in range(7): for mm in range(7): weight13_mat.append(weightn_mat[kk][mm][jj][ii]) io.savemat(mat_dir + 'weight13.mat', {'weight13': weight13_mat}) ``` ### 5.openCL BSP 1. 为何需要重新制作BSP? * 垃圾拍摄需要使用摄像头,官方BSP不带USB摄像头驱动 * 我们的Host程序需要使用GPIO与STM32电控板通讯,而官方BSP没有将FPGA的GPIO引到HPS端 * 官方BSP不带Frame Buffer,即不能接VGA显示器显示 2. 制作BSP的基本流程: 参见 documents/HowtoBuildYourOwnBSP.md, HowtoBulidLinuxKernel.md ### 6.Device端程序设计 1. 直接使用的pipeCNN代码,设置参数(hw_param.cl)如下(处理一张图片1.93秒): * VEC_SIZE = 16 LANE_NUM = 8 2. 配置Makefile参数: * VENDOR = altera * PLATFORM = arm32 * FLOW = hw * KERNEL_DEBUG = 0 3. 开始编译: ```bash cd D:/git/pipe-cnn/project make clean make fpga ``` 注:编译大概需要耗时1小时(intel 10900F, 32G) 4. 将编译生成的conv.aocx文件拷贝到开发板(可使用sftp或者U盘) ### 7.Host端程序设计 1. 大致流程: ![](documents/png/host_program.png) 2. Key Feasures: * 使用openCV读取摄像头图像,并对图像进行处理和显示 * 使用FPGA端GPIO与STM32电控板通讯,完成对垃圾桶的转动控制 * 三种工作模式 #### 在开发板上编译Host 0. 开发板上用的是ubuntu 18.04, 支持ssh和vnc连接 1. 将整个项目文件夹拷贝到开发板 2. 修改Makefile 3. 开始编译 ```bash cd pipe-cnn/project make clean make host ``` ### 附1.单机测试操作说明 1. 需要确定 /etc/rc.local中的dhclient 和ntpdate 这两条指令被注释,不然开机会阻塞等待网络连接 2. 给开发板连接VGA显示器 3. 打开命令行,执行 source init_opencl_18.1.sh 4. 进入/root/application/garbage_classify/project/bin 5. 执行 ./garbage_classify conv.aocx mode (mode=0 正常工作模式;mode=1 验证集测试模式;mode=2 无STM32工作模式) ### 附2.补充 1) 若要使用摄像头,需要做以下操作 * a) 替换fat分区中的内核文件zImage * b) 替换opencl_arm32_rte目录下board/c5soc/arm32/driver/aclsoc_drv.ko文件 * c) 在Makefile中配置 USE_CAMERA = 1 2) 运行摄像头时,如果报下列警告 "org.freedesktop.DBus.Error.ServiceUnknown: org.a11y.Bus" ```bash apt install at-spi2-core ``` 3) 运行openCL程序如果报错 "Runtime error CL_INVALID_BINARY",表示aocx文件和fat分区中系统加载rbf文件版本不匹配 4) host部分的代码中,CvxText.cpp用于实现openCV显示中文,需要讲要用的字体的ttf文件放到运行目录,依赖freetype库,可使用如下指令安装对饮的库: ```bash apt install libfreetype6-dev ``` 5) 网盘内容: ![网盘内容](https://gitee.com/innovation-lab/pipe-cnn/raw/master/documents/%E7%BD%91%E7%9B%98%E5%86%85%E5%AE%B9.png) ### 附3.鸣谢 1. https://github.com/thinkoco/c5soc_opencl 2. https://github.com/doonny/PipeCNN