Jump to content
Compvision.ru
Sign in to follow this  
cfif

caffe и real-time video

Recommended Posts

начал разбираться с caffe. разобрался с тем как распознавать объекты на изображениях. хочу перейти к распознаванию объектов на видео в реальном времени, но не пойму с какого бока к этому вопросу подходить. погуглил, на форуме поискал - не смог найти материалы(( как нужно скармливать видео натренированной модели? в параметрах коммандной строки указывается путь к картинке, а мне нужно указать видеопоток с web-камеры. Я так понимаю, что тут нужно оболочку на питоне писать? может есть уже готовые примеры? подскажите в какую степь гуглить - я в этом деле новичок))) пробовал разобраться с моделью SegNet - но в примерах у них идет обработка изображений((, а как туда видеопоток засунуть - тоже нет информации.

Share this post


Link to post
Share on other sites

Начните с этого примера: https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp там тоже изображения, но можно ведь просто подавать изображения с видео и классифицировать.

Share this post


Link to post
Share on other sites

разобрался я с программированием python и opencv. Там у меня получилось взять видеопоток от вебкамеры. Далее я запускаю для каждого кадра анализ. Получаю результат - вот только не могу разобраться в данных, которые присылает caffe.

Если я правильно понял, то запуск анализа происходит так: 

inputs = [caffe.io.load_image(args.input_file)] - загрузка файла картинки

после чего идёт такая строка

scores = classifier.predict(inputs, not args.center_only).flatten() - сам анализ изображения

и вот теперь не могу разобраться где и в каком виде хранит результат своей работы caffe. Я так понимаю, что должен получиться массив данных. там должны быть перечислены вероятности и названия найденного объекта. Ну и, наверное, координаты квадрата, где находится этот объект.

Подскажите пожалуйста структуру этого массива или где можно про это почитать.

Share this post


Link to post
Share on other sites

Вот нашел кусок одного проекта:

import numpy as np
import caffe
import cv2
import scipy.io as sio

caffe.set_mode_gpu()
caffe.set_device(1)

model = './model/det1.prototxt'
weights = './model/det1.caffemodel'

PNet = caffe.Net(model, weights, caffe.TEST) # create net and load weights

print ("\n\n----------------------------------------")
print ("------------- Network loaded -----------")
print ("----------------------------------------\n")

img = np.float32(cv2.imread( 'F:/ImagesForTest/test1.jpg' ))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

avg = np.array([127.5,127.5,127.5])
img = img - avg
img = img*0.0078125;
img = img.transpose((2,0,1)) 
img = img[None,:] # add singleton dimension

PNet.blobs['data'].reshape(1,3,img.shape[2],img.shape[3])
out = PNet.forward_all( data = img )

#sh1=PNet.blobs['conv1'].data.shape
#sh2=PNet.params['conv1'][0].data.shape
#sh3=PNet.params['conv1'][1].data.shape
#print PNet.params['PReLU1'][0].data.shape

cv2.imshow('out',out['prob1'][0][1])
cv2.waitKey()

Просто задаете какой блоб нужно прочитать ('prob1' в данном случае) и какой его слой.

Share this post


Link to post
Share on other sites

второй день воюю с этими блобами - не выходит каменный цветок((

хочу разобраться с моделью из примеров в caffe - где нужно распознать кота на картинке (модель - bvlc_reference_caffenet).

Кота он распознает - теперь нужно его в рамку обвести.

Сделал картинку структуры этой модели

caffenet.thumb.png.c6ed724ce5057c49e343cf60d1148280.png

 

теперь нужно выяснить в какой блоб она сохраняет данные о местоположении этого кота - я прав?

вот тут я и застрял. Полез в отладчик PyCharm чтобы просмотреть что хранится в переменных - не понял((

нашел в инете код, где выводится рамка (то что мне нужно) но повторить не получилось((( и модель из этого кода в инете не нашел, чтобы покопаться в кишках основательно.

вот такой код нашел: https://github.com/jssmile/Distance_Estimation/blob/master/caffe/examples/detect.py

# Forward pass.
  detections = net.forward()['detection_out']
   
  # Parse the outputs.
  det_label = detections[0,0,:,1]
  det_conf = detections[0,0,:,2]
  det_xmin = detections[0,0,:,3]
  det_ymin = detections[0,0,:,4]
  det_xmax = detections[0,0,:,5]
  det_ymax = detections[0,0,:,6]
   
  # Get detections with confidence higher than 0.6.
  top_indices = [i for i, conf in enumerate(det_conf) if conf >= 0.6]
   
  top_conf = det_conf[top_indices]
  top_label_indices = det_label[top_indices].tolist()
  top_labels = get_labelname(labelmap, top_label_indices)
  top_xmin = det_xmin[top_indices]
  top_ymin = det_ymin[top_indices]
  top_xmax = det_xmax[top_indices]
  top_ymax = det_ymax[top_indices]
  colors = plt.cm.hsv(np.linspace(0, 1, 21)).tolist()
   
  for i in xrange(top_conf.shape[0]):
          xmin = int(round(top_xmin * image.shape[1]))

                                 ymin = int(round(top_ymin * image.shape[0]))  

                                 xmax = int(round(top_xmax * image.shape[1]))  

                                ymax = int(round(top_ymax * image.shape[0]))  

                                score = top_conf  

                               label = int(top_label_indices)  

                               label_name = top_labels      

                               if label_name == 'car':  

                                         cv2.rectangle(frame, (xmin,ymin), (xmax,ymax), (150,0,255), 2)    

тут мне непонятна строка: detections = net.forward()['detection_out']

пытаюсь вставить в свой код - выдает ошибку. Что такое detection_out? или это слой в его модели?

далее он из detections извлекает det_xmin = detections[0,0,:,3] и т.д и потом из этих данных находит координаты для выделения объекта. Не могу осилить этот пример(((

Share this post


Link to post
Share on other sites

кажется я начинаю понимать - чтобы объект был выделен рамкой, нужно тренировать модель на изображениях с рамками. Т.е. если модель обучали на простых картинках (без рамок на объектах), то рамку я уже не смогу нарисовать - я прав? И тогда получается в модель нужно вносить изменения - нужны дополнительные данные для хранения координат рамок - так?

Share this post


Link to post
Share on other sites

Точно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×