项目介绍

参加阿里云AI训练营的第4天,完成一个车辆检测系统

主要思路:用户上传身份证和受损车辆图片,识别结果返回前端,同时将数据存入数据库。

项目用到文档地址

阿里云达摩院视觉开放平台:https://vision.aliyun.com/

阿里云视觉开放平台 “车辆损伤识别” 地址:https://help.aliyun.com/document_detail/155002.html?spm=a2c4g.11174283.6.755.77e06bdfN9iMtt

项目模块1-各种识别服务

(1)说明

一开始的设想是用到身份证识别和车辆识别2个服务,但是发现同时导入 2 个依赖之后,有一些 jar 包会冲突,导致身份证识别的部分由于缺少一些 jar 包而不能正常运行。最后只用到了机动车识别和车辆损伤识别2个服务。

(2)导入项目依赖

这里的依赖我们使用较早的版本

<!--    内容识别对应依赖    -->
<!-- https://mvnrepository.com/artifact/com.aliyun/objectdet -->
<dependency><groupId>com.aliyun</groupId><artifactId>objectdet</artifactId><version>0.0.5</version>
</dependency><!--    图片识别    -->
<dependency><groupId>com.aliyun</groupId><artifactId>ocr</artifactId><version>1.0.3</version>
</dependency>

之后同样要开通 “目标检测服务” 才能正常运行。

(3)创建 Client,Config类

虽然身份证识别部分会报错,但是这里依旧吧身份证识别部分的代码贴出来

CraService.java

@Value("${accessKeyId}")
private String accessKeyId;@Value("${accessKeySecret}")
private String accessKeySecret;// "内容识别" --> 导入这个类:import com.aliyun.objectdet20191230.Client;
private com.aliyun.objectdet.Client objectClient;
private com.aliyun.ocr.Client ocrClient;private RuntimeObject runtimeObject;
private RuntimeOptions runTimeOperations;@PostConstruct
public void initClient() throws Exception {Config objectConfig = new Config();objectConfig.type = "access_key";objectConfig.regionId = "cn-shanghai";objectConfig.accessKeyId = accessKeyId;objectConfig.accessKeySecret = accessKeySecret;// 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet=objectConfig.endpoint = "objectdet.cn-shanghai.aliyuncs.com";objectClient = new com.aliyun.objectdet.Client(objectConfig);runtimeObject = new RuntimeObject();com.aliyun.ocr.models.Config ocrConfig = new com.aliyun.ocr.models.Config();ocrConfig.type = "access_key";ocrConfig.regionId = "cn-shanghai";ocrConfig.accessKeyId = accessKeyId;ocrConfig.accessKeySecret = accessKeySecret;// 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet=ocrConfig.endpoint = "ocr.cn-shanghai.aliyuncs.com";ocrClient = new com.aliyun.ocr.Client(ocrConfig);runTimeOperations = new RuntimeOptions();
}

需要注意的是两个 Client 是不同的包下面的 Client 类,一个是 “内容识别” 的,另一个是 “图像识别” 的。

(4)调用关键 API

这里原本调用了3个服务,分别是 “身份证识别”,“机动车识别”,“车辆受损识别”,关键代码如下:

// “机动车识别”
public String myDetectVehicle(String filePath) throws Exception {DetectVehicleAdvanceRequest request = new DetectVehicleAdvanceRequest();request.imageURLObject = new FileInputStream(filePath);DetectVehicleResponse response = objectClient.detectVehicleAdvance(request, runtimeObject);String result = null;// 发现这是一个内部类for (DetectVehicleResponse.DetectVehicleResponseDataDetectObjectInfoList item:response.data.detectObjectInfoList) {System.out.println(item.type);System.out.println(item.score);if ("vehicle".equals(item.type)) {System.out.println("检测成功!是机动车");} else {System.out.println("该图片不是机动车!");}result = item.type;}return result;
}// “车辆损伤识别”
public String myRecognizeVehicle(String filePath) throws Exception {// 使用 xxxAdvanceRequest,支持本地图片上传RecognizeVehicleDamageAdvanceRequest request = new RecognizeVehicleDamageAdvanceRequest();request.imageURLObject = new FileInputStream(filePath);// 识别 “车辆损伤”RecognizeVehicleDamageResponse response = objectClient.recognizeVehicleDamageAdvance(request, runtimeObject);return getHurtResult(response.data.elements);
}// “身份证识别” -------->
public String MyRecognizeIdCard(String filePath, String side) throws Exception {RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();request.imageURLObject = Files.newInputStream(Paths.get(filePath));request.side = side;RecognizeIdentityCardResponse response = ocrClient.recognizeIdentityCardAdvance(request, runTimeOperations);if ("face".equals(side)) {return  JSON.toJSONString(response.data.frontResult);} else {return "";}
}

(5) 车辆损伤补充代码

看文档我们知道,由于车辆损伤有很多种情况,所以我们需要对数据进行一定的处理,思路是通过一个 switch~case 语句区分各种损伤的具体情况。

具体代码:

// 对 “车辆损伤” 识别出来的数据进行一定的处理,方便前台展示
public String getHurtResult(RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements[] items) {StringBuffer type =  new StringBuffer("检测到的车辆损伤为:");for (RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements item:items) {switch (item.type) {case "1": type.append("轻微刮擦   ");break;case "2": type.append("重度刮擦   ");break;case "3": type.append("轻度变形   ");break;case "4": type.append("中度变形   ");break;case "5": type.append("重度变形   ");break;case "6": type.append("crack破损孔洞   ");break;case "7": type.append("翼子板和大灯缝隙   ");break;case "8": type.append("翼子板保险杠缝隙   ");break;case "9": type.append("大灯轻微刮擦   ");break;case "10": type.append("大灯重度刮擦   ");break;case "11": type.append("大灯破损   ");break;case "12": type.append("后视镜轻微刮擦   ");break;case "13": type.append("后视镜玻璃破损   ");break;case "14": type.append("后视镜脱落   ");break;case "15": type.append("挡风玻璃破损   ");break;}}return type.toString();
}

项目模块2-图片上传服务,及数据库操作

这部分做的比较简易,没有美化样式,能看就行~就是一个简单的 from 表单

test.html

<form th:action="@{/upload}" enctype="multipart/form-data" method="post">身份证:<input type="file" name="identityfile">受损车辆:<input type="file" name="carfile"><input type="submit" value="upload">
</form>

图片上传对应的 Controller,上传完成之后,同时进行识别,然后在将识别输入存入数据库中

CarController.java

@RequestMapping("/upload")
public String fileUpload(@RequestParam("carfile") MultipartFile carFile, @RequestParam("identityfile") MultipartFile identityFile, Model model) throws IOException {// 1. 上传图片 ----》 “身份证”String identityPath = aiCarService.fileUpload(identityFile);// 2. 上传图片 -----》 “受损车辆”String carPath = aiCarService.fileUpload(carFile);// 3. 调用 Service 层分析图片String face = null;String carStr = null;String carStr2 = null;try {// 3.1 身份证识别 ---> 只需要识别正面//            face = carService.MyRecognizeIdCard(identityPath , "face");// 3.2 机动车检查carStr = aiCarService.myDetectVehicle(carPath);// 3.3 车辆损伤识别carStr2 = aiCarService.myRecognizeVehicle(carPath);} catch (Exception e) {e.printStackTrace();}// 4. 保存数据到数据库中Car car = new Car(null, carStr, carStr2);carService.insert(car);// 4. 将图片路径放入 Model 中String carFileName = carFile.getOriginalFilename();String identityFileName = identityFile.getOriginalFilename();model.addAttribute("carfilename", "/upload/" + carFileName);model.addAttribute("identityfilename", "/upload/" + identityFileName);model.addAttribute("face", face);if ("vehicle".equals(carStr)) {model.addAttribute("carStr", "检测成功!是机动车");} else {model.addAttribute("carStr", "您上传的图片不是机动车,请重新上传!!");}model.addAttribute("carStr2", carStr2);return "result";
}

对应的 Service

CarService.java

/*** @Description: 图片上传服务* @Param: [file]* @return: void* @Author: 林凯* @Date: 2020/6/8*/
public String fileUpload(MultipartFile file) {// 1. 获取文件名String uploadFileName = file.getOriginalFilename();// 2. 上传路径保存设置   UUIDString path = "src/main/resources/static/upload";// 2.1 如果路径不存在,创建一个File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}// 3. 上传文件,并保存InputStream is = null; //文件输入流OutputStream os = null;try {is = file.getInputStream();os = new FileOutputStream(new File(realPath, uploadFileName));int len = 0;byte[] buffer = new byte[1024];while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);os.flush();}} catch (IOException e) {e.printStackTrace();} finally {try {os.close();} catch (IOException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}return path + "\\" + uploadFileName;
}

返回结果给前端,前端的处理部分

result.html

<img th:src="${carfilename}" alt="">
<img th:src="${identityfilename}" alt="">
<p th:text="${carStr}"></p>
<p th:text="${carStr2}"></p>

测试效果

首先进入上传图片页面,并上传2张图片

然后点击 upload 上传并查看结果:

数据库里面的结果:

阿里云高校计划

最后在贴一张阿里云的广告:”阿里云高校计划“,快来加入我们吧!

【阿里云高校计划】阿里云AI训练营_Day04_车辆检测系统相关推荐

  1. 【阿里云高校计划】视觉AI-身份证识别系统搭建

    [阿里云高校计划]视觉AI-身份证识别系统搭建 由大佬书写的项目源码:https://github.com/aliyun/alibabacloud-viapi-demo/tree/master 阿里云 ...

  2. 【阿里云高校计划】视觉Al训练营五天训练第二天

    学习身份证识别系统搭建笔记 SDK 正文 链接 名词解释 搭建过程可以看看这个博客 link 下面是一个小白的记录,还没做完. SDK 阿里云达摩院视觉开放平台:http://vision.aliyu ...

  3. 【阿里云高校计划】视觉Al训练营五天训练第一天笔记

    导论-视觉生产 定义和分类 定义 分类 通用基础框架 五个关键维度 2精细理解--寻微入里 分割抠图 难点 解题思路 模型框架 效果展示 视觉生成 鹿班 框架流程 视频生成--AlibabaWood ...

  4. 【阿里云高校计划】实现简单的身份证识别系统!

    实现简单的身份证识别系统: 借助阿里云视觉平台提供的ocr识别能力完成简单的身份证识别系统. (这个系统最终在web前端页面上呈现.) 实现的核心逻辑: 最终的wed端界面效果 项目结构: { App ...

  5. 阿里云高校计划视觉AI五天训练营教程学习笔记

    阿里云高校计划视觉AI五天训练营教程学习笔记 Day 1 Topic: 视觉生产技术 定义:通过(一个或者一系列)视觉过程,产出 **新的** 视觉表达. 分类 通用基础框架 关键维度 精细理解--举 ...

  6. 【阿里云高校计划】阿里云视觉AI训练营 DAY1 AI视觉生产技术简述

    目录 写在前面 定义和分类 定义 分类 通用基础框架 五个关键维度 分割抠图 分割抠图 难点 解题思路 模型框架 部分扩展 视觉生成 以平面设计图像生成平台--<鹿班>为例 框架流程 鹿班 ...

  7. 2021第一场 | 阿里云高校计划训练营全面升级!0成本体验云计算入门到进阶

    简介:2021,走进云计算的美妙世界(参加训练营免费获取ACA考试资格) 近年来云计算越来越受到重用,它不再仅仅是开源发烧友们的选择,已经在多方面得到了价值体现. 甚至网上流传一句话:云计算适合零基础 ...

  8. 【阿里云高校计划】身份证识别系统搭建 day2 【抛砖引玉】

    身份证识别系统搭建 [阿里云高校计划]身份证识别系统搭建 day2 [抛砖引玉] 身份证识别系统搭建 一.项目简介 二.获取视觉智能开放平台提供的SDK 三.项目实现 (一)前端index.html ...

  9. 【阿里云高校计划】未完成(车牌识别)停车场车辆管理系统 day5 【以小见大】

    [阿里云高校计划]未完成(车牌识别)停车场车辆管理系统 day5 [以小见大] [阿里云高校计划]未完成(车牌识别)停车场车辆管理系统 day5 [以小见大] 实施前--项目实现思路 1.简要描述 2 ...

最新文章

  1. suse linux 命令
  2. GridView的操作大全
  3. 分布式块存储QoS限速算法介绍与实践以及对上层应用的影响
  4. linux uniq命令_如何在Linux上使用uniq命令
  5. 客户旅程_我们进入微服务世界的旅程-以及从中学到的东西。
  6. 澳国立计算机录取分数,澳洲出国:2018年澳洲国立大学对高考成绩的本科录取分数线(多图)...
  7. 2021庐江高考成绩查询,2021庐江高考考点查询入口https://lj.hfzsks.org/list_score/index.php?seach_t...
  8. 更高效地提高redis client多线程操作的并发吞吐设计
  9. python上下文管理器ContextLib及with语句
  10. 河北联通烽火HG680-J机顶盒破解安装教程
  11. Ubuntu18.04 下载与安装
  12. BurpSuite CA证书安装(拦截HTTPS协议)
  13. 博客迁移说明 : )
  14. “2019年全国职业院校技能大赛”高职组计算机网络应用竞赛竞赛样题C卷(软件定义网络部分答案参考)
  15. 石像鬼 openwrt chinadns dns-forwarder 开机无法自动启动
  16. Mongodb Mysql 小测试 (To Be Continued)
  17. openwrt编译smartdns_老大静态编译openwrt平台mipsel_24kc架构的smartdns时报错,求救!...
  18. clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解
  19. validform_v5.3.2帮助文档
  20. RS-485总线与CAN总线理解

热门文章

  1. ppp协议 服务器,PPP(点对点协议(Point to Point Protocol))_百度百科
  2. 「实战篇」开源项目docker化运维部署-前端java部署(八)
  3. canvas基础简单易懂教程(完结,多图)
  4. LSVGlobal Mapper应用----影像下载
  5. golang识别身份证号
  6. 单盘位小先锋 群晖DS112j家用NAS评测
  7. 活体检测 Domain Generalization via Shuffled Style Assembly for Face Anti-Spoofing 论文学习记录
  8. Linux下基于C++11的socket网络编程(线程版本)
  9. 解决aspx页面中关键词(keywords)和描述(descript)不显示问题
  10. 深度学习的过拟合与欠拟合问题的介绍与解决方案