手写数字识别在FPGA上的暴力美学
fpga实现cnn神经网络加速 手写字硬件加速 FPGA artix7-100t 纯verilog编写 神经网络硬件加速 使用ov5640摄像头dvp接口 verilog实现手写字识别 包括卷积层、全连接层、池化层、softmax有效减轻误识别问题 注意: 该项目并未使用到arm核是使用传统fpga的逻辑资源实现的用Verilog在Artix7上硬刚神经网络这事像极了当年用汇编写贪吃蛇的硬核玩家。这次我们抛开软核CPU直接用FPGA的逻辑门堆砌出一个能跑MNIST识别的怪兽顺便把OV5640摄像头调教成数字世界的眼睛。先看摄像头怎么咬数据DVP接口的时序比想象中暴躁Verilog代码得像个严格的监工always (posedge cam_pclk) begin if(cam_vsync) begin wr_en 0; row_cnt 0; end else if(cam_href) begin pixel_buffer[wr_ptr] {pixel_buffer[wr_ptr][7:0], cam_data}; if(wr_cnt 1) begin fifo_data {pixel_buffer[wr_ptr], cam_data}; wr_en 1; wr_ptr wr_ptr 1; wr_cnt 0; end else begin wr_cnt wr_cnt 1; end end end这段代码藏着两个骚操作用双缓冲吃下DVP的16位转8位把戏用行计数器暴力对齐图像边界。实测抓图时发现不用格雷码计数器会偶发亚稳态这大概就是数字电路的玄学时刻。卷积核要玩流水线魔术3x3卷积用移位寄存器搭了个滑窗DSP48单元被我们榨干到极致genvar i; generate for(i0; i9; ii1) begin mult_add u_mult_add ( .clk(clk), .a(window[i]), .b(weight[i]), .p(mult_result[i]) ); end endgenerate always (posedge clk) begin if(pipeline_en[2]) begin sum mult_result[0]...mult_result[8]; bias_add sum conv_bias; end end这里藏着三层流水线打拍实测发现不加pipeline会导致时序违例但代价是每个卷积层有3周期延迟。有趣的是用补码处理负数比单独符号位节省了15%的LUTs。fpga实现cnn神经网络加速 手写字硬件加速 FPGA artix7-100t 纯verilog编写 神经网络硬件加速 使用ov5640摄像头dvp接口 verilog实现手写字识别 包括卷积层、全连接层、池化层、softmax有效减轻误识别问题 注意: 该项目并未使用到arm核是使用传统fpga的逻辑资源实现的池化层的极简哲学2x2最大池化用比较器硬怼像极了数字电路课上的作业题always (posedge clk) begin case(pool_state) 0: begin max_temp (line0_data line1_data) ? line0_data : line1_data; pool_state 1; end 1: begin pool_out (max_temp max_temp_d1) ? max_temp : max_temp_d1; pool_state 0; end endcase end状态机在两个周期内完成两行数据的比较实测发现如果用组合逻辑实现会导致关键路径过长还是打拍更香。全连接层的存储战争权重参数塞进Block RAM时遭遇了地址对齐危机reg [17:0] weight_rom [0:1023]; initial $readmemh(fc_weights.hex, weight_rom); always (posedge clk) begin if(mac_en) begin acc acc activation[addr] * weight_rom[weight_addr]; weight_addr weight_addr 1; end end这里有个隐藏坑当乘累加超过16位时忘记符号位扩展会导致识别率暴跌20%。后来用位拼接解决了这大概就是硬件工程师的日常。Softmax的温度玄学不用浮点运算的诀窍是把指数运算泰勒展开到第二项always * begin exp_sum 0; for(int i0; i10; i) begin exp_out[i] (1 8) (logits[i] 2) (logits[i]*logits[i])/64; exp_sum exp_sum exp_out[i]; end end调参时发现温度参数T从256改成128后误识别率从8%降到3%。这验证了硬件算法必须带点人工智障的妥协毕竟用LUT存完整exp表会吃掉整个BRAM。最后上电测试时摄像头抓到的数字7总被认成1。查错发现是卷积层padding没补零补上后识别率稳定在95%。资源占用报告显示用了23%的LUTs和8个DSP证明Artix7这老将还能饭。这项目最大的启示可能是用硬件实现AI时与其追求理论完美不如在工程实现上多抠细节。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2486835.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!