Current collected state Current
Observed since 20 Oct, 21:59 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@01works/mediapipe
Mediapipe tools for all environments
MediaPipe 비전 태스크를 쉽게 사용할 수 있는 래퍼 라이브러리입니다.
npm install @01works/mediapipe
import {
FaceLandmarkerTask,
TaskResult,
FaceLandmarkerResult,
TaskStatus,
} from '@01works/mediapipe'
// 얼굴 랜드마크 태스크 생성
const faceLandmarker = new FaceLandmarkerTask(
{
enableWebGPU: true, // WebGPU 사용 (기본값: false)
numFaces: 1, // 감지할 얼굴 수 (기본값: 1)
autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)
},
(result: TaskResult<FaceLandmarkerResult>) => {
// 결과 처리
if (result.data) {
console.log('얼굴 랜드마크:', result.data.faceLandmarks)
}
},
)
// 태스크 초기화 및 시작
try {
await faceLandmarker.initialize()
await faceLandmarker.initializeVideoStream('user') // 카메라 스트림 초기화
await faceLandmarker.start()
// 얼굴 감지 여부 확인
if (faceLandmarker.isFaceDetected()) {
console.log('얼굴이 감지되었습니다!')
}
// 특정 얼굴 부위 데이터 가져오기
const eyeData = faceLandmarker.getFeatureData('left_eye')
if (eyeData) {
console.log('왼쪽 눈 위치:', eyeData[0].position)
}
// 성능 정보 확인
const { fps, processingTime } = faceLandmarker.getPerformanceInfo()
console.log(
`FPS: ${fps.toFixed(1)}, 처리 시간: ${processingTime.toFixed(2)}ms`,
)
} catch (error) {
console.error('얼굴 랜드마크 오류:', error)
} finally {
// 사용 완료 후 정리
await faceLandmarker.dispose()
}
import {
FaceLandmarkerTask,
TaskResult,
FaceLandmarkerResult,
} from '@01works/mediapipe'
// 얼굴 랜드마크 태스크 생성 (자동 프레임 처리 비활성화)
const faceLandmarker = new FaceLandmarkerTask(
{
enableWebGPU: true,
numFaces: 1,
autoProcess: false, // 자동 프레임 처리 비활성화
},
(result: TaskResult<FaceLandmarkerResult>) => {
// 결과 콜백 (선택적)
},
)
// 태스크 초기화
await faceLandmarker.initialize()
// 이미지 요소에서 얼굴 감지
const image = document.getElementById('input-image') as HTMLImageElement
const result = await faceLandmarker.processSingleFrame(image)
if (result) {
console.log('감지된 얼굴:', result.faceLandmarks)
}
// 비디오 프레임 처리 (requestAnimationFrame 사용)
const video = document.getElementById('input-video') as HTMLVideoElement
const processVideoFrame = async () => {
if (video.readyState >= 2) {
const result = await faceLandmarker.processSingleFrame(video)
if (result) {
// 결과 처리
}
}
requestAnimationFrame(processVideoFrame)
}
requestAnimationFrame(processVideoFrame)
// 사용 완료 후 정리
await faceLandmarker.dispose()
import {
ImageSegmenterTask,
ImageSegmenterModelType,
TaskResult,
ImageSegmenterResult,
} from '@01works/mediapipe'
// 이미지 세그멘터 태스크 생성
const imageSegmenter = new ImageSegmenterTask(
{
modelType: ImageSegmenterModelType.SELFIE_SEGMENTER, // 모델 타입 (기본값: SELFIE_SEGMENTER)
enableWebGPU: true, // WebGPU 사용 (기본값: false)
autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)
},
(result: TaskResult<ImageSegmenterResult>) => {
// 결과 처리
if (result.data?.categoryMask) {
console.log('세그멘테이션 마스크 크기:', result.data.categoryMask.length)
}
},
)
// 태스크 초기화 및 시작
try {
await imageSegmenter.initialize()
await imageSegmenter.initializeVideoStream('user') // 카메라 스트림 초기화
await imageSegmenter.start()
// 마스크 처리 옵션 설정
imageSegmenter.setDefaultMaskOptions({
threshold: 0.5,
foregroundColor: 'rgba(255, 0, 0, 0.5)',
backgroundColor: 'rgba(0, 0, 0, 0)',
opacity: 0.7,
})
// 마스크 그리기
const maskCanvas = imageSegmenter.drawMask()
if (maskCanvas) {
document.body.appendChild(maskCanvas)
}
} catch (error) {
console.error('이미지 세그멘테이션 오류:', error)
} finally {
// 사용 완료 후 정리
await imageSegmenter.dispose()
}
import { ImageSegmenterTask, ImageSegmenterModelType } from '@01works/mediapipe'
// 이미지 세그멘터 태스크 생성 (자동 프레임 처리 비활성화)
const imageSegmenter = new ImageSegmenterTask({
modelType: ImageSegmenterModelType.SELFIE_SEGMENTER,
enableWebGPU: true,
autoProcess: false, // 자동 프레임 처리 비활성화
})
// 태스크 초기화
await imageSegmenter.initialize()
// 이미지 요소에서 세그멘테이션 수행
const image = document.getElementById('input-image') as HTMLImageElement
const result = await imageSegmenter.processSingleFrame(image)
if (result?.categoryMask) {
// 마스크 데이터 직접 처리
const imageData = imageSegmenter.processMaskData(
result.categoryMask,
result.width,
result.height,
(value, x, y, index) => {
// 각 픽셀에 대한 처리 로직
return value > 0.5
? { r: 255, g: 0, b: 0, a: 0.7 } // 전경
: { r: 0, g: 0, b: 0, a: 0 } // 배경
},
)
// 이미지 데이터를 캔버스에 그리기
const canvas = document.getElementById('output-canvas') as HTMLCanvasElement
const ctx = canvas.getContext('2d')
if (ctx) {
ctx.putImageData(imageData, 0, 0)
}
}
// 사용 완료 후 정리
await imageSegmenter.dispose()
import {
ObjectDetectorTask,
TaskResult,
ObjectDetectorResult,
} from '@01works/mediapipe'
// 객체 감지 태스크 생성
const objectDetector = new ObjectDetectorTask(
{
enableWebGPU: true, // WebGPU 사용 (기본값: false)
scoreThreshold: 0.5, // 감지 점수 임계값 (기본값: 0.5)
autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)
},
(result: TaskResult<ObjectDetectorResult>) => {
// 결과 처리
if (result.data) {
console.log('감지된 객체:', result.data.detections)
}
},
)
// 태스크 초기화 및 시작
try {
await objectDetector.initialize()
await objectDetector.initializeVideoStream('environment') // 후면 카메라 스트림 초기화
await objectDetector.start()
// 바운딩 박스 옵션 설정
objectDetector.setDefaultBoxOptions({
lineWidth: 3,
lineColor: 'green',
fillColor: 'rgba(0, 255, 0, 0.2)',
showLabels: true,
showScores: true,
})
// 바운딩 박스 그리기
objectDetector.drawBoundingBoxes()
// 특정 카테고리 필터링
const persons = objectDetector.filterByCategories(['person'])
console.log('감지된 사람 수:', persons.length)
// 높은 점수의 객체만 필터링
const highConfidenceObjects = objectDetector.filterByScore(0.8)
console.log('높은 신뢰도 객체 수:', highConfidenceObjects.length)
} catch (error) {
console.error('객체 감지 오류:', error)
} finally {
// 사용 완료 후 정리
await objectDetector.dispose()
}
import { ObjectDetectorTask } from '@01works/mediapipe'
// 객체 감지 태스크 생성 (자동 프레임 처리 비활성화)
const objectDetector = new ObjectDetectorTask({
enableWebGPU: true,
scoreThreshold: 0.5,
autoProcess: false, // 자동 프레임 처리 비활성화
})
// 태스크 초기화
await objectDetector.initialize()
// 이미지 요소에서 객체 감지
const image = document.getElementById('input-image') as HTMLImageElement
const result = await objectDetector.processSingleFrame(image)
if (result?.detections.length) {
console.log('감지된 객체:', result.detections)
// 특정 캔버스에 바운딩 박스 그리기
const canvas = document.getElementById('output-canvas') as HTMLCanvasElement
objectDetector.drawBoundingBoxes(canvas)
}
// 사용 완료 후 정리
await objectDetector.dispose()
모든 태스크는 에러 처리를 위한 메커니즘을 제공합니다:
try {
await faceLandmarker.initialize()
} catch (error) {
console.error('초기화 오류:', error)
}
// 또는 결과 콜백에서 에러 확인
faceLandmarker.setResultCallback((result) => {
if (result.error) {
console.error('처리 오류:', result.error)
return
}
// 정상 결과 처리
console.log('결과:', result.data)
})
태스크의 상태를 확인할 수 있습니다:
import { TaskStatus } from '@01works/mediapipe'
const status = faceLandmarker.getStatus()
if (status === TaskStatus.READY) {
console.log('태스크가 준비되었습니다.')
} else if (status === TaskStatus.ERROR) {
console.error('태스크 오류:', faceLandmarker.getError())
}
태스크의 성능을 모니터링할 수 있습니다:
// 현재 FPS 가져오기
const fps = faceLandmarker.getFPS()
console.log(`현재 FPS: ${fps.toFixed(1)}`)
// 프레임 처리 시간 가져오기
const processingTime = faceLandmarker.getFrameProcessingTime()
console.log(`프레임 처리 시간: ${processingTime.toFixed(2)}ms`)
// 성능 정보 한 번에 가져오기
const { fps, processingTime } = faceLandmarker.getPerformanceInfo()
태스크의 캔버스와 비디오 요소에 접근할 수 있습니다:
// 캔버스 가져오기
const canvas = faceLandmarker.getCanvas()
if (canvas) {
document.body.appendChild(canvas)
}
// 비디오 요소 가져오기
const video = faceLandmarker.getVideo()
비디오나 이미지를 캔버스에 그리는 방식을 설정할 수 있습니다:
faceLandmarker.setDrawOptions({
fit: 'cover', // 'cover', 'contain', 'fill' 중 하나
objectPosition: 'center', // 'center', 'top', 'bottom', 'left', 'right' 중 하나
})
태스크의 자동 프레임 처리 여부를 동적으로 변경할 수 있습니다:
// 자동 프레임 처리 비활성화
faceLandmarker.setAutoProcess(false)
// 자동 프레임 처리 활성화
faceLandmarker.setAutoProcess(true)
// 현재 자동 프레임 처리 상태 확인
const isAutoProcessing = faceLandmarker.isAutoProcessing()
모든 태스크는 사용 완료 후 반드시 정리해야 합니다:
await faceLandmarker.dispose()
MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
reactEnvironment{
"local_name": "react",
"alias": false,
"peer_metadata": null
} | ^19.0.0 | development |
@mediapipe/tasks-visionEnvironment{
"local_name": "@mediapipe/tasks-vision",
"alias": false,
"peer_metadata": null
} | ^0.10.21 | development |
reactEnvironment{
"local_name": "react",
"alias": false,
"peer_metadata": null
} | ^19.0.0 | peer |
@mediapipe/tasks-visionEnvironment{
"local_name": "@mediapipe/tasks-vision",
"alias": false,
"peer_metadata": null
} | ^0.10.21 | peer |
Source distribution
{
"shasum": "1ed3231a988808c88c237a351fe8bfb245fb4c91",
"tarball": "https://registry.npmjs.org/@01works/mediapipe/-/mediapipe-0.10.21-250328.2827.tgz",
"fileCount": 8,
"integrity": "sha512-0X7Ewaoa0yCEJph8CyjlPnbY5Y88b3vTRazW4xQ0CQavYopSL80p6J+W8+a4q3beoqpEYP9hnL2VhK8oVA4vhQ==",
"signatures": [
{
"sig": "MEYCIQCrc8aF7cJtdR0M35+HjcSiRF1o+0oT2FfMR64f+hqMPQIhAI+zCSZjp01iUpCTgPpf2oKRtni+v+wOzmz/6khG1e+5",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 65628
}Observed since 20 Oct, 21:59 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:80ee2940d715d09bc9fb6303141c19dc410bcdcb4ebd3ea147ce60351ba93e9b