본문 바로가기
Team Project/핸들랭(handlang)

Image labeling 및 Yolo darkflow/darknet관련 프로젝트 분석

by SSHyun 2020. 2. 2.

1. Image labeling

- 이전에 수집한 데이터 中 "american-sign-language-dataset"  사용하여 labeling

- labeling 방법

  : https://github.com/tzutalin/labelImg

 

tzutalin/labelImg

🖍️ LabelImg is a graphical image annotation tool and label object bounding boxes in images - tzutalin/labelImg

github.com

: 위의 github을 참고하여 labelling하는 tool 사용

Anaconda prompt 가상환경 내에서 labeling

 : 숫자 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

 

rohitner/flask-yolo

Flask app to run YOLO on webcam. Contribute to rohitner/flask-yolo development by creating an account on GitHub.

github.com

        : 우리 팀의 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

 

shaqian/tfjs-yolo

YOLO v3 and Tiny YOLO v1, v2, v3 with Tensorflow.js - shaqian/tfjs-yolo

github.com

     : 웹 구성이 깔끔하고 귀엽다

     : 추후 발전 단계에서 웹 공부와 병행할때 이 코드를 참고하면 좋을 것 같다

     * Yolo v3, 즉 Darknet이다

     * Tensorflow.js 사용 --> 느리다는 단점

 

 1-3. Django + Darkflow

     : https://github.com/qwerty1434/Person_Reocognition/

 

qwerty1434/Person_Reocognition

Contribute to qwerty1434/Person_Reocognition development by creating an account on GitHub.

github.com

     : 별로다.

     : 이 프로젝트에 관한 설명글

    https://qwerty1434.github.io/yolo%EC%9E%91%EC%97%85

 

yolo

def show @widget = Widget(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @widget } end end 참조 : https://jekyllrb-ko.github.io/docs/posts/ 출처 - 원리(Yolo에 대해서,스시봇에 대해서) - 작업내용(무슨작업했는지,코드설명) - 사용방법 -느낀점

qwerty1434.github.io

 

 1-4. 추가적으로 우리 프로젝트에 쓸만한 것들 정리

 1-4.1 Detect한 결과를 txt 파일로 변환

      : https://stackoverflow.com/questions/56426672/when-i-using-yolo-v3-how-can-i-save-detected-object-name-with-txt-file

 

When I using YOLO V3, how can i save detected object name with .txt file?

I am first using YOLO V3 for my project. I had finished testing detecting dog. horse... etc. But I only got images result. I want to get detected object's name as txt file. For Example, I tested do...

stackoverflow.com

 

 1-4.2 Darkflow를 python application에서 사용할때

 

 1-4.3 Json 포맷으로 만드는 법

 

2. 손수현

 2-1. Web상에 이미 올려진 Model의 retraining에 대한 분석

  https://niceman.tistory.com/193?category=1009824

 

Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(2)

파이썬(Python) Flask - ML & DL RESTFul API 지난 포스팅에 이어서 Flask 머신러닝 서비스 프로젝트를 완성해보겠습니다. 이번 내용의 핵심은 머신러닝 학습 서비스를 모듈화 한 후 플라스크에서 요청 시 재 학습..

niceman.tistory.com

 : 소스코드가 존재해서 필요한 부분만 뽑아 올 수 있을 것 같다

 : RESTful API를 기반으로 한 architecture을 기반으로 토이 프로젝트 진행

 : RandomForest Classification을 활용한 Google House Number Predictor을 기반으로 웹에서 업 로드한 이미지에 표시된 숫자를 예측하는

출처:  https://medium.com/@dvelsner/deploying-a-simple-machine-learning-model-in-a-modern-web-application-flask-angular-docker-a657db075280

 : 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

 

[YOLO - darkflow] YOLO와 Python을 이용한 object detection (2) - image detection

※ 본 포스팅은 darkflow 유투브(https://www.youtube.com/watch?v=fSM6cdFQdwI)를 기반으로 작성되었습니다. ※ Windows 10 x64 환경을 사용하고 있습니다. 0. 환경설정 및 darkflow 설치 : 2019/04/19 - [Labora..

reyrei.tistory.com

     : 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

 

Deploy Custom Trained Weights with Web Application · Issue #2969 · AlexeyAB/darknet

Hi, i'm still a beginner in darknet. I've trained my own weights and i have doubts on how to implement it on web application because i just know how to execute the detection on the command ...

github.com

darknet will work as server
html에서 불러오기

 3-2. Darknet+flask

     : https://medium.com/analytics-vidhya/object-detection-using-yolo-v3-and-deploying-it-on-docker-and-minikube-c1192e81ae7a

 

Object Detection using YOLO_v3 and Deploying it on Docker and Minikube

I have heard about Yolo Many times but never tried it. Today I wanted to give it a try and see how it perfoms on images. As I am already…

medium.com

cfg & weight 파일 불러오기

                       --> Docker in Kubernetes 이용해서 배포

 

 

4. 신지영

4-1. python에서 darkflow 사용하기

      : https://github.com/thtrieu/darkflow

 

thtrieu/darkflow

Translate darknet to tensorflow. Load trained weights, retrain/fine-tune using tensorflow, export constant graph def to mobile devices - thtrieu/darkflow

github.com

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

 

tranleanh/Yolov3-Django-Streaming

This project is to stream an object detection module (Yolo v3) with 2 cameras (2 channels) on a web browser using Django. - tranleanh/Yolov3-Django-Streaming

github.com

   : 영상 https://www.youtube.com/watch?v=SDnpNd7xRbE

 

4-3. React로 구현한 yolo with tensorflow.js

    예시 : https://z364noozrm.codesandbox.io/

    구현코드링크: https://codesandbox.io/s/z364noozrm

 

TensorFlow.js Real-Time Object Detection - CodeSandbox

TensorFlow.js Real-Time Object Detection by bourdakos1 using @tensorflow-models/coco-ssd, @tensorflow/tfjs, react, react-dom, react-magic-dropzone, react-scripts

codesandbox.io

 

// 패키지 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

 

TensorFlow.js Transfer Learning Image Classifier

In this codelab, you will learn how to build a simple "teachable machine", a custom image classifier that you will train on the fly in the browser using TensorFlow.js, a powerful and flexible machine learning library for Javascript. You will first load and

codelabs.developers.google.com

    : 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

    : https://teachablemachine.withgoogle.com/?fbclid=IwAR2y1juwJUpJ6rcHbcy4RkjAP1paKrFagfCyHR3399fhobUOuTAQGMe7nsk

 

Teachable Machine

Train a computer to recognize your own images, sounds, & poses. A fast, easy way to create machine learning models for your sites, apps, and more – no expertise or coding required.

teachablemachine.withgoogle.com

teachable machine 사용할때의 화면

 


- 앞으로 1~2주 동안은 labeling한 data를 이용하여 model training을 할 예정이다

댓글