欢迎使用我们的TensorFlow对象检测API教程系列的第7部分。首先,您可以在我的GitHub页面上下载代码。在这一部分,我们将更改我们的代码,我们可以找到敌人身上检测到的矩形的中心,将鼠标移到中心并射击它们。GitHub
在本教程中,我们使用的文件与在第6个教程中使用的文件相同。要实现本教程的预期目标,我们需要向代码中添加几行代码。首先,我们从导入pyautogui库开始:
import pyautogui
这个库将用来在游戏中移动我们的鼠标。但是有些游戏可能不允许你移动鼠标,然后你需要用管理员权限启动一个python脚本,就像我在YouTube视频教程中对CSGO所做的那样。
接下来,我们将定义的监视器大小行更改为以下内容。我们之所以这样做,是因为我们将使用其他地方的窗口宽度和高度来计算游戏的正确坐标。因此,为了避免错误并且不在许多地方写入相同的值,我们相应地定义了我们的窗口大小:
width = 800
height = 640
monitor = {'top': 80, 'left': 0, 'width': width, 'height': height}
在转到我们的主While循环之前,我们定义了一个新函数,我们将使用它来瞄准和射击敌人。正如你在下面的函数中看到的,我们计算y与x的方式不同。在我的YouTube教程中,我们将看到,当我们以与x相同的方式计算y时,我们是在头顶上方拍摄。因此,我们通过将所需的屏幕高度除以9并将其与标准y高度相加来消除这一差异。
def Shoot(mid_x, mid_y):
x = int(mid_x*width)
y = int(mid_y*height+height/9)
pyautogui.moveTo(x,y)
pyautogui.click()
接下来,我们在主While循环中工作的同时改进代码。因此,我们创建以下for循环。首先,我们初始化array_ch数组,我们将在其中放置所有ch对象。然后,我们将遍历Box[0]数组,如果找到所需的类,则检查它的检测百分比。例如,在我们的案例中,class[0][i]==2等于ch,如果该类的得分[0][i]>=0.5等于或大于50%,我们就假设我们检测到了我们的对象。在本例中,我们采用箱数组编号,其中:
boxes[0][i][0] – y axis upper start coordinates
boxes[0][i][1] – x axis left start coordinates
boxes[0][i][2] – y axis down start coordinates
boxes[0][i][3] – x axis right start coordinates
当减去相同的轴起点坐标并将它们除以2时,我们得到两个轴的中心。这样,我们就可以计算出检测到的矩形的中心。在最后一条线上,我们在中心画一个点:
array_ch = []
for i,b in enumerate(boxes[0]):
if classes[0][i] == 2: # ch
if scores[0][i] >= 0.5:
mid_x = (boxes[0][i][1]+boxes[0][i][3])/2
mid_y = (boxes[0][i][0]+boxes[0][i][2])/2
array_ch.append([mid_x, mid_y])
cv2.circle(image_np,(int(mid_x*width),int(mid_y*height)), 3, (0,0,255), -1)
这几行代码只适用于一个对象,我们对所有四个对象都这样做:
for i,b in enumerate(boxes[0]):
if classes[0][i] == 2: # ch
if scores[0][i] >= 0.5:
mid_x = (boxes[0][i][1]+boxes[0][i][3])/2
mid_y = (boxes[0][i][0]+boxes[0][i][2])/2
array_ch.append([mid_x, mid_y])
cv2.circle(image_np,(int(mid_x*width),int(mid_y*height)), 3, (0,0,255), -1)
if classes[0][i] == 1: # c
if scores[0][i] >= 0.5:
mid_x = (boxes[0][i][1]+boxes[0][i][3])/2
mid_y = boxes[0][i][0] + (boxes[0][i][2]-boxes[0][i][0])/6
array_c.append([mid_x, mid_y])
cv2.circle(image_np,(int(mid_x*width),int(mid_y*height)), 3, (50,150,255), -1)
if classes[0][i] == 4: # th
if scores[0][i] >= 0.5:
mid_x = (boxes[0][i][1]+boxes[0][i][3])/2
mid_y = (boxes[0][i][0]+boxes[0][i][2])/2
array_th.append([mid_x, mid_y])
cv2.circle(image_np,(int(mid_x*width),int(mid_y*height)), 3, (0,0,255), -1)
if classes[0][i] == 3: # t
if scores[0][i] >= 0.5:
mid_x = (boxes[0][i][1]+boxes[0][i][3])/2
mid_y = boxes[0][i][0] + (boxes[0][i][2]-boxes[0][i][0])/6
array_t.append([mid_x, mid_y])
cv2.circle(image_np,(int(mid_x*width),int(mid_y*height)), 3, (50,150,255), -1)
在这之后,我们正在制作拍摄功能。因此,作为一个团队=“t”,我们选择要射击的对象。在这种情况下,我们试图射杀恐怖分子。所以首先,我们检查是否发现了恐怖分子的头颅。如果我们检测到至少一个头部,则使用所需的坐标调用shot(midx,midy)函数。如果我们没有发现人头,我们就会检查也许我们发现了恐怖分子的身体。如果我们这样做了,我们调用相同的射击函数。否则,我们不会调用射击函数。
team = "t"
if team == "c":
if len(array_ch) > 0:
Shoot(array_ch[0][0], array_ch[0][1])
if len(array_ch) == 0 and len(array_c) > 0:
Shoot(array_c[0][0], array_c[0][1])
if team == "t":
if len(array_th) > 0:
Shoot(array_th[0][0], array_th[0][1])
if len(array_th) == 0 and len(array_t) > 0:
Shoot(array_t[0][0], array_t[0][1])
请注意,如果我们想向反恐分子开枪,我们会在第一行将“t”改为“c”。
这只是代码的简短说明,您可以从上面的文件下载完整的代码。在我的YouTube视频中,你可以看到我的CSGO aimbot模型是如何工作的。现在,我对我们的FPS真的很失望,因为没有人可以玩这些号码…但我很高兴我们的机器人可以相当准确地瞄准敌人并射击他们。因此,也许在下一篇教程中,我会考虑我们可以做些什么来让它更快地工作。
最初发表于https://pylessons.com/Tensorflow-object-detection-csgo-aim-bothttps://pylessons.com/Tensorflow-object-detection-csgo-aim-bot
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/08/tensorflow%e5%af%b9%e8%b1%a1%e6%a3%80%e6%b5%8bcs%ef%bc%9ago-aim%e6%9c%ba%e5%99%a8%e4%ba%ba-2/