Python 3 는 Dlib 19.7 을 이용 하여 카메라 의 얼굴 인식 을 실현 하 는 방법
python 개발 을 이용 하여 Dlib 라 이브 러 리 를 통 해 카메라 에 있 는 사람의 얼굴 을 포착 하고 사람의 얼굴 특징 을 추출 하 며 오 씨 거 리 를 계산 하여 미리 저 장 된 사람의 얼굴 특징 과 비교 하여 사람의 얼굴 인식 목적 을 달성 합 니 다.
자동 으로 카메라 에서 사람의 얼굴 사진 을 파 서 로 컬 에 저장 한 다음 에 미리 설 치 된 사람의 얼굴 특징 을 추출 할 수 있다.
파 낸/기 존의 동일 한 사람의 얼굴 사진 여러 장 에 따라 128 D 특징 치 를 추출 한 다음 에 해당 사람의 128 D 특징 평균 치 를 계산한다.
그리고 카메라 에서 실시 간 으로 얻 은 사람의 얼굴 에서 추출 한 특징 치 와 오 씨 거 리 를 계산 하여 같은 사람의 얼굴 인지 아 닌 지 를 판정한다.
얼굴 인식/face recognition 의 설명:
위 키 백과 얼굴 인식 시스템/face recognition system 에 대한 설명:theywork by comparing selected facial features from given image with faces within a database.
이 프로젝트 는 미리 설 치 된 사람의 얼굴 특징 과 카메라 가 실시 간 으로 얻 은 사람의 얼굴 특징 을 비교 하 는 것 이다.
핵심 은 128 D 얼굴 특징 을 추출 한 뒤 카메라 얼굴 특징 과 미리 설 치 된 특징 얼굴의 유럽식 거 리 를 계산 해 비교 하 는 것 이다.
효 과 는 다음 과 같 습 니 다.person 미리 설 정 된 얼굴/다른 사람 은 미리 설 정 된 얼굴 디 프 가 아 닙 니 다):
그림 1 카메라 얼굴 인식 효과 gif
1.전체 절차
먼저 하인 얼굴 검 측(face detection)과 얼굴 인식(face recognition)을 말한다.전 자 는 등장 경 에서 사람의 얼굴 을 검 측 하 는 목적 을 달성 하면 된다.후 자 는 사람의 얼굴 을 검 측 해 야 할 뿐만 아니 라 기 존의 얼굴 데이터 와 비교 하여 데이터 베이스 에 있 는 지,아니면 신분 표시 와 같은 처 리 를 해 야 한다.얼굴 검사 와 얼굴 인식 두 가 지 는 가끔 헷 갈 릴 수 있다.
제 이전 프로젝트 들 은 모두 dlib 로 얼굴 을 검 측 했 습 니 다.이 프로젝트 가 실현 하고 자 하 는 기능 은 얼굴 인식 기능 입 니 다.dlib 홈 페이지 에서 face 를 빌 렸 습 니 다.recognition.py 이 루틴(link:http://dlib.net/face_recognition.py.html);
핵심 은"dlib"를 이용 하 는 것 입 니 다.face_recognition_resnet_model_v1.dat'라 는 model 은 사람의 얼굴 이미지 의 128 D 특징 을 추출 한 다음 에 서로 다른 사람의 얼굴 이미지 의 128 D 특징 보다 한도 값 을 설정 하여 오 씨 거 리 를 계산 하여 같은 얼굴 인지 아 닌 지 를 판단 한다.
# face recognition model, the object maps human faces into 128D vectors
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
shape = predictor(img, dets[0])
face_descriptor = facerec.compute_face_descriptor(img, shape)
그림 2 전체적인 디자인 절차
2.소스 코드 소개
주로
2.1get_face_from_camera.py/XXX 얼굴 데이터 수집 구축
얼굴 인식 은 추출 한 이미지 데이터 와 기 존 이미지 데 이 터 를 비교 분석 해 야 하기 때문에 이 py 파일 이 실현 하 는 기능 은 XXX 를 구축 하 는 얼굴 데 이 터 를 수집 하 는 것 이다.
프로그램 은 호출 된 카메라 가 실시 간 으로 가 져 온 그림 을 표시 하 는 창 을 생 성 합 니 다(카메라 호출 방식 은 제 다른 블 로그 https://www.jb51.net/article/135512.htm 을 참고 할 수 있 습 니 다).
s 키 를 누 르 면 현재 동 영상 흐름 에 있 는 사람의 얼굴 이미 지 를 저장 할 수 있 습 니 다.저 장 된 경 로 는 path 입 니 다.save = “xxxx/get_from_camera/"규정;
q 키 를 누 르 면 창 을 종료 합 니 다.
카메라 의 호출 은 opencv 라 이브 러 리 의 cv2.VideoCapture(0)를 이용 하 는 것 입 니 다.이 매개 변 수 는 0 으로 노트북 의 기본 카 메 라 를 호출 하 는 것 을 의미 합 니 다.기 존 비디오 파일 에 호출 할 수도 있 습 니 다.
그림 3 getface_from_camera.py 의 인터페이스
그러면 pathsave 가 지정 한 디 렉 터 리 에서 캡 처 한 사람의 얼굴 얻 기;
그림 4 포 획 된 한 무리의 얼굴
원본 코드 는 다음 과 같 습 니 다.
# 2018-5-11
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie
import dlib # dlib
import numpy as np # numpy
import cv2 # OpenCv
# dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# cv2
cap = cv2.VideoCapture(0)
# cap.set(propId, value)
# ,propId ,value
cap.set(3, 480)
# screenshoot
cnt_ss = 0
#
cnt_p = 0
#
path_save = "F:/code/python/P_dlib_face_reco/data/get_from_camera/"
# cap.isOpened() true/false
while cap.isOpened():
# cap.read()
# :
# true/false, /
# , q
flag, im_rd = cap.read()
# 1ms, 0
kk = cv2.waitKey(1)
#
img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
# rects
rects = detector(img_gray, 0)
# print(len(rects))
#
font = cv2.FONT_HERSHEY_SIMPLEX
if (len(rects) != 0):
#
#
for k, d in enumerate(rects):
#
# (x,y), ( width, height)
pos_start = tuple([d.left(), d.top()])
pos_end = tuple([d.right(), d.bottom()])
#
height = d.bottom() - d.top()
width = d.right() - d.left()
#
im_blank = np.zeros((height, width, 3), np.uint8)
im_rd = cv2.rectangle(im_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2)
im_blank = np.zeros((height, width, 3), np.uint8)
#
if (kk == ord('s')):
cnt_p += 1
for ii in range(height):
for jj in range(width):
im_blank[ii][jj] = im_rd[d.top() + ii][d.left() + jj]
print(path_save + "img_face_" + str(cnt_p) + ".jpg")
cv2.imwrite(path_save + "img_face_" + str(cnt_p) + ".jpg", im_blank)
cv2.putText(im_rd, "faces: " + str(len(rects)), (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
else:
#
cv2.putText(im_rd, "no face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
#
im_rd = cv2.putText(im_rd, "s: save face", (20, 400), font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
im_rd = cv2.putText(im_rd, "q: quit", (20, 450), font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
# q
if (kk == ord('q')):
break
#
cv2.imshow("camera", im_rd)
#
cap.release()
#
cv2.destroyAllWindows()
2.2get_features_into_CSV.py/추출 특징 을 CSV 에 저장 합 니 다.이미 XXX 의 얼굴 이미 지 를 얻 었 으 니 지금 은 그의 얼굴 특징 을 추출 해 야 한다.
여기 dlib 라 이브 러 리 의 face recognition model 얼굴 인식 모델 을 빌 립 니 다.
# face recognition model, the object maps human faces into 128D vectors
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
# detector to find the faces
detector = dlib.get_frontal_face_detector()
# shape predictor to find the face landmarks
predictor = dlib.shape_predictor("shape_predictor_5_face_landmarks.dat")
#
img = io.imread(path_img)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dets = detector(img_gray, 1)
shape = predictor(img_gray, dets[0])
face_descriptor = facerec.compute_face_descriptor(img_gray, shape)
우 리 는 어떤 그림 에 대해,face 를 볼 수 있다.descriptor 의 출력 결과:녹색 상자 안 은 128 D 특징 을 되 돌려 주 는 함수 입 니 다.
빨간색 상자 에서 이 함 수 를 호출 하여 img 를 계산 합 니 다.face_13.jpg;
노란색 상자 의 출력 이 128 D 인 벡터 를 볼 수 있 습 니 다.
그림 5 는 한 장의 그림 의 128 D 특징의 계산 결 과 를 되 돌려 준다.
그래서 우 리 는 path 를save 에 있 는 그림 을 대량으로 특징 계산 한 다음 CSV 에 기록 합 니 다(write 를 이용 하여into_CSV 함수),내 csv 의 이름 은 defaultperson.csv;
줄 수(얼굴 수)*128 열의 특징 CSV 를 얻 을 수 있 습 니 다.
이것 은 누군가의 얼굴 특징 입 니 다.그리고 128 D 특징의 평균 값 을 계산 하여 mean(coptute 이용)을 구 합 니 다.the_평균 함수
실행 중인 출력 결과,이 128 D 의 특징 값 은 default 입 니 다.person 의 특징;
즉,우리 가 내장/미리 설 치 된 얼굴 은 나중에 카메라 가 잡 은 얼굴 을 가 져 와 이 특징 치 와 비교 하여 얼굴 인식 처 리 를 해 야 한다.
[-0.030892765492592986, 0.13333227054068916, 0.054221574805284799, -0.050820438289328626, -0.056331159841073189, 0.0039378538311116004, -0.044465327145237675, -0.13096490031794497, 0.14215188983239627, -0.084465635842398593, 0.34389359700052363, -0.062936659118062566, -0.24372901571424385, -0.13270603316394905, -0.0472818422866495, 0.15475224742763921, -0.24415240554433121, -0.11213862150907516, 0.032288033417180964, 0.023676671577911628, 0.098508275653186594, -0.010117797634417289, 0.0048202000815715448, -0.014808513420192819, -0.060100053486071135, -0.34934839135722112, -0.095795629448012301, -0.050788544706608117, 0.032316677762489567, -0.099673464894294739, -0.080181991975558434, 0.096361607705291952, -0.1823408101734362, -0.045472671817007815, -0.0066827326326778062, 0.047393877549391041, -0.038414973079373964, -0.039067085930391363, 0.15961966781239761, 0.0092458106136243598, -0.16182226570029007, 0.026322136191945327, -0.0039144184832510193, 0.2492692768573761, 0.19180528427425184, 0.022950534855848866, -0.019220497949342979, -0.15331173021542399, 0.047744840089427795, -0.17038608616904208, 0.026140184680882254, 0.19366614363695445, 0.066497623724372762, 0.07038829416820877, -0.0549700813073861, -0.11961311768544347, -0.032121153940495695, 0.083507449611237169, -0.14934051350543373, 0.011458799806668571, 0.10686114273573223, -0.10744074888919529, -0.04377919611962218, -0.11030520381111848, 0.20804878441910996, 0.093076545941202266, -0.11621182490336268, -0.1991656830436305, 0.10751579348978244, -0.11251544991606161, -0.12237925866716787, 0.058218707869711672, -0.15829276019021085, -0.17670038891466042, -0.2718416170070046, 0.034569320955166689, 0.30443575821424784, 0.061833358712886512, -0.19622498672259481, 0.011373612000361868, -0.050225612756453063, -0.036157087079788507, 0.12961127491373764, 0.13962576616751521, -0.0074232793168017737, 0.020964263007044792, -0.11185114399382942, 0.012502493042694894, 0.17834208513561048, -0.072658227462517586, -0.041312719401168194, 0.25095899873658228, -0.056628625839948654, 0.10285118379090961, 0.046701753217923012, 0.042323612264896691, 0.0036216247826814651, 0.066720707440062574, -0.16388990533979317, -0.0193739396421925, 0.027835704435251261, -0.086023958105789985, -0.05472404568603164, 0.14802298341926776, -0.10644183582381199, 0.098863413851512108, 0.00061285014778963834, 0.062096107555063146, 0.051960245755157973, -0.099548895108072383, -0.058173993112225285, -0.065454461562790375, 0.14721672511414477, -0.25363486848379435, 0.20384312381869868, 0.16890435312923632, 0.097537552447695477, 0.087824966562421697, 0.091438713434495431, 0.093809676797766431, -0.034379941362299417, -0.085149037210564868, -0.24900743130006289, 0.021165960517368819, 0.076710369830068792, -0.0061752907196549996, 0.028413473285342519, -0.029983982541843465]
원본 코드:
# 2018-5-11
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie
# return_128d_features() 128d
# write_into_csv() csv
# compute_the_mean() csv 128d ,
import cv2
import os
import dlib
from skimage import io
import csv
import numpy as np
import pandas as pd
path_pics = "F:/code/python/P_dlib_face_reco/data/get_from_camera/"
path_csv = "F:/code/python/P_dlib_face_reco/data/csvs/"
# detector to find the faces
detector = dlib.get_frontal_face_detector()
# shape predictor to find the face landmarks
predictor = dlib.shape_predictor("shape_predictor_5_face_landmarks.dat")
# face recognition model, the object maps human faces into 128D vectors
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
# 128D
def return_128d_features(path_img):
img = io.imread(path_img)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dets = detector(img_gray, 1)
if(len(dets)!=0):
shape = predictor(img_gray, dets[0])
face_descriptor = facerec.compute_face_descriptor(img_gray, shape)
else:
face_descriptor = 0
print("no face")
# print(face_descriptor)
return face_descriptor
#return_128d_features(path_pics+"img_face_13.jpg")
# , csv
# input:
# path_pics:
# path_csv: csv
def write_into_csv(path_pics ,path_csv):
dir_pics = os.listdir(path_pics)
with open(path_csv, "w", newline="") as csvfile:
writer = csv.writer(csvfile)
for i in range(len(dir_pics)):
# return_128d_features() 128d
print(path_pics+dir_pics[i])
features_128d = return_128d_features(path_pics+dir_pics[i])
# print(features_128d)
#
if features_128d==0:
i += 1
else:
writer.writerow(features_128d)
#write_into_csv(path_pics, path_csv+"default_person.csv")
path_csv_rd = "F:/code/python/P_dlib_face_reco/data/csvs/default_person.csv"
# csv , 128d
def compute_the_mean(path_csv_rd):
column_names = []
for i in range(128):
column_names.append("features_" + str(i + 1))
rd = pd.read_csv(path_csv_rd, names=column_names)
# 128
feature_mean = []
for i in range(128):
tmp_arr = rd["features_"+str(i+1)]
tmp_arr = np.array(tmp_arr)
#
tmp_mean = np.mean(tmp_arr)
feature_mean.append(tmp_mean)
print(feature_mean)
return feature_mean
compute_the_mean(path_csv_rd)
2.3 face_reco_from_camera.py/실시 간 얼굴 인식 비교 분석이 py 는 카 메 라 를 호출 하여 카메라 에 있 는 사람의 얼굴 을 포착 한 다음 에 사람의 얼굴 이 감지 되면 카메라 에 있 는 사람의 얼굴 을 128 D 의 특징 을 추출 한 다음 에 미리 설 치 된 defaultperson 의 128 D 특징 은 유럽식 거 리 를 계산 하고 비교적 작 으 면 한 사람 으로 판정 할 수 있 으 며 그렇지 않 으 면 한 사람 이 아니다.
오 씨 거리 대비 한도 값 설정,returneuclidean_distance 함수 의 dist 변수;
내 가 여기 있 는 프로그램 에서 지정 한 것 은 0.4 이 고 구체 적 인 한도 값 은 실제 상황 이나 측정 결과 에 따라 수정 할 수 있다.
원본 코드:
# 2018-5-11
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie
import dlib # dlib
import numpy as np # numpy
import cv2 # OpenCv
# face recognition model, the object maps human faces into 128D vectors
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
#
def return_euclidean_distance(feature_1,feature_2):
feature_1 = np.array(feature_1)
feature_2 = np.array(feature_2)
dist = np.sqrt(np.sum(np.square(feature_1 - feature_2)))
print(dist)
if dist > 0.4:
return "diff"
else:
return "same"
features_mean_default_person = [-0.030892765492592986, 0.13333227054068916, 0.054221574805284799, -0.050820438289328626, -0.056331159841073189, 0.0039378538311116004, -0.044465327145237675, -0.13096490031794497, 0.14215188983239627, -0.084465635842398593, 0.34389359700052363, -0.062936659118062566, -0.24372901571424385, -0.13270603316394905, -0.0472818422866495, 0.15475224742763921, -0.24415240554433121, -0.11213862150907516, 0.032288033417180964, 0.023676671577911628, 0.098508275653186594, -0.010117797634417289, 0.0048202000815715448, -0.014808513420192819, -0.060100053486071135, -0.34934839135722112, -0.095795629448012301, -0.050788544706608117, 0.032316677762489567, -0.099673464894294739, -0.080181991975558434, 0.096361607705291952, -0.1823408101734362, -0.045472671817007815, -0.0066827326326778062, 0.047393877549391041, -0.038414973079373964, -0.039067085930391363, 0.15961966781239761, 0.0092458106136243598, -0.16182226570029007, 0.026322136191945327, -0.0039144184832510193, 0.2492692768573761, 0.19180528427425184, 0.022950534855848866, -0.019220497949342979, -0.15331173021542399, 0.047744840089427795, -0.17038608616904208, 0.026140184680882254, 0.19366614363695445, 0.066497623724372762, 0.07038829416820877, -0.0549700813073861, -0.11961311768544347, -0.032121153940495695, 0.083507449611237169, -0.14934051350543373, 0.011458799806668571, 0.10686114273573223, -0.10744074888919529, -0.04377919611962218, -0.11030520381111848, 0.20804878441910996, 0.093076545941202266, -0.11621182490336268, -0.1991656830436305, 0.10751579348978244, -0.11251544991606161, -0.12237925866716787, 0.058218707869711672, -0.15829276019021085, -0.17670038891466042, -0.2718416170070046, 0.034569320955166689, 0.30443575821424784, 0.061833358712886512, -0.19622498672259481, 0.011373612000361868, -0.050225612756453063, -0.036157087079788507, 0.12961127491373764, 0.13962576616751521, -0.0074232793168017737, 0.020964263007044792, -0.11185114399382942, 0.012502493042694894, 0.17834208513561048, -0.072658227462517586, -0.041312719401168194, 0.25095899873658228, -0.056628625839948654, 0.10285118379090961, 0.046701753217923012, 0.042323612264896691, 0.0036216247826814651, 0.066720707440062574, -0.16388990533979317, -0.0193739396421925, 0.027835704435251261, -0.086023958105789985, -0.05472404568603164, 0.14802298341926776, -0.10644183582381199, 0.098863413851512108, 0.00061285014778963834, 0.062096107555063146, 0.051960245755157973, -0.099548895108072383, -0.058173993112225285, -0.065454461562790375, 0.14721672511414477, -0.25363486848379435, 0.20384312381869868, 0.16890435312923632, 0.097537552447695477, 0.087824966562421697, 0.091438713434495431, 0.093809676797766431, -0.034379941362299417, -0.085149037210564868, -0.24900743130006289, 0.021165960517368819, 0.076710369830068792, -0.0061752907196549996, 0.028413473285342519, -0.029983982541843465]
# dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# cv2
cap = cv2.VideoCapture(0)
# cap.set(propId, value)
# ,propId ,value
cap.set(3, 480)
def get_128d_features(img_gray):
dets = detector(img_gray, 1)
if (len(dets) != 0):
shape = predictor(img_gray, dets[0])
face_descriptor = facerec.compute_face_descriptor(img_gray, shape)
else:
face_descriptor=0
return face_descriptor
# cap.isOpened() true/false
while (cap.isOpened()):
# cap.read()
# :
# true/false, /
# ,
flag, im_rd = cap.read()
# 1ms, 0
kk = cv2.waitKey(1)
#
img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
# rects
rects = detector(img_gray, 0)
# print(len(rects))
#
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(im_rd, "q: quit", (20, 400), font, 0.8, (0, 255, 255), 1, cv2.LINE_AA)
if (len(rects) != 0):
#
#
features_rd = get_128d_features(im_rd)
compare = return_euclidean_distance(features_rd, features_mean_default_person)
im_rd = cv2.putText(im_rd, compare.replace("same", "default_person"), (20, 350), font, 0.8, (0, 255, 255), 1, cv2.LINE_AA)
#
for k, d in enumerate(rects):
#
im_rd = cv2.rectangle(im_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2)
cv2.putText(im_rd, "faces: " + str(len(rects)), (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
else:
#
cv2.putText(im_rd, "no face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
# q
if (kk == ord('q')):
break
#
cv2.imshow("camera", im_rd)
#
cap.release()
#
cv2.destroyAllWindows()
실시 간 출력 결과:그림 6 실시 간 으로 출력 된 오 씨 거리 결과
실시 간 출력 결 과 를 통 해 비교적 뚜렷하게 볼 수 있다.
녹색 부분 출력:나 자신(즉,추출 특징 을 분석 한 defaultperson)시 계 산 된 유럽식 거 리 는 기본적으로 0.2 정도 이다.
빨간색 부분 출력:그림 을 바 꾸 면 트럼프 와 같이 유럽식 거리 계산 결과 가 0.8 에 달 하 는 것 을 뚜렷하게 볼 수 있다.이때 판정 할 수 있다.나중에 이 얼굴 은 우리 가 미리 설정 한 얼굴 이 아니다.
그래서 앞서 언급 한 유럽식 거리 계산 대비 의 한도 값 은 이 를 통 해 설정 할 수 있 고 본 프로젝트 에서 얻 은 것 은 0.4 이다.
3.총화
그 전에 그 카메라 의 얼굴 검 측 에 이 어 쓴 것 이지 만 지금까지 끌 고 와 서 업 데 이 트 했 습 니 다.쓴 것 도 비교적 거 칠 고 구체 적 인 수요 와 응용 장면 을 수정 할 수 있 습 니 다.어떤 문제 가 있 으 면 메 시 지 를 남기 거나 직접 메 일 을 보 낼 수 있 습 니 다.미안 하 다
핵심 은 사람의 얼굴 특징 을 추출 한 다음 에 유럽식 거리 와 미리 설 치 된 특징 얼굴 을 계산 하여 비교 하 는 것 이다.
그러나 이 실시 간 으로 카메라 의 얼굴 을 비교 하고 실시 간 으로 카메라 얼굴의 특징 치 를 계산 한 다음 에 오 씨 거 리 를 계산 해 야 하기 때문에 계 산 량 이 비교적 많 고 카메라 영상 흐름 이 끊 길 수 있다.
\#내 GitHub 에 코드 가 올 라 왔 습 니 다.도움 이 된다 면 스타 아래:https://github.com/coneypo/Dlib_face_recognition_from_camera
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
#2_Raspberry Pi 3B+에서 LINE에 일기 예보 알림도쿄에 와서 갑자기 비가 오는 경우가 많습니다. "아침 제대로 일기 예보를 체크해 두면..."라고 후회하는 것이 자주. LINE에 매일 아침 일기 예보를 보내 주시면 좋지 않아? 라고 생각하고 만들어 보기로 했습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.