目录

1 Caffe数据集txt文本制作

2 jpg图像完整性检测

3 图像随机移动复制

4 图像尺寸统计

5 图像名字后缀重命名

6 两文件夹文件比对

7 绘制caffe模型的ROC曲线(二分类)


对于机器学习、图像处理有时要对图像数据进行分割处理。用python写了一些常用小工具代码。

1 Caffe数据集txt文本制作

很多时候要建立如下数据集txt文本,类似图片所示(图片网上找的)

生成代码如下:

"""
caffe数据集txt文本制作
"""import os#文件保存路径
f =open(r'd:/val.txt',"w")
path = 'D:/smoke_datasets/val/0'
for filename in os.listdir(path) :#数据标签count = 0ff = filename+" "+ "0"+"\n"f.write(ff)
print('{} class: {}'.format(filename,count))path = 'D:/smoke_datasets/val/1'
for filename in os.listdir(path) :#数据标签count = 1ff = filename+" "+ "1"+"\n"f.write(ff)
print('{} class: {}'.format(filename,count))f.close()

2 jpg图像完整性检测

有时爬虫所获得图像可能不完整,需要进行图像完整性检测。代码如下:

"""
jpg图像完整性检测
"""from skimage import io
from PIL import Image
import numpy as np
import osdef is_valid_jpg(path):  #判断JPG文件下载是否完整 if path.split('.')[-1].lower() == 'jpg':  with open(path, 'rb') as fr:  fr.seek(-2, 2)#判定jpg是否包含结束字段return fr.read() == '\xff\xd9' else:  return False#文件头的方式
def is_jpg(path):data = open(path,'rb').read(11)if data[:4] != '\xff\xd8\xff\xe0' and data[:4]!='\xff\xd8\xff\xe1': return Falseif data[6:] != 'JFIF\0' and data[6:] != 'Exif\0': return Falsereturn Truedef check_pic_PIL(path):try:Image.open(path).load()Image.open(path).verify()except:return Falsetry:img = Image.open(path)img = np.array(img, dtype=np.float32)except:return Falseif len(img.shape)!=3:return Falsereturn Truedef check_pic_skimage(path):try:img = io.imread(path)except:return Falsetry:img = np.array(img, dtype=np.float32)except:return Falseif len(img.shape)!=3:return Falsereturn Trueif __name__ == '__main__':#结果f =open(r'd:/state.txt',"w")#路径paths = ["d:/train"]for path in paths:print('the current path is : {}\n'.format(path))#path = "D:/smoke_data/datas/deal/smoke_auto_aug"#文件头检测#精细检测for filename in os.listdir(path):#print('current jpg is {}'.format(path+"/"+filename))#文件头检测status_valid_jpg = is_valid_jpg(path+"/"+filename)status_jpg = is_jpg(path+"/"+filename)if( status_valid_jpg == False or status_jpg == False):ff = filename+"\n"f.write(ff)print('{} \n'.format(path+"/"+filename))continue#状态检测status_PIL = check_pic_PIL(path+"/"+filename)status_skimage = check_pic_skimage(path+"/"+filename)if (status_PIL == False or status_skimage == False):ff = filename+"\n"f.write(ff)print("=" * 50)     print('{} \n'.format(path+"/"+filename))print("=" * 50)    #分割线    print("*" * 50)           print("end!")f.close()

3 图像随机移动复制

对于windows系统,移动太慢,也费时。linux也差不多。通过python可以快速移动/复制大量图像,代码如下:

"""
图像随机移动复制
"""import os, random, shutildef moveFile(fileDir, tarDir, picknumber):#取图像原始路径pathDir = os.listdir(fileDir)filenumber = len(pathDir)if filenumber < picknumber:picknumber = filenumber#抽取一定比例sample = random.sample(pathDir, picknumber)print(sample)for name in sample:shutil.move(fileDir+name, tarDir+name)returndef copyFile(fileDir, tarDir, picknumber):#取图像原始路径pathDir = os.listdir(fileDir)filenumber = len(pathDir)if filenumber < picknumber:picknumber = filenumber#抽取一定比例sample = random.sample(pathDir, picknumber)print(sample)for name in sample:shutil.copy(fileDir+name, tarDir+name)returnif __name__ == '__main__':#图像路径fileDir = 'D:/datasets/train/'#移动路径tarDir = 'D:/datasets/move/'#从fileDir随机移动500张图像到tarDir文件夹moveFile(fileDir, tarDir, 500)#从fileDir随机复制500张图像到tarDir文件夹copyFile(fileDir, tarDir, 500)

4 图像尺寸统计

主要是统计图像尺寸,可以添加过滤条件,滤掉尺寸过小或者过大的图像。代码如下:

"""
统计数据集下图像尺寸
"""import os
from PIL import Image
import pandas as pd#数据集路径
path = 'D:/test/'
#存入列表
f = os.listdir(path)count = 0df = pd.DataFrame(columns=['width','height'])
for i in f:#旧文件名oldname=path+f[count]im = Image.open(oldname)df.loc[count,'width']=im.widthdf.loc[count,'height']=im.heightprint(oldname)count += 1#保存结果
df.to_csv('test.csv')
f.close()

5 图像名字后缀重命名

对图像的名字以及后缀名重新命名,代码如下:

"""
图像名称后缀重命名
"""import os#图像路径
path = 'D:/train/'
#保存路径
save_path = 'D:/result/'
#存入列表
f = os.listdir(path)count = 0for i in f:#旧文件名oldname=path+f[count]print(oldname)#新文件名newname=save_path+'smoke.'+str(count)+'.jpg'os.rename(oldname,newname)count += 1

6 两文件夹文件比对

判断两个文件夹里面文件的文件名是不是相互对应,并移动文件名不对应的文件

# -*- coding: utf-8 -*-
"""
判断两个文件夹里面文件的文件名是不是相互对应,并移动不对应的文件
"""import os,shutil# 文件少的文件夹路径  传入存储的list
def listdir(path, list_name):for file in os.listdir(path):  list_name.append(file.split('.')[0])  def del_dir(checkpath,input_name,savepath):if not os.path.exists(savepath):os.makedirs(savepath)                for file in os.listdir(checkpath):  check_name=file.split('.')[0]if check_name in input_name:print('{} 在列表中'.format(check_name))#不在列表中,移动文件else:srcfile=os.path.join(checkpath, file)shutil.move(srcfile,savepath) name=[]
#保存路径
listdir('./2',name)
del_dir('./1',name,'./3')

7 绘制caffe模型的ROC曲线(二分类)

主要原理为通过OpenCV DNN 调用caffe模型,其他模型一样套路。然后对每张图像进行检测,保存该图像真实标签,以及该标签分类的模型预测概率。调用sklearn绘制ROC,并计算AUC值。通过约登指数获得ROC曲线中最佳阈值。最后通过matplotlib绘图。约登指数为TPR-FPR或者TPR+TNR-1。具体ROC原理可参考:

https://www.jianshu.com/p/c61ae11cc5f6

https://www.jianshu.com/p/82903edb58dc

https://blog.csdn.net/u014264373/article/details/80487766

'''
opencv调用caffe并计算roc
'''
import numpy as np
import matplotlib.pyplot as plt
import cv2
import os
from sklearn import metrics# 真实图像标签为0的图像路径
imagePath_0 = ['0']
# 真实图像标签为1的图像路径
imagePath_1 = ['1']# 正类标签
poslabel = 1
# 模型路径
prototxtFile = 'deploy_227.prototxt'
modelFile = 'model_227.caffemodel'# 真实分类结果
trueResult = []
# 检测结果
detectProbs = []# 图像检测def detectCaffe(srcImg):detectImg = srcImg.copy()blob = cv2.dnn.blobFromImage(detectImg, 1, (227, 227), (92.713, 106.446, 118.115), swapRB=False)net = cv2.dnn.readNetFromCaffe(prototxtFile, modelFile)net.setInput(blob)detections = net.forward()# 分类结果order = detections[0].argmax()prob = detections[0].max()#print('the predict class is:',order)#print('the positive class prob is: ', prob)# 返回分类结果和概率return order, prob# 图像检测def imageDetect(detectImagePath, trueLabel):for imageFileName in os.listdir(detectImagePath):imageFilePath = os.path.join(detectImagePath, imageFileName)print("current detect image is: ", imageFileName)srcImg = cv2.imread(imageFilePath)if srcImg is None:print("error image is: ", imageFilePath)continuedetectOrder, detectProb = detectCaffe(srcImg)trueResult.append(trueLabel)# 如果正样本编号和检测结果标签一致直接保存分类概率if detectOrder == poslabel:detectProbs.append(detectProb)# 如果不一致保存正样本的分类概率else:detectProbs.append(1-detectProb)# 画ROC图,输入真实标签,正样本模型分类概率,正样本编号
def drawROC(trueResult, detectProbs, poslabel):fpr, tpr, thresholds = metrics.roc_curve(trueResult, detectProbs, pos_label=poslabel)#auc = metrics.roc_auc_score(y, scores)roc_auc = metrics.auc(fpr, tpr)# 计算约登指数Youden Index(TPR-FPR或者TPR+TNR-1)tpr_fpr = list(tpr-fpr)bestIndex = tpr_fpr.index(max(tpr_fpr))print("约登指数为{}".format(max(tpr_fpr)))tprBest = tpr[bestIndex]fprBest = fpr[bestIndex]thresholdsBest = thresholds[bestIndex]print("最佳约登指数阈值为:", thresholdsBest)# 假正率为横坐标,真正率为纵坐标做曲线plt.plot(fpr, tpr, color='darkorange',label='ROC curve (area = %0.2f)' % roc_auc)plt.plot([0, 1], [0, 1], color='navy', linestyle='--')#plt.xlim([0.0, 1.0])#plt.ylim([0.0, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('Receiver operating characteristic example')plt.legend(loc="lower right")# 画出约登指数最大值plt.plot(fprBest, tprBest, "ro")plt.savefig("roc.png", dpi=300)plt.show()return fpr, tpr, thresholds, bestIndexdef main():# 0标签图像遍历for imagePath in imagePath_0:imageDetect(imagePath, 0)for imagePath in imagePath_1:imageDetect(imagePath, 1)# poslabel正例标签fpr, tpr, thresholds, bestIndex = drawROC(trueResult, detectProbs, poslabel)np.save('fpr.npy', fpr)np.save('tpr.npy', tpr)np.save('thresholds', thresholds)return fpr, tpr, thresholdsif __name__ == '__main__':fpr, tpr, thresholds = main()

结果如图所示:

[常用工具]深度学习Caffe处理工具相关推荐

  1. 深度学习数据集标注工具、图像语料数据库等资源

    NLP+VS︱深度学习数据集标注工具.图像语料数据库.实验室搜索ing... 2017年02月07日 12:12:01 阅读数:27032 ~~因为不太会使用opencv.matlab工具,所以在找一 ...

  2. PyTorch深度学习训练可视化工具tensorboardX

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 之前笔者提到了PyTorch的专属可视化工具visdom,参看Py ...

  3. wandb(wb)(weights and biases): 深度学习轻量级可视化工具入门教程

    参考文章:wandb: 深度学习轻量级可视化工具入门教程 这wandb有点蛋疼啊,说登录https://wandb.ai/authorize?signup=true获取API KEY,但貌似要梯子才能 ...

  4. 【深度学习】PyTorch深度学习训练可视化工具visdom

    PyTorch Author:louwill Machine Learning Lab 在进行深度学习实验时,能够可视化地对训练过程和结果进行展示是非常有必要的.除了Torch版本的TensorBoa ...

  5. wandb: 深度学习轻量级可视化工具入门教程

    本文,就来给大家介绍一款新型的机器学习可视化工具,能够让人工智能研发过程变得更加简单明了. wandb: 深度学习轻量级可视化工具入门教程 引言 wandb 验证数据可视化 自然语言处理 重要工具 极 ...

  6. 深度学习半自动标注_时下流行的深度学习数据标注工具

    时下流行的深度学习数据标注工具 迷若烟雨 2018-09-04 16:36:00 15820 收藏 33 分类专栏: 深度学习 版权 本文将标注工具适用的最佳运行环境分成了三类. 跨平台 https: ...

  7. Wandb(Weights Biases) 深度学习轻量级可视化工具(Sweeps Artifacts)

    wandb是Weights & Biases的缩写,是类似TensorBoard, visdom的一款可视化工具 是属于Python的,不是Pytorch的 wandb是最大的特点是能自动上传 ...

  8. 深度学习图像标注工具汇总

    深度学习图像标注工具汇总 原文地址: https://blog.csdn.net/chaipp0607/article/details/79036312 对于监督学习算法而言,数据决定了任务的上限,而 ...

  9. 36.Oracle深度学习笔记——SLOB 工具使用

    36.Oracle深度学习笔记--SLOB 工具使用 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50859152 SLOB全 ...

  10. 36 Oracle深度学习笔记 SLOB 工具使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 36.O ...

最新文章

  1. HDU 2079 选课时间
  2. Qt Creator用定位器搜索
  3. [scikit-learn 机器学习] 4. 特征提取
  4. 数据分析必备:掌握这个R语言基础包1%的功能,你就很牛了
  5. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<网关篇>
  6. latex中括号大小控制 [转]
  7. C语言——指针篇(三)数组的下标引用和指针访问
  8. 小结SpringMVC(三)
  9. Android存储(1)-- 你还在乱用Android存储嘛!!!
  10. JavaScript练习
  11. 通过云服务器实现淘宝京东抢拍器
  12. vim 设置文件类型_如何手动设置Vim的文件类型?
  13. 互联网运营起步 |《从零开始做运营》读书笔记
  14. VS解决方案文件格式说明
  15. 输入某年某月然后输出当前月份的天数
  16. Android 扫码登录
  17. c++ 求四边形面积和周长_面向对象c++——三角形求周长和面积
  18. 第二周:PSP进度条
  19. spark之kryo 序列化
  20. Latex 篇章结构 特殊字符

热门文章

  1. 以前进行的程序安装创建了挂起的文件操作(SqlServer2000或SqlServer 2000 SP4补丁安装) .
  2. (转)简体繁体转换代码(Big5-GB | GBK简体-GBK繁体)
  3. 使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题
  4. 2021年电工(初级)考试资料及电工(初级)考试技巧
  5. 链表排序python
  6. python判断一个数是否为质数(素数)
  7. win10配置JDK环境变量
  8. 定积分证明题例题_数列极限求法十五种(25个例题+推文送给微积分和数学分析同学)...
  9. 扩展卡尔曼滤波算法——基本原理及举例(python实现radar数据滤波)
  10. ZYNQ平台Linux4.6内核蓝牙音频