全手写resnet50,分分钟识别“十二生肖“图片

简介: 全手写resnet50神经网络,终于运行正常了。

大家好啊,我是董董灿。

前天,我完全手写的算法,并手搭的神经网络,终于成功的识别出一张图片。

点击链接查看出猫现场:我出猫了,第一阶段完成!

成功地识别出来猫,意味着我搭建的整个流程跑通了。

这个流程主要包括了以下几个步骤:

  • 图片导入
  • 图片预处理:裁减、缩放、归一化
  • 输入手写的 Resnet50 中,进行推理,输出 1000 个分类得分
  • 从分类文件中查找得分最大的索引对应的类别

虽然流程通了,但是识别一张图片要耗时 40 分钟!这推理速度,简直就是龟速。

忍不了,于是我优化了一波,识别一张图片的耗时直接从40分钟降到1分多钟。

接着我从百度图片中下载了 12 张动物图片 — 组成十二生肖。

输入给了我手写的神经网络,希望它能正确的识别出来,顺便也测试一下网络的鲁棒性。

下面是十二生肖图片的识别结果,至于怎么优化的,在文章最后会有介绍。

image.png
image.png

子鼠,识别结果为 mink — 水貂,识别错误,扣一分。

不过这个老鼠是不是有那么点像水貂?

image.png
image.png

丑牛,识别为 ox - 公牛,识别正确!加一分。
而且还是公牛,是根据上翘的尾巴做的区分吗?

image.png
image.png

寅虎,识别为 tiger - 老虎,识别正确!加一分。

这萌萌的老虎特征这么明显,要是识别错,那可以下班了。

image.png
image.png

卯兔,识别为 hare - 野兔,识别正确!加一分。

这站立的姿势,警觉地竖起的耳朵,野兔无疑了。

image.png
image.png
image.png

辰龙,识别成 harp - 竖琴,识别错误,不减分。

神经网络识别不出来龙,真的不怪神经网络,因为它的类比分类里就没有中国龙这一类。

不过识别成竖琴的话,看这弯曲的身形,还确实是有点神似。

image.png
image.png

巳蛇,识别为 garter snake - 袜带蛇,识别正确!加一分。
虽然我不知道什么事袜带蛇,但它说是,就是了。

image.png
image.png

午马,识别成 Mexican hairless - 墨西哥无毛犬,识别错误,减一分。
这个不应该的。

是不是因为这匹马身上太光滑,没有马儿们标志性的鬃毛么? 但是那飘逸的尾巴,也能说明问题啊。

image.png
image.png

未羊,识别成 ram - 公羊,算是识别正确吧。

我感觉识别出是绵羊更好一些。

image.png
image.png

申猴,识别出 macaque - 猕猴,识别正确,加一分。

看这身形和毛发,这么像猕猴桃,是猕猴了!

image.png

酉鸡,识别出 cock - 公鸡,识别正确,加一分。这个是送分题。

image.png
image.png

戌狗,识别出 Samoyed - 萨摩耶,识别正确,加一分。

这一身雪白的气质,小萨独有。

image.png
image.png

亥猪,识别出 hog - 猪,识别正确,加一分。

二师兄小时候,还是很可爱的。

优化完神经网络之后,识别这 12 张图片,总共花了十来分钟。

十二生肖,共 12 种动物类别,剔除“龙”这一项,因为模型分类中没有,其他11个分类,有两个识别错误,分别是老鼠识别成了水貂,骏马识别成了墨西哥无毛犬。

整体识别成功率 81%,还算不错。

网络优化

下面说一下我是如何将这个网络推理一张图片的耗时,从 40 分钟一张,优化到 1 分钟一张的。

在最开始的版本中,整个推理过程,消耗的 90% 的时间集中在卷积运算中。

尤其是卷积运算中的乘累加部分。

在第一版手写卷积算法时,我为了完全展示卷积的运算逻辑,采用了最原始的多层循环,也就造成了现在的龟速卷积从零手写Resnet50实战—手写龟速卷积。
image.png

这种多重循环的写法,时间复杂度O(N^6),简直是没法忍受的。

于是,我针对卷积的乘累加运算,做了一个简单优化。

向量内积代替标量循环

优化方法也很简单:将最内层的循环乘累加替换成向量内积。

卷积的这种优化方法,在编译器或者指令优化场合很常见:尽可能用向量指令代替循环标量运算。

基本原理就是:原来一个时钟周期只可以计算一次循环的一个标量,而现在一个时钟周期可以计算一个向量。

在 python 的应用代码中,也可以这么做,利用 numpy 提供的 vdot 函数,直接对两个数组做向量内积。
然后加到一个数值上完成累加。

基本就下面一条语句搞定。

acc += np.vdot(img[hi_index][wi_index], weight[co_][kh_][kw_])

就这一点改动,整个网络的推理性能,便从原来的 40 分钟,直接降到了 1 分钟。

好啦,这篇文章就到这。欢迎关注本系列文章。

====================================================

最近在尝试不借助任何第三方库,从零手写 Resnet50 的算法并搭建网络,完成一张图片的推理,正确识别一张图片出来。

这是一个很好地图片识别入门实践项目,可以写到简历上,并且亮瞎面试官双眼的那种哦。

如果你感兴趣,欢迎一起参与。

项目地址:https://gitee.com/iwaihou/resnet50-zero
项目内容:

  • 从零手写 Resnet50 中的所有基础算法 - 已完成
  • 从零搭建 Resnet50 的网络结构,将深入理解残差结构 - 已完成
  • 完成一整图片的正确推理 - 已完成
  • 对手写卷积算法进行优化(x86 CPU),提升推理性能 - 进行中
  • 采用异构编程方式完成推理加速(GPU + cuda kernel)

希望项目可以顺利完成。 欢迎关注同名公众号 @董董灿是个攻城狮,获取最新项目进展和好玩的算法文章。

相关文章
|
2天前
|
人工智能 搜索推荐
StableIdentity:可插入图像/视频/3D生成,单张图即可变成超人,可直接与ControlNet配合使用
【2月更文挑战第17天】StableIdentity:可插入图像/视频/3D生成,单张图即可变成超人,可直接与ControlNet配合使用
24 2
StableIdentity:可插入图像/视频/3D生成,单张图即可变成超人,可直接与ControlNet配合使用
|
人工智能 数据可视化 数据处理
快速在 PaddleLabel 标注的花朵分类数据集上展示如何应用 PaddleX 训练 MobileNetV3_ssld 网络
快速在 PaddleLabel 标注的花朵分类数据集上展示如何应用 PaddleX 训练 MobileNetV3_ssld 网络
612 0
快速在 PaddleLabel 标注的花朵分类数据集上展示如何应用 PaddleX 训练 MobileNetV3_ssld 网络
|
存储 数据采集 传感器
一文多图搞懂KITTI数据集下载及解析
一文多图搞懂KITTI数据集下载及解析
8726 0
一文多图搞懂KITTI数据集下载及解析
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成下
生成器的结构应与鉴别器相逆,因此生成器不再使用卷积操作,而是使用卷积的逆向操作,我们称之为转置卷积(transposed convolution)。
|
12月前
|
机器学习/深度学习 编解码 人工智能
VDSR、DRRN、LapSRN、RCAN、DSRN…你都掌握了吗?一文总结超分辨率分析必备经典模型(二)(2)
VDSR、DRRN、LapSRN、RCAN、DSRN…你都掌握了吗?一文总结超分辨率分析必备经典模型(二)
191 0
|
12月前
|
机器学习/深度学习 编解码 监控
VDSR、DRRN、LapSRN、RCAN、DSRN…你都掌握了吗?一文总结超分辨率分析必备经典模型(二)(1)
VDSR、DRRN、LapSRN、RCAN、DSRN…你都掌握了吗?一文总结超分辨率分析必备经典模型(二)
259 0
|
12月前
|
文字识别
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(三)
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(三)
101 0
|
12月前
|
机器学习/深度学习 文字识别 算法
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(二)
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(二)
185 0
|
12月前
|
机器学习/深度学习 文字识别 算法
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(一)
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(一)
252 0