其系统自带的例程在/workspace/PaddleLiteSample 路径下,其中classifica
tion为图片分类的例程文件夹。这个文件夹的工程目录结构如下所示:
├── CMakeLists.txt // cmake 工程配置文件。
├── include
├── configs // 配置文件目录
│ ├── Inceptionv2
│ │ └─ zebra.json 斑马图片的配置
│ ├── Inceptionv3
│ └── resnet50
├── lib
├── models // 模型文件目录
│ ├── Inceptionv2
│ ├── Inceptionv3
│ └── resnet50
│── src
│ ├── json.hpp // json 解析库
│ └── image_classify.cpp // 图片推理示例
└── README.md
下面是配置文件示例。
JSON
{
"model":"../models/resnet50",
"combined_model":true,
"video_device":"/dev/video0",
"labels":"../models/resnet50/label_list.txt",
"input_width":224,
"input_height":224,
"image":"../models/resnet50/1.jpg",
"mean":[123.675,116.28, 103.53],
"scale":[0.01743,0.01743, 0.01743],
"format":"RGB"
}
| key | value |
| -------------- | ------------------------------------------ |
| model | 模型目录存放的位置 |
| combined_model | 是否为融合的模型,只有两个文件的是融合模型 |
| video_device | u***摄像头识别到的设备节点 |
| labels | 模型的类别标签 |
| input_width | 输入网络的图片尺寸输入图片会缩放到该大小 |
| input_height | 输入网络的图片尺寸 |
| image | 进行分类的图片输入 |
| mean | 平均值 |
| scale | 输入网络前预算处理为 ( x - mean ) * scale |
| format | 网络所需要的格式,OpenCV默认是BGR |
该例程的使用步骤如下:
在此处我们使用的实例图片为:
其中分类的标签为饮料的商品名称,有以下四种标签分类:0:[default]1:cocacola2:cestbon3:nongfu我们可以轻易看出这是怡宝(cestbon)的矿泉水,下面就是要得到上述图片的分类标签。1.加载驱动,系统启动后加载一次即可(已启动的可忽略)insmod /home/root/workspace/driver/
FPGAdrv.ko2.编译示例,本设备具有编译能力,进入到PaddleLiteSample/classification示例的build目录下进行编译cd /home/root/workspace/PaddleLiteSample/classification// 如果没有build目录,创建一个mkdir buildcd buildrm -rf *// 调用cmake 创建Makefile cmake ..
// 编译工程。Make
编译结束后会在build 目录生成几个文件。image_classify 读取本地图片推理示例。video_classify 读取摄像头数据进行推理,要连接USB Camera才能使用。如需显示结果还要连接DP显示器或者HDMI显示器或者VGA显示器等。3.执行示例读取一张图片,做推理,将结果保存为图片输出result.jpg./image_classify ../configs/resnet50/drink.json
我们可以看到分类的结果为cestbon,其概率为99.9968%在此处我们可以修改配置文件drink.json做其他图片的分类,将其路径修改一下即可。
该图片分类的主函数如下所示:
- int main(int argc, char* argv[]){
- std::string path;
- if (argc > 1) {
- path = argv[1];
- } else {
- path = "../configs/config.json";
- }
-
- json j;
- std::ifstream is(path);
- is >> j;
- init(j);
- read_labels(j);
- predict(j);
- return 0;
- }
复制代码
其中的predict()函数如下所示:
- void predict(json& value) {
-
- int width = value["input_width"];
- int height = value["input_height"];
- auto input = g_predictor->GetInput(0);
- input->Resize({1, 3, height, width});
- auto* in_data = input->mutable_data();
- read_image(value, in_data);
- g_predictor->Run();
- auto output = g_predictor->GetOutput(0);
- float *data = output->mutable_data();
- int size = output->shape()[1];
- int max_index = 0;
- float score = 0;
- for (int i = 0; i < size; i++) {
- float value = data[i];
- if (value > score) {
- max_index = i;
- score = value;
- }
- }
- if (labels.size() > 0) {
- std::cout << "label:" << labels[max_index] << std::endl;
- }
- std::cout << "index:" << max_index << std::endl;
- std::cout << "score:" << score << std::endl;
- }
复制代码
其中解析库为 json.hpp
关于其中的算法方面的推到和调用,并没有仔细看,这个还需要深入了解,不知道该库使用的是哪种神经网络。
`