windows pycharm连得anaconda的环境
改过的infer.py
-- coding:utf-8 --
import cv2
import time
import os
import argparse
import numpy as np
from PIL import Image
from keras.models import model_from_json
from anchor_generator import generate_anchors
from anchor_decode import decode_bbox
from nms import single_class_non_max_suppression
from playsound import playsound
model = model_from_json(open('models/face_mask_detection.json').read())
model.load_weights('models/face_mask_detection.hdf5')
anchor configuration
feature_map_sizes = [[33, 33], [17, 17], [9, 9], [5, 5], [3, 3]]
anchor_sizes = [[0.04, 0.056], [0.08, 0.11], [0.16, 0.22], [0.32, 0.45], [0.64, 0.72]]
anchor_ratios = [[1, 0.62, 0.42]] * 5
generate anchors
anchors = generate_anchors(feature_map_sizes, anchor_sizes, anchor_ratios)
for inference , the batch size is 1, the model output shape is [1, N, 4],
so we expand dim for anchors to [1, anchor_num, 4]
anchors_exp = np.expand_dims(anchors, axis=0)
id2class = {0: 'MASK', 1: 'NOMASK'}
def inference(image,
conf_thresh=0.5,
iou_thresh=0.4,
target_shape=(160, 160),
draw_result=True,
show_result=True
):
'''
Main function of detection inference
:param image: 3D numpy array of image
:param conf_thresh: the min threshold of classification probabity.
:param iou_thresh: the IOU threshold of NMS
:param target_shape: the model input size.
:param draw_result: whether to daw bounding box to the image.
:param show_result: whether to display the image.
:return:
'''
# image = np.copy(image)
output_info = []
height, width, _ = image.shape
image_resized = cv2.resize(image, target_shape)
image_np = image_resized / 255.0 # 归一化到0~1
image_exp = np.expand_dims(image_np, axis=0)
result = model.predict(image_exp)
y_bboxes_output = result[0]
y_cls_output = result[1]
# remove the batch dimension, for batch is always 1 for inference.
y_bboxes = decode_bbox(anchors_exp, y_bboxes_output)[0]
y_cls = y_cls_output[0]
# To speed up, do single class NMS, not multiple classes NMS.
bbox_max_scores = np.max(y_cls, axis=1)
bbox_max_score_classes = np.argmax(y_cls, axis=1)
# keep_idx is the alive bounding box after nms.
keep_idxs = single_class_non_max_suppression(y_bboxes,
bbox_max_scores,
conf_thresh=conf_thresh,
iou_thresh=iou_thresh,
)
for idx in keep_idxs:
conf = float(bbox_max_scores[idx])
class_id = bbox_max_score_classes[idx]
bbox = y_bboxes[idx]
# clip the coordinate, avoid the value exceed the image boundary.
xmin = max(0, int(bbox[0] * width))
ymin = max(0, int(bbox[1] * height))
xmax = min(int(bbox[2] * width), width)
ymax = min(int(bbox[3] * height), height)
if draw_result:
if class_id == 0:
color = (0, 255, 0)
else:
color = (255, 0 , 0)
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, 2)
cv2.putText(image, "%s: %.2f" % (id2class[class_id], conf), (xmin + 2, ymin-2),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, color)
output_info.append([class_id, conf, xmin, ymin, xmax, ymax])
if show_result:
Image.fromarray(image).show()
return output_info
def run_on_video(video_path, output_video_name, conf_thresh):
cap = cv2.VideoCapture(video_path)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
writer = cv2.VideoWriter(output_video_name, fourcc, int(fps), (int(width), int(height)))
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
cv2.imwrite("/saimg" + '.img', cap.read())
if not cap.isOpened():
raise ValueError("Video open failed.")
return
status = True
idx = 0
while status:
start_stamp = time.time()
status, img_raw = cap.read()
cv2.imwrite("/saimg"+'.png', img_raw)
img_raw = cv2.cvtColor(img_raw, cv2.COLOR_BGR2RGB)
read_frame_stamp = time.time()
if (status):
inference(img_raw,
conf_thresh,
iou_thresh=0.5,
target_shape=(260, 260),
draw_result=True,
show_result=False)
cv2.imshow('image', img_raw[:,:,::-1])
cv2.waitKey(1)
inference_stamp = time.time()
writer.write(img_raw)
write_frame_stamp = time.time()
idx += 1
print("%d of %d" % (idx, total_frames))
print("read_frame:%f, infer time:%f, write time:%f" % (read_frame_stamp - start_stamp,
inference_stamp - read_frame_stamp,
write_frame_stamp - inference_stamp))
writer.release()
if name == "main":
parser = argparse.ArgumentParser(description="Face Mask Detection")
parser.add_argument('--img-mode', type=int, default=1, help='set 1 to run on image, 0 to run on video.')
parser.add_argument('--img-path', type=str, help='path to your image.')
parser.add_argument('--video-path', type=str, default='0', help='path to your video, 0
means to use camera.')
# parser.add_argument('--hdf5', type=str, help='keras hdf5 file')
args = parser.parse_args()
if args.img_mode:
imgPath = args.img_path
img = cv2.imread(imgPath)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
inference(img, show_result=True, target_shape=(260, 260))
else:
video_path = args.video_path
if args.video_path == '0':
video_path = 0
run_on_video(video_path, '', conf_thresh=0.5)
错误日志:
(base) C:\Users\xiaomi\PycharmProjects\untitled8\FaceMaskDetection-master>python infer.py --img-mode 0 --video-path 0
Using TensorFlow backend.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:517: The name tf.p
laceholder is deprecated. Please use tf.compat.v1.placeholder instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:4185: The name tf.
truncated_normal is deprecated. Please use tf.random.truncated_normal instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:245: The name tf.g
et_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:174: The name tf.g
et_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:181: The name tf.C
onfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:186: The name tf.S
ession is deprecated. Please use tf.compat.v1.Session instead.
2020-03-03 16:44:54.419321: I tensorflow/core/platform/cpu_feature_guard.cc:145] This TensorFlow binary is optimized with
Intel(R) MKL-DNN to use the following CPU instructions in performance critical operations: AVX AVX2
To enable them in non-MKL-DNN operations, rebuild TensorFlow with the appropriate compiler flags.
2020-03-03 16:44:54.434687: I tensorflow/core/common_runtime/process_util.cc:115] Creating new thread pool with default in
ter op setting: 8. Tune using inter_op_parallelism_threads for best performance.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:190: The name tf.g
lobal_variables is deprecated. Please use tf.compat.v1.global_variables instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:199: The name tf.i
s_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:206: The name tf.v
ariables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:1834: The name tf.
nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:133: The name tf.p
laceholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:3976: The name tf.
nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.
WARNING:tensorflow:From C:\Users\xiaomi\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:4138: The name tf.
random_uniform is deprecated. Please use tf.random.uniform instead.
[ERROR:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap.cpp (415) cv::VideoWriter::open VIDEOIO(CV_IMAGE
S): raised OpenCV exception:
OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\videoio\src\cap_images.cpp:207: error: (-215:Assertion failed) !fil
ename.empty() in function 'cv::icvExtractPattern'
Traceback (most recent call last):
File "infer.py", line 159, in
run_on_video(video_path, '', conf_thresh=0.5)
File "infer.py", line 111, in run_on_video
cv2.imwrite("/saimg" + '.img', cap.read())
TypeError: Expected Ptrcv::UMat for argument 'img'
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB t
erminating async callback
opencv版本:3.4.1