版权声明:本文为博主原创文章,转载 请注明出处 https://blog.csdn.net/sc2079/article/details/82189824

9月9日更:博客资源下载:链接: https://pan.baidu.com/s/1AEtQL7uk4_T7TPKa1Q6kFg 提取码: g1n8 永久有效

  • 动机

暑假实习,一位做算法的老师让我们一行人将摄像头拍取的车辆照片按车型分类保存。

示例如下:

这样的图片共有上万张,且有多个文件夹,人工打开图片、放大,再识别(如果不清楚车辆标志,还需上网查找),并Ctrl+C、Ctrl+V将其保存在相应文件夹下,这着实让人感到无聊与繁琐。

因此,我就萌发了用熟知的python写个脚本,自动化完成工作。

  • 开始工作

上面想法很好,但是实际行动起来我还是遇到了很多问题。

首先,技术路线的选取。最简单莫过于直接调用某云上的API接口,但是免费调用次数有限。当然,我最开始也最想采用的是走爬虫路线。有很多网站可以在线上传车辆照片并返回车型结果,我就想利用这一点解决车型识别的问题。然并卵,post请求无法响应,就想向selenium上靠,可是上传文件对话框阻碍了我进一步操作。虽然网上有很多解决对话框的方法,但是碍于时间紧且方法较复杂(短时我无法实现)等种种原因,我不得不采用了最简单直接的方法。PS:如果有做过类似的项目(对话框)的大佬请不吝赐教!

1.环境配置

编译环境:Python3.6,Spyder

依赖模块:shelve,PIL,shutil

2.申请API

打开百度云图像识别的网页链接:https://cloud.baidu.com/product/imagerecognition,创建一个项目,便可以得到API调用的接口。

找到并下载车型识别Python的SDK

车型识别的示例:

""" 读取图片 """
def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()image = get_file_content('example.jpg')""" 调用车辆识别 """
client.carDetect(image);""" 如果有可选参数 """
options = {}
options["top_num"] = 3
options["baike_num"] = 5""" 带参数调用车辆识别 """
client.carDetect(image, options)

3.指定目录下所有车型的获得

对API调用返回JSON数据的清洗,提取所需要的信息(取第一个)

car_info=client.carDetect(img)
try:car_color=car_info['color_result']
except:car_color='无法识别'
try:car_name=car_info['result'][0]['name']car_score=car_info['result'][0]['score']car_year=car_info['result'][0]['year']
except:car_name='非车类'car_score=1car_year='无年份信息'
car_result=[car_color,car_name,car_score,car_year,file]

获取指定目录下的所有车辆照片的车型

path='..'
img_path=path+'\\car_img'#调用API获取指定目录下所有文件的车型,并将数据保存
m_files=os.listdir(img_path)
for i in range(len(m_files)):results=[]files_path=img_path+'\\'+m_files[i]imgs=os.listdir(files_path)for j in range(len(imgs)):#out_path,img=img_cut(m_files[i],imgs[j])result=get_info(out_path,img)results.append(result)data_path=path+'\\'+'data'+'\\'+m_files[i]shelf_save(results,data_path)

实际操作中,发现有些图片识别不出来,便裁剪一下,保留下半部分,竟然发现它能识别了。因此,在上传图片时首先对图片进行了裁剪。

#图片裁剪
def img_cut(file,img):img_read = Image.open(path+'\\car_img\\'+file+'\\'+img)a = [0,1300,3310,2600]box = (a)roi = img_read.crop(box)out_path = path+'\\图片处理\\'+fileif not os.path.exists(out_path):os.mkdir(out_path)roi.save(out_path+'\\'+img)return out_path,img

我这里使用了shelve模块将每个文件夹数据进行保存与调用

def shelf_load(path):shelfFile = shelve.open(path)results=shelfFile['results']shelfFile.close() return resultsdef shelf_save(results,path):shelfFile = shelve.open(path)shelfFile['results'] = resultsshelfFile.close() 

4.根据车型分类建立文件夹

话不多说,直接上代码

#按车型分类建立文件夹
for i in range(len(m_datas)):_path=path+'\\data\\'+m_datas[i]datas=shelf_load(_path)for j in range(len(datas)):ori_path=img_path+'\\'+m_datas[i]+'\\'+datas[j][4]if datas[j][1]=='非车类':           if not os.path.exists(path+'\\results\\未知'):os.mkdir(path+'\\results\\未知')now_path=path+'\\results\\未知\\'+datas[j][4]shutil.copy(ori_path,now_path)continuefor brand in brands: if brand in datas[j][1]:if not os.path.exists(path+'\\results\\'+brand):os.mkdir(path+'\\results\\'+brand)now_path=path+'\\results\\'+brand+'\\'+datas[j][4]shutil.copy(ori_path,now_path)breakif brand=='其他':if not os.path.exists(path+'\\results\\未知'):os.mkdir(path+'\\results\\未知')now_path=path+'\\results\\未知\\'+datas[j][4]shutil.copy(ori_path,now_path)
  • 运行结果

由于调用次数限制,我跑了480张图片,仅有几张无法识别,识别率还可以。至于准确率,我简单翻看了一些目录下的照片,虽然有个别车型识别错误,但大多还可以的。这里仅展示已经自动分类好的文件。

  • 结语

由于时间仓促,代码还没整理好。另外其他细节(如存储车型brands数组,获得shelve数据、根文件夹下子文件下有哪些等)这里就不一一展示了。如果实在需要,过段时间我发个Github 链接。

车型识别API调用与批量分类车辆图片相关推荐

  1. 车型识别API调用对比

    一.艾科瑞特API 地址:https://market.aliyun.com/products/57124001/cmapi032754.html 价格:较贵2008元/10000次,车型识别近期更新 ...

  2. 运用百度智能云车型识别API分析具体车型

    运用百度智能云车型识别API分析具体车型 一.申请Key 百度AI开放平台图像识别_API Key与Secret Key 二.获取access_token 我这里运用"黑魔法"进行 ...

  3. php识别名片,基于php的聚合数据名片识别api调用实例

    基于php的聚合数据名片识别api调用实例 本代码是基于聚合数据名片识别api实现名片识别功能,使用前你需要通过http://www.doczj.com/doc/f71face3bed5b9f3f90 ...

  4. 百度人脸识别API调用实现

    目录 一. 准备工作 A. 应用创建 1. 百度用户创建登录 2. 进入人脸识别服务 3. 应用创建 4.应用查看 B. 开发准备 1. 工具类下载 2. maven依赖注入 二. 调用实现 A. 看 ...

  5. 百度文字识别API调用

    百度文字识别API调用 官网获取api和secret key 调用API接口 官网获取api和secret key 百度AI智能平台通用文字识别:https://ai.baidu.com/tech/o ...

  6. Python调用百度手写识别API,将手写笔记图片转换成文字

    事件起因 家里人有十几页手写笔记想要转成文字格式.网上搜了一下发现了百度有手写文字图片识别的api,于是拿来试试. 虽然最终效果并不理想,还是当做一次测试记录一下. 手里有手写笔记想要识别一下,也可以 ...

  7. 百度在线人脸识别API调用教程

    目录 API调用 第一步 获取access token 第二步 访问API 最后 API调用 百度API调用主要是分为两步 第一步:通过AK和SK获取 access token 第二步:使用夹带acc ...

  8. 百度人脸识别API调用(人脸搜索)Java实现

    调用百度的AI平台接口,做一个人脸搜索的例子. 搜索效果展示 首先展示一下搜索效果 {"error_code":0,"error_msg":"SUCC ...

  9. 华为云语音识别:一句话识别API调用

    最近想做一个智能硬件(实现单片机使用W600连接上位机或直接实现语音识别) 查看了华为云的语音交互服务SIS,有两种:录音文件识别以及一句话语音识别 名称 功能 录音文件识别 可以实现5小时以内的音频 ...

最新文章

  1. IDEA快捷键及基本使用方法
  2. 网站SEO优化工作主要包括哪些内容?
  3. CSS3之background的调整和增加的属性
  4. C#基础(四)--值类型和引用类型,栈和堆的含义
  5. 用户扫描二维码进入公众号后自动发送指定消息_wetool的封杀、企业微信的崛起,我们要怎么利用企业微信进行用户增长?...
  6. mod_shout 模块
  7. 2021海口高考调研成绩查询,2021海口市地区高考成绩排名查询,海口市高考各高中成绩喜报榜单...
  8. 汉化风暴 python_手机端强大的汉化风暴工具 可汉化软件
  9. sqlserver2017不允许保存更改
  10. Spring Boot内嵌的tomcat日志
  11. 莫斯密码加密与解密--python加密篇
  12. clojure-jack-in : error in process filter: open-network-stream: make client process failed: Connecti
  13. 电脑手机css自适应,怎么把一个pc页面自适应手机屏幕
  14. 计算机中 空间局限性(Spatial Locality)与时间局限性(Temporal Locality)
  15. Python中的if __name__ == ‘__main__‘什么意思?
  16. uni-app学习 form表单(五)
  17. 跨专业考计算机研究生有专业限制吗,跨专业考计算机研究生难不难
  18. 数据结构与算法之线性表(超详细顺序表、链表)
  19. SAP FICO模块-财务账期的打开和关闭
  20. java 操作 word 表格和样式_java 处理word文档 (含图片,表格内容)

热门文章

  1. 计算机组成:cpu的功能和组成
  2. netstat,ss,nc ,wget,dig
  3. CSDN博文周刊第一期 | 2018年总结:向死而生,为爱而活——忆编程青椒的戎马岁月
  4. 使用神经网络识别手写数字
  5. MySQL:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (gbk_chinese_ci,IMPLICIT) for operat
  6. pdf书籍规范页码编排
  7. 当前主流服务器型号,当前服务器的主流品牌 型号 配置
  8. python求输入某年某月某日,判断这一天是这一年的第几天
  9. C语言——医院挂号系统(队列)
  10. android调用系统相机返回图片模糊