Я использую 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 работает абсолютно нормально, и это не вина, что классификация так плоха.
Для всех, кто интересуется видео: Чихуахуа