Нейронная сеть не принимает изображения в градациях серого - PullRequest
0 голосов
/ 05 сентября 2018

Я следовал этому уроку: https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/ Я изменил эту часть, где я преобразовал изображение потока в оттенки серого, прежде чем вставить его в нейронную сеть

frame = vs.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame = imutils.resize(frame, width=400)

(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),
    0.007843, (300, 300), 127.5)
net.setInput(blob)
detections = net.forward()

Однако эта ошибка возникает:

OpenCV(3.4.1) Error: Assertion failed (ngroups > 0 && inpCn % ngroups == 0 && outCn % ngroups == 0) in cv::dnn::ConvolutionLayerImpl::getMemoryShapes, file D:\Build\OpenCV\opencv-3.4.1\modules\dnn\src\layers\convolution_layer.cpp, line 234
    Traceback (most recent call last):
      File "C:/Users/Toshiba/PycharmProjects/real-time-object-detection/study7ver2.py", line 75, in <module>
        detections = net.forward()
    cv2.error: OpenCV(3.4.1) D:\Build\OpenCV\opencv-3.4.1\modules\dnn\src\layers\convolution_layer.cpp:234: error: (-215) ngroups > 0 && inpCn % ngroups == 0 && outCn % ngroups == 0 in function cv::dnn::ConvolutionLayerImpl::getMemoryShapes

Строка 75: detections = net.forward()

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

1 Ответ

0 голосов
/ 05 сентября 2018

Подавляющему большинству этих моделей требуются цветные, т. Е. 3-канальные изображения; преобразовав в оттенки серого, вы получите одноканальное изображение, и код вылетает.

Давайте быстро взглянем на это; скрипт в связанном сообщении в блоге запускается как

python deep_learning_object_detection.py \
    --prototxt MobileNetSSD_deploy.prototxt.txt \
    --model MobileNetSSD_deploy.caffemodel --image images/example_01.jpg 

Копая в MobileNetSSD_deploy.prototxt.txt файл MobileNet-SSD Github repo (т.е. используемую здесь реализацию), мы видим, что входной слой определен как

name: "MobileNet-SSD"
input: "data"
input_shape {
  dim: 1
  dim: 3
  dim: 300
  dim: 300
}

Второй аргумент dim - это количество каналов, ожидаемых на изображении (3). И он просто откажется работать с одноканальными изображениями, такими как изображения в градациях серого.

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

...