idk_Idk Ответов: 3

Распознавание лиц на веб-камере реализация: не удается прочитать свойство "дескриптор" undefined


Столкнувшись с этой проблемой при реализации распознавания лиц на веб-камере камеры для браузера с помощью узла js для веб-приложения. Эта ошибка возникает только тогда, когда я добавляю более 1 имени в свои метки в функции loadLabeledImages (). Если у меня есть одно имя, оно прекрасно работает. Новичок здесь, и я уже несколько дней получаю одну и ту же ошибку :c

Любая помощь приветствуется, это часть проекта, который должен быть завершен в течение недели!
Большое вам спасибо!

Ошибка Geeting:
Цитата:
"Uncaught (в обещании) TypeError: не удается прочитать свойство "дескриптор" undefined"


  1  const video = document.getElementById('video')
  2  
  3  Promise.all([
  4    faceapi.nets.tinyFaceDetector.loadFromUri('/models'),
  5    faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
  6    faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
  7    faceapi.nets.ssdMobilenetv1.loadFromUri('/models'),
  8  ]).then(startVideo)
  9  
 10  function startVideo() {
 11    navigator.getUserMedia(
 12      { video: {} },
 13      stream => video.srcObject = stream,
 14      err => console.error(err)
 15    )
 16  }
 17  
 18  this.video.addEventListener('play',() => {
 19    const canvas = faceapi.createCanvasFromMedia(video)
 20    document.body.append(canvas)
 21    const displaySize = { width: video.width, height: video.height }
 22    faceapi.matchDimensions(canvas, displaySize)
 23    setInterval(async () => {
 24      const detections = await faceapi.detectAllFaces(video).withFaceLandmarks().withFaceDescriptors()
 25      const resizedDetections = faceapi.resizeResults(detections, displaySize)
 26      canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height)
 27      faceapi.draw.drawFaceLandmarks(canvas, resizedDetections)
 28      this.labeledFaceDescriptors = await this.loadLabeledImages()    const faceMatcher = new faceapi.FaceMatcher(labeledFaceDescriptors, 0.6)
 29      const results = resizedDetections.map(d => faceMatcher.findBestMatch(d.descriptor))
 30      results.forEach((result, i) => {
 31        const box = resizedDetections[i].detection.box
 32        const drawBox = new faceapi.draw.DrawBox(box, {label: result.toString()})
 33        drawBox.draw(canvas) 
 34      })
 35  
 36    }, 100) 
 37  })
 38  
 39  function loadLabeledImages() {
 40  
 41    try{
 42      const labels = ['Jane', 'Alex']
 43  
 44      return Promise.all(
 45        labels.map(async label => {
 46          const descriptions = []
 47          for (let i = 1; i <= 3; i++) {
 48            const img = await faceapi.fetchImage(`public/img/${label}/${i}.jpg`)
 49            const detections = await faceapi.detectSingleFace(img).withFaceLandmarks().withFaceDescriptor()
 50            descriptions.push(detections.descriptor)          
 51          }
 52    
 53          return new faceapi.LabeledFaceDescriptors(label, this.descriptions)      })
 54      )
 55  
 56    }
 57    catch(err){
 58      console.log(err)
 59    }
 60  
 61  }


Что я уже пробовал:

Я пробовал искать решения в google, но ничего не помогало.

Richard MacCutchan

Сообщение означает, что вы пытаетесь использовать переменную, которая не существует. Но поскольку вы не сказали нам, на какой линии это происходит, мы не можем догадаться, почему. Кроме того, Пожалуйста, не говорите, что ваш вопрос срочный. Здесь каждый вопрос имеет равный приоритет.

idk_Idk

Мне так жаль! Новое здесь, но я уважаю и признаю, что не должен был говорить, что это срочно. Я удалил эту часть. Я не знал, как выделить номер строки, поэтому подчеркнул строки, где появляется "дескриптор"- то есть проблема. Спасибо!

Richard Deeming

Я добавил номера строк в ваш кодовый блок. Из какой строки выбрасывается ошибка?

Richard MacCutchan

Спасибо, Ричард, 29 или 50.

Richard MacCutchan

Это не может быть та строка, так как она не содержит ссылки на descriptor Это должна быть либо строка 29, либо строка 50. Вам нужно выяснить, почему ссылка на любую из этих строк равна нулю.

idk_Idk

Спасибо тебе, Ричард и Ричард!
Да, ошибка относится к строке 51. И ошибка также относится к строке 28, так как функция loadLabledImages() вызывается на 28. Я подчеркнул другие строки, поскольку дескриптор упоминается во всех этих строках.
Я понимаю, что это происходит потому, что в дескрипторе нет никакой ценности. Я много читал о неопределенной ошибке, чтобы понять ее. Но я не могу понять, почему он равен нулю. Он прекрасно работает, когда его использует только один человек. Но как только добавляется еще один человек, он становится неопределенным. Я так сожалею о путанице, я просто очень Отчаянно ищу решение. Спасибо Вам за вашу помощь!

3 Ответов

Рейтинг:
2

Joshua Jones

const results = resizedDetections.map(d => faceMatcher.findBestMatch(d.descriptor))


Ваша проблема лежит здесь. Прочитайте сообщение об ошибке более внимательно.

"Uncaught (in promise) TypeError: Cannot read property 'descriptor' of undefined"


Я рекомендую добавить некоторое ведение журнала, чтобы увидеть, что именно Ваш массив resizedDetections содержит в каждом объекте, чтобы убедиться, что свойство дескриптора существует.

пробовать
const results = resizedDetections.map(d => { 
   console.dir(d); 
   return faceMatcher.findBestMatch(d.descriptor); 
});


Чтобы убедиться, что свойство, о котором вы получаете сообщение об ошибке, существует. Это приблизит вас к поиску истинного виновника.


idk_Idk

Спасибо, да, этот способ очень помогает. Я понял, что проблема была не в моем коде, а в моих изображениях. Я изменил свои изображения, и ошибка исчезла. Спасибо Вам за вашу помощь!

Рейтинг:
2

Member 14812370

Я получаю ту же ошибку !! Есть ли какое-то решение для этого ?


Richard MacCutchan

Да, исправьте свой код так, чтобы все ссылки были действительны.

Richard Deeming

- И я тоже." это не решение проблемы.

Если вы хотите получить дополнительную информацию, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под вопросом и оставьте комментарий.

Если вы хотите задать новый вопрос, то задавать вопрос[^].

Не разместите свой комментарий как "решение" на чей-то вопрос.

idk_Idk

Моя проблема была исправлена путем изменения моих изображений. Они были очень плохого качества, поэтому он не мог обнаружить в них никакого лица, следовательно, ошибка.

Рейтинг:
14

Member 14812370

Это потому, что ваше изображение этикетки не обнаруживает никакого лица. Вы должны убедиться, что изображения являются лицом человека


idk_Idk

Большое вам спасибо! Это была ошибка. Я изменил свои изображения, и ошибка исчезла.