下载地址:CMSIS-NN
由于是8位定点的推算算法,所以精度会差点,但是速度快啊,需要把图片存TF卡里,或者你自己开发驱动,我用的是STM32F769 DISCO.
关键代码:
int8_t NN_OpenReadFile(const char *BmpName)
{
  uint32_t size = 0;
  int32_t h_index = 0;
  int32_t w_index = 0;
  int32_t h_total = 0;
  int32_t w_total = 0;
  int32_t h_nn = 0;
  int32_t w_nn = 0;
  UINT BytesRead;
  FIL bmpfile;
  q7_t output_data[10]; /* 输出数据,分别代表{"Plane", "Car", "Bird", "Cat", "Deer", "Dog", "Frog", "Horse", "Ship", "Truck"} */
  int8_t max_ind = 0;
  int8_t max_val = -128;
  BmpHeader *pbmpheader = (BmpHeader *)aBuffer;
  /* 打开BMP文件 */
  f_open(&bmpfile, BmpName, FA_READ);
  /* 移动到文件头 */
  f_lseek(&bmpfile, 0);
  /* 读取头信息 */
  f_read(&bmpfile, &aBuffer, BITMAP_HEADER_SIZE, &BytesRead);
  /* 取出原图的长宽 */
  h_total = pbmpheader->h;
  w_total = pbmpheader->w;
  /* 计算出缩小比例 */
  h_nn = pbmpheader->h / 32;
  w_nn = pbmpheader->w / 32;
  /* 取出一次读出数量 */
  size = pbmpheader->w * (pbmpheader->bpp / 8) + ((pbmpheader->w * (pbmpheader->bpp / 8)) % 4);
  if (pbmpheader->bpp != 24)
  {
    return -1; /* 保存为24Bit图像吧. */
  }
  if (size > BITMAP_BUFFER_SIZE)
  {
    return -2; /* 图片太大,超过缓冲区大小. */
  }
  /* 偏移到图像内容,然后提取图像内容到32*32的范围内. */
  f_lseek(&bmpfile, pbmpheader->offset);
  for (h_index = 0; h_index < h_total; h_index++)
  {
    f_read(&bmpfile, &aBuffer, size, &BytesRead);
    if (h_index % h_nn == 0)
    {
      for (w_index = 0; w_index < w_total; w_index++)
      {
        if (w_index % w_nn == 0)
        {
          BmpBuffer[(h_index) / h_nn][w_index / w_nn][2] = aBuffer[3 * w_index];
          BmpBuffer[(h_index) / h_nn][w_index / w_nn][1] = aBuffer[3 * w_index + 1];
          BmpBuffer[(h_index) / h_nn][w_index / w_nn][0] = aBuffer[3 * w_index + 2];
        }
      }
    }
  }
  /* 关闭文件 */
  f_close(&bmpfile);
  /* 运行NN算法 */
  run_nn((q7_t *)BmpBuffer, output_data);
  arm_softmax_q7(output_data, IP1_OUT_DIM, output_data);
  /* 找出最可信结果 */
  for (int i = 0; i < 10; i++)
  {
    if (max_val < output_data[i])
    {
      max_val = output_data[i];
      max_ind = i;
    }
  }
  /* 返回可信结果 */
  return max_ind;
}
返回值如果是正,就是有结果,0 ~ 9分别对应"Plane", "Car", "Bird", "Cat", "Deer", "Dog", "Frog", "Horse", "Ship", "Truck"这么几种,推荐用Windows 10画图工具保存为24位BMP,最好的分辨率是32*32,如果不是32*32,则在程序里也有缩放,但是效果不太好,因为我是直接间隔抽取的,良好的缩放算法应该考虑颜色权重问题.

方便加个微信或者QQ么,想交流学习一下,这方面的知识~
@danny 493448547