如何在Python中使用OpenCV改善Caffe的性能? [英] How to improve the performance of Caffe with OpenCV in Python?

查看:146
本文介绍了如何在Python中使用OpenCV改善Caffe的性能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在按照本教程使用OpenCV和深度学习进行面部检测,以使用OpenCV3,Caffe和Python3创建和面部检测软件. 这是使用的代码:

    # USAGE
    # python detect_faces.py --image rooster.jpg --prototxt deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel

# import the necessary packages
import numpy as np
import argparse
import cv2

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
                help="path to input image")
ap.add_argument("-p", "--prototxt", required=True,
                help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
                help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.40,
                help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# load the input image and construct an input blob for the image
# by resizing to a fixed 300x300 pixels and then normalizing it
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
print(h)
dimension_x =h
dimension_y=h
print(image.shape[:2])
blob = cv2.dnn.blobFromImage(cv2.resize(image, (dimension_x, dimension_y)), 1.0, (dimension_x, dimension_y), (104.0, 177.0, 123.0))
# pass the blob through the network and obtain the detections and
# predictions
print("[INFO] computing object detections...")
net.setInput(blob)
detections = net.forward()

print(detections)

# loop over the detections
for i in range(0, detections.shape[2]):

    # extract the confidence (i.e., probability) associated with the
    # prediction
    confidence = detections[0, 0, i, 2]

    # filter out weak detections by ensuring the `confidence` is
    # greater than the minimum confidence
    if confidence > args["confidence"]:
        # compute the (x, y)-coordinates of the bounding box for the
        # object
        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
        (startX, startY, endX, endY) = box.astype("int")
        print(confidence, startX, startY, endX, endY )
        print(box)
        # draw the bounding box of the face along with the associated
        # probability
        text = "{:.2f}%".format(confidence * 100)
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
        cv2.putText(image, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

print(type(image))
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)

当我使用以下命令从命令行运行代码时:

python detect_faces.py  --prototxt  deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel --confidence=0.45 --image 14.jpg

我得到此结果 * 来源 *

结果是相当不错的,但是我们注意到在图片的最左下角,我画了一个蓝色圆圈,表示该程序两次检测到女孩的脸.第一次检测是好的,但是第二次却不是! 我在网上搜索了一种给出模型/程序反馈的方法,以便它可以得知检测到的对象(由蓝色圆圈包围并且具有51.11%的精度)不是人脸.因此,可以避免将其作为人脸发回! /p>

所以我的问题是,我该如何微调所用的Caffe模型以排除被检测为未来面部检测任务的面部的非面部对象?

我的问题不仅是关于这种特定情况,而且通常是针对所有被检测为人脸而不是人脸的对象.使用的图像只是一个例子.

解决方案

@Peshmerge,对于特定图像,可以更改输入Blob尺寸以获得最佳效果. 例如,900x900:

python object_detection.py --model opencv_face_detector.caffemodel --config opencv_face_detector.prototxt --mean 104 177 123  --thr 0.4 --input P1280471.JPG --width 900 --height 900

脚本: https://github.com/opencv/opencv/blob/master/samples/dnn/object_detection.py

I am following this tutorial Face detection with OpenCV and deep learning to create and face detection software using OpenCV3, Caffe and Python3. This is the used code:

    # USAGE
    # python detect_faces.py --image rooster.jpg --prototxt deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel

# import the necessary packages
import numpy as np
import argparse
import cv2

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
                help="path to input image")
ap.add_argument("-p", "--prototxt", required=True,
                help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
                help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.40,
                help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# load the input image and construct an input blob for the image
# by resizing to a fixed 300x300 pixels and then normalizing it
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
print(h)
dimension_x =h
dimension_y=h
print(image.shape[:2])
blob = cv2.dnn.blobFromImage(cv2.resize(image, (dimension_x, dimension_y)), 1.0, (dimension_x, dimension_y), (104.0, 177.0, 123.0))
# pass the blob through the network and obtain the detections and
# predictions
print("[INFO] computing object detections...")
net.setInput(blob)
detections = net.forward()

print(detections)

# loop over the detections
for i in range(0, detections.shape[2]):

    # extract the confidence (i.e., probability) associated with the
    # prediction
    confidence = detections[0, 0, i, 2]

    # filter out weak detections by ensuring the `confidence` is
    # greater than the minimum confidence
    if confidence > args["confidence"]:
        # compute the (x, y)-coordinates of the bounding box for the
        # object
        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
        (startX, startY, endX, endY) = box.astype("int")
        print(confidence, startX, startY, endX, endY )
        print(box)
        # draw the bounding box of the face along with the associated
        # probability
        text = "{:.2f}%".format(confidence * 100)
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
        cv2.putText(image, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

print(type(image))
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)

When I run the the code from the command line using this command:

python detect_faces.py  --prototxt  deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel --confidence=0.45 --image 14.jpg

I get this result * Source*

The result is quite good, but we notice at the most lower-left location on the picture where I drew a blue circle that the program has detected the face of the girl twice. The first detection is good, but the second one isn't! I have searched online for a method to give the model/program feedback so that it will learn that the detected object (surrounded by blue circle and has 51.11% accuracy isn't a face. So it can avoid giving it back as face!

So my question is, how can I finetune the used Caffe model to exclude non-face objects which are detected as faces for the future face detection tasks?

My question is not only about this specific situation, but in general for all object which are detected as faces while they are not. The used image is just an example.

解决方案

@Peshmerge, For a specific image you can vary input blob dimensions to achieve the best results. In example, 900x900:

python object_detection.py --model opencv_face_detector.caffemodel --config opencv_face_detector.prototxt --mean 104 177 123  --thr 0.4 --input P1280471.JPG --width 900 --height 900

a script: https://github.com/opencv/opencv/blob/master/samples/dnn/object_detection.py

这篇关于如何在Python中使用OpenCV改善Caffe的性能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆