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

本文涉及的产品
视觉智能开放平台,分割抠图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_露营"

],

}

相关文章
|
7月前
|
人工智能 自然语言处理 供应链
面向企业的 ChatGPT 究极手册:第一章到第二章
面向企业的 ChatGPT 究极手册:第一章到第二章
177 0
面向企业的 ChatGPT 究极手册:第一章到第二章
|
5月前
|
机器学习/深度学习 算法
284张机器学习漫画手册吃透所有基础知识!
前几天淘到一份斯坦福大佬整理的漫画集,几乎讲到了机器学习所有的知识点,包括特征工程、算法模型、评估、优化……熬夜肝完了,真的很不错! 用284张漫画几乎可以吃透机器学习所有知识,就想着赶紧分享给小伙伴们了!
|
7月前
|
机器学习/深度学习 人工智能 安全
面向企业的 ChatGPT 究极手册:第九章到附录 A
面向企业的 ChatGPT 究极手册:第九章到附录 A
118 0
南大《探索数据的奥秘》课件示例代码笔记03
南大《探索数据的奥秘》课件示例代码笔记03
64 0
南大《探索数据的奥秘》课件示例代码笔记02
南大《探索数据的奥秘》课件示例代码笔记02
83 0
|
存储 并行计算 计算机视觉
【CUDA学习笔记】第九篇:基本计算机视觉操作【上】(附实践源码下载)(二)
【CUDA学习笔记】第九篇:基本计算机视觉操作【上】(附实践源码下载)(二)
120 0
|
存储 并行计算 API
【CUDA学习笔记】第九篇:基本计算机视觉操作【上】(附实践源码下载)(一)
【CUDA学习笔记】第九篇:基本计算机视觉操作【上】(附实践源码下载)(一)
136 0
|
并行计算 算法 计算机视觉
【CUDA学习笔记】第十篇:基本计算机视觉操作【下】(附实践源码下载)(一)
【CUDA学习笔记】第十篇:基本计算机视觉操作【下】(附实践源码下载)(一)
144 0
|
并行计算 API 计算机视觉
【CUDA学习笔记】第十篇:基本计算机视觉操作【下】(附实践源码下载)(二)
【CUDA学习笔记】第十篇:基本计算机视觉操作【下】(附实践源码下载)(二)
132 0
【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解
点击面板,选择第三个图标,就是行人库行人库分为两个区域(空间标记和模块)从左边拽一个矩形墙出来把墙的外观的填充类型改为无填充拽两条目标线出来拽一个pedSource模块出来,作用是设置人的起始点设置目标线为左边的那条同样的,拽出一个Ped GoTo,作用是设置人的目的地,设置它的目标线为右边的那条最后,拽一个PedSink出来,作用是将到达目的地的人进行销毁点击运行加速播放运行效果展示。
907 0
【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解