TA的每日心情 | 慵懒 2024-5-31 23:20 |
---|
签到天数: 302 天 连续签到: 2 天 [LV.8]以坛为家I
|
FZ3深度学习镜像是由百度提供的,其推理加速功能由一个FPGA软核提供,该软核也是基于百度的深度学习框架“飞桨”定制的。
该平台可以通过百度大脑的工具( EasyDL/AIStudio)进行开发。
(一)EasyDL/AIStudio
1-概念
实际上EasyDL/AIStudio这两者概念有所重叠,都提供了一个深度学习数据集训练环境和深度学习应用构建平台。
但大致上分工明确,AIStudio定位在线实训平台,提供一体化深度学习编程环境,以及数据集汇集、竞赛等。
而EasyDL则是一个快速的模型部署平台。
2-区别
在我的理解,两者最大的区别在于AIStudio更偏重于深度学习的底层,包含但不限于图像识别和音频识别,可以广泛地应用于各种领域,比如可以做情感分析的深度学习。
而EasyDL则侧重于应用,注重于AI成熟的图像视频、文本语音的深度学习应用,提供快速的AI应用开发途径。
(二)深度学习DEMO
FZ3开发板出厂内置了深度学习的DEMO,分别是分类模型(classification)和目标检测(detection)
这分别对应了EasyDL平台的两个拳头产品:物体检测模型、图像分类。
(三)分类模型(classification)-图像分类
分类模型指对图片进行分类,可以识别一张图整体是什么物体/状态/场景。
其分类的结果是整张图片进行一个标注。
classification的demo是识别怡宝水瓶子,搜了一下家,刚好发现个空的怡宝瓶:
识别到怡宝瓶的时候标签变为cestban:
准确率有92.5,实时直观感受还行。
(四)目标检测(detection)-物体检测模型
目标检测指对图片内的物体进行检测,可以检测出图片里面多个目标物体名称、位置。
实时的demo是检测螺丝,一下子没找到螺丝来试,先看个样子吧。
(五)停止demo
demo并没有考虑停止的问题,从代码来看:
- 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);
- signal(SIGINT, signal_handler);
- // 为相机开启一个新的线程
- // std::thread task_capture(capture);
- // 预测线程
- std::thread task_predict(predict);
- std::thread task_cvcap(cv_getpic_loop);
-
- cv::namedWindow(name, CV_WINDOW_NORMAL);
- cv::setWindowProperty(name, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
- // moveWindow(name, 20, 20);
- usleep(2000); // 等待窗口初始化
- while (true) {
- cv::Mat mat = g_dis_queue.Take();
- /* if (g_display_frame.cols == 0) {
- // std::cout<< "FIXME: shouldn't be 0 of image's cols" << std::endl;
- usleep(40000);
- continue;
- } */
- // g_mtx.lock();
- for (int i = 0; i < g_results.size(); ++i) {
- SSDResult r = g_results[i];
- cv::Rect rect(r.x, r.y,r.width,r.height);
- // cv::rectangle(g_display_frame, rect, Scalar(0,0,224), 2);
- cv::rectangle(mat, rect, Scalar(0,0,224), 2);
- }
- imshow(name, mat);
- // imshow(name, g_display_frame);
- // g_mtx.unlock();
- cv::waitKey(10);
- }
- // task_capture.join();
- task_cvcap.join();
- task_predict.join();
- return 0;
- }
复制代码
主函数里面只有一个waitkey,也没有判定key是什么类型的,根据类型进行停止。似乎并没有考虑停止的问题,因此需要在SSH远程kill这个线程:
|
|