opencv - Google Coral Model (MobileNet SSD v2 (Faces)) 盒子太大
问题描述
我正在使用此处的 TPU MobileNet SSD v2 (Faces) 模型。
它还提供了此处列出的一个非常有据可查的示例。我也会粘贴下面的代码。
当我用我的网络摄像头运行它时,你可以看到它在左右两边产生了很多边距。我的脸比“悲伤的脸”要小,但你可以看到边界框要大得多。(免责声明:出于隐私问题,我只是在截图后在我的脸上添加了悲伤的脸。模型没有放置悲伤的脸脸或任何东西哈哈)
我希望边界框实际上像第二张图像一样专注于面部。(两张图片均来自网络)
你能指出我如何做到这一点吗?我怀疑他们用这么大的空间训练了模型......
import argparse
import cv2
import os
from pycoral.adapters.common import input_size
from pycoral.adapters.detect import get_objects
from pycoral.utils.dataset import read_label_file
from pycoral.utils.edgetpu import make_interpreter
from pycoral.utils.edgetpu import run_inference
def main():
default_model_dir = '../all_models'
default_model = 'mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite'
default_labels = 'coco_labels.txt'
parser = argparse.ArgumentParser()
parser.add_argument('--model', help='.tflite model path',
default=os.path.join(default_model_dir,default_model))
parser.add_argument('--labels', help='label file path',
default=os.path.join(default_model_dir, default_labels))
parser.add_argument('--top_k', type=int, default=3,
help='number of categories with highest score to display')
parser.add_argument('--camera_idx', type=int, help='Index of which video source to use. ', default = 0)
parser.add_argument('--threshold', type=float, default=0.1,
help='classifier score threshold')
args = parser.parse_args()
print('Loading {} with {} labels.'.format(args.model, args.labels))
interpreter = make_interpreter(args.model)
interpreter.allocate_tensors()
labels = read_label_file(args.labels)
inference_size = input_size(interpreter)
cap = cv2.VideoCapture(args.camera_idx)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2_im = frame
cv2_im_rgb = cv2.cvtColor(cv2_im, cv2.COLOR_BGR2RGB)
cv2_im_rgb = cv2.resize(cv2_im_rgb, inference_size)
run_inference(interpreter, cv2_im_rgb.tobytes())
objs = get_objects(interpreter, args.threshold)[:args.top_k]
cv2_im = append_objs_to_img(cv2_im, inference_size, objs, labels)
cv2.imshow('frame', cv2_im)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
def append_objs_to_img(cv2_im, inference_size, objs, labels):
height, width, channels = cv2_im.shape
scale_x, scale_y = width / inference_size[0], height / inference_size[1]
for obj in objs:
bbox = obj.bbox.scale(scale_x, scale_y)
x0, y0 = int(bbox.xmin), int(bbox.ymin)
x1, y1 = int(bbox.xmax), int(bbox.ymax)
percent = int(100 * obj.score)
label = '{}% {}'.format(percent, labels.get(obj.id, obj.id))
cv2_im = cv2.rectangle(cv2_im, (x0, y0), (x1, y1), (0, 255, 0), 2)
cv2_im = cv2.putText(cv2_im, label, (x0, y0+30),
cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2)
return cv2_im
if __name__ == '__main__':
解决方案
推荐阅读
- javascript - 冻结表头的错误 - HTML / CSS
- julia - 如何将依赖项添加到我的 Julia 包中?
- c - C: 2 请求时的用户输入字段 3
- python - 使用字典的 Python 控制台库存管理器
- python - NameError:名称“播放器”未定义
- sql - 使用 PROCEDURE 在 PL/SQL 中未发现数据错误
- javascript - io.sockets.in 在 nativescript-socketio 中不起作用
- html - 如何使用剪辑制作可拖动的 div
- typescript - 覆盖从 GraphQL Schema 生成的 Typescript 类型
- php - Laravel 未定义变量:文件