Не удается преобразовать OpenCV в изображение PIL для правильной подачи в пользовательскую модель (InceptionV3) - PullRequest
0 голосов
/ 17 апреля 2019

Я использую opencvs VideoCapture , чтобы читать видео кадр за кадром и подавать каждое изображение в предварительно подготовленное пользовательское Модель InceptionV3 для классификации изображений (две метки). Я не могу СОБСТВЕННО преобразовать каждый кадр из формата opencv в PIL, я перепробовал множество вариантов со всего Интернета. Кажется, никто не работает.

Модель всегда выбирает неправильную метку, когда я пытаюсь классифицировать каждый кадр видео.

Где, когда, когда я сохраняю изображение, считанное в формате JPEG, а затем передаю это статическое изображение в модель, оно правильно классифицирует метку. Я попробовал обычное преобразование BGR в RGB и затем использовал PIL для чтения изображения.


cap = cv2.VideoCapture('../y2mate.com - chihuahua_at_play_tony_taken_02192010_from_pentimfall2009_video_3avi_iCOXj63oYEM_360p.mp4')


width, height = 200, 200

font = cv2.FONT_HERSHEY_SIMPLEX
# Check if camera opened successfully
if (cap.isOpened()== False): 
    print("Error opening video stream or file")


# Check if camera opened successfully
if (cap.isOpened()== False): 
    print("Error opening video stream or file")




# Read until video is completed
while(cap.isOpened()):

    # Capture frame-by-frame
    ret, frame = cap.read()



    # Convert to RGB
    cv2_im = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

    # Read image in PIL format
    pil_im = Image.fromarray(cv2_im)

    # Predict using pre-trained model
    predics = predict(Inception_Model, cv2_im)


    print(predics)

    if np.max(predics) > 0.90:

        predicted_label = labels[ np.argmax(predics) ]

        cv2.putText(frame,

                    'Detected ' + predicted_label,

                    (50,250),

                    font,
                    2,

                    (255,0,255),
                    2,

                    cv2.LINE_AA)



    # Display the resulting frame
    cv2.imshow('Dog Face',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Два ярлыка: «Чихуахуа» и «Мальтийский»; обучен в том же порядке

Независимо от того, что представляют собой данные кадра;

Фактический результат выглядит так:

[0.22820102 0.771799  ]
[0.17714396 0.82285607]
[0.11787692 0.8821231 ]
[0.11390335 0.88609666]
[0.1003077  0.89969236]
[0.0998676 0.9001325]
[0.05119308 0.94880694]
[0.11403728 0.8859627 ]
[0.03555993 0.96444005]
[0.04067587 0.95932406]
[0.029842 0.970158]
[0.01746762 0.9825324 ]
[0.06942239 0.9305776 ]
[0.01813542 0.9818646 ]
[0.0055009 0.9944991]
[0.00557377 0.99442625]
[0.004916 0.995084]
[0.01140862 0.9885914 ]
[0.01956638 0.98043364]

где как, для этих данных (это видео чихуахуа)

вывод должен быть:

[0.999444, 0.005509]

при попытке прочитать сохраненное изображение jpg (сохраненное из некоторых кадров предыдущего видео)

Я получаю фактический вывод:

stat_img = load_img('/home/amith/LAI/LOCV/practice/Test-91.jpg', target_size=(220,220))

labels [ np.argmax( predict(Inception_Model, stat_img) ) ], predict(Inception_Model, stat_img)

('Chihuahua', array([9.9999905e-01, 9.4589092e-07], dtype=float32))


когда я пытаюсь прочитать преобразованное изображение подушки в виде массива, я всегда получаю кучу нулей и ничего больше. Это точно показывает, почему каждый кадр классифицируется только как одна метка. Преобразование из cv в PIL портит что-то, что не принимает фактические значения пикселей, но я не знаю точно, как преобразовать из cv в PIL.

Я бы очень признателен за любые указатели.

Спасибо

Примечание: я на 100% уверен, что модель DL работает абсолютно нормально, и это не вина, что классификация так плоха.

Для всех, кто интересуется видео: Чихуахуа

...