Как использовать readNet (или readFromDarknet) вместо readNetFromCaffe? - PullRequest
0 голосов
/ 06 ноября 2018

Я обнаружил объект с помощью opencv, загрузив предварительно обученную модель SSD MobileNet. из этого поста . Он читает видео и обнаруживает объекты без каких-либо проблем. Но я бы хотел использовать readNet (или readFromDarknet) вместо readNetFromCaffe

net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

потому что у меня есть предварительно обученные веса и файл cfg мои собственные объекты только в среде Darknet. Поэтому я просто изменил readNetFromCaffe на readNet в над постом и получил ошибку:

Traceback (most recent call last):
  File "people_counter.py", line 124, in <module>
    for i in np.arange(0, detections.shape[2]):
IndexError: tuple index out of range

Здесь detections - это вывод

blob = cv2.dnn.blobFromImage(frame, 1.0/255.0, (416, 416), True, crop=False)
net.setInput(blob)
detections = net.forward()

Его форма (1, 1, 100, 7) кортеж (при использовании readNetFromCaffe).

Я ожидал, что это не сработает, если поменять модель. Затем я решил поискать код детектора объектов, где использовался readNet, и нашел его здесь . Я прочитал код и нашел следующие строки:

blob = cv2.dnn.blobFromImage(image, scale, (416,416), (0,0,0), True, crop=False)
net.setInput(blob)
outs = net.forward(get_output_layers(net))

Здесь форма outs имеет вид (1, 845, 6) список . Но для того, чтобы я мог использовать его сразу ( здесь ), outs должен быть такого же размера с detections. Я подошел к этой части и понятия не имею, как мне поступить.

Если что-то не понятно, мне просто нужна помощь, чтобы использовать readNet (или readFromDarknet) вместо readNetFromCaffe в в этом посте

1 Ответ

0 голосов
/ 14 ноября 2018

Если мы внимательно посмотрим на код , то увидим, что все зависит от выходных данных detections, строка 121, и мы должны настроить его выходные данные, чтобы они соответствовали outs из это , строка 63. Потратив почти сутки, я пришел к разумному (не идеальному) решению. По сути, это все о выходных двоичных объектах readNetFromCaffe и readFromDarknet, потому что они выводят BLOB-объекты в форме 1x1xNx7 и NxC соответственно. Здесь N s - количество обнаружений, но с векторами разных размеров, а именно N в 1x1xNx7 - это количество обнаружений, а каждое обнаружение - это вектор значений. [batchId, classId, достоверность, слева, сверху, справа, снизу] и N в NxC число обнаруженные объекты, а C - это число классов + 4, где первые 4 числа: [center_x, center_y, width, height] . Проанализировав их, мы можем заменить (124-130 строк)

for i in np.arange(0, detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence > args["confidence"]:
        idx = int(detections[0, 0, i, 1])
        if CLASSES[idx] != "person":
            continue
        box = detections[0, 0, i, 3:7] * np.array([W, H, W, H])
        (startX, startY, endX, endY) = box.astype("int")

с эквивалентными строками

    for i in np.arange(0, detections.shape[0]):
        scores = detections[i][5:]
        classId = np.argmax(scores)
        confidence = scores[classId]
        if confidence > args["confidence"]:
            idx = int(classId)
            if CLASSES[idx] != "person":
                continue

            center_x = int(detections[i][0] * 416)    
            center_y = int(detections[i][1] * 416)    
            width = int(detections[i][2] * 416)        
            height = int(detections[i][3] * 416)     
            left = int(center_x - width / 2)         
            top = int(center_y - height / 2)
            right = width + left - 1
            bottom = height + top - 1

            box = [left, top, width, height]
            (startX, startY, endX, endY) = box

Таким образом, мы можем отслеживать класс "персона", используя веса cfg и Darknet и подсчитывать их вверх / вниз с помощью линии визуализации.

Опять же, могут быть и другие, более простые способы отслеживания обнаружений файла весов Darknet, но это работает для этого конкретного случая.

Ссылка: больше о выводе BLOB-объектов readNetFromCaffe и readFromDarknet

...