前言:(相较于源码分享,本贴更倾向于一个思考过程,代码是次要,想法是主要)
(同时,这篇帖子是面向新手的,本身并没有我写的那么牛B,可以说是文胜质的经典例子,史不史我也不知道)
前天,我写了一个手写数字的识别工具
众所周知,这种识别都需要大量的数据来做参照,否则识别正确率低的吓人
但问题来了,仅仅748张的,32*32的bmp图片就达到了足足2.22mb
而想要达到理想的识别正确率,样本少说需要几万甚至几十万张
毫无疑问,这种存储方法是极为愚笨的,因为我拿能存储RGB颜色的,不限制图片大小bmp图片文件去存储大小固定为32*32的黑白照片因此,我对它做了一个小优化。
可能有人想到,只有黑白两色,那是否可以用二进制文本去储存?
不,效率太低了(而且这会显得你没有计算机理论基础)(该不会只有我这样想过吧?)
众所周知,在易语言中,一个整数型(int)占用4bytes空间,即32bits,而bit作为二进制的信息单位
1bit可以对应0,1两种情况
而0,1两种情况恰好可以与黑白相对应
也就是说一张32*32的黑白图片理论上仅需32*4bytes即可储存,也就是128字节
同时,由于图片大小的固定,我不再需要bmp格式繁琐重复且占用空间的头文件信息,只需要一个配置文件记录一下各图片的张数以及它对应的数字是几就行
这才有了748张,总计2MB的图片被压缩成93KB的例子
变量名 | 类 型 | 静态 | 数组 | 备 注 | i | | | | i1 | | | | Length | | | | Wide | | | | Bmp_pic | 字节集 | | | CountS | 整数型 | | | sample | 文本型 | | 0 | 数据量 | 整数型 | | | Line | | | | Output | 字节集 | | |
数据量 = 0 计次循环首 (10, i )i1 = 文件_枚举 (取运行目录 () + “\train\” + 到文本 (i - 1 ) + “\”, “*.bmp”, sample, 真, , ) 如果真 (数据量 < i1 )数据量 = i1 计次循环尾 ()写配置项 (取运行目录 () + “\config.ini”, “train”, “count”, 到文本 (数据量 )) 计次循环首 (10, i )CountS = 文件_枚举 (取运行目录 () + “\train\” + 到文本 (i - 1 ) + “\”, “*.bmp”, sample, 真, , )写配置项 (取运行目录 () + “\config.ini”, “bmp”, “ncount” + 到文本 (i - 1 ), 到文本 (CountS )) 计次循环首 (CountS, i1 )Bmp_pic = 读入文件 (sample [i1 ])计次循环首 (32, Length )计次循环首 (32, Wide )如果 (Bmp_pic [3124 - Length × 96 + Wide × 3 ] = 0 ) Line = __set_bit_on (Line, Wide - 1 ) Line = __set_bit_off (Line, Wide - 1 ) 计次循环尾 ()Output = Output + 到字节集 (Line )Line = 0 计次循环尾 ()计次循环尾 ()计次循环尾 ()写到文件 (取运行目录 () + “\train.dat”, Output )变量名 | 类 型 | 静态 | 数组 | 备 注 | 数据量 | 整数型 | | | 数据 | 逻辑型 | | 10,1,32,32 | Data | 字节集 | | | p | 整数型 | | | Length | 整数型 | | | Wide | 整数型 | | | pic_pro | 字节集 | | | n | 整数型 | | | Line | 整数型 | | | Number | 整数型 | | | Ncount | 整数型 | | | N_pic | 整数型 | | |
数据量 = 到整数 (读配置项 (取运行目录 () + “\config.ini”, “train”, “count”, )) 重定义数组 (数据, 假, 10, 数据量, 32, 32 )Data = 读入文件 (取运行目录 () + “\train.dat”)p = 1 Line = 1 计次循环首 (10, Number )Ncount = 到整数 (读配置项 (取运行目录 () + “\config.ini”, “bmp”, “ncount” + 到文本 (Number - 1 ), )) 计次循环首 (Ncount, N_pic )pic_pro = 取字节集中间 (Data, p, 128 )Line = 1 p = p + 128 计次循环首 (32, Length )n = 取字节集数据 (pic_pro, #整数型, Line )计次循环首 (32, Wide )如果 (__query_bit (n, Wide - 1 )) 数据 [Number ] [N_pic ] [Length ] [Wide ] = 真 数据 [Number ] [N_pic ] [Length ] [Wide ] = 假 计次循环尾 ()计次循环尾 ()计次循环尾 ()计次循环尾 ()
|