RT.
图像识别一直是很热门的话题,因此跟热点的 bytetriper 这次任务是做简单的手写数字识别!
大家都知道,AI 已经杀死了 CV(计算机视觉),但守旧的 bytetriper 不喜欢神经网络,因此决定把这个任务出成开放题,交给各位解决。
在本题中,你只需要解决基础的灰度图片单个数字识别的问题。即给定一张灰度图片,输出 0-9 的一个数字作为你的预测。
具体来讲,你需要实现 src.hpp
中的 judge
函数并将整个 src.hpp
上交到 OJ。
typedef std::vector<std::vector<double>> IMAGE_T;
int judge(IMAGE_T &img);
其中 IMAGE_T
为一个二维 vector,即图片的二维数组表示,数据存储约定见后。
judge
函数的返回值即为你对于这张图片的预测值。
请注意,返回除了 0-9 之外的任何其他返回值都被认为是非法的,会引发错误。
下发数据和代码都已放在 Code Repo。
我们对图片的存储方式做如下规定:
- 所有图像均被表示为二维数组
$A_{N\times N},A_{i,j}\in [0,1]$ ,其中 1 为纯白,0 为纯黑。 - 所有图像都由 png/ppm 格式储存。
- 数字都为白色,且符合人类正常书写规律。不会出现倒着写,横着写的情况。
- 保证数字一定存在于图片中,但不对数字的形状、大小、区域做任何保证。
- 部分数据已经下发,详见仓库中的
data/
,数据具体来源及与测试数据集差别详见 tips:
- 由于使用 C++ 读入 png/jpg/jpeg 图片非常不方便,我们下发了 ppm 格式的图片以方便读取。
- 同时,我们也给出了读取 PPM 文件的代码,你可以直接使用。
- 虽然文件以 PPM 格式存储,但内容实际是 P5 的 PGM,即灰度图。你可以在这里查看 PGM 的具体格式。
- 源文件
read_support.cpp
与read_support.h
已下发在仓库中。read_support.h
中提供了两个函数的接口:
typedef std::vector<std::vector<double>> IMAGE_T;
IMAGE_T read_ppm(const std::string &filename);
IMAGE_T read_ppm();
void check(IMAGE_T mat);
read_ppm
函数接受一个字符串作为 ppm 文件地址,返回一个二维 vector,即图片的二维数组表示,数据存储约定见前。没有参数的read_ppm
函数行为和上述函数相同,但是会从标准输入读取 ppm 文件。check
函数接受一个二维 vector,并在控制台输出该二维 vector 的内容,以方便你调试。
本题评分标准如下:
我们希望衡量的是算法的正确的概率。设测试数据集有
上交到 OJ 的代码会在测试集数据下进行测试。请注意:测试数据集与下发数据不同。
为了方便更有针对性的优化,在评测信息中给出了
欢迎在本地用下发数据自行评测结果,具体评测方式:
- 进入仓库根目录(和
Makefile
同级),执行make
,编译出可执行文件test
。由于 stdc++17 在 MINGW 上的 path 实现有一些问题,请尽量使用 Linux 或者 WSL 进行测试。如果你没有安装 make,可以使用命令
g++ -std=c++17 test.cpp read_support.cpp -o test
编译。 - 如果希望简单地在所有下发数据上测试,请使用:
./test
,输出为在所有数据上的正确率。 - 如果希望对某个 label 的数据进行测试,请使用:
./test [label]
(如./test 1
),输出为在该 label 上的正确率。 - 你也可以自行改动代码以实现更精细的评测。
鉴于 bytetriper 希望这是一道人类智慧题,而不是人工智能题,有一些 tips 送给大家:
- 测试数据集和下发的数据都随机采样自同一个数据集 MNIST,这意味他们在特征上基本相同,同时,测试集的大小是下发数据集的 60 倍。由于测试集和下发集不相同,你的算法在本地上跑出的结果很可能不同于 OJ 上的结果。
- 禁止上网路查询信息,同时,禁止直接使用任何图象处理库的代码,包括但不限于 OpenCV,PIL,skimage 等。由于 OJ 本身没有相关库支持,因此这里的禁止使用指的是不能抄袭相关库实现。
- 对于依旧使用人工智能方法的同学,我们会对准确率高的代码手动检查,请特别注意 PPCA 网络限制包括但不限于:
- 不允许使用任何外部数据
- 不允许使用任何预训练模型
- 由于以图片格式查看二进制 PPM 文件会碰到一些困难,(使用 VSCode 的)同学可以下载 VSCode 的插件来查看 PPM 文件,这是被允许的。同时,有些浏览器原生支持 PPM 格式,也可以使用浏览器打开 PPM 文件。
- 如果实在无法查看 PPM,可以查看
png_data/
下的 png 格式文件,这与 ppm 是完全相同的。