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

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,图像通用资源包5000点
简介: 快速学习第四节课——【图像识别项目及使用说明】

开发者学堂课程【达摩院视觉 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:简化多容器应用的部署
304 0
|
3月前
|
人工智能 自然语言处理 Java
面向 Java 开发者:2024 最新技术栈下 Java 与 AI/ML 融合的实操详尽指南
Java与AI/ML融合实践指南:2024技术栈实战 本文提供了Java与AI/ML融合的实操指南,基于2024年最新技术栈(Java 21、DJL 0.27.0、Spring Boot 3.2等)。主要内容包括: 环境配置:详细说明Java 21、Maven依赖和核心技术组件的安装步骤 图像分类服务:通过Spring Boot集成ResNet-50模型,实现REST接口图像分类功能 智能问答系统:展示基于RAG架构的文档处理与向量检索实现 性能优化:利用虚拟线程、GraalVM等新技术提升AI服务性能 文
366 0
基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(二)
基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(二)
221 1
|
机器学习/深度学习 自然语言处理 算法
深度学习之能源消耗预测
基于深度学习的能源消耗预测(Energy Consumption Prediction Based on Deep Learning)通过对历史能源数据的分析和建模,利用深度学习算法来预测未来的能源需求和消耗。
491 4
|
机器学习/深度学习 人工智能 自然语言处理
《智能语音助手的未来:从理解到预测的跃进》
随着人工智能技术的飞速发展,智能语音助手已经从简单的命令响应进化到能够理解和预测用户需求的高度。本文将深入探讨智能语音助手如何通过自然语言处理、机器学习和大数据分析等技术,实现从基础交互到高级认知功能的转变,并预测未来可能的发展方向。 【7月更文挑战第29天】
395 4
|
存储 SQL 数据库
软件体系结构 - 架构风格(10)数据库系统架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(10)数据库系统架构风格
382 0
|
存储 监控 安全
服务器的安全包括哪些方面?服务器安全该如何去加固处理?
服务器的安全包括哪些方面?服务器安全该如何去加固处理?
|
机器学习/深度学习 人工智能 算法
极智AI | 谈谈几种量化策略:MinMax、KLD、ADMM、EQ
大家好,我是极智视界,本文分享了 谈谈几种量化策略:MinMax、KLD、ADMM、EQ。希望我的分享能给你的学习带来一点帮助。
2321 0
|
人工智能 运维 Oracle
什么是LIS系统?LIS系统的优势有哪些?
什么是LIS系统?LIS系统的优势有哪些?
1752 0

热门文章

最新文章