百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

[常用工具] 深度学习Caffe处理工具

toyiye 2024-09-01 05:43 3 浏览 0 评论

深度学习Caffe处理工具

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

1 Caffe数据集txt文本制作

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

添加图片注释,不超过 140 字(可选)

生成代码如下:


"""
caffe数据集txt文本制作
"""

import os

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

   
path = 'D:/smoke_datasets/val/1'
for filename in os.listdir(path) :
    #数据标签
    count = 1
    ff = 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 os


def 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 False
    if data[6:] != 'JFIF\0' and data[6:] != 'Exif\0': 
        return False
    return True


def check_pic_PIL(path):
    try:
        Image.open(path).load()
        Image.open(path).verify()
    except:
        return False
    
    try:
        img = Image.open(path)
        img = np.array(img, dtype=np.float32)
    except:
            return False
    
    if len(img.shape)!=3:
        return False
    
    return True
    
def check_pic_skimage(path):
    try:
        img = io.imread(path)
    except:
        return False
    
    try:
        img = np.array(img, dtype=np.float32)
    except:
        return False
    
    if len(img.shape)!=3:
        return False
    
    return True


if __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, shutil

def 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)
    return

def 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)
    return

if __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 = 0

df = pd.DataFrame(columns=['width','height'])
for i in f:
    #旧文件名
    oldname=path+f[count]
    im = Image.open(oldname)
    df.loc[count,'width']=im.width
    df.loc[count,'height']=im.height
    print(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 = 0

for 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)
            continue
        detectOrder, 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, bestIndex


def 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, thresholds


if __name__ == '__main__':
    fpr, tpr, thresholds = main()

结果如图所示:

添加图片注释,不超过 140 字(可选)


引用链接

[1] https://www.jianshu.com/p/c61ae11cc5f6 : https://www.jianshu.com/p/c61ae11cc5f6 [2] https://www.jianshu.com/p/82903edb58dc : https://www.jianshu.com/p/82903edb58dc [3] https://blog.csdn.net/u014264373/article/details/80487766: https://blog.csdn.net/u014264373/article/details/80487766

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码