我写了一个锁人的代码,但是gpu算不了。
尝试安装过,安装cuda成功了
但是没效果
代码如下
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0] # YOLOv5 root directory
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative
from models.common import DetectMultiBackend
from utils.dataloaders import IMG_FORMATS, VID_FORMATS, LoadImages, LoadScreenshots, LoadStreams
from utils.general import (LOGGER, Profile, check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2,
increment_path, non_max_suppression, print_args, scale_boxes, strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.torch_utils import select_device, smart_inference_mode
from ScreenShot import screenshot
is_left_pressed = False
end = 'end'
lock = 'lock'
init = {
end: False,
lock: False,
}
def mouse(data):
def down(x, y, button, pressed):
if button == pynput.mouse.Button.left:
data[lock] = pressed
with pynput.mouse.Listener(on_click=down) as m:
m.join()
def keyboard(data):
def press(key):
if key == pynput.keyboard.KeyCode.from_char('v'):
data[lock] = True
def release(key):
if key == pynput.keyboard.Key.end:
# 结束程序
data[end] = True
winsound.Beep(400, 200)
return False
elif key == pynput.keyboard.KeyCode.from_char('v'):
data[lock] = False
with pynput.keyboard.Listener(on_release=release) as k:
k.join()
@smart_inference_mode()
def run(data):
try:
driver = ctypes.CDLL(r"D:\an\logitech.driver.dll")
ok = driver.device_open() == 1
if not ok:
print('初始化失败, 未安装罗技驱动')
except FileNotFoundError:
print('初始化失败, 缺少文件')
def move(x, y):
if (x == 0) & (y == 0):
return
driver.moveR(x, y, True)
# Load model
device = select_device('code:0') # cpu 或者code:0(n卡用), 你这边 cuda 环境装好了吗
model = DetectMultiBackend(weights='./look png/best.pt', device=device, dnn=False, data=False, fp16=False)
winsound.Beep(400, 200) # 响了就是可以使用了
while True:
if data[end]:
break
t1 = time.time()
im = screenshot()
im0 = im
im = letterbox(im, (640, 640), stride=32, auto=True)[0] # padded resize
im = im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB
im = np.ascontiguousarray(im) # contiguous
im = torch.from_numpy(im).to(model.device)
im = im.half() if model.fp16 else im.float() # uint8 to fp16/32
im /= 255 # 0 - 255 to 0.0 - 1.0
if len(im.shape) == 3:
im = im[None] # expand for batch dim
# 推理
pred = model(im, augment=False, visualize=False)
# 非极大值抑制
pred = non_max_suppression(pred, conf_thres=0.7, iou_thres=0.7, classes=0, max_det=1000)
# Second-stage classifier (optional)
# pred = utils.general.apply_classifier(pred, classifier_model, im, im0s)
# Process predictions
for i, det in enumerate(pred): # per image
annotator = Annotator(im0, line_width=1)
# gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh 实验
if len(det):
distance_list = []
target_list = []
# Rescale boxes from img_size to im0 size
det[:, :4] = scale_boxes(im.shape[2:], det[:, :4], im0.shape).round()
# Write results
for *xyxy, conf, cls in reversed(det):
# 此处为(conf)就是置信度,如果是(int(cls))就是物体数字
xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4))).view(-1).tolist()
# normalized xywh 把xywh变成列表
# print(xywh, line)
X = xywh[0] - 180
Y = xywh[1] - 180
distance = math.sqrt(X ** 2 + Y ** 2)
xywh.append(distance)
annotator.box_label(xyxy, label=f'[{int(cls)}Distance:{round(distance, 2)}]', color=(34, 139, 34),
txt_color=(0, 191, 255))
distance_list.append(distance)
target_list.append(xywh)
target_info = target_list[distance_list.index(min(distance_list))]
if data[lock]:
move(int(target_info[0] - 180), int(target_info[1] - 180))
print(f'移动鼠标: {int(target_info[0] - 180)}, {int(target_info[1] - 180)}')
# print('目标信息', target_list)
# print('距离', distance_list)
# print(target_info)
# print(X, Y)
# mouse_xy(int(X), int(Y))
# xywh.append(distance)
# print(distance)
# print(X, Y)
im0 = annotator.result()
cv2.imshow('QQ', im0) # w
cv2.waitKey(1)
# print(f'一个循环耗时: {time.time() - t1}')
if __name__ == "__main__":
print("作者anrr")
multiprocessing.freeze_support() # windows 平台使用 multiprocessing 必须在 main 中第一行写这个
manager = multiprocessing.Manager()
data = manager.dict() # 创建进程安全的共享变量
data.update(init) # 将初始数据导入到共享变量
pm = Process(target=mouse, args=(data,), name='Mouse') # 鼠标监听进程
pk = Process(target=keyboard, args=(data,), name='Keyboard') # 键盘监听进程
pa = Process(target=run, args=(data,), name='Aim') # 瞄准进程
pm.start()
pk.start()
pa.start()
pk.join() # 不写 join 的话, 使用 dict 的地方就会报错 conn = self._tls.connection, AttributeError: 'ForkAwareLocal' object has no attribute 'connection'
pm.terminate() # 鼠标进程无法主动监听到终止信号, 所以需强制结束
报错代码如下:
assert torch.cuda.is_available() and torch.cuda.device_count() >= len(device.replace(',', '')), \
AssertionError: Invalid CUDA '--device code:0' requested, use '--device cpu' or pass valid CUDA device(s)