zoukankan      html  css  js  c++  java
  • 图片分类

    # coding: utf-8
    import sys
    import os
    import dlib
    import glob
    import cv2
    import tkinter
    
    # root = tkinter.Tk()
    # root.minsize(400, 400)
    # menubar = tkinter.Menu(root)
    # filemenu = tkinter.Menu(menubar, tearoff=0)
    # menubar.add_cascade(label='命令', menu=filemenu)
    # menubar.add_cascade(label='工具')
    # menubar.add_cascade(label='收藏夹')
    # menubar.add_cascade(label='选项')
    # menubar.add_cascade(label='帮助')
    # root.config(menu=menubar)
    def index():
        # 指定路径
        current_path = os.getcwd()
        model_path = current_path + '\model\'
        shape_predictor_model = model_path + 'shape_predictor_5_face_landmarks.dat'
        face_rec_model = model_path + 'dlib_face_recognition_resnet_model_v1.dat'
        face_folder = current_path + '\faces\'
        output_folder = current_path + '\output\'
    
        # 导入模型
        detector = dlib.get_frontal_face_detector()
        shape_detector = dlib.shape_predictor(shape_predictor_model)
        face_recognizer = dlib.face_recognition_model_v1(face_rec_model)
    
        # 为后面操作方便,建了几个列表
        descriptors = []
        images = []
        # 遍历faces文件夹中所有的图片
        for f in glob.glob(os.path.join(face_folder, "*.jpg")):
            print('处理文件:{}'.format(f))
            # 读取图片
            img = cv2.imread(f)
            # 转换到rgb颜色空间
            img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
            # 检测人脸
            dets = detector(img2, 1)
            print("检测到的人脸数: {}".format(len(dets)))
    
            # 遍历所有的人脸
            for index, face in enumerate(dets):
                # 检测人脸特征点
                shape = shape_detector(img2, face)
                # 投影到128D
                face_descriptor = face_recognizer.compute_face_descriptor(img2, shape)
    
                # 保存相关信息
                descriptors.append(face_descriptor)
                images.append((img2, shape))
    
        # 聚类
        labels = dlib.chinese_whispers_clustering(descriptors, 0.5)
        #labels
        print("标签: {}".format(labels))
        num_classes = len(set(labels))
        #Number of clusters
        print("分类数: {}".format(num_classes))
    
        # 为了方便操作,用字典类型保存
        face_dict = {}
        for i in range(num_classes):
            face_dict[i] = []
        #print (face_dict)
        for i in range(len(labels)):
            face_dict[labels[i]].append(images[i])
    
        #print (face_dict.keys())
        # 遍历字典,保存结果
        for key in face_dict.keys():
            file_dir = os.path.join(output_folder, str(key))
            if not os.path.isdir(file_dir):
                os.makedirs(file_dir)
    
            for index, (image, shape) in enumerate(face_dict[key]):
                file_path = os.path.join(file_dir, 'face_' + str(index))
                print("图片位置:",file_path)
                dlib.save_face_chip(image, shape, file_path)
        
    # button1 =tkinter.Button(text="图片分类",command=index)
    # button1.place(x=250,y=150,relheight=0.1)
    # label1 =tkinter.Label()
    # label1.place()
    #
    # root.mainloop()
    
    if __name__ == '__main__':
    #def main():
        while True:
            print("")
            print("="*40)
            print("1.faces文件夹是存放分类图片的位置")
            print("2.output文件夹是整理后存放图片的位置")
            print("3.退出请输入:quit")
            print("="*40)
            print("")
            print("是否进行分类?")
            a = input("请输入Y进行确认: ")
            if a == "Y" or a == "y":
                index()
            elif a =="quit":
                break
            else:
                print("请重新输入")
                
            
  • 相关阅读:
    【如何在mysql 官网下载最新版本mysql 数据库】
    【17-类加载与反射】
    【16-网络编程】
    【14-输入/输出】
    【13-Annotation】
    【12-JDBC编程】
    C# SqlHelper类的数据库操作
    C# DateTime与时间戳转换
    C#递归方法遍历目录及子目录
    C# SaveFileDialog的用法
  • 原文地址:https://www.cnblogs.com/ssxblog/p/10674212.html
Copyright © 2011-2022 走看看