Created wrapper for object detector, refactored code, generalized Object Tracking tests
This commit is contained in:
parent
372a6ed3b7
commit
8ecbc781eb
12
.classpath
12
.classpath
|
@ -7,13 +7,9 @@
|
|||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-9">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="lib" path="/home/dpapp/lib/Jama-1.0.3.jar" sourcepath="/home/dpapp/lib/Jama">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/OpenCV-3.4.0">
|
||||
|
@ -26,11 +22,5 @@
|
|||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
|
||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
||||
|
|
6
.project
6
.project
|
@ -10,14 +10,8 @@
|
|||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
|
|
868777
TensorFlow/graph.pbtxt
868777
TensorFlow/graph.pbtxt
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +0,0 @@
|
|||
item {
|
||||
id: 1
|
||||
name: 'ironOre'
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
49
pom.xml
49
pom.xml
|
@ -16,10 +16,47 @@
|
|||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.tensorflow</groupId>
|
||||
<artifactId>tensorflow</artifactId>
|
||||
<version>1.5.0-rc0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependency>
|
||||
<groupId>org.tensorflow</groupId>
|
||||
<artifactId>libtensorflow</artifactId>
|
||||
<version>1.5.0-rc1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.tensorflow</groupId>
|
||||
<artifactId>libtensorflow_jni_gpu</artifactId>
|
||||
<version>1.5.0-rc1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.0.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>5.0.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
<version>4.12.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-launcher</artifactId>
|
||||
<version>1.0.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-runner</artifactId>
|
||||
<version>1.0.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
|
@ -7,7 +7,6 @@ import java.nio.file.Files;
|
|||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
|
|
@ -52,63 +52,34 @@ public class IronMiner {
|
|||
|
||||
DetectedObject closestIronOre = getClosestObjectToCharacter(ironOres);
|
||||
if (closestIronOre != null) {
|
||||
System.out.println("Found iron ore! Starting tracking!");
|
||||
Tracker objectTracker = TrackerBoosting.create();
|
||||
Rect2d boundingBox = closestIronOre.getBoundingRect2d();
|
||||
objectTracker.init(getMatFromBufferedImage(screenCapture), boundingBox);
|
||||
ObjectTracker ironOreTracker = new ObjectTracker(screenCapture, boundingBox);
|
||||
|
||||
//cursor.moveAndLeftClickAtCoordinatesWithRandomness(closestIronOre.getCenterForClicking(), 10, 10);
|
||||
cursor.moveAndLeftClickAtCoordinatesWithRandomness(closestIronOre.getCenterForClicking(), 10, 10);
|
||||
|
||||
long mineStartTime = System.currentTimeMillis();
|
||||
long miningStartTime = System.currentTimeMillis();
|
||||
int maxTimeToMine = randomizer.nextGaussianWithinRange(3500, 5000);
|
||||
|
||||
// track until either we lose the object or too much time passes
|
||||
int lostTrackCounter = 0;
|
||||
//while (((System.currentTimeMillis() - mineStartTime) < maxTimeToMine) && lostTrackCounter < 3) {
|
||||
while (lostTrackCounter < 600) {
|
||||
|
||||
//screenCapture = objectDetector.captureScreenshotGameWindow();
|
||||
detectedObjects = objectDetector.getObjectsInImage(screenCapture, 0.3); // Call with lower threshold value here
|
||||
/*
|
||||
* 600 iterations: 30 seconds
|
||||
boolean ok = objectTracker.update(getMatFromBufferedImage(screenCapture), boundingBox);
|
||||
if (!ok) {
|
||||
System.out.println("Lost track for + " + lostTrackCounter + "! Finding new ore soon.");
|
||||
lostTrackCounter++;
|
||||
}
|
||||
else if (!objectDetector.isObjectPresentInBoundingBoxInImage(detectedObjects, boundingBox, "ironOre")) {
|
||||
System.out.println("Can't find object in bounding box. Error " + lostTrackCounter + "! Finding new ore soon.");
|
||||
lostTrackCounter++;
|
||||
}
|
||||
else if (ok) {
|
||||
//lostTrackCounter = 0;
|
||||
System.out.println("Tracking at " + boundingBox.x + ", " + boundingBox.y + ", " + boundingBox.width + ", " + boundingBox.height);
|
||||
}*/
|
||||
System.out.println(lostTrackCounter);
|
||||
lostTrackCounter++;
|
||||
boolean objectTrackingFailure = false;
|
||||
while (!objectTrackingFailure && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) {
|
||||
screenCapture = objectDetector.captureScreenshotGameWindow();
|
||||
objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox);
|
||||
}
|
||||
System.out.println("600 iterations took " + (System.currentTimeMillis() - mineStartTime));
|
||||
break;
|
||||
}
|
||||
|
||||
//dropInventoryIfFull();
|
||||
|
||||
dropInventoryIfFull();
|
||||
}
|
||||
}
|
||||
|
||||
private void dropInventoryIfFull() throws Exception {
|
||||
inventory.update(); // TODO: add iron ore to indonventory items
|
||||
inventory.update();
|
||||
if (inventory.isInventoryFull()) {
|
||||
cursorTask.optimizedDropAllItemsInInventory(cursor, inventory);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void mineClosestIronOre(ArrayList<DetectedObject> ironOres) throws Exception {
|
||||
DetectedObject closestIronOre = getClosestObjectToCharacter(ironOres);
|
||||
if (closestIronOre != null) {
|
||||
cursor.moveAndLeftClickAtCoordinatesWithRandomness(closestIronOre.getCenterForClicking(), 10, 10);
|
||||
Thread.sleep(randomizer.nextGaussianWithinRange(IRON_ORE_MINING_TIME_MILLISECONDS - 350, IRON_ORE_MINING_TIME_MILLISECONDS + 1850));
|
||||
}
|
||||
private boolean isTimeElapsedOverLimit(long startTime, int timeLimit) {
|
||||
return (System.currentTimeMillis() - startTime) > timeLimit;
|
||||
}
|
||||
|
||||
private DetectedObject getClosestObjectToCharacter(ArrayList<DetectedObject> detectedObjects) {
|
||||
|
@ -128,7 +99,7 @@ public class IronMiner {
|
|||
return null;
|
||||
}
|
||||
|
||||
private Mat getMatFromBufferedImage(BufferedImage image) {
|
||||
/*private Mat getMatFromBufferedImage(BufferedImage image) {
|
||||
BufferedImage formattedImage = convertBufferedImage(image, BufferedImage.TYPE_3BYTE_BGR);
|
||||
byte[] data = ((DataBufferByte) formattedImage.getData().getDataBuffer()).getData();
|
||||
bgr2rgb(data);
|
||||
|
@ -152,7 +123,7 @@ public class IronMiner {
|
|||
data[i] = data[i + 2];
|
||||
data[i + 2] = tmp;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
public int getDistanceBetweenPoints(Point startingPoint, Point goalPoint) {
|
||||
return (int) (Math.hypot(goalPoint.x - startingPoint.x, goalPoint.y - startingPoint.y));
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
import java.awt.AWTException;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Robot;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
public class MirrorDisplay extends JPanel{
|
||||
|
||||
private BufferedImage image;
|
||||
|
||||
public MirrorDisplay() {
|
||||
try {
|
||||
Robot robot = new Robot();
|
||||
image = robot.createScreenCapture(new Rectangle(0, 0, 500, 500));
|
||||
} catch (AWTException ex) {
|
||||
Logger.getLogger(MirrorDisplay.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
g.drawImage(image, 0, 0, null);
|
||||
|
||||
}
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
|
||||
JFrame test = new JFrame();
|
||||
|
||||
while (true) {
|
||||
test.add(new MirrorDisplay());
|
||||
Dimension b = new Dimension(500,500);
|
||||
test.setMinimumSize(b);
|
||||
|
||||
test.setVisible(true);
|
||||
Thread.sleep(50);
|
||||
test.dispose();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -49,27 +49,17 @@ public class ObjectDetector {
|
|||
Robot robot;
|
||||
|
||||
public ObjectDetector() throws AWTException {
|
||||
this.model = SavedModelBundle.load("/home/dpapp/tensorflow-1.5.0/models/raccoon_dataset/results/checkpoint_56749/saved_model/", "serve");
|
||||
this.model = SavedModelBundle.load(Paths.TENSORFLOW_MODEL_DIRECTORY, "serve");
|
||||
this.robot = new Robot();
|
||||
}
|
||||
|
||||
public void update() throws Exception {
|
||||
// TODO: eliminate IO and pass BufferedImage directly.
|
||||
/*String fileName = "/home/dpapp/Desktop/RunescapeAI/temp/screenshot.jpg";
|
||||
BufferedImage image = captureScreenshotGameWindow();
|
||||
ImageIO.write(image, "jpg", new File(fileName));
|
||||
this.detectedObjects = getRecognizedObjectsFromImage(fileName);*/
|
||||
}
|
||||
}
|
||||
|
||||
// Goal: reduce this to < 50 ms
|
||||
public ArrayList<DetectedObject> getObjectsInImage(BufferedImage image, double scoreThreshold) throws Exception {
|
||||
List<Tensor<?>> outputs = null;
|
||||
ArrayList<DetectedObject> detectedObjectsInImage = new ArrayList<DetectedObject>();
|
||||
|
||||
long timebefore = System.currentTimeMillis();
|
||||
makeImageTensor(image);
|
||||
System.out.println("Conversion took: " + (System.currentTimeMillis() - timebefore));
|
||||
try (Tensor<UInt8> input = makeImageTensor(image)) {
|
||||
long timebefore2 = System.currentTimeMillis();
|
||||
outputs =
|
||||
model
|
||||
.session()
|
||||
|
@ -79,7 +69,6 @@ public class ObjectDetector {
|
|||
.fetch("detection_classes")
|
||||
.fetch("detection_boxes")
|
||||
.run();
|
||||
System.out.println("Model took: " + (System.currentTimeMillis() - timebefore));
|
||||
}
|
||||
|
||||
try (Tensor<Float> scoresT = outputs.get(0).expect(Float.class);
|
||||
|
@ -100,17 +89,11 @@ public class ObjectDetector {
|
|||
return detectedObjectsInImage;
|
||||
}
|
||||
|
||||
/*public boolean isObjectPresentInBoundingBoxInImage(BufferedImage image, Rect2d boundingBox, String objectClass) throws Exception {
|
||||
BufferedImage subImage = image.getSubimage((int) boundingBox.x, (int) boundingBox.y, (int) boundingBox.width, (int) boundingBox.height);
|
||||
ArrayList<DetectedObject> detectedObjectsInSubImage = getObjectsInImage(subImage);
|
||||
return (getObjectsOfClassInList(detectedObjectsInSubImage, objectClass).size() != 0);
|
||||
}*/
|
||||
|
||||
// This is too slow -> running object detection each time reduces the framerate to 3fps, which messses up object tracking
|
||||
public boolean isObjectPresentInBoundingBoxInImage(ArrayList<DetectedObject> detectedObjects, Rect2d boundingBox, String objectClass) throws Exception {
|
||||
for (DetectedObject detectedObject : detectedObjects) {
|
||||
if (detectedObject.getDetectionClass().equals(objectClass)) {
|
||||
//System.out.println(("Required bounding box: " + (int) boundingBox.x + ", " + (int) boundingBox.y + ", " + (int) boundingBox.width + ", " + (int) boundingBox.height));
|
||||
//System.out.println(("Detected bounding box: " + (int) detectedObject.getBoundingRect2d().x + ", " + (int) detectedObject.getBoundingRect2d().y + ", " + (int) detectedObject.getBoundingRect2d().width + ", " + (int) detectedObject.getBoundingRect2d().height) + "\n");
|
||||
if ((Math.abs(detectedObject.getBoundingRect2d().x - boundingBox.x) < 10) &&
|
||||
(Math.abs(detectedObject.getBoundingRect2d().y - boundingBox.y) < 10) &&
|
||||
(Math.abs(detectedObject.getBoundingRect2d().width - boundingBox.width) < 10) &&
|
||||
|
@ -136,8 +119,6 @@ public class ObjectDetector {
|
|||
BufferedImage formattedImage = convertBufferedImage(image, BufferedImage.TYPE_3BYTE_BGR);
|
||||
byte[] data = ((DataBufferByte) formattedImage.getData().getDataBuffer()).getData();
|
||||
bgr2rgb(data);
|
||||
|
||||
// BufferedImage and ImageIO.read() seems to produce BGR-encoded images, but the model expects RGB.
|
||||
final long BATCH_SIZE = 1;
|
||||
final long CHANNELS = 3;
|
||||
long[] shape = new long[] {BATCH_SIZE, formattedImage.getHeight(), formattedImage.getWidth(), CHANNELS};
|
||||
|
@ -159,9 +140,4 @@ public class ObjectDetector {
|
|||
data[i + 2] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
public BufferedImage captureScreenshotGameWindow() throws IOException, AWTException {
|
||||
Rectangle area = new Rectangle(Constants.GAME_WINDOW_OFFSET_X, Constants.GAME_WINDOW_OFFSET_Y, Constants.GAME_WINDOW_WIDTH, Constants.GAME_WINDOW_HEIGHT);
|
||||
return robot.createScreenCapture(area);
|
||||
}
|
||||
}
|
|
@ -1,17 +1,50 @@
|
|||
import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.Rect2d;
|
||||
import org.opencv.tracking.Tracker;
|
||||
import org.opencv.tracking.TrackerKCF;
|
||||
import org.opencv.tracking.TrackerBoosting;
|
||||
|
||||
public class ObjectTracker {
|
||||
|
||||
Rectangle boundingBox;
|
||||
public ObjectTracker() {
|
||||
/*this.boundingBox = boundingBox;
|
||||
Tracker tracker = TrackerKCF.create();
|
||||
tracker.init(image, boundingBox);*/
|
||||
|
||||
Tracker objectTracker;
|
||||
private int numberOfFramesLostFor;
|
||||
|
||||
public ObjectTracker(BufferedImage image, Rect2d boundingBox) {
|
||||
this.objectTracker = TrackerBoosting.create();
|
||||
this.objectTracker.init(bufferedImageTomat(image), boundingBox);
|
||||
this.numberOfFramesLostFor = 0;
|
||||
}
|
||||
|
||||
public ObjectTracker(Mat image, Rect2d boundingBox) {
|
||||
this.objectTracker = TrackerBoosting.create();
|
||||
this.objectTracker.init(image, boundingBox);
|
||||
this.numberOfFramesLostFor = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean update(BufferedImage image, Rect2d boundingBox) {
|
||||
boolean trackingSuccessful = objectTracker.update(bufferedImageToMat(image), boundingBox);
|
||||
updateNumberOfFramesLostFor(trackingSuccessful);
|
||||
return isObjectTrackingFailure();
|
||||
}
|
||||
|
||||
public boolean update(Mat image, Rect2d boundingBox) {
|
||||
boolean trackingSuccessful = objectTracker.update(image, boundingBox);
|
||||
updateNumberOfFramesLostFor(trackingSuccessful);
|
||||
return isObjectTrackingFailure();
|
||||
}
|
||||
|
||||
private void updateNumberOfFramesLostFor(boolean trackingSuccessful) {
|
||||
if (trackingSuccessful) {
|
||||
numberOfFramesLostFor = 0;
|
||||
}
|
||||
else {
|
||||
numberOfFramesLostFor++;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isObjectTrackingFailure() {
|
||||
return numberOfFramesLostFor > 3;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
import java.awt.AWTException;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Robot;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.Rect2d;
|
||||
import org.opencv.tracking.Tracker;
|
||||
import org.opencv.tracking.TrackerBoosting;
|
||||
import org.opencv.videoio.VideoCapture;
|
||||
|
||||
public class ObjectTrackerSpeedTest {
|
||||
|
||||
static Robot robot;
|
||||
// Screen capture: 6.5 ms (tested on 10,000 frames)
|
||||
// Object tracker: 15 ms (tested on 4000 frames)
|
||||
|
||||
public static void main(String[] args) throws AWTException, IOException {
|
||||
// TODO Auto-generated method stub
|
||||
robot = new Robot();
|
||||
//System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
Tracker tracker = TrackerBoosting.create();
|
||||
Rect2d boundingBox = new Rect2d(405, 177, 38, 38);
|
||||
//Mat image =
|
||||
//tracker.init(image, boundingBox);
|
||||
|
||||
|
||||
/*long startTime = System.currentTimeMillis();
|
||||
int limit = 10000;
|
||||
for (int i = 0; i < limit; i++) {
|
||||
BufferedImage screencapture = captureScreenshotGameWindow();
|
||||
if (i % 100 == 0) {
|
||||
System.out.println(i);
|
||||
}
|
||||
}*/
|
||||
|
||||
int limit = 0;
|
||||
VideoCapture video = new VideoCapture("/home/dpapp/Videos/gameplay-2018-02-23_11.50.00.mp4");
|
||||
Mat frame = new Mat();
|
||||
boolean frameReadSuccess = video.read(frame);
|
||||
|
||||
tracker.init(frame, boundingBox);
|
||||
|
||||
long totalTime = 0;
|
||||
while (video.read(frame)) {
|
||||
long startTimeUpdate = System.currentTimeMillis();
|
||||
tracker.update(frame, boundingBox);
|
||||
totalTime += (System.currentTimeMillis() - startTimeUpdate);
|
||||
limit++;
|
||||
if (limit % 100 == 0) {
|
||||
System.out.println(limit);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
System.out.println(limit + " frames took " + (totalTime) / 1000 + " seconds.");
|
||||
System.out.println("FPS:" + limit * 1.0 / (totalTime / 1000.0));
|
||||
System.out.println(totalTime * 1.0 / limit);
|
||||
}
|
||||
|
||||
|
||||
public static BufferedImage captureScreenshotGameWindow() throws IOException, AWTException {
|
||||
Rectangle area = new Rectangle(Constants.GAME_WINDOW_OFFSET_X, Constants.GAME_WINDOW_OFFSET_Y, Constants.GAME_WINDOW_WIDTH, Constants.GAME_WINDOW_HEIGHT);
|
||||
return robot.createScreenCapture(area);
|
||||
}
|
||||
}
|
|
@ -14,22 +14,39 @@ import org.junit.jupiter.api.Test;
|
|||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfByte;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.core.Rect2d;
|
||||
import org.opencv.core.Scalar;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
import org.opencv.tracking.Tracker;
|
||||
import org.opencv.tracking.TrackerKCF;
|
||||
import org.opencv.tracking.TrackerMIL;
|
||||
import org.opencv.tracking.TrackerBoosting;
|
||||
import org.opencv.tracking.TrackerGOTURN;
|
||||
import org.opencv.tracking.TrackerMedianFlow;
|
||||
import org.opencv.videoio.VideoCapture;
|
||||
|
||||
class ObjectTrackerTest {
|
||||
|
||||
|
||||
@Test
|
||||
void testObjectTracking() throws Exception {
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
VideoCapture video = new VideoCapture("/home/dpapp/Videos/gameplay-2018-02-24_14.24.53.mp4");
|
||||
System.out.println("loaded video...");
|
||||
void testObjectTrackingWithAllVideosInDirectory() {
|
||||
String videoDirectory = "/home/dpapp/Videos/";
|
||||
for (File video : getListOfFilesFromDirectory(videoDirectory)) {
|
||||
if (video.isFile()) {
|
||||
testObjectTrackingInVideo(videoDirectory, video.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public File[] getListOfFilesFromDirectory(String videoDirectoryPath) {
|
||||
File videoDirectory = new File(videoDirectoryPath);
|
||||
return videoDirectory.listFiles();
|
||||
}
|
||||
|
||||
void testObjectTrackingInVideo(String videoDirectory, String videoFileName) throws Exception {
|
||||
VideoCapture video = new VideoCapture(videoDirectory + videoFileName);
|
||||
|
||||
ObjectDetector objectDetector = new ObjectDetector();
|
||||
|
||||
|
@ -37,74 +54,34 @@ class ObjectTrackerTest {
|
|||
boolean frameReadSuccess = video.read(frame);
|
||||
assertTrue(frameReadSuccess);
|
||||
|
||||
ArrayList<DetectedObject> detectedObjects = objectDetector.getObjectsInImage(Mat2BufferedImage(frame), 0.60);
|
||||
ArrayList<DetectedObject> detectedObjects = objectDetector.getObjectsInImage(Mat2BufferedImage(frame), 0.80);
|
||||
System.out.println("Tracking " + detectedObjects.size() + " objects.");
|
||||
|
||||
ArrayList<Tracker> objectTrackers = new ArrayList<Tracker>();
|
||||
ArrayList<ObjectTracker> objectTrackers = new ArrayList<ObjectTracker>();
|
||||
ArrayList<Rect2d> boundingBoxes = new ArrayList<Rect2d>();
|
||||
|
||||
for (int i = 0; i < detectedObjects.size(); i++) {
|
||||
boundingBoxes.add(detectedObjects.get(i).getBoundingRect2d());
|
||||
objectTrackers.add(TrackerBoosting.create());
|
||||
objectTrackers.get(i).init(frame, boundingBoxes.get(i));
|
||||
objectTrackers.add(new ObjectTracker(frame, detectedObjects.get(i).getBoundingRect2d()));
|
||||
}
|
||||
//System.out.println("bounding box: " + (int) boundingBoxes.get(0).x + ", " + (int) boundingBoxes.get(0).y + ", " + (int) boundingBoxes.get(0).width + ", " + (int) boundingBoxes.get(0).height);
|
||||
|
||||
int counter = 0;
|
||||
while (video.read(frame)) {
|
||||
BufferedImage screencapture = Mat2BufferedImage(frame);
|
||||
detectedObjects = objectDetector.getObjectsInImage(screencapture, 0.3);
|
||||
|
||||
//Graphics g = screencapture.getGraphics();
|
||||
for (int i = 0; i < objectTrackers.size(); i++) {
|
||||
objectTrackers.get(i).update(frame, boundingBoxes.get(i));
|
||||
boolean trackingSuccess = objectTrackers.get(i).update(frame, boundingBoxes.get(i));
|
||||
|
||||
//System.out.println(detectedObjects.size());
|
||||
//System.out.println((int) boundingBoxes.get(i).x + ", " + (int) boundingBoxes.get(i).y + ", " + (int) boundingBoxes.get(i).width + ", " + (int) boundingBoxes.get(i).height);
|
||||
//BufferedImage subImage = screencapture.getSubimage((int) boundingBoxes.get(i).x- 10, (int) boundingBoxes.get(i).y - 10, (int) boundingBoxes.get(i).width + 20, (int) boundingBoxes.get(i).height + 20);
|
||||
|
||||
boolean ironOreDetected = objectDetector.isObjectPresentInBoundingBoxInImage(detectedObjects, boundingBoxes.get(i), "ironOre");
|
||||
boolean oreDetected = objectDetector.isObjectPresentInBoundingBoxInImage(detectedObjects, boundingBoxes.get(i), "ore");
|
||||
|
||||
Graphics g = screencapture.getGraphics();
|
||||
if (ironOreDetected) {
|
||||
g.setColor(Color.GREEN);
|
||||
}
|
||||
else if (oreDetected) {
|
||||
g.setColor(Color.RED);
|
||||
}
|
||||
else {
|
||||
g.setColor(Color.WHITE);
|
||||
}
|
||||
g.drawRect((int) boundingBoxes.get(i).x, (int) boundingBoxes.get(i).y, (int) boundingBoxes.get(i).width, (int) boundingBoxes.get(i).height);
|
||||
|
||||
//ImageIO.write(subImage, "jpg", new File("/home/dpapp/Videos/sub_frames/frame_" + counter + "_sub.jpg"));
|
||||
//System.out.println("wrote file...");
|
||||
/*if (i == ) {
|
||||
System.out.println(trackingSuccess + ", ironOre: " + ironOreDetected + ", ore:" + oreDetected);
|
||||
}*/
|
||||
|
||||
assertTrue(trackingSuccess);
|
||||
|
||||
g.drawRect((int) boundingBoxes.get(i).x, (int) boundingBoxes.get(i).y, (int) boundingBoxes.get(i).width, (int) boundingBoxes.get(i).height);
|
||||
}
|
||||
System.out.println("Wrote image...");
|
||||
ImageIO.write(screencapture, "jpg", new File("/home/dpapp/Videos/frames/frame_" + counter + ".jpg"));
|
||||
ImageIO.write(screencapture, "jpg", new File(videoDirectory + "/frame_" + videoFileName + counter + ".jpg"));
|
||||
counter++;
|
||||
}
|
||||
|
||||
/*Tracker objectTracker = TrackerKCF.create();
|
||||
Rect2d boundingBox = new Rect2d(405, 177, 38, 38);
|
||||
|
||||
int counter = 0;
|
||||
objectTracker.init(frame, boundingBox);
|
||||
while (video.read(frame) && counter < 200) {
|
||||
boolean trackingSuccess = objectTracker.update(frame, boundingBox);
|
||||
BufferedImage screencapture = Mat2BufferedImage(frame);
|
||||
boolean ironOreDetected = objectDetector.isObjectPresentInBoundingBoxInImage(screencapture, boundingBox, "ironOre", counter);
|
||||
|
||||
ImageIO.write(screencapture, "jpg", new File("/home/dpapp/Videos/frames/frame_" + counter + ".jpg"));
|
||||
|
||||
System.out.println(trackingSuccess + ", ironOre: " + ironOreDetected);
|
||||
counter++;
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
private BufferedImage Mat2BufferedImage(Mat matrix)throws Exception {
|
||||
MatOfByte mob=new MatOfByte();
|
||||
|
|
|
@ -6,7 +6,7 @@ public class Paths {
|
|||
|
||||
public static final String CURSOR_COORDINATES_FILE_PATH = "/home/dpapp/GhostMouse/coordinates.txt";
|
||||
|
||||
public static final String TENSORFLOW_MODEL_DIRECTORY = "/home/dpapp/tensorflow-1.5.0/models/raccoon_dataset/results/checkpoint_23826/saved_model/";
|
||||
public static final String TENSORFLOW_MODEL_DIRECTORY = "/home/dpapp/tensorflow-1.5.0/models/raccoon_dataset/results/checkpoint_56749/saved_model/";
|
||||
public static final String TENSORFLOW_TRAINING_IMAGE_OUTPUT_DIRECTORY = "/home/dpapp/tensorflow-1.5.0/models/raccoon_dataset/results/checkpoint_23826/saved_model/";
|
||||
public static final String TENSORFLOW_MODEL_LABELS_FILE_PATH = "/home/dpapp/tensorflow-1.5.0/models/raccoon_dataset/training/labels.pbtxt";
|
||||
}
|
||||
|
|
|
@ -4,13 +4,15 @@ import java.io.IOException;
|
|||
import java.net.URL;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
|
||||
import org.tensorflow.*;
|
||||
|
||||
public class main {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("Starting Iron Miner.");
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
//System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
//System.loadLibrary(org.tensorflow);
|
||||
|
||||
IronMiner ironMiner = new IronMiner();
|
||||
ironMiner.run();
|
||||
/*Cursor cursor = new Cursor();
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,29 @@
|
|||
/home/dpapp/eclipse-workspace/RunescapeAI/src/cascadeTrainingImageCollector.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/Paths.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ImageCollector.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/DetectedObject.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/main.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ObjectDetectorTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/RandomizerTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/InventoryItems.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/InventoryTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ColorAnalyzer.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/Inventory.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorPath.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ObjectTracker.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ObjectDetector.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/Constants.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/ObjectTrackerTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorPointTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/IronMiner.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorTask.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/Randomizer.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/Cursor.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/InventorySlot.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/InventoryItem.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/PointTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorPoint.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorDataFileParser.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/InventoryItemsTest.java
|
||||
/home/dpapp/eclipse-workspace/RunescapeAI/src/CursorPathTest.java
|
Loading…
Reference in New Issue