基于OpenCV与 ImageAI 的动漫人物识别

在从二次元毕业之前,我们经常都会看到"这个人物是谁?哪个番的?"之类的问题,在学习图像识别的过程中,实现了一个动漫人物的识别的例子,直接使用现有的两个成熟的工具OpenCV与 ImageAI通过人物头像来进行动漫人物的识别,作为一个入门的例子。而在实际情况下,动漫人物时有撞脸的情况发生,这个时候还需要通过服饰,甚至结合知识图谱关联图像中出现的其他角色来进行更加精确的识别。下面直接上demo:

一、获取图像中的人物头像:

这里首先使用fate的一张图像作为例子,代码如下:

1、引入必要的库:

import cv2
import sys
import os.path

2、使用opencv进行动漫人物头像的提取,这里采用某宅界前辈提供的lbpcascade_animeface.xml:

    cascade = cv2.CascadeClassifier('../lbpcascade_animeface.xml') #引入xml
    image = cv2.imread('timg8.jpg', cv2.IMREAD_COLOR) #读入一幅彩色图片
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #色彩空间转换
    gray = cv2.equalizeHist(gray)#图像直方图均衡化
    
    faces = cascade.detectMultiScale(gray,
                                     # detector options
                                     scaleFactor = 1.1,
                                     minNeighbors = 5,
                                     minSize = (24, 24))

3、展示人物头像提取的结果,并把提取的头像切割下来保存在faces文件中,为后续的识别做准备:

    i = 0
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

        face = image[y: y+h, x:x+w, :]
        face = cv2.resize(face,(96,96))
        save_filename = '%s_%d.png' % (os.path.basename(filename).split('.')[0],i)
        cv2.imwrite("faces/"+save_filename,face)
        i = i + 1

    cv2.imshow("AnimeFaceDetect", image)
    cv2.waitKey(0)
    cv2.imwrite("out2.png", image)

头像识别的结果:

faces文件中保持的头像:

二、使用ImageAI 进行模型的训练,由于本机性能有限,这里只做实例,对四个人物进行训练,每个人物训练集15张,测试集5张(实际使用中请使用高性能的机器进行,图像的数量也建议在400-600张左右,图像质量较好):

1、准备训练集和测试集,这里对四个角色进行训练:

2、训练代码如下:

from imageai.Prediction.Custom import ModelTraining
model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("pg") #训练的目录
model_trainer.trainModel(num_objects=4, num_experiments=50, enhance_data=True, batch_size=5, show_network_summary=True)

使用imageai工具,代码非常精简。通过ResNet模型进行训练,训练对象为4个,训练50次,每批次训练5张,生成副本并在控制台打印训练过程。

3、训练结果:

训练结果包括json和models。其中json表面了对象对象的索引值。models中是每次训练的结果,其中ex-后面的是训练的次数,0.450000是此次训练在测试集上的精准度,可以看到训练20次精准度是0.45(最大是1).

4、通过训练的结果在识别提取的头像:

from imageai.Prediction.Custom import CustomImagePrediction
import os
execution_path = os.getcwd()


prediction = CustomImagePrediction()
prediction.setModelTypeAsResNet() #设置ResNet模型
prediction.setModelPath(os.path.join(execution_path, "pg/models/model_ex-040_acc-0.800000.h5"))
prediction.setJsonPath(os.path.join(execution_path, "pg/json/model_class.json"))

prediction.loadModel(num_objects=4)

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "timg8_2.png"), result_count=1)

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

图像预测的代码也比较简洁,设置使用ResNet模型,采用的json和h5文件(训练结果),要预测的图像和预测的结果数量,最后打印出预测的结果:

最终预测是saber的概率是85%。

以上demo采用现有的库,实现过程也比较简单。但是在实际使用中还需要注意很多影响训练和预测结果的问题,比如图像的质量,训练的次数等等。可以看到本实例采用的是model_ex-040_acc-0.800000.h5,也即是说在测试集上训练的模型的准确率也只有80%(5张正确4张),效果不是很佳。同时,为了提高提取的人物头像的质量,还可以使用图像超分辨率进行处理,提升图像细节。

  • 51
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
好的,我了解您的问题。基于OpenCV和PyQt的火焰识别程序可以通过以下步骤实现: 1. 安装OpenCV和PyQt库 您需要在您的计算机上安装OpenCV和PyQt库。您可以使用以下命令在终端中安装它们: ``` pip install opencv-python pip install pyqt5 ``` 2. 创建PyQt界面 使用PyQt可以轻松创建一个用户界面。您可以使用Qt Designer创建一个界面,然后使用PyQt加载它。您可以在此处了解有关如何使用Qt Designer的更多信息:https://doc.qt.io/qt-5/qtdesigner-manual.html。 3. 读取视频并进行火焰检测 使用OpenCV,您可以读取摄像头或视频文件。您可以使用以下代码读取视频文件: ``` cap = cv2.VideoCapture('video.mp4') while True: ret, frame = cap.read() if not ret: break # 进行火焰检测 ``` 然后,您可以使用OpenCV的火焰检测算法来检测视频中的火焰。例如,您可以使用以下代码: ``` gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (11, 11), 0) edged = cv2.Canny(blurred, 50, 150) (cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in cnts: # 计算火焰区域 ``` 4. 在PyQt界面上显示结果 最后,您可以将检测到的火焰区域绘制在PyQt界面上。您可以使用以下代码在PyQt界面上显示帧: ``` pixmap = QPixmap.fromImage(QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped()) self.label.setPixmap(pixmap) ``` 您可以将此代码放置在适当的位置,例如PyQt的定时器中,以便在每个时间间隔内更新帧。 这些步骤可以帮助您创建一个基于OpenCV和PyQt的火焰识别程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值