开发者学堂课程【达摩院视觉 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_露营"
],
}