Akka Actors, FFmpeg,GraphicsMagick, OpenCV와 OpenIMAJ 정책 모드를 사용하여 Scala에서 영상 분석
리포터에서 생성된 구조도
최초 출시: 2020년 5월 3일https://darnahsan.medium.com/video-analytics-in-scala-with-akka-actors-ffmpeg-graphicsmagick-opencv-and-openimaj-b12735336b27
이것은 매우 긴 게시물이 될 것이다.프로젝트의 배경을 알고 싶지 않으면 **설계* 섹션으로 이동하십시오.*
이것은 최근 6년 전에 내가 처음으로 스칼라를 쓴 것이다.당시에는 Ruby가 탈락할 것이라고 주장했다. 왜냐하면 Rails는 웹 개발 세계를 설정이 아닌 일반적인 궤도에 놓고 매력을 잃고 있기 때문이다.스칼라는 트위터가 최근 이 분야에 많은 스택 개발에 투입한 비교적 새로운 그룹이다.
6년 전에는 동영상 분석의 전체적인 아이디어가 상당히 뜨거웠다.내가 이 프로젝트를 시작했을 때,Azure는 심지어 클라우드 게이머도 아니었지만, 지금은 두 번째로 큰 게이머로 오각 빌딩의 수십억 달러의 클라우드 프로젝트에서AWS를 격파했다.전 세계 어디에서나 자체 랙을 실행하거나 전용 서버를 전 세계 어디에나 설치할 수 있습니다.운이는 우리가 오늘 알고 있는 구름이 아니다.그렇기 때문에 이것은 매우 어려운 임무인 것 같다. 이 작업을 어떻게 하는지에 대한 자원이 온라인에서 사용할 수 있는 것이 많지 않고 클라우드 컴퓨팅의 도구도 상업적 목적에 사용할 수 없고 이런 분석을 위한 소스 프로젝트도 없다.네가 찾을 수 있는 것은 단지 이 라이브러리를 사용하는 예시 항목들일 뿐이다.
젊은 개발자로서 이 업계에서 3년 이상의 경험이 있는 것은 상업 제품을 통해 대기업을 혼란시킬 수 있는 기회로 보인다.나는 그 프로젝트를 회고전이라고 명명했는데, 지금 돌이켜 보면 그 여정에 대한 회고이다.
루비 개발자로서 루비에서 이 점을 실현하고 싶었고 심지어 Github에서 ropencv라는 오픈 CV 바인딩을 찾았다.이것은 자원을 어떻게 사용하는지에 대한 정보가 부족하고, 사용 가능한 기능이 제한되어 있으며, OpenCV를 사용하는 경험이 제한되어 있습니다. 저는 ropencv를 사용하여 분류기를 실행하고, [PR18]의 미래 사용자에게 예시를 제공하려고 합니다.
hog 설명자 및 haar 캐스케이드 예제
#18
ahsandar
출시 날짜
이것들은 Hog 설명자와 Haar 레벨링의 예입니다. pppl은 그것들이 매우 유용하다는 것을 발견할 수 있습니다
View on GitHub
성능이 당신이 합리적인 시간 안에 동영상을 처리할 수 있는 표준에 이르지 못했다.다음 선택은 C/C++ 또는 JVM을 사용하는 것입니다.나는 지금까지 C++를 쓴 적이 없고, 나처럼 유한한 C를 즐겨 쓴 적이 없다.다른 한편, 자바는 괜찮은 절충 방안이지만, 루비 개발자로서, 자바의 샘플 파일은 현재 문제가 되고 있다.다른 언어를 탐색할 때, 나는 Groovy와 Scala로 범위를 좁혔다.스칼라가 배우에 대한 대대적인 지지로 이 일을 계속하기로 결정한 것은 여러 가지 임무를 완수하는 데 깊은 인상을 남긴 것 같다.다행히도 OpenCV는 자바 귀속을 생성하는 안내서가 있지만 다운로드하고 사용할 수 있는 안내서가 없습니다. 그래서 Github에서 누구나 사용할 수 있도록 귀속 원본을 만들 것입니다.
아산달
/
OpencvJavaLib
OpenCV 명령으로 컴파일된 자바 귀속, 32비트 64비트, 자바 7&8 Linux와 Mac OSX의 OpenCV
opencv java binding lib and jar for linux/osx 32 bit and 64 bit
Enough of the background over how, why and when this project was commenced, will come back to why it was never pursued with commercial intent and it never got worked upon in last 6 years and what are the takeaways from this project.
설계
Now over how the whole program works or how I designed for it to run and process gigabytes of files over a modest laptop HP Pavillion dm-3000ea with 16 GB of RAM in significantly less time then the total duration of videos .
Videos are nothing but a sequence of Images and that is what was the primary block of analysis. Each video was broken down to level of images. Each video to be processed was termed as Footage which was then broken down into chunks called Video, video was further broken down in to clips from which images were extracted for analysis. Each breakdown was configurable down to a minute. Assume you have a Footage of 1 hour then it could be broken down in to chunks of 15 mins of videos which would then be broken down to chunks of 5 mins clips and frame extracted out of each clip. The clips could be generated down to 1 minute interval for analysis.
As you can see the breakdown in the folder structure to better understand the basic unit of processing.
Each Footage was owned by an Akka Actor an amazing toolkit to build reactive and concurrent systems. So each Footage was assigned to a Footage Actor which would convert the footage in to chunks of Video where each video was owned by its own actor VideoActor, which was a child actor to FootageActor. The VidoeActor would convert each video to a clip and each clip in same manner was owned by a ClipActor that would be a child of the VideoActor. So one FootageActor can have many child VideoActor and each VideoActor can have many ClipActor. This made a hierarchy of worker each working in its own space and doing analysis per clip
The FFmpeg was used to create Video and Clip chunks from the Footage. It was simpler to use the CLI tool via scala then a Java library which was not feature complete. To run CLI commands through out the code I wrote a small helper class that helped in executing commands and capturing their outputs to know about success or errors.
package services;
import grizzled.slf4j.Logging;
import sys.process._;
import scala.collection.mutable.ListBuffer;
object CommandService {
private object Locker
val cmd: CommandService = new CommandService
def execute(command: String): String = {
//Locker.synchronized{
cmd << command
cmd.execute
cmd.outputLogAll
// }
}
}
class CommandService extends Logging {
var commands = new ListBuffer[String]
val out = new StringBuilder
val err = new StringBuilder
val outputLogger = ProcessLogger(
(o: String) => out.append(o),
(e: String) => err.append(e)
)
def this(command: String) {
this
commands+=(command)
}
def << (command: String) = commands+=(command)
def cmdNew = commands+= "&&"
def printCmd = info(createCommand)
def execute {
var command: String = createCommand
info(command)
command ! outputLogger
commands.clear
}
def createCommand = commands.mkString(" ")
def outputLog = outputLogger
def outputLogOut = out.mkString
def outputLogErr = err.mkString
def outputLogAll = f"$outputLogOut %n $outputLogErr"
def printStdOutput {
printStdOut
printStdErr
}
def printStdOut {
info("output start")
info(out.mkString(""))
info("output end")
}
def printStdErr {
info("error start")
info(err.mkString(""))
info("error end")
}
}
일단 우리가 기본적인 처리 단원이 생기면 추출된 프레임에 대해 이미지 처리를 할 차례가 된다.모든 프로세스는 참여자가 병렬로 실행하기 때문에 설계에 임의의 프로세서를 추가할 수 있습니다.열도를 생성하기 전에 병행하여 진행하는 주요 과정은 다음과 같다.배경 빼기
OpenCV는 배경 빼기로 사용됩니다.프레임마다 배경을 빼서 프레임마다 변화를 식별합니다.이는 영상 속의 모든 운동을 식별하는 데 도움이 되고 물체가 차지하는 특정 구역과 지속 시간을 지시하여 실내와 실외 위치의 열도를 만들 수 있다.
연결 구성 요소
배경에서 뺀 그림에서 연결된 구성 요소를 계산하기 위해 OpenCV를 처음 시도했지만 문제가 있고 분할 오류가 발생했습니다.OpenIMAJ는 또 다른 위대한 이미지 분석 라이브러리를 사용했는데 그 결과는 사람들의 상호작용의 활동 위치를 식별하기에 충분하다.
등급 분류 분류기
오늘날 식별 분류기는 이미 장족의 발전을 이루었다.TensorFlow 등 도구 패키지를 사용하여 대상 식별 프로그램을 구축하는 것은 매우 간단하다.OpenCV는 당시 두 개의 기본 분류기가 있었는데, 함께 운행할 때 대상을 잘 식별하고 이상값과 결합한 결과를 거부했다.
열도
이것은 내가 가장 좋아하는 전체적인 기능이자 실내외 영상 중의 핫이슈 구역을 식별하는 최초의 용례이다.이것은 마치 매력과 같다. 그것은 모든 배경 감법을 바탕으로 출력하는 기능 중 가장 정확할 수도 있다.
모든 프로세서가 실행된 후에 다음 작업은 각 편집의 결과를 축적하고 그것들을 영상과 영상 수준에 따라 조합하는 것이다.이것도 배우를 통해 완성된 것이다.누적기 배우는 각 편집의 결과를 합쳐서 영상 배우에게 보낸다. 영상 배우도 이렇게 한다. 각 영상은 누적기 배우를 운행한 후에 영상 배우에게 보낸다.
이 모든 것은 아크카의 전략 모델로 이루어진 것이다.나도 이 프로젝트의 경험을 공유하여 쌓여 넘치는 문제에 대한 대답으로 삼았다
아크카의 전략 모델
2015년 2월 5일
평론
정답: 2
6
이것은 나의 이전 문제How do I get around type erasure on Akka receive method의 연장이다
나는 내가 처리해야 할 사건에서 10가지 종류의 사건을 확장했다.
나는 단독trait에서 모든 사건의 업무 논리를 실현하고 싶다. 왜냐하면 모든 것을 혼합했기 때문이다.
Open Full Question
case class EventOperation[T <: Event](eventType: T)
class OperationActor extends Actor {
def receive = {
case EventOperation(eventType) => eventType.execute
}
}
trait Event {
def execute //implement execute in specific event class
}
class Event1 extends Event {/*execute implemented with business logic*/}
class Event2 extends Event {/*execute implemented with business logic*/}
이것은 거의 전체 회고 항목의 총결이다.그 후 내가 스칼라를 포기한 이유는 스칼라 3을 하고 있었기 때문이다. 파이톤 3이 곧 다가온다.그 밖에 지역사회 자체도 분열되어 서로를 실망시키려는 시도는 신입생들에게 좋은 환영 체험이 아니다.스칼라 클럽에 새로 온 사람이 있다고 여겨질 수 있는 위대한 사람들이 있지만, 나에게는 이 길이 이 프로젝트를 끝냈다.
goes 프로젝트는 수요 때문에 상업화될 기회가 없다. 이것은 사람들이 영상 분석의 중요성을 이해하기 전의 일일 것이다.
그럼에도 불구하고 이 프로젝트는 나로 하여금 많은 도전을 깨닫게 했고 나에게 이러한 도전을 해결할 기회를 주었다.이것은 나로 하여금 반응식 병발 시스템에서 일한 경험을 가지게 했다.오늘날 시간의 추이에 따라 대상을 식별할 수 있는 프로젝트를 만드는 것은 식은 죽 먹기지만 어떻게 천메가바이트의 영상에서 이 점을 실현할 수 있는지는 이 프로젝트가 나의 모델이 되는 것이지 영상의 다른 대상 표식자만이 아니다.
언젠가, 나는 원본 코드를 Github에 놓을 수도 있지만, 지금, 만약 당신이 무엇을 배웠거나 그것을 읽는 것을 좋아한다면, 비슷한 예를 들어 보십시오.
case class EventOperation[T <: Event](eventType: T)
class OperationActor extends Actor {
def receive = {
case EventOperation(eventType) => eventType.execute
}
}
trait Event {
def execute //implement execute in specific event class
}
class Event1 extends Event {/*execute implemented with business logic*/}
class Event2 extends Event {/*execute implemented with business logic*/}
Reference
이 문제에 관하여(Akka Actors, FFmpeg,GraphicsMagick, OpenCV와 OpenIMAJ 정책 모드를 사용하여 Scala에서 영상 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/darnahsan/video-analytics-in-scala-with-akka-actors-ffmpeg-graphicsmagick-opencv-and-openimaj-2b71텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)