第四节课——【图像识别项目及使用说明】(一)|学习笔记

简介: 快速学习第四节课——【图像识别项目及使用说明】

开发者学堂课程【达摩院视觉 AI 精品课第四节课——【图像识别项目及使用说明】笔记与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/912/detail/14421


第四节课——【图像识别项目及使用说明】(一)

内容介绍:

一、数据库

二、代码

三、PostConstruct 注解

四、整个数据存储的结构:

五、VisionService

六、前端页面

七、mounted

八、控制器部分

九、识别实现的方法

大概结构:

AlbumApplication 是启动的入口函数

common 一般是存放公共的类、常量等

config 是装载数据库等(图片.jpg)

controller 是接收外部的请求

service 这里有两个模块:第一个可以持久到数据库;第二个是所有算法如对图像算法的识别

utils 是放一些类或公共函数

一、数据库

首先看装载的数据库:

import...

@Configuration

public class WebAppConfig implements WebMvcConfigurer {

@Value("./img/")

public String imgPath;

@Bean

public WebAppConfig newWebAppConfig() {

return new WebAppConfig()

}

@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {

newWebAppConfig();registry.addResourceHandler( ...pathPattoms:"/static/**").addResourceLocations("“classpath:/static/"");registry.addResourcetiandler. ...pathPlattems:"/templates/**" ).addResourceLocations("classpath:/templates/”);registry.addResourceHandler( ...pathPattens:"/img/**" ) ,addResourceLocations("file:"+imgPath);

}

}


二、代码

通过 MultipartFile 是一个文件的输入流,输入流只能读取一次,如果要重新读就会是空。

所以把它转化成 ByteArrayInputAtream 这个流然后在每次用完之后可以把它进行reset、mark 流,这个时候就可以重新去使用这个 ByteArrayInputAtream 流,函数就会把这个流保存在内存中(这个方式不适用于内存太大的图片,只是一个简单的实现)。

为了避免上传的图片重名,对图片的 Input 流取了 MD5 的值作为函数名,基本上可以避免重复。

@RequestMapping(value = "/list", method = RequestMethod.GET)

public Object getList() throws Exception { return resourceService.getAllPhotos();

}@RequestMapping(value = "/allcates", method = RequestMethod.GET)

public Object getCates() throws Exception {

return resourceService.getAllCates();

}@RequestNapping(value = "/getPhotosByCateAndLabel", method = RequestMethod.GET)public Object getPhotosByCateAndLabel(@RequestParam(name="cate") String cate, @RequestParam(name="tag”) String tag) throws Eaception {

return resourceService.getPhotosByCateAndLabel(cate, tag);

}@RequestMapping(value = "/getPhotosByCate", method = RequestMethod.GET)public Object getPhotosByCate(@RequestParam(name="cate") String cate) throws Exception {

return resourceService.getPhotosBycate(cate);

}

@PostMapping("/upload")public Object upload(@RequestParam("file') MultipartFile file) throws Exception {

//计算上传文件的md5值,作为文件名

byte[] bytes = file.getBytes();ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);

String md5Str = Md5CaculateUtil.getMD5(inputStream);

inputStream.reset();

inputStream.mark( readAheadLimit: 0);

String fileName = file.getOriginalFilename();String fType = fileName.substring(fileName.lastIndexOf( str: "."));

fileName = String.format("%s%s", md5Str, fType);

resourceService.saveAndRecognizeImage(fileName,inputStream);

return fileName;

}

三、PostConstruct注解

PostConstruct 注解:在装载 bin 的时候先执行这个函数,可以把保存在本地的数据取出来加到内存里面去;在销毁对象的时候再把数据保存在本地文件→date.json。

@PostConstruct

public void loadMetaData() {

log.info("load");

try {InputStream inputStream = new FileInputStream( name. storagePath + fileName);

labelModel =JSONObject.parseObject(inputStream,LabelModel.class);

}catch (IOException e) {

log.error(e.toString());

labelModel = new LabelModel();

}

}

@PreDestroy

public void saveMetaData() {

log.info("save");

try {System.out.println(JSON.toJSONString( labelModel));OutputStream outputStream = new FileOutputStream( name: storagePath + fileName);OutputStream.write(JSON.toJSONBytes( labe lhode1));

}catch (Exception e) {

log.error(e.toString());

}

}

四、整个数据存储的结构

整个数据存储的结构:

"allImg": [

"bddbe77275ff7595603d4cce8ce1828c.jpg”,

"73c666ab97fa4646d168585b256c5fcc.jpg",

"53c92f57ad4aea47fba6e6a45d317fa1.jpg",

"1afc6966899d7e8b5b408ce194a322b9.jpg"

],

"cateMap":Object{…},

"expressionMap" :Object{…},

"imgLabels":Object{…},

"sceneMap":Object{…},

"styleMap":{

}

可以通过分类找到标签:

"cateMap":Object{…},

"expressionMap": {

"expression_生气": [

"lafc6966899d7e0b5b408c0194a322b9.jpg”,

"53c92f57ad4aea47fba6e6a45d317fa1.jpg"

]

"expression_惊讶": [

"bddbe77275ff7595603d4ccece1828c.jpg"

]

},

"imgLabels": {

"1afc6966899d7e8b5b408c0194a322b9.jpg": [

"scene_人物",

"scene_其他",

"scen_运动",

"expression_生气",

"scene_演出“

],

"73c666ab97fa4646d168585b256c5fcc.jpg" : [

"scene_户外",

"scene_室外",

"scene_建筑",

"scene_物品",

"scene_露营"

],

}

相关文章
|
前端开发 开发者 Docker
深入探索Docker Compose:简化多容器应用的部署
深入探索Docker Compose:简化多容器应用的部署
400 0
|
10月前
|
数据采集 存储 网络协议
Java HttpClient 多线程爬虫优化方案
Java HttpClient 多线程爬虫优化方案
基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(二)
基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(二)
269 1
|
边缘计算 分布式计算 资源调度
云计算与边缘计算的融合趋势与挑战
云计算与边缘计算的融合趋势与挑战
455 3
|
机器学习/深度学习 自然语言处理 算法
深度学习之能源消耗预测
基于深度学习的能源消耗预测(Energy Consumption Prediction Based on Deep Learning)通过对历史能源数据的分析和建模,利用深度学习算法来预测未来的能源需求和消耗。
647 4
|
机器学习/深度学习 人工智能 自然语言处理
《智能语音助手的未来:从理解到预测的跃进》
随着人工智能技术的飞速发展,智能语音助手已经从简单的命令响应进化到能够理解和预测用户需求的高度。本文将深入探讨智能语音助手如何通过自然语言处理、机器学习和大数据分析等技术,实现从基础交互到高级认知功能的转变,并预测未来可能的发展方向。 【7月更文挑战第29天】
458 4
|
数据采集 存储 JavaScript
(2024)豆瓣电影TOP250爬虫详细讲解和代码
这是一个关于如何用Python爬取2024年豆瓣电影Top250的详细教程。教程涵盖了生成分页URL列表和解析页面以获取电影信息的函数。`getAllPageUrl()` 生成前10页的链接,而`getMoiveListByUrl()` 使用PyQuery解析HTML,提取电影标题、封面、评价数和评分。代码示例展示了测试这些函数的方法,输出包括电影详情的字典列表。
1496 3
|
消息中间件 关系型数据库 MySQL
MySQL 到 Kafka 实时数据同步实操分享(1),字节面试官职级
MySQL 到 Kafka 实时数据同步实操分享(1),字节面试官职级
|
存储 SQL 数据库
软件体系结构 - 架构风格(10)数据库系统架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(10)数据库系统架构风格
442 0
|
存储 监控 安全
服务器的安全包括哪些方面?服务器安全该如何去加固处理?
服务器的安全包括哪些方面?服务器安全该如何去加固处理?

热门文章

最新文章