python - 使用网络摄像头执行 opencv / maskrcnn 时,我收到“NoneType”错误的原因是因为我的笔记本电脑上没有 GPU?
问题描述
运行下面的代码 - 尝试使用 opencv 和我的网络摄像头实现 maskrcnn。
当我设置PROCESS_IMG = False
时,输出很好,显示网络摄像头输入以及 FPS(如果我将其设置为 false)。
我试图注释掉该行s = masked_image
和下面的行,每 4-5 秒我会刷新一次网络摄像头以及覆盖在顶部的适当 maskrcnn 输出(这就是我想要的)。
不假设我会以任何方式获得 60fps,0.2fps 就可以了。
import os
import sys
import cv2
import time
import imutils
import numpy as np
import mrcnn.model as modellib
from mrcnn import utils, visualize
from imutils.video import WebcamVideoStream
import random
# Root directory of the project
from samples.coco.coco import CocoConfig
ROOT_DIR = os.path.abspath("./")
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/")) # To find local version
# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
# Local path to trained weights file
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
utils.download_trained_weights(COCO_MODEL_PATH)
class InferenceConfig(CocoConfig):
# Set batch size to 1 since we'll be running inference on
# one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
GPU_COUNT = 1
IMAGES_PER_GPU = 1
config = InferenceConfig()
config.display()
# Create model object in inference mode.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)
# Load weights trained on MS-COCO
model.load_weights(COCO_MODEL_PATH, by_name=True)
# COCO Class names
# Index of the class in the list is its ID. For example, to get ID of
# the teddy bear class, use: class_names.index('teddy bear')
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
'kite', 'baseball bat', 'baseball glove', 'skateboard',
'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
'teddy bear', 'hair drier', 'toothbrush']
colors = visualize.random_colors(len(class_names))
gentle_grey = (45, 65, 79)
white = (255, 255, 255)
OPTIMIZE_CAM = True
SHOW_FPS = False
SHOW_FPS_WO_COUNTER = False # faster
PROCESS_IMG = True
if OPTIMIZE_CAM:
vs = WebcamVideoStream(src=0).start()
else:
vs = cv2.VideoCapture(0)
if SHOW_FPS:
fps_caption = "FPS: 0"
fps_counter = 0
start_time = time.time()
SCREEN_NAME = 'Mask RCNN LIVE'
cv2.namedWindow(SCREEN_NAME, cv2.WINDOW_NORMAL)
cv2.setWindowProperty(SCREEN_NAME, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
while True:
# Capture frame-by-frame
if OPTIMIZE_CAM:
frame = vs.read()
else:
grabbed, frame = vs.read()
if not grabbed:
break
if SHOW_FPS_WO_COUNTER:
start_time = time.time() # start time of the loop
if PROCESS_IMG:
results = model.detect([frame])
r = results[0]
# Run detection
masked_image = visualize.display_instances(frame, r['rois'], r['masks'],
r['class_ids'], class_names, r['scores'], colors=colors)
if PROCESS_IMG:
s = masked_image
else:
s = frame
print("Image shape: {1}x{0}".format(s.shape[0], s.shape[1]))
width = s.shape[1]
height = s.shape[0]
top_left_corner = (width-120, height-20)
bott_right_corner = (width, height)
top_left_corner_cvtext = (width-80, height-5)
if SHOW_FPS:
fps_counter+=1
if (time.time() - start_time) > 5 : # every 5 second
fps_caption = "FPS: {:.0f}".format(fps_counter / (time.time() - start_time))
# print(fps_caption)
fps_counter = 0
start_time = time.time()
ret, baseline = cv2.getTextSize(fps_caption, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
cv2.rectangle(s, (width - ret[0], height - ret[1] - baseline), bott_right_corner, gentle_grey, -1)
cv2.putText(s,fps_caption, (width - ret[0], height - baseline), cv2.FONT_HERSHEY_SIMPLEX, 0.5, white, lineType=cv2.LINE_AA)
if SHOW_FPS_WO_COUNTER:
# Display the resulting frame
fps_caption = "FPS: {:.0f}".format(1.0 / (time.time() - start_time))
# print("FPS: ", 1.0 / (time.time() - start_time))
# Put the rectangle and text on the bottom left corner
ret, baseline = cv2.getTextSize(fps_caption, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
cv2.rectangle(s, (width - ret[0], height - ret[1] - baseline), bott_right_corner, gentle_grey, -1)
cv2.putText(s, fps_caption, (width - ret[0], height - baseline),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, white, 1, lineType=cv2.LINE_AA)
s = cv2.resize(s,(1920,1080))
cv2.imshow(SCREEN_NAME, s)
cv2.waitKey(1)
if cv2.waitKey(1) & 0xFF == ord('q'): break
# When everything done, release the capture
if OPTIMIZE_CAM:
vs.stop()
else:
vs.release()
cv2.destroyAllWindows()
错误:
AttributeError Traceback (most recent call last)
<ipython-input-1-d3debbeb3ebd> in <module>
109 else:
110 s = frame
--> 111 print("Image shape: {1}x{0}".format(s.shape[0], s.shape[1]))
112
113 width = s.shape[1]
AttributeError: 'NoneType' object has no attribute 'shape'
如果我添加这个代码,我会得到一个带有正确掩码的图像:
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))
start = time.time()
# Run detection
results = model.detect([image], verbose=1)
end = time.time()
print("Time:",end-start,"seconds")
# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])
解决方案
visualize.display_instances()
不返回任何东西,所以在 python 中它None
默认返回。所以你设置masked_image
在None
这条线上:
masked_image = visualize.display_instances(...
然后你设置s
到None
这一行:
s = masked_image
所以 thens.shape
不能工作并抛出你得到的错误。
推荐阅读
- mysql - 添加条件后严重的 MySQL 查询性能问题
- spring - 从一个 SFTP 读取具有 3 种不同命名模式的文件。并在 Spring Application 中进行不同的处理
- eigen - 试图将特征矩阵强制为硬编码地址
- append - 如何在 C++ 中使用 Rapidxml 将新的子节点附加到现有文件
- python - 如何计算第二个轴上的平均值,直到 Pytorch 中的特定行列?
- wordpress - Woocommerce 插件导致重定向
- java - 如何在java中使用mockito模拟局部变量
- mysql - 如何检索日期时间记录,转换为新时区并返回按新日期时间分组的结果,而不会出现 ONLY_FULL_GROUP_BY 错误
- laravel - ErrorException 试图在 Hasmany 关系中获取非对象的属性“名称”
- javascript - react 应用程序中 pdfjs-dist 的附加加载器?