1. Image labeling
- 이전에 수집한 데이터 中 "american-sign-language-dataset" 사용하여 labeling
- labeling 방법
: https://github.com/tzutalin/labelImg
: 위의 github을 참고하여 labelling하는 tool 사용
: 숫자 0~9, 알파벳 a~f 각각 700개 image 총 25,200개 data를 labeling 하였다
2. 프로젝트 분석
: trained 된 model을 어떻게 웹상에 올릴 수 있는지 파악하기 위해 각자 프로젝트를 조사, 발표하였다.
1. 김연수
1-1. Flask + Darkflow
: https://github.com/rohitner/flask-yolo/blob/master/server.py
: 우리 팀의 3월 중순까지의 목표와 가장 잘 맞는 프로젝트라고 생각한다.
: Webcam 이용
: DarkFlow 이용 - 코드를 보면 어떻게 우리 프로젝트에 적용하면 될 지 알 수 있음
: BUT, 딱 Demo 버전에만 맞는 프로젝트
* 추가적으로 predict한 글자 stack을 어떻게 쌓을 건지 고민할 필요 있음
* 위 프로젝트에서 관심있게 본 코드
-darkflow 모델 넣는 법
from darkflow.net.build import TFNet
app =
Flask(__name__)
options = {"model": "/home/rohitner/tensorflow/darkflow/cfg/tiny yolo-
voc.cfg",
"load": "/home/rohitner/tensorflow/darkflow/bin/tiny-yolo voc.
weights",
"threshold": 0.1, "gpu": 0.8}
tfnet = TFNet(options)
-상자 표시 + 예측 label 출력
while True:
success, img = camera.read()
results = tfnet.return_predict(img)
for result in results:
cv2.rectangle(img,
(result["topleft"]["x"], result["topleft"]["y"]),
(result["bottomright"]["x"],
result["bottomright"]["y"]),
(255, 0, 0), 4)
text_x, text_y = result["topleft"]["x"] - 10, result["topleft"]["y"] - 10
cv2.putText(img, result["label"], (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)
- webcam에서 받아오기
@app.route('/video_feed')
def video_feed():
cam = cv2.VideoCapture(0)
# cam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)
return Response(gen(cam),mimetype='multipart/x-mixedreplace;boundary=frame')
1-2. Tensorflow.js + Yolo v3
: https://github.com/shaqian/tfjs-yolo
: 웹 구성이 깔끔하고 귀엽다
: 추후 발전 단계에서 웹 공부와 병행할때 이 코드를 참고하면 좋을 것 같다
* Yolo v3, 즉 Darknet이다
* Tensorflow.js 사용 --> 느리다는 단점
1-3. Django + Darkflow
: https://github.com/qwerty1434/Person_Reocognition/
: 별로다.
: 이 프로젝트에 관한 설명글
https://qwerty1434.github.io/yolo%EC%9E%91%EC%97%85
1-4. 추가적으로 우리 프로젝트에 쓸만한 것들 정리
1-4.1 Detect한 결과를 txt 파일로 변환
1-4.2 Darkflow를 python application에서 사용할때
1-4.3 Json 포맷으로 만드는 법
2. 손수현
2-1. Web상에 이미 올려진 Model의 retraining에 대한 분석
https://niceman.tistory.com/193?category=1009824
: 소스코드가 존재해서 필요한 부분만 뽑아 올 수 있을 것 같다
: RESTful API를 기반으로 한 architecture을 기반으로 토이 프로젝트 진행
: RandomForest Classification을 활용한 Google House Number Predictor을 기반으로 웹에서 업 로드한 이미지에 표시된 숫자를 예측하는
: Flask 사용
* Flask
- 경량화 된 웹 framework
- ML, DL trained Model에 access
: 프론트부분은 일반 웹개발과 유사하게 적절한 프레임워크 사용 함
: 백부분이 중요 !
- 모델의 retrain이 이루어지는 부분
- 새로운 data에 대해 강화된 모델을 추출, 결과값을 웹 환경에서 사용자에게 제공
: 전제척인 단계
- 데이터 전처리 --> 학습 --> 모델 추출 --> 모델 재생성 --> 서비스
- interactive한 서비스 가능
: model.py로 data를 이용하여 model을 train --> 이건 매우 간단.
: 하지만 이제, 이 model은 새롭게 발생하는 데이터에 대해 일정한 주기 형태로 다시 알고리즘을 사용해 재학습, 새로운 모델을 사용하는 서비스를 제공할 수 있어야 한다.
: 코드를 보니, ML 학습 서비스를 모듈화 한 후 Flask에서 요청시 재학습/학습 결과를 return해주는 부분을 수정해 줌
: (scheduler 사용하지 않고) RestAPI로 사용자가 언제든지 요청할 경우 기존 모델 백업 후 새로운 모델을 생성해 줌
2-2. [YOLO - darkflow] YOLO와 Python을 이용한 object detection (2) - image detection
: https://reyrei.tistory.com/17
: CPU 사용
: 이전에 Yolo 실행시 사용한 weight 파일 그대로 사용함
-openCV, darkflow, matplotlib import
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'svg'
- *.cfg와 *.weight 의 이름은 yolo로 통일하는 것을 권장한다고 함
- cuDNN, CUDA 오류로 CPU에서 실행하기 위한 주석처리
options = {
'model' : 'cfg/yolo.cfg',
'load' : 'bin/yolo.weights',
'threshold' : 0.3,
# 'gpu' : 1.0
}
tfnet = TFNet(options)
-image 로드, 객체 예측
img = cv2.imread('doge.jpg', cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
result = tfnet.return_predict(img)
img.shape
-바운딩 박스 생성, labeling
t1 = (result[0]['topleft']['x'], result[0]['topleft']['y'])
br = (result[0]['bottomright']['x'], result[0]['bottomright']['y'])
label = result[0]['label']
img = cv2.rectangle(img, t1, br, (0, 255, 0), 7)
img = cv2.putText(img, label, t1, cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,0), 2)
plt.imshow(img)
plt.show()
3. 서현주
3-1. darknet을 서버처럼 사용하는 방법
: https://github.com/AlexeyAB/darknet/issues/2969
3-2. Darknet+flask
--> Docker in Kubernetes 이용해서 배포
4. 신지영
4-1. python에서 darkflow 사용하기
: https://github.com/thtrieu/darkflow
from darkflow.net.build import TFNet
import cv2
options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
tfnet = TFNet(options)
imgcv = cv2.imread("./sample_img/sample_dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)
: ❗️Please note that return_predict(img) must take an numpy.ndarray.
return_predict(img)전에 이미지가 미리 로드되어 있어야 함. 파일 경로를 넘기는 것은 작동하지 않음.
return_predict(img) 의 결과는 리스트 형태의 딕셔너리로 반환.
4-2. django with yolo v3
: https://github.com/tranleanh/Yolov3-Django-Streaming
: 영상 https://www.youtube.com/watch?v=SDnpNd7xRbE
4-3. React로 구현한 yolo with tensorflow.js
예시 : https://z364noozrm.codesandbox.io/
구현코드링크: https://codesandbox.io/s/z364noozrm
// 패키지 JSON
{
"name": "tensorflowjs-real-time-object-detection",
"version": "1.0.0",
"description": "",
"keywords": [],
"main": "src/index.js",
"dependencies": {
"@tensorflow-models/coco-ssd": "0.1.1",
"@tensorflow/tfjs": "0.14.0",
"react": "16.5.2",
"react-dom": "16.5.2",
"react-magic-dropzone": "1.0.1",
"react-scripts": "2.0.3"
},
"devDependencies": {},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"]
}
4-4. 구글 codelab 에 있는 tensorflow.js 예시
: https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/#0
: yolo 사용은 안하고 knn 알고리즘 사용한 프로젝트인데 만약에 tensorflow.js 쓰게 되면 처음 뼈대 잡기 좋을 것 같다.
const classifier = knnClassifier.create();
const webcamElement = document.getElementById('webcam');
let net;
async function app() {
console.log('Loading mobilenet..');
// Load the model.
net = await mobilenet.load();
console.log('Successfully loaded model');
// Create an object from Tensorflow.js data API which could capture image
// from the web camera as Tensor.
const webcam = await tf.data.webcam(webcamElement);
// Reads an image from the webcam and associates it with a specific class
// index.
const addExample = async classId => {
// Capture an image from the web camera.
const img = await webcam.capture();
// Get the intermediate activation of MobileNet 'conv_preds' and pass that
// to the KNN classifier.
const activation = net.infer(img, 'conv_preds');
// Pass the intermediate activation to the classifier.
classifier.addExample(activation, classId);
// Dispose the tensor to release the memory.
img.dispose();
};
// When clicking a button, add an example for that class.
document.getElementById('class-a').addEventListener('click', () => addExample(0));
document.getElementById('class-b').addEventListener('click', () => addExample(1));
document.getElementById('class-c').addEventListener('click', () => addExample(2));
while (true) {
if (classifier.getNumClasses() > 0) {
const img = await webcam.capture();
// Get the activation from mobilenet from the webcam.
const activation = net.infer(img, 'conv_preds');
// Get the most likely class and confidences from the classifier module.
const result = await classifier.predictClass(activation);
const classes = ['A', 'B', 'C'];
document.getElementById('console').innerText = `
prediction: ${classes[result.label]}\n
probability: ${result.confidences[result.label]}
`;
// Dispose the tensor to release the memory.
img.dispose();
}
await tf.nextFrame();
}
}
app();
4-5. 구글이 제공하는 teachable machine
- 앞으로 1~2주 동안은 labeling한 data를 이용하여 model training을 할 예정이다
'Team Project > 핸들랭(handlang)' 카테고리의 다른 글
flask(플라스크) + darkflow YOLO/GCP로 트레이닝한 모델 테스트해보기/ajax활용한 웹 (3) | 2020.03.08 |
---|---|
프로젝트 진행 상황 + 2/1까지 할 일 (0) | 2020.02.24 |
프로젝트 실습기록 및 데이터수집 (0) | 2020.01.16 |
19/12/28 ~ 20/1/4 회의록, 일지 (0) | 2020.01.11 |
Welcome to Codelabs!(Tensorflow codelab 5, 6 따라해보기) (0) | 2019.11.25 |
댓글